poly1305.h 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * OpenSSL/Cryptogams accelerated Poly1305 transform for arm64
  4. *
  5. * Copyright (C) 2019 Linaro Ltd. <ard.biesheuvel@linaro.org>
  6. */
  7. #include <asm/hwcap.h>
  8. #include <asm/simd.h>
  9. #include <linux/cpufeature.h>
  10. #include <linux/jump_label.h>
  11. #include <linux/kernel.h>
  12. asmlinkage void poly1305_block_init(struct poly1305_block_state *state,
  13. const u8 raw_key[POLY1305_BLOCK_SIZE]);
  14. asmlinkage void poly1305_blocks_arm64(struct poly1305_block_state *state,
  15. const u8 *src, u32 len, u32 hibit);
  16. asmlinkage void poly1305_blocks_neon(struct poly1305_block_state *state,
  17. const u8 *src, u32 len, u32 hibit);
  18. asmlinkage void poly1305_emit(const struct poly1305_state *state,
  19. u8 digest[POLY1305_DIGEST_SIZE],
  20. const u32 nonce[4]);
  21. static __ro_after_init DEFINE_STATIC_KEY_FALSE(have_neon);
  22. static void poly1305_blocks(struct poly1305_block_state *state, const u8 *src,
  23. unsigned int len, u32 padbit)
  24. {
  25. if (static_branch_likely(&have_neon) && likely(may_use_simd())) {
  26. do {
  27. unsigned int todo = min_t(unsigned int, len, SZ_4K);
  28. scoped_ksimd()
  29. poly1305_blocks_neon(state, src, todo, padbit);
  30. len -= todo;
  31. src += todo;
  32. } while (len);
  33. } else
  34. poly1305_blocks_arm64(state, src, len, padbit);
  35. }
  36. #define poly1305_mod_init_arch poly1305_mod_init_arch
  37. static void poly1305_mod_init_arch(void)
  38. {
  39. if (cpu_have_named_feature(ASIMD))
  40. static_branch_enable(&have_neon);
  41. }