Skip to contentSkip to conversation

sha512 hardware acceleration for s390

PATCH In review Jan Glauber 1 participant 1 message Mar 3, 2008

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 2/4 sha512 hardware acceleration for s390

Exploit the System z10 hardware acceleration for SHA512.

---
 arch/s390/crypto/Makefile      |    1 
 arch/s390/crypto/crypt_s390.h  |    2 +
 arch/s390/crypto/sha.h         |    5 +-
 arch/s390/crypto/sha512_s390.c |   71 +++++++++++++++++++++++++++++++++++++++++
 arch/s390/crypto/sha_common.c  |   11 +++++-
 drivers/crypto/Kconfig         |   11 ++++++
 6 files changed, 97 insertions(+), 4 deletions(-)
drivers/crypto/Kconfig +11 -0
Index: cryptodev-2.6/drivers/crypto/Kconfig
===================================================================
@@ -100,6 +100,17 @@ config CRYPTO_SHA256_S390
 	  This version of SHA implements a 256 bit hash with 128 bits of
 	  security against collision attacks.
 
+config CRYPTO_SHA512_S390
+	tristate "SHA512 digest algorithm"
+	depends on S390
+	select CRYPTO_ALGAPI
+	help
+	  This is the s390 hardware accelerated implementation of the
+	  SHA512 secure hash standard.
+
+	  This version of SHA implements a 512 bit hash with 256 bits of
+	  security against collision attacks.
+
 config CRYPTO_DES_S390
 	tristate "DES and Triple DES cipher algorithms"
 	depends on S390
arch/s390/crypto/Makefile +1 -0
Index: cryptodev-2.6/arch/s390/crypto/Makefile
===================================================================
@@ -4,6 +4,7 @@
 
 obj-$(CONFIG_CRYPTO_SHA1_S390) += sha1_s390.o sha_common.o
 obj-$(CONFIG_CRYPTO_SHA256_S390) += sha256_s390.o sha_common.o
+obj-$(CONFIG_CRYPTO_SHA512_S390) += sha512_s390.o sha_common.o
 obj-$(CONFIG_CRYPTO_DES_S390) += des_s390.o des_check_key.o
 obj-$(CONFIG_CRYPTO_AES_S390) += aes_s390.o
 obj-$(CONFIG_S390_PRNG) += prng.o
arch/s390/crypto/crypt_s390.h +2 -0
Index: cryptodev-2.6/arch/s390/crypto/crypt_s390.h
===================================================================
@@ -82,6 +82,7 @@ enum crypt_s390_kimd_func {
 	KIMD_QUERY   = CRYPT_S390_KIMD | 0,
 	KIMD_SHA_1   = CRYPT_S390_KIMD | 1,
 	KIMD_SHA_256 = CRYPT_S390_KIMD | 2,
+	KIMD_SHA_512 = CRYPT_S390_KIMD | 3,
 };
 
 /*
@@ -92,6 +93,7 @@ enum crypt_s390_klmd_func {
 	KLMD_QUERY   = CRYPT_S390_KLMD | 0,
 	KLMD_SHA_1   = CRYPT_S390_KLMD | 1,
 	KLMD_SHA_256 = CRYPT_S390_KLMD | 2,
+	KLMD_SHA_512 = CRYPT_S390_KLMD | 3,
 };
 
 /*
arch/s390/crypto/sha.h +3 -2
Index: cryptodev-2.6/arch/s390/crypto/sha.h
===================================================================
@@ -19,11 +19,12 @@
 #include <crypto/sha.h>
 
 /* must be big enough for the largest SHA variant */
-#define SHA_MAX_BLOCK_SIZE      SHA256_BLOCK_SIZE
+#define SHA_MAX_STATE_SIZE	16
+#define SHA_MAX_BLOCK_SIZE      SHA512_BLOCK_SIZE
 
 struct s390_sha_ctx {
 	u64 count;              /* message length in bytes */
-	u32 state[8];
+	u32 state[SHA_MAX_STATE_SIZE];
 	u8 buf[2 * SHA_MAX_BLOCK_SIZE];
 	int func;		/* KIMD function to use */
 };
arch/s390/crypto/sha512_s390.c new file +71 -0

71 lines not on this page · raw message

arch/s390/crypto/sha_common.c +9 -2
Index: cryptodev-2.6/arch/s390/crypto/sha_common.c
===================================================================
@@ -59,12 +59,15 @@ void s390_sha_final(struct crypto_tfm *t
 	struct s390_sha_ctx *ctx = crypto_tfm_ctx(tfm);
 	unsigned int bsize = crypto_tfm_alg_blocksize(tfm);
 	u64 bits;
-	unsigned int index, end;
+	unsigned int index, end, plen;
 	int ret;
 
+	/* SHA-512 uses 128 bit padding length */
+	plen = (bsize > SHA256_BLOCK_SIZE) ? 16 : 8;
+
 	/* must perform manual padding */
 	index = ctx->count & (bsize - 1);
-	end = (index < bsize - 8) ? bsize : (2 * bsize);
+	end = (index < bsize - plen) ? bsize : (2 * bsize);
 
 	/* start pad with 1 */
 	ctx->buf[index] = 0x80;
@@ -73,6 +76,10 @@ void s390_sha_final(struct crypto_tfm *t
 	/* pad with zeros */
 	memset(ctx->buf + index, 0x00, end - index - 8);
 
+	/*
+	 * Append message length. Well, SHA-512 wants a 128 bit lenght value,
+	 * nevertheless we use u64, should be enough for now...
+	 */
 	bits = ctx->count * 8;
 	memcpy(ctx->buf + end - 8, &bits, sizeof(bits));