]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
crypto: mediatek - fix incorrect crypto key setting
authorVic Wu <vic.wu@mediatek.com>
Wed, 28 Aug 2019 06:37:16 +0000 (14:37 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Thu, 5 Sep 2019 04:36:54 +0000 (14:36 +1000)
Record crypto key to context during setkey and set the key to
transform state buffer in encrypt/decrypt process.

Signed-off-by: Vic Wu <vic.wu@mediatek.com>
Tested-by: John Crispin <john@phrozen.og>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/mediatek/mtk-aes.c

index 378899b640b4202a6eb99e33fce3936c61c6a0e1..90c9644fb8a8694e90e47c32fcd662f2b8d75fd4 100644 (file)
@@ -105,6 +105,7 @@ struct mtk_aes_reqctx {
 struct mtk_aes_base_ctx {
        struct mtk_cryp *cryp;
        u32 keylen;
+       __le32 key[12];
        __le32 keymode;
 
        mtk_aes_fn start;
@@ -534,6 +535,8 @@ static int mtk_aes_handle_queue(struct mtk_cryp *cryp, u8 id,
                backlog->complete(backlog, -EINPROGRESS);
 
        ctx = crypto_tfm_ctx(areq->tfm);
+       /* Write key into state buffer */
+       memcpy(ctx->info.state, ctx->key, sizeof(ctx->key));
 
        aes->areq = areq;
        aes->ctx = ctx;
@@ -653,7 +656,7 @@ static int mtk_aes_setkey(struct crypto_ablkcipher *tfm,
        }
 
        ctx->keylen = SIZE_IN_WORDS(keylen);
-       mtk_aes_write_state_le(ctx->info.state, (const u32 *)key, keylen);
+       mtk_aes_write_state_le(ctx->key, (const u32 *)key, keylen);
 
        return 0;
 }
@@ -1070,10 +1073,8 @@ static int mtk_aes_gcm_setkey(struct crypto_aead *aead, const u8 *key,
        if (err)
                goto out;
 
-       /* Write key into state buffer */
-       mtk_aes_write_state_le(ctx->info.state, (const u32 *)key, keylen);
-       /* Write key(H) into state buffer */
-       mtk_aes_write_state_be(ctx->info.state + ctx->keylen, data->hash,
+       mtk_aes_write_state_le(ctx->key, (const u32 *)key, keylen);
+       mtk_aes_write_state_be(ctx->key + ctx->keylen, data->hash,
                               AES_BLOCK_SIZE);
 out:
        kzfree(data);