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