crypto: sha512-s390 - Add export/import support
authorHerbert Xu <herbert@gondor.apana.org.au>
Wed, 22 Jul 2009 04:29:41 +0000 (12:29 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Wed, 22 Jul 2009 06:38:13 +0000 (14:38 +0800)
This patch adds export/import support to sha512-s390 (which includes
sha384-s390).  The exported type is defined by struct sha512_state,
which is basically the entire descriptor state of sha512_generic.

Since sha512-s390 only supports a 64-bit byte count the import
function will reject anything that exceeds that.

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

index 83192bfc80480bd1477433fd906b6450ab7c4d38..b4b3438ae77edcabc059ee5faac706cf50d03e6a 100644 (file)
  *
  */
 #include <crypto/internal/hash.h>
+#include <crypto/sha.h>
+#include <linux/errno.h>
 #include <linux/init.h>
+#include <linux/kernel.h>
 #include <linux/module.h>
 
 #include "sha.h"
@@ -37,12 +40,42 @@ static int sha512_init(struct shash_desc *desc)
        return 0;
 }
 
+static int sha512_export(struct shash_desc *desc, void *out)
+{
+       struct s390_sha_ctx *sctx = shash_desc_ctx(desc);
+       struct sha512_state *octx = out;
+
+       octx->count[0] = sctx->count;
+       octx->count[1] = 0;
+       memcpy(octx->state, sctx->state, sizeof(octx->state));
+       memcpy(octx->buf, sctx->buf, sizeof(octx->buf));
+       return 0;
+}
+
+static int sha512_import(struct shash_desc *desc, const u8 *in)
+{
+       struct s390_sha_ctx *sctx = shash_desc_ctx(desc);
+       struct sha512_state *ictx = in;
+
+       if (unlikely(ictx->count[1]))
+               return -ERANGE;
+       sctx->count = ictx->count[0];
+
+       memcpy(sctx->state, ictx->state, sizeof(ictx->state));
+       memcpy(sctx->buf, ictx->buf, sizeof(ictx->buf));
+       sctx->func = KIMD_SHA_512;
+       return 0;
+}
+
 static struct shash_alg sha512_alg = {
        .digestsize     =       SHA512_DIGEST_SIZE,
        .init           =       sha512_init,
        .update         =       s390_sha_update,
        .final          =       s390_sha_final,
+       .export         =       sha512_export,
+       .import         =       sha512_import,
        .descsize       =       sizeof(struct s390_sha_ctx),
+       .statesize      =       sizeof(struct sha512_state),
        .base           =       {
                .cra_name       =       "sha512",
                .cra_driver_name=       "sha512-s390",
@@ -78,7 +111,10 @@ static struct shash_alg sha384_alg = {
        .init           =       sha384_init,
        .update         =       s390_sha_update,
        .final          =       s390_sha_final,
+       .export         =       sha512_export,
+       .import         =       sha512_import,
        .descsize       =       sizeof(struct s390_sha_ctx),
+       .statesize      =       sizeof(struct sha512_state),
        .base           =       {
                .cra_name       =       "sha384",
                .cra_driver_name=       "sha384-s390",