diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-14 13:40:42 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-14 13:40:42 -0700 |
commit | 3b23e665b68387f5ee7b21f7b75ceea4d9acae4a (patch) | |
tree | f68ddc11e1a3bb068f6d3d16c15da5e91df4dd84 /crypto/digest.c | |
parent | 6c118e43dc513a7118b49b9ff953fe61e14515dc (diff) | |
parent | 090657e423f45a77151943f50165ae9565bfbf33 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6: (50 commits)
crypto: ixp4xx - Select CRYPTO_AUTHENC
crypto: s390 - Respect STFL bit
crypto: talitos - Add support for sha256 and md5 variants
crypto: hash - Move ahash functions into crypto/hash.h
crypto: crc32c - Add ahash implementation
crypto: hash - Added scatter list walking helper
crypto: prng - Deterministic CPRNG
crypto: hash - Removed vestigial ahash fields
crypto: hash - Fixed digest size check
crypto: rmd - sparse annotations
crypto: rmd128 - sparse annotations
crypto: camellia - Use kernel-provided bitops, unaligned access helpers
crypto: talitos - Use proper form for algorithm driver names
crypto: talitos - Add support for 3des
crypto: padlock - Make module loading quieter when hardware isn't available
crypto: tcrpyt - Remove unnecessary kmap/kunmap calls
crypto: ixp4xx - Hardware crypto support for IXP4xx CPUs
crypto: talitos - Freescale integrated security engine (SEC) driver
[CRYPTO] tcrypt: Add self test for des3_ebe cipher operating in cbc mode
[CRYPTO] rmd: Use pointer form of endian swapping operations
...
Diffstat (limited to 'crypto/digest.c')
-rw-r--r-- | crypto/digest.c | 83 |
1 files changed, 82 insertions, 1 deletions
diff --git a/crypto/digest.c b/crypto/digest.c index b526cc348b79..ac0919460d14 100644 --- a/crypto/digest.c +++ b/crypto/digest.c @@ -12,6 +12,7 @@ * */ +#include <crypto/internal/hash.h> #include <crypto/scatterwalk.h> #include <linux/mm.h> #include <linux/errno.h> @@ -141,7 +142,7 @@ int crypto_init_digest_ops(struct crypto_tfm *tfm) struct hash_tfm *ops = &tfm->crt_hash; struct digest_alg *dalg = &tfm->__crt_alg->cra_digest; - if (dalg->dia_digestsize > crypto_tfm_alg_blocksize(tfm)) + if (dalg->dia_digestsize > PAGE_SIZE / 8) return -EINVAL; ops->init = init; @@ -157,3 +158,83 @@ int crypto_init_digest_ops(struct crypto_tfm *tfm) void crypto_exit_digest_ops(struct crypto_tfm *tfm) { } + +static int digest_async_nosetkey(struct crypto_ahash *tfm_async, const u8 *key, + unsigned int keylen) +{ + crypto_ahash_clear_flags(tfm_async, CRYPTO_TFM_RES_MASK); + return -ENOSYS; +} + +static int digest_async_setkey(struct crypto_ahash *tfm_async, const u8 *key, + unsigned int keylen) +{ + struct crypto_tfm *tfm = crypto_ahash_tfm(tfm_async); + struct digest_alg *dalg = &tfm->__crt_alg->cra_digest; + + crypto_ahash_clear_flags(tfm_async, CRYPTO_TFM_RES_MASK); + return dalg->dia_setkey(tfm, key, keylen); +} + +static int digest_async_init(struct ahash_request *req) +{ + struct crypto_tfm *tfm = req->base.tfm; + struct digest_alg *dalg = &tfm->__crt_alg->cra_digest; + + dalg->dia_init(tfm); + return 0; +} + +static int digest_async_update(struct ahash_request *req) +{ + struct crypto_tfm *tfm = req->base.tfm; + struct hash_desc desc = { + .tfm = __crypto_hash_cast(tfm), + .flags = req->base.flags, + }; + + update(&desc, req->src, req->nbytes); + return 0; +} + +static int digest_async_final(struct ahash_request *req) +{ + struct crypto_tfm *tfm = req->base.tfm; + struct hash_desc desc = { + .tfm = __crypto_hash_cast(tfm), + .flags = req->base.flags, + }; + + final(&desc, req->result); + return 0; +} + +static int digest_async_digest(struct ahash_request *req) +{ + struct crypto_tfm *tfm = req->base.tfm; + struct hash_desc desc = { + .tfm = __crypto_hash_cast(tfm), + .flags = req->base.flags, + }; + + return digest(&desc, req->src, req->nbytes, req->result); +} + +int crypto_init_digest_ops_async(struct crypto_tfm *tfm) +{ + struct ahash_tfm *crt = &tfm->crt_ahash; + struct digest_alg *dalg = &tfm->__crt_alg->cra_digest; + + if (dalg->dia_digestsize > crypto_tfm_alg_blocksize(tfm)) + return -EINVAL; + + crt->init = digest_async_init; + crt->update = digest_async_update; + crt->final = digest_async_final; + crt->digest = digest_async_digest; + crt->setkey = dalg->dia_setkey ? digest_async_setkey : + digest_async_nosetkey; + crt->digestsize = dalg->dia_digestsize; + + return 0; +} |