crypto: ccp - move to AES library for CMAC key derivation
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Tue, 2 Jul 2019 19:41:43 +0000 (21:41 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 26 Jul 2019 04:58:13 +0000 (14:58 +1000)
Use the AES library instead of the cipher interface to perform
the single block of AES processing involved in updating the key
of the cmac(aes) hash.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/ccp/Kconfig
drivers/crypto/ccp/ccp-crypto-aes-cmac.c
drivers/crypto/ccp/ccp-crypto.h

index 48f3edc1e3fb2fd170b4a18489c47e8ba3d6b8ed..ce1c47286fc67db828d5ed9ea811602878b25cb4 100644 (file)
@@ -30,6 +30,7 @@ config CRYPTO_DEV_CCP_CRYPTO
        select CRYPTO_BLKCIPHER
        select CRYPTO_AUTHENC
        select CRYPTO_RSA
+       select CRYPTO_LIB_AES
        help
          Support for using the cryptographic API with the AMD Cryptographic
          Coprocessor. This module supports offload of SHA and AES algorithms.
index bb7219d36b2ca929b53c5edc2ab5c99b1330be92..32f19f402073728104d7c82ac78a765be8d95b73 100644 (file)
@@ -261,6 +261,7 @@ static int ccp_aes_cmac_setkey(struct crypto_ahash *tfm, const u8 *key,
                ccp_crypto_ahash_alg(crypto_ahash_tfm(tfm));
        u64 k0_hi, k0_lo, k1_hi, k1_lo, k2_hi, k2_lo;
        u64 rb_hi = 0x00, rb_lo = 0x87;
+       struct crypto_aes_ctx aes;
        __be64 *gk;
        int ret;
 
@@ -284,14 +285,14 @@ static int ccp_aes_cmac_setkey(struct crypto_ahash *tfm, const u8 *key,
        ctx->u.aes.key_len = 0;
 
        /* Set the key for the AES cipher used to generate the keys */
-       ret = crypto_cipher_setkey(ctx->u.aes.tfm_cipher, key, key_len);
+       ret = aes_expandkey(&aes, key, key_len);
        if (ret)
                return ret;
 
        /* Encrypt a block of zeroes - use key area in context */
        memset(ctx->u.aes.key, 0, sizeof(ctx->u.aes.key));
-       crypto_cipher_encrypt_one(ctx->u.aes.tfm_cipher, ctx->u.aes.key,
-                                 ctx->u.aes.key);
+       aes_encrypt(&aes, ctx->u.aes.key, ctx->u.aes.key);
+       memzero_explicit(&aes, sizeof(aes));
 
        /* Generate K1 and K2 */
        k0_hi = be64_to_cpu(*((__be64 *)ctx->u.aes.key));
@@ -336,32 +337,15 @@ static int ccp_aes_cmac_cra_init(struct crypto_tfm *tfm)
 {
        struct ccp_ctx *ctx = crypto_tfm_ctx(tfm);
        struct crypto_ahash *ahash = __crypto_ahash_cast(tfm);
-       struct crypto_cipher *cipher_tfm;
 
        ctx->complete = ccp_aes_cmac_complete;
        ctx->u.aes.key_len = 0;
 
        crypto_ahash_set_reqsize(ahash, sizeof(struct ccp_aes_cmac_req_ctx));
 
-       cipher_tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_NEED_FALLBACK);
-       if (IS_ERR(cipher_tfm)) {
-               pr_warn("could not load aes cipher driver\n");
-               return PTR_ERR(cipher_tfm);
-       }
-       ctx->u.aes.tfm_cipher = cipher_tfm;
-
        return 0;
 }
 
-static void ccp_aes_cmac_cra_exit(struct crypto_tfm *tfm)
-{
-       struct ccp_ctx *ctx = crypto_tfm_ctx(tfm);
-
-       if (ctx->u.aes.tfm_cipher)
-               crypto_free_cipher(ctx->u.aes.tfm_cipher);
-       ctx->u.aes.tfm_cipher = NULL;
-}
-
 int ccp_register_aes_cmac_algs(struct list_head *head)
 {
        struct ccp_crypto_ahash_alg *ccp_alg;
@@ -401,7 +385,6 @@ int ccp_register_aes_cmac_algs(struct list_head *head)
        base->cra_ctxsize = sizeof(struct ccp_ctx);
        base->cra_priority = CCP_CRA_PRIORITY;
        base->cra_init = ccp_aes_cmac_cra_init;
-       base->cra_exit = ccp_aes_cmac_cra_exit;
        base->cra_module = THIS_MODULE;
 
        ret = crypto_register_ahash(alg);
index 622b34c176431d61aa938522b1c5e545fa60b757..25409cea846599ad56a17adcf8978287898c2d72 100644 (file)
@@ -87,9 +87,6 @@ struct ccp_aes_ctx {
        /* Fallback cipher for XTS with unsupported unit sizes */
        struct crypto_sync_skcipher *tfm_skcipher;
 
-       /* Cipher used to generate CMAC K1/K2 keys */
-       struct crypto_cipher *tfm_cipher;
-
        enum ccp_engine engine;
        enum ccp_aes_type type;
        enum ccp_aes_mode mode;