sha256.h 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * SHA-256 optimized for ARM64
  4. *
  5. * Copyright 2025 Google LLC
  6. */
  7. #include <asm/simd.h>
  8. #include <linux/cpufeature.h>
  9. static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_neon);
  10. static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_ce);
  11. asmlinkage void sha256_block_data_order(struct sha256_block_state *state,
  12. const u8 *data, size_t nblocks);
  13. asmlinkage void sha256_block_neon(struct sha256_block_state *state,
  14. const u8 *data, size_t nblocks);
  15. asmlinkage size_t __sha256_ce_transform(struct sha256_block_state *state,
  16. const u8 *data, size_t nblocks);
  17. static void sha256_blocks(struct sha256_block_state *state,
  18. const u8 *data, size_t nblocks)
  19. {
  20. if (IS_ENABLED(CONFIG_KERNEL_MODE_NEON) &&
  21. static_branch_likely(&have_neon) && likely(may_use_simd())) {
  22. if (static_branch_likely(&have_ce)) {
  23. do {
  24. size_t rem;
  25. scoped_ksimd()
  26. rem = __sha256_ce_transform(state, data,
  27. nblocks);
  28. data += (nblocks - rem) * SHA256_BLOCK_SIZE;
  29. nblocks = rem;
  30. } while (nblocks);
  31. } else {
  32. scoped_ksimd()
  33. sha256_block_neon(state, data, nblocks);
  34. }
  35. } else {
  36. sha256_block_data_order(state, data, nblocks);
  37. }
  38. }
  39. static_assert(offsetof(struct __sha256_ctx, state) == 0);
  40. static_assert(offsetof(struct __sha256_ctx, bytecount) == 32);
  41. static_assert(offsetof(struct __sha256_ctx, buf) == 40);
  42. asmlinkage void sha256_ce_finup2x(const struct __sha256_ctx *ctx,
  43. const u8 *data1, const u8 *data2, int len,
  44. u8 out1[SHA256_DIGEST_SIZE],
  45. u8 out2[SHA256_DIGEST_SIZE]);
  46. #define sha256_finup_2x_arch sha256_finup_2x_arch
  47. static bool sha256_finup_2x_arch(const struct __sha256_ctx *ctx,
  48. const u8 *data1, const u8 *data2, size_t len,
  49. u8 out1[SHA256_DIGEST_SIZE],
  50. u8 out2[SHA256_DIGEST_SIZE])
  51. {
  52. /*
  53. * The assembly requires len >= SHA256_BLOCK_SIZE && len <= INT_MAX.
  54. * Further limit len to 65536 to avoid spending too long with preemption
  55. * disabled. (Of course, in practice len is nearly always 4096 anyway.)
  56. */
  57. if (IS_ENABLED(CONFIG_KERNEL_MODE_NEON) &&
  58. static_branch_likely(&have_ce) && len >= SHA256_BLOCK_SIZE &&
  59. len <= 65536 && likely(may_use_simd())) {
  60. scoped_ksimd()
  61. sha256_ce_finup2x(ctx, data1, data2, len, out1, out2);
  62. kmsan_unpoison_memory(out1, SHA256_DIGEST_SIZE);
  63. kmsan_unpoison_memory(out2, SHA256_DIGEST_SIZE);
  64. return true;
  65. }
  66. return false;
  67. }
  68. static bool sha256_finup_2x_is_optimized_arch(void)
  69. {
  70. return static_key_enabled(&have_ce);
  71. }
  72. #ifdef CONFIG_KERNEL_MODE_NEON
  73. #define sha256_mod_init_arch sha256_mod_init_arch
  74. static void sha256_mod_init_arch(void)
  75. {
  76. if (cpu_have_named_feature(ASIMD)) {
  77. static_branch_enable(&have_neon);
  78. if (cpu_have_named_feature(SHA2))
  79. static_branch_enable(&have_ce);
  80. }
  81. }
  82. #endif /* CONFIG_KERNEL_MODE_NEON */