summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2009-07-22 08:37:06 +0400
committerHerbert Xu <herbert@gondor.apana.org.au>2009-07-22 10:38:13 +0400
commitf592682f9fca18d336ac068a1abc8507b4a1d936 (patch)
tree4f50efe420d0ecf523adff5301aaff014c357070
parent9fadfd1adff28a8895de8df9e8a778c44958840f (diff)
downloadlinux-f592682f9fca18d336ac068a1abc8507b4a1d936.tar.xz
crypto: shash - Require all algorithms to support export/import
This patch provides a default export/import function for all shash algorithms. It simply copies the descriptor context as is done by sha1_generic. This in essence means that all existing shash algorithms now support export/import. This is something that will be depended upon in implementations such as hmac. Therefore all new shash and ahash implementations must support export/import. For those that cannot obtain a partial result, padlock-sha's fallback model should be used so that a partial result is always available. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--crypto/shash.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/crypto/shash.c b/crypto/shash.c
index 7713b520bc98..98b7f46ca1ed 100644
--- a/crypto/shash.c
+++ b/crypto/shash.c
@@ -183,14 +183,16 @@ int crypto_shash_digest(struct shash_desc *desc, const u8 *data,
}
EXPORT_SYMBOL_GPL(crypto_shash_digest);
-static int shash_no_export(struct shash_desc *desc, void *out)
+static int shash_default_export(struct shash_desc *desc, void *out)
{
- return -ENOSYS;
+ memcpy(out, shash_desc_ctx(desc), crypto_shash_descsize(desc->tfm));
+ return 0;
}
-static int shash_no_import(struct shash_desc *desc, const void *in)
+static int shash_default_import(struct shash_desc *desc, const void *in)
{
- return -ENOSYS;
+ memcpy(shash_desc_ctx(desc), in, crypto_shash_descsize(desc->tfm));
+ return 0;
}
static int shash_async_setkey(struct crypto_ahash *tfm, const u8 *key,
@@ -563,10 +565,11 @@ static int shash_prepare_alg(struct shash_alg *alg)
alg->finup = shash_finup_unaligned;
if (!alg->digest)
alg->digest = shash_digest_unaligned;
- if (!alg->import)
- alg->import = shash_no_import;
- if (!alg->export)
- alg->export = shash_no_export;
+ if (!alg->export) {
+ alg->export = shash_default_export;
+ alg->import = shash_default_import;
+ alg->statesize = alg->descsize;
+ }
if (!alg->setkey)
alg->setkey = shash_no_setkey;