Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * Cryptographic API.
0004  *
0005  * DES & Triple DES EDE Cipher Algorithms.
0006  *
0007  * Copyright (c) 2005 Dag Arne Osvik <da@osvik.no>
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");