hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/arch/arm64/crypto/sha3-ce-glue.c
....@@ -14,6 +14,7 @@
1414 #include <asm/simd.h>
1515 #include <asm/unaligned.h>
1616 #include <crypto/internal/hash.h>
17
+#include <crypto/internal/simd.h>
1718 #include <crypto/sha3.h>
1819 #include <linux/cpufeature.h>
1920 #include <linux/crypto.h>
....@@ -27,8 +28,8 @@
2728 MODULE_ALIAS_CRYPTO("sha3-384");
2829 MODULE_ALIAS_CRYPTO("sha3-512");
2930
30
-asmlinkage void sha3_ce_transform(u64 *st, const u8 *data, int blocks,
31
- int md_len);
31
+asmlinkage int sha3_ce_transform(u64 *st, const u8 *data, int blocks,
32
+ int md_len);
3233
3334 static int sha3_update(struct shash_desc *desc, const u8 *data,
3435 unsigned int len)
....@@ -36,7 +37,7 @@
3637 struct sha3_state *sctx = shash_desc_ctx(desc);
3738 unsigned int digest_size = crypto_shash_digestsize(desc->tfm);
3839
39
- if (!may_use_simd())
40
+ if (!crypto_simd_usable())
4041 return crypto_sha3_update(desc, data, len);
4142
4243 if ((sctx->partial + len) >= sctx->rsiz) {
....@@ -58,11 +59,15 @@
5859 blocks = len / sctx->rsiz;
5960 len %= sctx->rsiz;
6061
61
- if (blocks) {
62
+ while (blocks) {
63
+ int rem;
64
+
6265 kernel_neon_begin();
63
- sha3_ce_transform(sctx->st, data, blocks, digest_size);
66
+ rem = sha3_ce_transform(sctx->st, data, blocks,
67
+ digest_size);
6468 kernel_neon_end();
65
- data += blocks * sctx->rsiz;
69
+ data += (blocks - rem) * sctx->rsiz;
70
+ blocks = rem;
6671 }
6772 }
6873
....@@ -80,7 +85,7 @@
8085 __le64 *digest = (__le64 *)out;
8186 int i;
8287
83
- if (!may_use_simd())
88
+ if (!crypto_simd_usable())
8489 return crypto_sha3_final(desc, out);
8590
8691 sctx->buf[sctx->partial++] = 0x06;