cast6_avx_glue.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Glue Code for the AVX assembler implementation of the Cast6 Cipher
  4. *
  5. * Copyright (C) 2012 Johannes Goetzfried
  6. * <[email protected]>
  7. *
  8. * Copyright © 2013 Jussi Kivilinna <[email protected]>
  9. */
  10. #include <linux/module.h>
  11. #include <linux/types.h>
  12. #include <linux/crypto.h>
  13. #include <linux/err.h>
  14. #include <crypto/algapi.h>
  15. #include <crypto/cast6.h>
  16. #include <crypto/internal/simd.h>
  17. #include "ecb_cbc_helpers.h"
  18. #define CAST6_PARALLEL_BLOCKS 8
  19. asmlinkage void cast6_ecb_enc_8way(const void *ctx, u8 *dst, const u8 *src);
  20. asmlinkage void cast6_ecb_dec_8way(const void *ctx, u8 *dst, const u8 *src);
  21. asmlinkage void cast6_cbc_dec_8way(const void *ctx, u8 *dst, const u8 *src);
  22. static int cast6_setkey_skcipher(struct crypto_skcipher *tfm,
  23. const u8 *key, unsigned int keylen)
  24. {
  25. return cast6_setkey(&tfm->base, key, keylen);
  26. }
  27. static int ecb_encrypt(struct skcipher_request *req)
  28. {
  29. ECB_WALK_START(req, CAST6_BLOCK_SIZE, CAST6_PARALLEL_BLOCKS);
  30. ECB_BLOCK(CAST6_PARALLEL_BLOCKS, cast6_ecb_enc_8way);
  31. ECB_BLOCK(1, __cast6_encrypt);
  32. ECB_WALK_END();
  33. }
  34. static int ecb_decrypt(struct skcipher_request *req)
  35. {
  36. ECB_WALK_START(req, CAST6_BLOCK_SIZE, CAST6_PARALLEL_BLOCKS);
  37. ECB_BLOCK(CAST6_PARALLEL_BLOCKS, cast6_ecb_dec_8way);
  38. ECB_BLOCK(1, __cast6_decrypt);
  39. ECB_WALK_END();
  40. }
  41. static int cbc_encrypt(struct skcipher_request *req)
  42. {
  43. CBC_WALK_START(req, CAST6_BLOCK_SIZE, -1);
  44. CBC_ENC_BLOCK(__cast6_encrypt);
  45. CBC_WALK_END();
  46. }
  47. static int cbc_decrypt(struct skcipher_request *req)
  48. {
  49. CBC_WALK_START(req, CAST6_BLOCK_SIZE, CAST6_PARALLEL_BLOCKS);
  50. CBC_DEC_BLOCK(CAST6_PARALLEL_BLOCKS, cast6_cbc_dec_8way);
  51. CBC_DEC_BLOCK(1, __cast6_decrypt);
  52. CBC_WALK_END();
  53. }
  54. static struct skcipher_alg cast6_algs[] = {
  55. {
  56. .base.cra_name = "__ecb(cast6)",
  57. .base.cra_driver_name = "__ecb-cast6-avx",
  58. .base.cra_priority = 200,
  59. .base.cra_flags = CRYPTO_ALG_INTERNAL,
  60. .base.cra_blocksize = CAST6_BLOCK_SIZE,
  61. .base.cra_ctxsize = sizeof(struct cast6_ctx),
  62. .base.cra_module = THIS_MODULE,
  63. .min_keysize = CAST6_MIN_KEY_SIZE,
  64. .max_keysize = CAST6_MAX_KEY_SIZE,
  65. .setkey = cast6_setkey_skcipher,
  66. .encrypt = ecb_encrypt,
  67. .decrypt = ecb_decrypt,
  68. }, {
  69. .base.cra_name = "__cbc(cast6)",
  70. .base.cra_driver_name = "__cbc-cast6-avx",
  71. .base.cra_priority = 200,
  72. .base.cra_flags = CRYPTO_ALG_INTERNAL,
  73. .base.cra_blocksize = CAST6_BLOCK_SIZE,
  74. .base.cra_ctxsize = sizeof(struct cast6_ctx),
  75. .base.cra_module = THIS_MODULE,
  76. .min_keysize = CAST6_MIN_KEY_SIZE,
  77. .max_keysize = CAST6_MAX_KEY_SIZE,
  78. .ivsize = CAST6_BLOCK_SIZE,
  79. .setkey = cast6_setkey_skcipher,
  80. .encrypt = cbc_encrypt,
  81. .decrypt = cbc_decrypt,
  82. },
  83. };
  84. static struct simd_skcipher_alg *cast6_simd_algs[ARRAY_SIZE(cast6_algs)];
  85. static int __init cast6_init(void)
  86. {
  87. const char *feature_name;
  88. if (!cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM,
  89. &feature_name)) {
  90. pr_info("CPU feature '%s' is not supported.\n", feature_name);
  91. return -ENODEV;
  92. }
  93. return simd_register_skciphers_compat(cast6_algs,
  94. ARRAY_SIZE(cast6_algs),
  95. cast6_simd_algs);
  96. }
  97. static void __exit cast6_exit(void)
  98. {
  99. simd_unregister_skciphers(cast6_algs, ARRAY_SIZE(cast6_algs),
  100. cast6_simd_algs);
  101. }
  102. module_init(cast6_init);
  103. module_exit(cast6_exit);
  104. MODULE_DESCRIPTION("Cast6 Cipher Algorithm, AVX optimized");
  105. MODULE_LICENSE("GPL");
  106. MODULE_ALIAS_CRYPTO("cast6");