Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

crypto: arm64/sha512-ce - Use API partial block handling

Use the Crypto API partial block handling.

Also remove the unnecessary SIMD fallback path.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

+12 -37
+12 -37
arch/arm64/crypto/sha512-ce-glue.c
··· 10 10 */ 11 11 12 12 #include <asm/neon.h> 13 - #include <asm/simd.h> 14 - #include <linux/unaligned.h> 15 13 #include <crypto/internal/hash.h> 16 - #include <crypto/internal/simd.h> 17 14 #include <crypto/sha2.h> 18 15 #include <crypto/sha512_base.h> 19 16 #include <linux/cpufeature.h> 20 - #include <linux/crypto.h> 17 + #include <linux/kernel.h> 21 18 #include <linux/module.h> 22 19 23 20 MODULE_DESCRIPTION("SHA-384/SHA-512 secure hash using ARMv8 Crypto Extensions"); ··· 26 29 asmlinkage int __sha512_ce_transform(struct sha512_state *sst, u8 const *src, 27 30 int blocks); 28 31 29 - asmlinkage void sha512_block_data_order(u64 *digest, u8 const *src, int blocks); 30 - 31 32 static void sha512_ce_transform(struct sha512_state *sst, u8 const *src, 32 33 int blocks) 33 34 { 34 - while (blocks) { 35 + do { 35 36 int rem; 36 37 37 38 kernel_neon_begin(); ··· 37 42 kernel_neon_end(); 38 43 src += (blocks - rem) * SHA512_BLOCK_SIZE; 39 44 blocks = rem; 40 - } 41 - } 42 - 43 - static void sha512_arm64_transform(struct sha512_state *sst, u8 const *src, 44 - int blocks) 45 - { 46 - sha512_block_data_order(sst->state, src, blocks); 45 + } while (blocks); 47 46 } 48 47 49 48 static int sha512_ce_update(struct shash_desc *desc, const u8 *data, 50 49 unsigned int len) 51 50 { 52 - sha512_block_fn *fn = crypto_simd_usable() ? sha512_ce_transform 53 - : sha512_arm64_transform; 54 - 55 - sha512_base_do_update(desc, data, len, fn); 56 - return 0; 51 + return sha512_base_do_update_blocks(desc, data, len, 52 + sha512_ce_transform); 57 53 } 58 54 59 55 static int sha512_ce_finup(struct shash_desc *desc, const u8 *data, 60 56 unsigned int len, u8 *out) 61 57 { 62 - sha512_block_fn *fn = crypto_simd_usable() ? sha512_ce_transform 63 - : sha512_arm64_transform; 64 - 65 - sha512_base_do_update(desc, data, len, fn); 66 - sha512_base_do_finalize(desc, fn); 67 - return sha512_base_finish(desc, out); 68 - } 69 - 70 - static int sha512_ce_final(struct shash_desc *desc, u8 *out) 71 - { 72 - sha512_block_fn *fn = crypto_simd_usable() ? sha512_ce_transform 73 - : sha512_arm64_transform; 74 - 75 - sha512_base_do_finalize(desc, fn); 58 + sha512_base_do_finup(desc, data, len, sha512_ce_transform); 76 59 return sha512_base_finish(desc, out); 77 60 } 78 61 79 62 static struct shash_alg algs[] = { { 80 63 .init = sha384_base_init, 81 64 .update = sha512_ce_update, 82 - .final = sha512_ce_final, 83 65 .finup = sha512_ce_finup, 84 - .descsize = sizeof(struct sha512_state), 66 + .descsize = SHA512_STATE_SIZE, 85 67 .digestsize = SHA384_DIGEST_SIZE, 86 68 .base.cra_name = "sha384", 87 69 .base.cra_driver_name = "sha384-ce", 88 70 .base.cra_priority = 200, 71 + .base.cra_flags = CRYPTO_AHASH_ALG_BLOCK_ONLY | 72 + CRYPTO_AHASH_ALG_FINUP_MAX, 89 73 .base.cra_blocksize = SHA512_BLOCK_SIZE, 90 74 .base.cra_module = THIS_MODULE, 91 75 }, { 92 76 .init = sha512_base_init, 93 77 .update = sha512_ce_update, 94 - .final = sha512_ce_final, 95 78 .finup = sha512_ce_finup, 96 - .descsize = sizeof(struct sha512_state), 79 + .descsize = SHA512_STATE_SIZE, 97 80 .digestsize = SHA512_DIGEST_SIZE, 98 81 .base.cra_name = "sha512", 99 82 .base.cra_driver_name = "sha512-ce", 100 83 .base.cra_priority = 200, 84 + .base.cra_flags = CRYPTO_AHASH_ALG_BLOCK_ONLY | 85 + CRYPTO_AHASH_ALG_FINUP_MAX, 101 86 .base.cra_blocksize = SHA512_BLOCK_SIZE, 102 87 .base.cra_module = THIS_MODULE, 103 88 } };