crypto: caam - consolidate split key length computation
authorHoria Geantă <horia.geanta@nxp.com>
Tue, 22 Nov 2016 13:44:10 +0000 (15:44 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Mon, 28 Nov 2016 13:23:23 +0000 (21:23 +0800)
Move split key length and padded length computation from caamalg.c
and caamhash.c to key_gen.c.

Signed-off-by: Horia Geantă <horia.geanta@nxp.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/caam/caamalg.c
drivers/crypto/caam/caamhash.c
drivers/crypto/caam/key_gen.c
drivers/crypto/caam/key_gen.h

index 78b0b7c17205b346fb89405aed40ad7788e43e1a..767ffaea9649f1994ddf58c80271209b1083211f 100644 (file)
@@ -586,18 +586,9 @@ static int rfc4543_setauthsize(struct crypto_aead *authenc,
        return 0;
 }
 
-static u32 gen_split_aead_key(struct caam_ctx *ctx, const u8 *key_in,
-                             u32 authkeylen)
-{
-       return gen_split_key(ctx->jrdev, ctx->key, &ctx->adata, key_in,
-                            authkeylen);
-}
-
 static int aead_setkey(struct crypto_aead *aead,
                               const u8 *key, unsigned int keylen)
 {
-       /* Sizes for MDHA pads (*not* keys): MD5, SHA1, 224, 256, 384, 512 */
-       static const u8 mdpadlen[] = { 16, 20, 32, 32, 64, 64 };
        struct caam_ctx *ctx = crypto_aead_ctx(aead);
        struct device *jrdev = ctx->jrdev;
        struct crypto_authenc_keys keys;
@@ -606,26 +597,17 @@ static int aead_setkey(struct crypto_aead *aead,
        if (crypto_authenc_extractkeys(&keys, key, keylen) != 0)
                goto badkey;
 
-       /* Pick class 2 key length from algorithm submask */
-       ctx->adata.keylen = mdpadlen[(ctx->adata.algtype &
-                                     OP_ALG_ALGSEL_SUBMASK) >>
-                                    OP_ALG_ALGSEL_SHIFT] * 2;
-       ctx->adata.keylen_pad = ALIGN(ctx->adata.keylen, 16);
-
-       if (ctx->adata.keylen_pad + keys.enckeylen > CAAM_MAX_KEY_SIZE)
-               goto badkey;
-
 #ifdef DEBUG
        printk(KERN_ERR "keylen %d enckeylen %d authkeylen %d\n",
               keys.authkeylen + keys.enckeylen, keys.enckeylen,
               keys.authkeylen);
-       printk(KERN_ERR "split_key_len %d split_key_pad_len %d\n",
-              ctx->adata.keylen, ctx->adata.keylen_pad);
        print_hex_dump(KERN_ERR, "key in @"__stringify(__LINE__)": ",
                       DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
 #endif
 
-       ret = gen_split_aead_key(ctx, keys.authkey, keys.authkeylen);
+       ret = gen_split_key(ctx->jrdev, ctx->key, &ctx->adata, keys.authkey,
+                           keys.authkeylen, CAAM_MAX_KEY_SIZE -
+                           keys.enckeylen);
        if (ret) {
                goto badkey;
        }
index d3f0ae16a73b2acbf2158e260db767c6db08cf45..505007d0277cfc6587b96b7392427f8a7373c71d 100644 (file)
@@ -398,12 +398,6 @@ static int ahash_set_sh_desc(struct crypto_ahash *ahash)
        return 0;
 }
 
-static int gen_split_hash_key(struct caam_hash_ctx *ctx, const u8 *key_in,
-                             u32 keylen)
-{
-       return gen_split_key(ctx->jrdev, ctx->key, &ctx->adata, key_in, keylen);
-}
-
 /* Digest hash size if it is too large */
 static int hash_digest_key(struct caam_hash_ctx *ctx, const u8 *key_in,
                           u32 *keylen, u8 *key_out, u32 digestsize)
@@ -483,8 +477,6 @@ static int hash_digest_key(struct caam_hash_ctx *ctx, const u8 *key_in,
 static int ahash_setkey(struct crypto_ahash *ahash,
                        const u8 *key, unsigned int keylen)
 {
-       /* Sizes for MDHA pads (*not* keys): MD5, SHA1, 224, 256, 384, 512 */
-       static const u8 mdpadlen[] = { 16, 20, 32, 32, 64, 64 };
        struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
        struct device *jrdev = ctx->jrdev;
        int blocksize = crypto_tfm_alg_blocksize(&ahash->base);
@@ -509,20 +501,8 @@ static int ahash_setkey(struct crypto_ahash *ahash,
                key = hashed_key;
        }
 
-       /* Pick class 2 key length from algorithm submask */
-       ctx->adata.keylen = mdpadlen[(ctx->adata.algtype &
-                                     OP_ALG_ALGSEL_SUBMASK) >>
-                                    OP_ALG_ALGSEL_SHIFT] * 2;
-       ctx->adata.keylen_pad = ALIGN(ctx->adata.keylen, 16);
-
-#ifdef DEBUG
-       printk(KERN_ERR "split_key_len %d split_key_pad_len %d\n",
-              ctx->adata.keylen, ctx->adata.keylen_pad);
-       print_hex_dump(KERN_ERR, "key in @"__stringify(__LINE__)": ",
-                      DUMP_PREFIX_ADDRESS, 16, 4, key, keylen, 1);
-#endif
-
-       ret = gen_split_hash_key(ctx, key, keylen);
+       ret = gen_split_key(ctx->jrdev, ctx->key, &ctx->adata, key, keylen,
+                           CAAM_MAX_HASH_KEY_SIZE);
        if (ret)
                goto bad_free_key;
 
index 621199a02f2eb45b8a68f5ab18e1bb7be579b8a7..1bb2816a9b4d992330a7d18ce31e475700a27afe 100644 (file)
 #include "desc_constr.h"
 #include "key_gen.h"
 
+/**
+ * split_key_len - Compute MDHA split key length for a given algorithm
+ * @hash: Hashing algorithm selection, one of OP_ALG_ALGSEL_* - MD5, SHA1,
+ *        SHA224, SHA384, SHA512.
+ *
+ * Return: MDHA split key length
+ */
+static inline u32 split_key_len(u32 hash)
+{
+       /* Sizes for MDHA pads (*not* keys): MD5, SHA1, 224, 256, 384, 512 */
+       static const u8 mdpadlen[] = { 16, 20, 32, 32, 64, 64 };
+       u32 idx;
+
+       idx = (hash & OP_ALG_ALGSEL_SUBMASK) >> OP_ALG_ALGSEL_SHIFT;
+
+       return (u32)(mdpadlen[idx] * 2);
+}
+
+/**
+ * split_key_pad_len - Compute MDHA split key pad length for a given algorithm
+ * @hash: Hashing algorithm selection, one of OP_ALG_ALGSEL_* - MD5, SHA1,
+ *        SHA224, SHA384, SHA512.
+ *
+ * Return: MDHA split key pad length
+ */
+static inline u32 split_key_pad_len(u32 hash)
+{
+       return ALIGN(split_key_len(hash), 16);
+}
+
 void split_key_done(struct device *dev, u32 *desc, u32 err,
                           void *context)
 {
@@ -42,13 +72,28 @@ Split key generation-----------------------------------------------
                        @0xffe04000
 */
 int gen_split_key(struct device *jrdev, u8 *key_out,
-                 struct alginfo * const adata, const u8 *key_in, u32 keylen)
+                 struct alginfo * const adata, const u8 *key_in, u32 keylen,
+                 int max_keylen)
 {
        u32 *desc;
        struct split_key_result result;
        dma_addr_t dma_addr_in, dma_addr_out;
        int ret = -ENOMEM;
 
+       adata->keylen = split_key_len(adata->algtype & OP_ALG_ALGSEL_MASK);
+       adata->keylen_pad = split_key_pad_len(adata->algtype &
+                                             OP_ALG_ALGSEL_MASK);
+
+#ifdef DEBUG
+       dev_err(jrdev, "split keylen %d split keylen padded %d\n",
+               adata->keylen, adata->keylen_pad);
+       print_hex_dump(KERN_ERR, "ctx.key@" __stringify(__LINE__)": ",
+                      DUMP_PREFIX_ADDRESS, 16, 4, key_in, keylen, 1);
+#endif
+
+       if (adata->keylen_pad > max_keylen)
+               return -EINVAL;
+
        desc = kmalloc(CAAM_CMD_SZ * 6 + CAAM_PTR_SZ * 2, GFP_KERNEL | GFP_DMA);
        if (!desc) {
                dev_err(jrdev, "unable to allocate key input memory\n");
index e87483c6057ba8da2c958fef725ae60708875d8a..4628f389eb64d51b88e1dda24b0c42ea90018f9b 100644 (file)
@@ -13,4 +13,5 @@ struct split_key_result {
 void split_key_done(struct device *dev, u32 *desc, u32 err, void *context);
 
 int gen_split_key(struct device *jrdev, u8 *key_out,
-                 struct alginfo * const adata, const u8 *key_in, u32 keylen);
+                 struct alginfo * const adata, const u8 *key_in, u32 keylen,
+                 int max_keylen);