des_generic.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Cryptographic API.
  4. *
  5. * DES & Triple DES EDE Cipher Algorithms.
  6. *
  7. * Copyright (c) 2005 Dag Arne Osvik <da@osvik.no>
  8. */
  9. #include <asm/byteorder.h>
  10. #include <linux/bitops.h>
  11. #include <linux/init.h>
  12. #include <linux/module.h>
  13. #include <linux/errno.h>
  14. #include <linux/crypto.h>
  15. #include <crypto/internal/des.h>
  16. static int des_setkey(struct crypto_tfm *tfm, const u8 *key,
  17. unsigned int keylen)
  18. {
  19. struct des_ctx *dctx = crypto_tfm_ctx(tfm);
  20. int err;
  21. err = des_expand_key(dctx, key, keylen);
  22. if (err == -ENOKEY) {
  23. if (crypto_tfm_get_flags(tfm) & CRYPTO_TFM_REQ_FORBID_WEAK_KEYS)
  24. err = -EINVAL;
  25. else
  26. err = 0;
  27. }
  28. if (err)
  29. memset(dctx, 0, sizeof(*dctx));
  30. return err;
  31. }
  32. static void crypto_des_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
  33. {
  34. const struct des_ctx *dctx = crypto_tfm_ctx(tfm);
  35. des_encrypt(dctx, dst, src);
  36. }
  37. static void crypto_des_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
  38. {
  39. const struct des_ctx *dctx = crypto_tfm_ctx(tfm);
  40. des_decrypt(dctx, dst, src);
  41. }
  42. static int des3_ede_setkey(struct crypto_tfm *tfm, const u8 *key,
  43. unsigned int keylen)
  44. {
  45. struct des3_ede_ctx *dctx = crypto_tfm_ctx(tfm);
  46. int err;
  47. err = des3_ede_expand_key(dctx, key, keylen);
  48. if (err == -ENOKEY) {
  49. if (crypto_tfm_get_flags(tfm) & CRYPTO_TFM_REQ_FORBID_WEAK_KEYS)
  50. err = -EINVAL;
  51. else
  52. err = 0;
  53. }
  54. if (err)
  55. memset(dctx, 0, sizeof(*dctx));
  56. return err;
  57. }
  58. static void crypto_des3_ede_encrypt(struct crypto_tfm *tfm, u8 *dst,
  59. const u8 *src)
  60. {
  61. const struct des3_ede_ctx *dctx = crypto_tfm_ctx(tfm);
  62. des3_ede_encrypt(dctx, dst, src);
  63. }
  64. static void crypto_des3_ede_decrypt(struct crypto_tfm *tfm, u8 *dst,
  65. const u8 *src)
  66. {
  67. const struct des3_ede_ctx *dctx = crypto_tfm_ctx(tfm);
  68. des3_ede_decrypt(dctx, dst, src);
  69. }
  70. static struct crypto_alg des_algs[2] = { {
  71. .cra_name = "des",
  72. .cra_driver_name = "des-generic",
  73. .cra_priority = 100,
  74. .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
  75. .cra_blocksize = DES_BLOCK_SIZE,
  76. .cra_ctxsize = sizeof(struct des_ctx),
  77. .cra_module = THIS_MODULE,
  78. .cra_u = { .cipher = {
  79. .cia_min_keysize = DES_KEY_SIZE,
  80. .cia_max_keysize = DES_KEY_SIZE,
  81. .cia_setkey = des_setkey,
  82. .cia_encrypt = crypto_des_encrypt,
  83. .cia_decrypt = crypto_des_decrypt } }
  84. }, {
  85. .cra_name = "des3_ede",
  86. .cra_driver_name = "des3_ede-generic",
  87. .cra_priority = 100,
  88. .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
  89. .cra_blocksize = DES3_EDE_BLOCK_SIZE,
  90. .cra_ctxsize = sizeof(struct des3_ede_ctx),
  91. .cra_module = THIS_MODULE,
  92. .cra_u = { .cipher = {
  93. .cia_min_keysize = DES3_EDE_KEY_SIZE,
  94. .cia_max_keysize = DES3_EDE_KEY_SIZE,
  95. .cia_setkey = des3_ede_setkey,
  96. .cia_encrypt = crypto_des3_ede_encrypt,
  97. .cia_decrypt = crypto_des3_ede_decrypt } }
  98. } };
  99. static int __init des_generic_mod_init(void)
  100. {
  101. return crypto_register_algs(des_algs, ARRAY_SIZE(des_algs));
  102. }
  103. static void __exit des_generic_mod_fini(void)
  104. {
  105. crypto_unregister_algs(des_algs, ARRAY_SIZE(des_algs));
  106. }
  107. subsys_initcall(des_generic_mod_init);
  108. module_exit(des_generic_mod_fini);
  109. MODULE_LICENSE("GPL");
  110. MODULE_DESCRIPTION("DES & Triple DES EDE Cipher Algorithms");
  111. MODULE_AUTHOR("Dag Arne Osvik <da@osvik.no>");
  112. MODULE_ALIAS_CRYPTO("des");
  113. MODULE_ALIAS_CRYPTO("des-generic");
  114. MODULE_ALIAS_CRYPTO("des3_ede");
  115. MODULE_ALIAS_CRYPTO("des3_ede-generic");