0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <asm/byteorder.h>
0011 #include <linux/bitops.h>
0012 #include <linux/init.h>
0013 #include <linux/module.h>
0014 #include <linux/errno.h>
0015 #include <linux/crypto.h>
0016
0017 #include <crypto/internal/des.h>
0018
0019 static int des_setkey(struct crypto_tfm *tfm, const u8 *key,
0020 unsigned int keylen)
0021 {
0022 struct des_ctx *dctx = crypto_tfm_ctx(tfm);
0023 int err;
0024
0025 err = des_expand_key(dctx, key, keylen);
0026 if (err == -ENOKEY) {
0027 if (crypto_tfm_get_flags(tfm) & CRYPTO_TFM_REQ_FORBID_WEAK_KEYS)
0028 err = -EINVAL;
0029 else
0030 err = 0;
0031 }
0032 if (err)
0033 memset(dctx, 0, sizeof(*dctx));
0034 return err;
0035 }
0036
0037 static void crypto_des_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
0038 {
0039 const struct des_ctx *dctx = crypto_tfm_ctx(tfm);
0040
0041 des_encrypt(dctx, dst, src);
0042 }
0043
0044 static void crypto_des_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
0045 {
0046 const struct des_ctx *dctx = crypto_tfm_ctx(tfm);
0047
0048 des_decrypt(dctx, dst, src);
0049 }
0050
0051 static int des3_ede_setkey(struct crypto_tfm *tfm, const u8 *key,
0052 unsigned int keylen)
0053 {
0054 struct des3_ede_ctx *dctx = crypto_tfm_ctx(tfm);
0055 int err;
0056
0057 err = des3_ede_expand_key(dctx, key, keylen);
0058 if (err == -ENOKEY) {
0059 if (crypto_tfm_get_flags(tfm) & CRYPTO_TFM_REQ_FORBID_WEAK_KEYS)
0060 err = -EINVAL;
0061 else
0062 err = 0;
0063 }
0064 if (err)
0065 memset(dctx, 0, sizeof(*dctx));
0066 return err;
0067 }
0068
0069 static void crypto_des3_ede_encrypt(struct crypto_tfm *tfm, u8 *dst,
0070 const u8 *src)
0071 {
0072 const struct des3_ede_ctx *dctx = crypto_tfm_ctx(tfm);
0073
0074 des3_ede_encrypt(dctx, dst, src);
0075 }
0076
0077 static void crypto_des3_ede_decrypt(struct crypto_tfm *tfm, u8 *dst,
0078 const u8 *src)
0079 {
0080 const struct des3_ede_ctx *dctx = crypto_tfm_ctx(tfm);
0081
0082 des3_ede_decrypt(dctx, dst, src);
0083 }
0084
0085 static struct crypto_alg des_algs[2] = { {
0086 .cra_name = "des",
0087 .cra_driver_name = "des-generic",
0088 .cra_priority = 100,
0089 .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
0090 .cra_blocksize = DES_BLOCK_SIZE,
0091 .cra_ctxsize = sizeof(struct des_ctx),
0092 .cra_module = THIS_MODULE,
0093 .cra_u = { .cipher = {
0094 .cia_min_keysize = DES_KEY_SIZE,
0095 .cia_max_keysize = DES_KEY_SIZE,
0096 .cia_setkey = des_setkey,
0097 .cia_encrypt = crypto_des_encrypt,
0098 .cia_decrypt = crypto_des_decrypt } }
0099 }, {
0100 .cra_name = "des3_ede",
0101 .cra_driver_name = "des3_ede-generic",
0102 .cra_priority = 100,
0103 .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
0104 .cra_blocksize = DES3_EDE_BLOCK_SIZE,
0105 .cra_ctxsize = sizeof(struct des3_ede_ctx),
0106 .cra_module = THIS_MODULE,
0107 .cra_u = { .cipher = {
0108 .cia_min_keysize = DES3_EDE_KEY_SIZE,
0109 .cia_max_keysize = DES3_EDE_KEY_SIZE,
0110 .cia_setkey = des3_ede_setkey,
0111 .cia_encrypt = crypto_des3_ede_encrypt,
0112 .cia_decrypt = crypto_des3_ede_decrypt } }
0113 } };
0114
0115 static int __init des_generic_mod_init(void)
0116 {
0117 return crypto_register_algs(des_algs, ARRAY_SIZE(des_algs));
0118 }
0119
0120 static void __exit des_generic_mod_fini(void)
0121 {
0122 crypto_unregister_algs(des_algs, ARRAY_SIZE(des_algs));
0123 }
0124
0125 subsys_initcall(des_generic_mod_init);
0126 module_exit(des_generic_mod_fini);
0127
0128 MODULE_LICENSE("GPL");
0129 MODULE_DESCRIPTION("DES & Triple DES EDE Cipher Algorithms");
0130 MODULE_AUTHOR("Dag Arne Osvik <da@osvik.no>");
0131 MODULE_ALIAS_CRYPTO("des");
0132 MODULE_ALIAS_CRYPTO("des-generic");
0133 MODULE_ALIAS_CRYPTO("des3_ede");
0134 MODULE_ALIAS_CRYPTO("des3_ede-generic");