crypto: x86/sha256 - implement ->digest for sha256
Subsystems (2)
PATCH 1/1 crypto: x86/sha256 - implement ->digest for sha256
From: Eric Biggers <[email protected]>
Implement a ->digest function for sha256-ssse3, sha256-avx, sha256-avx2, and sha256-ni. This improves the performance of crypto_shash_digest() with these algorithms by reducing the number of indirect calls that are made.
For now, don't bother with this for sha224, since sha224 is rarely used.
--- arch/x86/crypto/sha256_ssse3_glue.c | 32 +++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+)
arch/x86/crypto/sha256_ssse3_glue.c +32 -0
@@ -100,26 +100,34 @@ static int sha256_ssse3_finup(struct shash_desc *desc, const u8 *data, {return sha256_finup (desc, data, len, out, sha256_transform_ssse3); }/* Add padding and return the message digest. */ static int sha256_ssse3_final (struct shash_desc *desc,u8 *out) {return sha256_ssse3_finup (desc,NULL ,0 , out); } +static int sha256_ssse3_digest (struct shash_desc *desc,const u8 *data, +unsigned int len,u8 *out) +{ +return sha256_base_init (desc) ?: +sha256_ssse3_finup (desc, data, len, out); +} +static struct shash_alg sha256_ssse3_algs[] = { { .digestsize =SHA256_DIGEST_SIZE , .init = sha256_base_init, .update = sha256_ssse3_update, .final = sha256_ssse3_final, .finup = sha256_ssse3_finup, + .digest = sha256_ssse3_digest, .descsize =sizeof (struct sha256_state ), .base = { .cra_name ="sha256" , .cra_driver_name ="sha256-ssse3" , .cra_priority =150 , .cra_blocksize =SHA256_BLOCK_SIZE , .cra_module =THIS_MODULE , } }, { .digestsize =SHA224_DIGEST_SIZE ,
@@ -165,26 +173,34 @@ static int sha256_avx_finup(struct shash_desc *desc, const u8 *data, unsigned int len, u8 *out) { return sha256_finup(desc, data, len, out, sha256_transform_avx); }static int sha256_avx_final (struct shash_desc *desc,u8 *out) {return sha256_avx_finup (desc,NULL ,0 , out); } +static int sha256_avx_digest (struct shash_desc *desc,const u8 *data, +unsigned int len,u8 *out) +{ +return sha256_base_init (desc) ?: +sha256_avx_finup (desc, data, len, out); +} +static struct shash_alg sha256_avx_algs[] = { { .digestsize =SHA256_DIGEST_SIZE , .init = sha256_base_init, .update = sha256_avx_update, .final = sha256_avx_final, .finup = sha256_avx_finup, + .digest = sha256_avx_digest, .descsize =sizeof (struct sha256_state ), .base = { .cra_name ="sha256" , .cra_driver_name ="sha256-avx" , .cra_priority =160 , .cra_blocksize =SHA256_BLOCK_SIZE , .cra_module =THIS_MODULE , } }, { .digestsize =SHA224_DIGEST_SIZE ,
@@ -241,26 +257,34 @@ static int sha256_avx2_finup(struct shash_desc *desc, const u8 *data, unsigned int len, u8 *out) { return sha256_finup(desc, data, len, out, sha256_transform_rorx); }static int sha256_avx2_final (struct shash_desc *desc,u8 *out) {return sha256_avx2_finup (desc,NULL ,0 , out); } +static int sha256_avx2_digest (struct shash_desc *desc,const u8 *data, +unsigned int len,u8 *out) +{ +return sha256_base_init (desc) ?: +sha256_avx2_finup (desc, data, len, out); +} +static struct shash_alg sha256_avx2_algs[] = { { .digestsize =SHA256_DIGEST_SIZE , .init = sha256_base_init, .update = sha256_avx2_update, .final = sha256_avx2_final, .finup = sha256_avx2_finup, + .digest = sha256_avx2_digest, .descsize =sizeof (struct sha256_state ), .base = { .cra_name ="sha256" , .cra_driver_name ="sha256-avx2" , .cra_priority =170 , .cra_blocksize =SHA256_BLOCK_SIZE , .cra_module =THIS_MODULE , } }, { .digestsize =SHA224_DIGEST_SIZE ,
@@ -316,26 +340,34 @@ static int sha256_ni_finup(struct shash_desc *desc, const u8 *data, unsigned int len, u8 *out) { return sha256_finup(desc, data, len, out, sha256_ni_transform); }static int sha256_ni_final (struct shash_desc *desc,u8 *out) {return sha256_ni_finup (desc,NULL ,0 , out); } +static int sha256_ni_digest (struct shash_desc *desc,const u8 *data, +unsigned int len,u8 *out) +{ +return sha256_base_init (desc) ?: +sha256_ni_finup (desc, data, len, out); +} +static struct shash_alg sha256_ni_algs[] = { { .digestsize =SHA256_DIGEST_SIZE , .init = sha256_base_init, .update = sha256_ni_update, .final = sha256_ni_final, .finup = sha256_ni_finup, + .digest = sha256_ni_digest, .descsize =sizeof (struct sha256_state ), .base = { .cra_name ="sha256" , .cra_driver_name ="sha256-ni" , .cra_priority =250 , .cra_blocksize =SHA256_BLOCK_SIZE , .cra_module =THIS_MODULE , } }, { .digestsize =SHA224_DIGEST_SIZE ,
base-commit: 8468516f9f93a41dc65158b6428a1a1039c68f20
Signature · 1 line
2.42.0
Herbert Xu
maintainerQuoted 7 lines · Eric Biggers
From: Eric Biggers <[email protected]>
Implement a ->digest function for sha256-ssse3, sha256-avx, sha256-avx2, and sha256-ni. This improves the performance of
crypto_shash_digest()with these algorithms by reducing the number of indirect calls that are made.
Quoted 6 lines
For now, don't bother with this for sha224, since sha224 is rarely used.
Signed-off-by Eric Biggers <[email protected]>---
arch/x86/crypto/sha256_ssse3_glue.c| 32 +++++++++++++++++++++++++++++1 file changed, 32 insertions(+)
Patch applied. Thanks.
Signature · 3 lines
Email: Herbert Xu <[email protected]> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt