crypto: padlock-sha - Add import/export support
authorHerbert Xu <herbert@gondor.apana.org.au>
Sun, 31 Jan 2010 22:17:56 +0000 (09:17 +1100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Mon, 1 Feb 2010 19:50:25 +0000 (06:50 +1100)
As the padlock driver for SHA uses a software fallback to perform
partial hashing, it must implement custom import/export functions.
Otherwise hmac which depends on import/export for prehashing will
not work with padlock-sha.

Reported-by: Wolfgang Walter <wolfgang.walter@stwm.de>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/padlock-sha.c

index 0af80577dc7bbfd9d80f276765e5afb7d218c067..d3a27e0119bc2ebc907f9c82c10cedae05540a0c 100644 (file)
@@ -57,6 +57,23 @@ static int padlock_sha_update(struct shash_desc *desc,
        return crypto_shash_update(&dctx->fallback, data, length);
 }
 
+static int padlock_sha_export(struct shash_desc *desc, void *out)
+{
+       struct padlock_sha_desc *dctx = shash_desc_ctx(desc);
+
+       return crypto_shash_export(&dctx->fallback, out);
+}
+
+static int padlock_sha_import(struct shash_desc *desc, const void *in)
+{
+       struct padlock_sha_desc *dctx = shash_desc_ctx(desc);
+       struct padlock_sha_ctx *ctx = crypto_shash_ctx(desc->tfm);
+
+       dctx->fallback.tfm = ctx->fallback;
+       dctx->fallback.flags = desc->flags & CRYPTO_TFM_REQ_MAY_SLEEP;
+       return crypto_shash_import(&dctx->fallback, in);
+}
+
 static inline void padlock_output_block(uint32_t *src,
                        uint32_t *dst, size_t count)
 {
@@ -235,7 +252,10 @@ static struct shash_alg sha1_alg = {
        .update         =       padlock_sha_update,
        .finup          =       padlock_sha1_finup,
        .final          =       padlock_sha1_final,
+       .export         =       padlock_sha_export,
+       .import         =       padlock_sha_import,
        .descsize       =       sizeof(struct padlock_sha_desc),
+       .statesize      =       sizeof(struct sha1_state),
        .base           =       {
                .cra_name               =       "sha1",
                .cra_driver_name        =       "sha1-padlock",
@@ -256,7 +276,10 @@ static struct shash_alg sha256_alg = {
        .update         =       padlock_sha_update,
        .finup          =       padlock_sha256_finup,
        .final          =       padlock_sha256_final,
+       .export         =       padlock_sha_export,
+       .import         =       padlock_sha_import,
        .descsize       =       sizeof(struct padlock_sha_desc),
+       .statesize      =       sizeof(struct sha256_state),
        .base           =       {
                .cra_name               =       "sha256",
                .cra_driver_name        =       "sha256-padlock",