aes-armv8-aarch32-glue.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /*
  2. * Glue Code for the asm optimized version of the AES Cipher Algorithm
  3. */
  4. #include <asm/neon.h>
  5. #include <linux/module.h>
  6. #include <linux/crypto.h>
  7. #include <crypto/aes.h>
  8. #include "aes-armv8-aarch32-glue.h"
  9. static void aes_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
  10. {
  11. struct AES_CTX *ctx = crypto_tfm_ctx(tfm);
  12. kernel_neon_begin();
  13. AES_encrypt_ce(src, dst, &ctx->enc_key);
  14. kernel_neon_end();
  15. }
  16. static void aes_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
  17. {
  18. struct AES_CTX *ctx = crypto_tfm_ctx(tfm);
  19. kernel_neon_begin();
  20. AES_decrypt_ce(src, dst, &ctx->dec_key);
  21. kernel_neon_end();
  22. }
  23. static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
  24. unsigned int key_len)
  25. {
  26. struct AES_CTX *ctx = crypto_tfm_ctx(tfm);
  27. switch (key_len) {
  28. case AES_KEYSIZE_128:
  29. key_len = 128;
  30. break;
  31. case AES_KEYSIZE_192:
  32. key_len = 192;
  33. break;
  34. case AES_KEYSIZE_256:
  35. key_len = 256;
  36. break;
  37. default:
  38. tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
  39. return -EINVAL;
  40. }
  41. kernel_neon_begin();
  42. if (private_AES_set_encrypt_key_ce(in_key, key_len, &ctx->enc_key) == -1) {
  43. tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
  44. return -EINVAL;
  45. }
  46. /* private_AES_set_decrypt_key expects an encryption key as input */
  47. ctx->dec_key = ctx->enc_key;
  48. if (private_AES_set_decrypt_key_ce(in_key, key_len, &ctx->dec_key) == -1) {
  49. tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
  50. return -EINVAL;
  51. }
  52. kernel_neon_end();
  53. return 0;
  54. }
  55. static struct crypto_alg aes_alg = {
  56. .cra_name = "aes",
  57. .cra_driver_name = "aes-ce",
  58. .cra_priority = 300,
  59. .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
  60. .cra_blocksize = AES_BLOCK_SIZE,
  61. .cra_ctxsize = sizeof(struct AES_CTX),
  62. .cra_module = THIS_MODULE,
  63. .cra_list = LIST_HEAD_INIT(aes_alg.cra_list),
  64. .cra_u = {
  65. .cipher = {
  66. .cia_min_keysize = AES_MIN_KEY_SIZE,
  67. .cia_max_keysize = AES_MAX_KEY_SIZE,
  68. .cia_setkey = aes_set_key,
  69. .cia_encrypt = aes_encrypt,
  70. .cia_decrypt = aes_decrypt
  71. }
  72. }
  73. };
  74. static int __init aes_init(void)
  75. {
  76. return crypto_register_alg(&aes_alg);
  77. }
  78. static void __exit aes_fini(void)
  79. {
  80. crypto_unregister_alg(&aes_alg);
  81. }
  82. module_init(aes_init);
  83. module_exit(aes_fini);
  84. MODULE_DESCRIPTION("ARMv8 Aarch32 Crypto Extensions");
  85. MODULE_LICENSE("GPL");
  86. MODULE_ALIAS("aes");
  87. MODULE_ALIAS("aes-ce");
  88. MODULE_AUTHOR("Mediatek Inc.");