OSDN Git Service

crypto: qce - initialize fallback only for AES
authorEneas U de Queiroz <cotequeiroz@gmail.com>
Fri, 20 Dec 2019 19:02:17 +0000 (16:02 -0300)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 27 Dec 2019 10:18:04 +0000 (18:18 +0800)
Adjust cra_flags to add CRYPTO_NEED_FALLBACK only for AES ciphers, where
AES-192 is not handled by the qce hardware, and don't allocate & free
the fallback skcipher for other algorithms.

Signed-off-by: Eneas U de Queiroz <cotequeiroz@gmail.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/qce/skcipher.c

index d3852a6..4217b74 100644 (file)
@@ -257,7 +257,14 @@ static int qce_skcipher_init(struct crypto_skcipher *tfm)
 
        memset(ctx, 0, sizeof(*ctx));
        crypto_skcipher_set_reqsize(tfm, sizeof(struct qce_cipher_reqctx));
+       return 0;
+}
 
+static int qce_skcipher_init_fallback(struct crypto_skcipher *tfm)
+{
+       struct qce_cipher_ctx *ctx = crypto_skcipher_ctx(tfm);
+
+       qce_skcipher_init(tfm);
        ctx->fallback = crypto_alloc_sync_skcipher(crypto_tfm_alg_name(&tfm->base),
                                                   0, CRYPTO_ALG_NEED_FALLBACK);
        return PTR_ERR_OR_ZERO(ctx->fallback);
@@ -387,14 +394,18 @@ static int qce_skcipher_register_one(const struct qce_skcipher_def *def,
 
        alg->base.cra_priority          = 300;
        alg->base.cra_flags             = CRYPTO_ALG_ASYNC |
-                                         CRYPTO_ALG_NEED_FALLBACK |
                                          CRYPTO_ALG_KERN_DRIVER_ONLY;
        alg->base.cra_ctxsize           = sizeof(struct qce_cipher_ctx);
        alg->base.cra_alignmask         = 0;
        alg->base.cra_module            = THIS_MODULE;
 
-       alg->init                       = qce_skcipher_init;
-       alg->exit                       = qce_skcipher_exit;
+       if (IS_AES(def->flags)) {
+               alg->base.cra_flags    |= CRYPTO_ALG_NEED_FALLBACK;
+               alg->init               = qce_skcipher_init_fallback;
+               alg->exit               = qce_skcipher_exit;
+       } else {
+               alg->init               = qce_skcipher_init;
+       }
 
        INIT_LIST_HEAD(&tmpl->entry);
        tmpl->crypto_alg_type = CRYPTO_ALG_TYPE_SKCIPHER;