crypto: shash - Move finup/digest null checks to registration time
authorHerbert Xu <herbert@gondor.apana.org.au>
Thu, 9 Jul 2009 12:36:44 +0000 (20:36 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sat, 11 Jul 2009 10:23:33 +0000 (18:23 +0800)
This patch moves the run-time null finup/digest checks to the
shash_prepare_alg function which is run at registration time.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/shash.c

index 14a3b707a31f281dae7b3096f869c0931ba2aaf3..f7fcc652ff3260996b1ec13afe8474a3b09e25b4 100644 (file)
@@ -142,8 +142,7 @@ int crypto_shash_finup(struct shash_desc *desc, const u8 *data,
        struct shash_alg *shash = crypto_shash_alg(tfm);
        unsigned long alignmask = crypto_shash_alignmask(tfm);
 
-       if (((unsigned long)data | (unsigned long)out) & alignmask ||
-           !shash->finup)
+       if (((unsigned long)data | (unsigned long)out) & alignmask)
                return shash_finup_unaligned(desc, data, len, out);
 
        return shash->finup(desc, data, len, out);
@@ -164,8 +163,7 @@ int crypto_shash_digest(struct shash_desc *desc, const u8 *data,
        struct shash_alg *shash = crypto_shash_alg(tfm);
        unsigned long alignmask = crypto_shash_alignmask(tfm);
 
-       if (((unsigned long)data | (unsigned long)out) & alignmask ||
-           !shash->digest)
+       if (((unsigned long)data | (unsigned long)out) & alignmask)
                return shash_digest_unaligned(desc, data, len, out);
 
        return shash->digest(desc, data, len, out);
@@ -488,6 +486,10 @@ static int shash_prepare_alg(struct shash_alg *alg)
        base->cra_flags &= ~CRYPTO_ALG_TYPE_MASK;
        base->cra_flags |= CRYPTO_ALG_TYPE_SHASH;
 
+       if (!alg->finup)
+               alg->finup = shash_finup_unaligned;
+       if (!alg->digest)
+               alg->digest = shash_digest_unaligned;
        if (!alg->import)
                alg->import = shash_no_import;
        if (!alg->export)