crypto: chcr - Calculate Reverse round key in setkey callback.
authorHarsh Jain <harsh@chelsio.com>
Tue, 29 Nov 2016 13:30:39 +0000 (19:00 +0530)
committerHerbert Xu <herbert@gondor.apana.org.au>
Wed, 30 Nov 2016 12:01:47 +0000 (20:01 +0800)
Move reverse round key calculation logic in setkey operation.

Signed-off-by: Harsh Jain <harsh@chelsio.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/chelsio/chcr_algo.c
drivers/crypto/chelsio/chcr_crypto.h

index 13aaca2b6e9589d4dfebad9304e3dfb902ac55db..3cf009315dbf1bace47e25e1f307b7184446a621 100644 (file)
@@ -455,16 +455,13 @@ static int generate_copy_rrkey(struct ablk_ctx *ablkctx,
                               struct _key_ctx *key_ctx)
 {
        if (ablkctx->ciph_mode == CHCR_SCMD_CIPHER_MODE_AES_CBC) {
-               get_aes_decrypt_key(key_ctx->key, ablkctx->key,
-                                   ablkctx->enckey_len << 3);
-               memset(key_ctx->key + ablkctx->enckey_len, 0,
-                      CHCR_AES_MAX_KEY_LEN - ablkctx->enckey_len);
+               memcpy(key_ctx->key, ablkctx->rrkey, ablkctx->enckey_len);
        } else {
                memcpy(key_ctx->key,
                       ablkctx->key + (ablkctx->enckey_len >> 1),
                       ablkctx->enckey_len >> 1);
-               get_aes_decrypt_key(key_ctx->key + (ablkctx->enckey_len >> 1),
-                                   ablkctx->key, ablkctx->enckey_len << 2);
+               memcpy(key_ctx->key + (ablkctx->enckey_len >> 1),
+                      ablkctx->rrkey, ablkctx->enckey_len >> 1);
        }
        return 0;
 }
@@ -620,15 +617,9 @@ static int chcr_aes_cbc_setkey(struct crypto_ablkcipher *tfm, const u8 *key,
 {
        struct chcr_context *ctx = crypto_ablkcipher_ctx(tfm);
        struct ablk_ctx *ablkctx = ABLK_CTX(ctx);
-       struct ablkcipher_alg *alg = crypto_ablkcipher_alg(tfm);
        unsigned int ck_size, context_size;
        u16 alignment = 0;
 
-       if ((keylen < alg->min_keysize) || (keylen > alg->max_keysize))
-               goto badkey_err;
-
-       memcpy(ablkctx->key, key, keylen);
-       ablkctx->enckey_len = keylen;
        if (keylen == AES_KEYSIZE_128) {
                ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_128;
        } else if (keylen == AES_KEYSIZE_192) {
@@ -639,7 +630,9 @@ static int chcr_aes_cbc_setkey(struct crypto_ablkcipher *tfm, const u8 *key,
        } else {
                goto badkey_err;
        }
-
+       memcpy(ablkctx->key, key, keylen);
+       ablkctx->enckey_len = keylen;
+       get_aes_decrypt_key(ablkctx->rrkey, ablkctx->key, keylen << 3);
        context_size = (KEY_CONTEXT_HDR_SALT_AND_PAD +
                        keylen + alignment) >> 4;
 
@@ -1172,28 +1165,29 @@ static int chcr_aes_xts_setkey(struct crypto_ablkcipher *tfm, const u8 *key,
 {
        struct chcr_context *ctx = crypto_ablkcipher_ctx(tfm);
        struct ablk_ctx *ablkctx = ABLK_CTX(ctx);
-       int status = 0;
        unsigned short context_size = 0;
 
-       if ((key_len == (AES_KEYSIZE_128 << 1)) ||
-           (key_len == (AES_KEYSIZE_256 << 1))) {
-               memcpy(ablkctx->key, key, key_len);
-               ablkctx->enckey_len = key_len;
-               context_size = (KEY_CONTEXT_HDR_SALT_AND_PAD + key_len) >> 4;
-               ablkctx->key_ctx_hdr =
-                       FILL_KEY_CTX_HDR((key_len == AES_KEYSIZE_256) ?
-                                        CHCR_KEYCTX_CIPHER_KEY_SIZE_128 :
-                                        CHCR_KEYCTX_CIPHER_KEY_SIZE_256,
-                                        CHCR_KEYCTX_NO_KEY, 1,
-                                        0, context_size);
-               ablkctx->ciph_mode = CHCR_SCMD_CIPHER_MODE_AES_XTS;
-       } else {
+       if ((key_len != (AES_KEYSIZE_128 << 1)) &&
+           (key_len != (AES_KEYSIZE_256 << 1))) {
                crypto_tfm_set_flags((struct crypto_tfm *)tfm,
                                     CRYPTO_TFM_RES_BAD_KEY_LEN);
                ablkctx->enckey_len = 0;
-               status = -EINVAL;
+               return -EINVAL;
+
        }
-       return status;
+
+       memcpy(ablkctx->key, key, key_len);
+       ablkctx->enckey_len = key_len;
+       get_aes_decrypt_key(ablkctx->rrkey, ablkctx->key, key_len << 2);
+       context_size = (KEY_CONTEXT_HDR_SALT_AND_PAD + key_len) >> 4;
+       ablkctx->key_ctx_hdr =
+               FILL_KEY_CTX_HDR((key_len == AES_KEYSIZE_256) ?
+                                CHCR_KEYCTX_CIPHER_KEY_SIZE_128 :
+                                CHCR_KEYCTX_CIPHER_KEY_SIZE_256,
+                                CHCR_KEYCTX_NO_KEY, 1,
+                                0, context_size);
+       ablkctx->ciph_mode = CHCR_SCMD_CIPHER_MODE_AES_XTS;
+       return 0;
 }
 
 static int chcr_sha_init(struct ahash_request *areq)
index 8934ea2fe56b4f417a7b9d2cc5d448b9a03bb313..7ed6d2b72320092510b54204e66670355cf99c9e 100644 (file)
@@ -125,8 +125,8 @@ struct ablk_ctx {
        __be32 key_ctx_hdr;
        unsigned int enckey_len;
        unsigned int dst_nents;
-       struct scatterlist iv_sg;
        u8 key[CHCR_AES_MAX_KEY_LEN];
+       u8 rrkey[AES_MAX_KEY_SIZE];
        u8 iv[CHCR_MAX_CRYPTO_IV_LEN];
        unsigned char ciph_mode;
 };