aegis128-neon.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Copyright (C) 2019 Linaro Ltd <ard.biesheuvel@linaro.org>
  4. */
  5. #include <asm/cpufeature.h>
  6. #include <asm/neon.h>
  7. #include "aegis.h"
  8. void crypto_aegis128_init_neon(void *state, const void *key, const void *iv);
  9. void crypto_aegis128_update_neon(void *state, const void *msg);
  10. void crypto_aegis128_encrypt_chunk_neon(void *state, void *dst, const void *src,
  11. unsigned int size);
  12. void crypto_aegis128_decrypt_chunk_neon(void *state, void *dst, const void *src,
  13. unsigned int size);
  14. void crypto_aegis128_final_neon(void *state, void *tag_xor, uint64_t assoclen,
  15. uint64_t cryptlen);
  16. int aegis128_have_aes_insn __ro_after_init;
  17. bool crypto_aegis128_have_simd(void)
  18. {
  19. if (cpu_have_feature(cpu_feature(AES))) {
  20. aegis128_have_aes_insn = 1;
  21. return true;
  22. }
  23. return IS_ENABLED(CONFIG_ARM64);
  24. }
  25. void crypto_aegis128_init_simd(union aegis_block *state,
  26. const union aegis_block *key,
  27. const u8 *iv)
  28. {
  29. kernel_neon_begin();
  30. crypto_aegis128_init_neon(state, key, iv);
  31. kernel_neon_end();
  32. }
  33. void crypto_aegis128_update_simd(union aegis_block *state, const void *msg)
  34. {
  35. kernel_neon_begin();
  36. crypto_aegis128_update_neon(state, msg);
  37. kernel_neon_end();
  38. }
  39. void crypto_aegis128_encrypt_chunk_simd(union aegis_block *state, u8 *dst,
  40. const u8 *src, unsigned int size)
  41. {
  42. kernel_neon_begin();
  43. crypto_aegis128_encrypt_chunk_neon(state, dst, src, size);
  44. kernel_neon_end();
  45. }
  46. void crypto_aegis128_decrypt_chunk_simd(union aegis_block *state, u8 *dst,
  47. const u8 *src, unsigned int size)
  48. {
  49. kernel_neon_begin();
  50. crypto_aegis128_decrypt_chunk_neon(state, dst, src, size);
  51. kernel_neon_end();
  52. }
  53. void crypto_aegis128_final_simd(union aegis_block *state,
  54. union aegis_block *tag_xor,
  55. u64 assoclen, u64 cryptlen)
  56. {
  57. kernel_neon_begin();
  58. crypto_aegis128_final_neon(state, tag_xor, assoclen, cryptlen);
  59. kernel_neon_end();
  60. }