2009-06-15 17:33:34

by Shasi Pulijala

[permalink] [raw]
Subject: [PATCH 3/3] AMCC Crypto4xx Device Driver v7


From: Shasi Pulijala <[email protected]>

This patch further adds immediate hash functions to md5/sha1/sha2 algs.
These immediate hash functions are used in hmac key generation in PPC Crypto4xx driver.

Signed-off-by: Shasi Pulijala <[email protected]>
Acked-by: Loc Ho <[email protected]>
---
crypto/md5.c | 15 +++++++++++++++
crypto/sha1_generic.c | 15 +++++++++++++++
crypto/sha256_generic.c | 15 +++++++++++++++
crypto/sha512_generic.c | 19 +++++++++++++++++++
include/crypto/sha.h | 7 +++++++
5 files changed, 71 insertions(+), 0 deletions(-)

diff --git a/crypto/md5.c b/crypto/md5.c
index 83eb529..0c74b84 100644
--- a/crypto/md5.c
+++ b/crypto/md5.c
@@ -220,6 +220,21 @@ static int md5_final(struct shash_desc *desc, u8 *out)
return 0;
}

+void md5_get_immediate_hash(struct crypto_tfm *tfm, u8 *data)
+{
+ struct shash_desc *desc = crypto_tfm_ctx(tfm);
+ struct md5_ctx *mctx = shash_desc_ctx(desc);
+ int i;
+
+ for (i = 0; i < MD5_HASH_WORDS; i++) {
+ *data++ = mctx->hash[i] & 0xFF;
+ *data++ = (mctx->hash[i] >> 8) & 0xFF;
+ *data++ = (mctx->hash[i] >> 16) & 0xFF;
+ *data++ = (mctx->hash[i] >> 24) & 0xFF;
+ }
+}
+EXPORT_SYMBOL_GPL(md5_get_immediate_hash);
+
static struct shash_alg alg = {
.digestsize = MD5_DIGEST_SIZE,
.init = md5_init,
diff --git a/crypto/sha1_generic.c b/crypto/sha1_generic.c
index 9efef20..e77b591 100644
--- a/crypto/sha1_generic.c
+++ b/crypto/sha1_generic.c
@@ -111,6 +111,21 @@ static int sha1_final(struct shash_desc *desc, u8 *out)
return 0;
}

+void sha1_get_immediate_hash(struct crypto_tfm *tfm, u8 *data)
+{
+ struct shash_desc *desc = crypto_tfm_ctx(tfm);
+ struct sha1_ctx *sctx = shash_desc_ctx(desc);
+ int i;
+
+ for (i = 0; i < 5; i++) {
+ *data++ = sctx->state[i] & 0xFF;
+ *data++ = (sctx->state[i] >> 8) & 0xFF;
+ *data++ = (sctx->state[i] >> 16) & 0xFF;
+ *data++ = (sctx->state[i] >> 24) & 0xFF;
+ }
+}
+EXPORT_SYMBOL_GPL(sha1_get_immediate_hash);
+
static struct shash_alg alg = {
.digestsize = SHA1_DIGEST_SIZE,
.init = sha1_init,
diff --git a/crypto/sha256_generic.c b/crypto/sha256_generic.c
index 6349d83..0f5a66b 100644
--- a/crypto/sha256_generic.c
+++ b/crypto/sha256_generic.c
@@ -331,6 +331,21 @@ static int sha224_final(struct shash_desc *desc, u8 *hash)
return 0;
}

+void sha256_get_immediate_hash(struct crypto_tfm *tfm, u8 *data)
+{
+ struct shash_desc *desc = crypto_tfm_ctx(tfm);
+ struct sha256_ctx *sctx = shash_desc_ctx(desc);
+ int i;
+
+ for (i = 0; i < 8; i++) {
+ *data++ = sctx->state[i] & 0xFF;
+ *data++ = (sctx->state[i] >> 8) & 0xFF;
+ *data++ = (sctx->state[i] >> 16) & 0xFF;
+ *data++ = (sctx->state[i] >> 24) & 0xFF;
+ }
+}
+EXPORT_SYMBOL_GPL(sha256_get_immediate_hash);
+
static struct shash_alg sha256 = {
.digestsize = SHA256_DIGEST_SIZE,
.init = sha256_init,
diff --git a/crypto/sha512_generic.c b/crypto/sha512_generic.c
index 3bea38d..c329903 100644
--- a/crypto/sha512_generic.c
+++ b/crypto/sha512_generic.c
@@ -257,6 +257,25 @@ static int sha384_final(struct shash_desc *desc, u8 *hash)
return 0;
}

+void sha512_get_immediate_hash(struct crypto_tfm *tfm, u8 *data)
+{
+ struct shash_desc *desc = crypto_tfm_ctx(tfm);
+ struct sha512_ctx *sctx = shash_desc_ctx(desc);
+ int i;
+
+ for (i = 0; i < 8; i++) {
+ *data++ = (sctx->state[i] >> 32) & 0xFF;
+ *data++ = (sctx->state[i] >> 40) & 0xFF;
+ *data++ = (sctx->state[i] >> 48) & 0xFF;
+ *data++ = (sctx->state[i] >> 56) & 0xFF;
+ *data++ = sctx->state[i] & 0xFF;
+ *data++ = (sctx->state[i] >> 8) & 0xFF;
+ *data++ = (sctx->state[i] >> 16) & 0xFF;
+ *data++ = (sctx->state[i] >> 24) & 0xFF;
+ }
+}
+EXPORT_SYMBOL_GPL(sha512_get_immediate_hash);
+
static struct shash_alg sha512 = {
.digestsize = SHA512_DIGEST_SIZE,
.init = sha512_init,
diff --git a/include/crypto/sha.h b/include/crypto/sha.h
index c0ccc2b..8894c2f 100644
--- a/include/crypto/sha.h
+++ b/include/crypto/sha.h
@@ -62,4 +62,11 @@
#define SHA512_H6 0x1f83d9abfb41bd6bULL
#define SHA512_H7 0x5be0cd19137e2179ULL

+/* From crypto/sha1_generic.c */
+void sha1_get_immediate_hash(struct crypto_tfm *tfm, u8 *data);
+/* From crypto/sha256_generic.c */
+void sha256_get_immediate_hash(struct crypto_tfm *tfm, u8 *data);
+/* From crypto/sha512_generic.c */
+void sha512_get_immediate_hash(struct crypto_tfm *tfm, u8 *data);
+
#endif
--
1.5.5