sm4-ce-cipher-glue.c 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <asm/neon.h>
  3. #include <asm/simd.h>
  4. #include <crypto/sm4.h>
  5. #include <crypto/internal/simd.h>
  6. #include <linux/module.h>
  7. #include <linux/cpufeature.h>
  8. #include <linux/crypto.h>
  9. #include <linux/types.h>
  10. MODULE_ALIAS_CRYPTO("sm4");
  11. MODULE_ALIAS_CRYPTO("sm4-ce");
  12. MODULE_DESCRIPTION("SM4 symmetric cipher using ARMv8 Crypto Extensions");
  13. MODULE_AUTHOR("Ard Biesheuvel <[email protected]>");
  14. MODULE_LICENSE("GPL v2");
  15. asmlinkage void sm4_ce_do_crypt(const u32 *rk, void *out, const void *in);
  16. static int sm4_ce_setkey(struct crypto_tfm *tfm, const u8 *key,
  17. unsigned int key_len)
  18. {
  19. struct sm4_ctx *ctx = crypto_tfm_ctx(tfm);
  20. return sm4_expandkey(ctx, key, key_len);
  21. }
  22. static void sm4_ce_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
  23. {
  24. const struct sm4_ctx *ctx = crypto_tfm_ctx(tfm);
  25. if (!crypto_simd_usable()) {
  26. sm4_crypt_block(ctx->rkey_enc, out, in);
  27. } else {
  28. kernel_neon_begin();
  29. sm4_ce_do_crypt(ctx->rkey_enc, out, in);
  30. kernel_neon_end();
  31. }
  32. }
  33. static void sm4_ce_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
  34. {
  35. const struct sm4_ctx *ctx = crypto_tfm_ctx(tfm);
  36. if (!crypto_simd_usable()) {
  37. sm4_crypt_block(ctx->rkey_dec, out, in);
  38. } else {
  39. kernel_neon_begin();
  40. sm4_ce_do_crypt(ctx->rkey_dec, out, in);
  41. kernel_neon_end();
  42. }
  43. }
  44. static struct crypto_alg sm4_ce_alg = {
  45. .cra_name = "sm4",
  46. .cra_driver_name = "sm4-ce",
  47. .cra_priority = 300,
  48. .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
  49. .cra_blocksize = SM4_BLOCK_SIZE,
  50. .cra_ctxsize = sizeof(struct sm4_ctx),
  51. .cra_module = THIS_MODULE,
  52. .cra_u.cipher = {
  53. .cia_min_keysize = SM4_KEY_SIZE,
  54. .cia_max_keysize = SM4_KEY_SIZE,
  55. .cia_setkey = sm4_ce_setkey,
  56. .cia_encrypt = sm4_ce_encrypt,
  57. .cia_decrypt = sm4_ce_decrypt
  58. }
  59. };
  60. static int __init sm4_ce_mod_init(void)
  61. {
  62. return crypto_register_alg(&sm4_ce_alg);
  63. }
  64. static void __exit sm4_ce_mod_fini(void)
  65. {
  66. crypto_unregister_alg(&sm4_ce_alg);
  67. }
  68. module_cpu_feature_match(SM4, sm4_ce_mod_init);
  69. module_exit(sm4_ce_mod_fini);