sha512-neon-glue.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * sha512-neon-glue.c - accelerated SHA-384/512 for ARM NEON
  4. *
  5. * Copyright (C) 2015 Linaro Ltd <[email protected]>
  6. */
  7. #include <crypto/internal/hash.h>
  8. #include <crypto/internal/simd.h>
  9. #include <crypto/sha2.h>
  10. #include <crypto/sha512_base.h>
  11. #include <linux/crypto.h>
  12. #include <linux/module.h>
  13. #include <asm/simd.h>
  14. #include <asm/neon.h>
  15. #include "sha512.h"
  16. MODULE_ALIAS_CRYPTO("sha384-neon");
  17. MODULE_ALIAS_CRYPTO("sha512-neon");
  18. asmlinkage void sha512_block_data_order_neon(u64 *state, u8 const *src,
  19. int blocks);
  20. static int sha512_neon_update(struct shash_desc *desc, const u8 *data,
  21. unsigned int len)
  22. {
  23. struct sha512_state *sctx = shash_desc_ctx(desc);
  24. if (!crypto_simd_usable() ||
  25. (sctx->count[0] % SHA512_BLOCK_SIZE) + len < SHA512_BLOCK_SIZE)
  26. return sha512_arm_update(desc, data, len);
  27. kernel_neon_begin();
  28. sha512_base_do_update(desc, data, len,
  29. (sha512_block_fn *)sha512_block_data_order_neon);
  30. kernel_neon_end();
  31. return 0;
  32. }
  33. static int sha512_neon_finup(struct shash_desc *desc, const u8 *data,
  34. unsigned int len, u8 *out)
  35. {
  36. if (!crypto_simd_usable())
  37. return sha512_arm_finup(desc, data, len, out);
  38. kernel_neon_begin();
  39. if (len)
  40. sha512_base_do_update(desc, data, len,
  41. (sha512_block_fn *)sha512_block_data_order_neon);
  42. sha512_base_do_finalize(desc,
  43. (sha512_block_fn *)sha512_block_data_order_neon);
  44. kernel_neon_end();
  45. return sha512_base_finish(desc, out);
  46. }
  47. static int sha512_neon_final(struct shash_desc *desc, u8 *out)
  48. {
  49. return sha512_neon_finup(desc, NULL, 0, out);
  50. }
  51. struct shash_alg sha512_neon_algs[] = { {
  52. .init = sha384_base_init,
  53. .update = sha512_neon_update,
  54. .final = sha512_neon_final,
  55. .finup = sha512_neon_finup,
  56. .descsize = sizeof(struct sha512_state),
  57. .digestsize = SHA384_DIGEST_SIZE,
  58. .base = {
  59. .cra_name = "sha384",
  60. .cra_driver_name = "sha384-neon",
  61. .cra_priority = 300,
  62. .cra_blocksize = SHA384_BLOCK_SIZE,
  63. .cra_module = THIS_MODULE,
  64. }
  65. }, {
  66. .init = sha512_base_init,
  67. .update = sha512_neon_update,
  68. .final = sha512_neon_final,
  69. .finup = sha512_neon_finup,
  70. .descsize = sizeof(struct sha512_state),
  71. .digestsize = SHA512_DIGEST_SIZE,
  72. .base = {
  73. .cra_name = "sha512",
  74. .cra_driver_name = "sha512-neon",
  75. .cra_priority = 300,
  76. .cra_blocksize = SHA512_BLOCK_SIZE,
  77. .cra_module = THIS_MODULE,
  78. }
  79. } };