sha512 hardware acceleration for s390
Subsystems (3)
PATCH 2/4 sha512 hardware acceleration for s390
Exploit the System z10 hardware acceleration for SHA512.
Signed-off-by Jan Glauber <[email protected]>
--- 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
@@ -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
@@ -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
@@ -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
@@ -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_SIZEstruct 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
@@ -59,12 +59,15 @@ void s390_sha_final(struct crypto_tfm *tstruct 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));