sha1.h 896 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * SHA-1 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_ce);
  10. asmlinkage size_t __sha1_ce_transform(struct sha1_block_state *state,
  11. const u8 *data, size_t nblocks);
  12. static void sha1_blocks(struct sha1_block_state *state,
  13. const u8 *data, size_t nblocks)
  14. {
  15. if (static_branch_likely(&have_ce) && likely(may_use_simd())) {
  16. do {
  17. size_t rem;
  18. scoped_ksimd()
  19. rem = __sha1_ce_transform(state, data, nblocks);
  20. data += (nblocks - rem) * SHA1_BLOCK_SIZE;
  21. nblocks = rem;
  22. } while (nblocks);
  23. } else {
  24. sha1_blocks_generic(state, data, nblocks);
  25. }
  26. }
  27. #define sha1_mod_init_arch sha1_mod_init_arch
  28. static void sha1_mod_init_arch(void)
  29. {
  30. if (cpu_have_named_feature(SHA1))
  31. static_branch_enable(&have_ce);
  32. }