sha1_neon_glue.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Glue code for the SHA1 Secure Hash Algorithm assembler implementation using
  4. * ARM NEON instructions.
  5. *
  6. * Copyright © 2014 Jussi Kivilinna <[email protected]>
  7. *
  8. * This file is based on sha1_generic.c and sha1_ssse3_glue.c:
  9. * Copyright (c) Alan Smithee.
  10. * Copyright (c) Andrew McDonald <[email protected]>
  11. * Copyright (c) Jean-Francois Dive <[email protected]>
  12. * Copyright (c) Mathias Krause <[email protected]>
  13. * Copyright (c) Chandramouli Narayanan <[email protected]>
  14. */
  15. #include <crypto/internal/hash.h>
  16. #include <crypto/internal/simd.h>
  17. #include <linux/init.h>
  18. #include <linux/module.h>
  19. #include <linux/mm.h>
  20. #include <linux/types.h>
  21. #include <crypto/sha1.h>
  22. #include <crypto/sha1_base.h>
  23. #include <asm/neon.h>
  24. #include <asm/simd.h>
  25. #include "sha1.h"
  26. asmlinkage void sha1_transform_neon(void *state_h, const char *data,
  27. unsigned int rounds);
  28. static int sha1_neon_update(struct shash_desc *desc, const u8 *data,
  29. unsigned int len)
  30. {
  31. struct sha1_state *sctx = shash_desc_ctx(desc);
  32. if (!crypto_simd_usable() ||
  33. (sctx->count % SHA1_BLOCK_SIZE) + len < SHA1_BLOCK_SIZE)
  34. return sha1_update_arm(desc, data, len);
  35. kernel_neon_begin();
  36. sha1_base_do_update(desc, data, len,
  37. (sha1_block_fn *)sha1_transform_neon);
  38. kernel_neon_end();
  39. return 0;
  40. }
  41. static int sha1_neon_finup(struct shash_desc *desc, const u8 *data,
  42. unsigned int len, u8 *out)
  43. {
  44. if (!crypto_simd_usable())
  45. return sha1_finup_arm(desc, data, len, out);
  46. kernel_neon_begin();
  47. if (len)
  48. sha1_base_do_update(desc, data, len,
  49. (sha1_block_fn *)sha1_transform_neon);
  50. sha1_base_do_finalize(desc, (sha1_block_fn *)sha1_transform_neon);
  51. kernel_neon_end();
  52. return sha1_base_finish(desc, out);
  53. }
  54. static int sha1_neon_final(struct shash_desc *desc, u8 *out)
  55. {
  56. return sha1_neon_finup(desc, NULL, 0, out);
  57. }
  58. static struct shash_alg alg = {
  59. .digestsize = SHA1_DIGEST_SIZE,
  60. .init = sha1_base_init,
  61. .update = sha1_neon_update,
  62. .final = sha1_neon_final,
  63. .finup = sha1_neon_finup,
  64. .descsize = sizeof(struct sha1_state),
  65. .base = {
  66. .cra_name = "sha1",
  67. .cra_driver_name = "sha1-neon",
  68. .cra_priority = 250,
  69. .cra_blocksize = SHA1_BLOCK_SIZE,
  70. .cra_module = THIS_MODULE,
  71. }
  72. };
  73. static int __init sha1_neon_mod_init(void)
  74. {
  75. if (!cpu_has_neon())
  76. return -ENODEV;
  77. return crypto_register_shash(&alg);
  78. }
  79. static void __exit sha1_neon_mod_fini(void)
  80. {
  81. crypto_unregister_shash(&alg);
  82. }
  83. module_init(sha1_neon_mod_init);
  84. module_exit(sha1_neon_mod_fini);
  85. MODULE_LICENSE("GPL");
  86. MODULE_DESCRIPTION("SHA1 Secure Hash Algorithm, NEON accelerated");
  87. MODULE_ALIAS_CRYPTO("sha1");