root/crypto/des_generic.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. des_setkey
  2. crypto_des_encrypt
  3. crypto_des_decrypt
  4. des3_ede_setkey
  5. crypto_des3_ede_encrypt
  6. crypto_des3_ede_decrypt
  7. des_generic_mod_init
  8. des_generic_mod_fini

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

/* [<][>][^][v][top][bottom][index][help] */