root/crypto/cbc.c

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

DEFINITIONS

This source file includes following definitions.
  1. crypto_cbc_encrypt_one
  2. crypto_cbc_encrypt
  3. crypto_cbc_decrypt_one
  4. crypto_cbc_decrypt
  5. crypto_cbc_create
  6. crypto_cbc_module_init
  7. crypto_cbc_module_exit

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  * CBC: Cipher Block Chaining mode
   4  *
   5  * Copyright (c) 2006-2016 Herbert Xu <herbert@gondor.apana.org.au>
   6  */
   7 
   8 #include <crypto/algapi.h>
   9 #include <crypto/cbc.h>
  10 #include <crypto/internal/skcipher.h>
  11 #include <linux/err.h>
  12 #include <linux/init.h>
  13 #include <linux/kernel.h>
  14 #include <linux/log2.h>
  15 #include <linux/module.h>
  16 
  17 static inline void crypto_cbc_encrypt_one(struct crypto_skcipher *tfm,
  18                                           const u8 *src, u8 *dst)
  19 {
  20         crypto_cipher_encrypt_one(skcipher_cipher_simple(tfm), dst, src);
  21 }
  22 
  23 static int crypto_cbc_encrypt(struct skcipher_request *req)
  24 {
  25         return crypto_cbc_encrypt_walk(req, crypto_cbc_encrypt_one);
  26 }
  27 
  28 static inline void crypto_cbc_decrypt_one(struct crypto_skcipher *tfm,
  29                                           const u8 *src, u8 *dst)
  30 {
  31         crypto_cipher_decrypt_one(skcipher_cipher_simple(tfm), dst, src);
  32 }
  33 
  34 static int crypto_cbc_decrypt(struct skcipher_request *req)
  35 {
  36         struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
  37         struct skcipher_walk walk;
  38         int err;
  39 
  40         err = skcipher_walk_virt(&walk, req, false);
  41 
  42         while (walk.nbytes) {
  43                 err = crypto_cbc_decrypt_blocks(&walk, tfm,
  44                                                 crypto_cbc_decrypt_one);
  45                 err = skcipher_walk_done(&walk, err);
  46         }
  47 
  48         return err;
  49 }
  50 
  51 static int crypto_cbc_create(struct crypto_template *tmpl, struct rtattr **tb)
  52 {
  53         struct skcipher_instance *inst;
  54         struct crypto_alg *alg;
  55         int err;
  56 
  57         inst = skcipher_alloc_instance_simple(tmpl, tb, &alg);
  58         if (IS_ERR(inst))
  59                 return PTR_ERR(inst);
  60 
  61         err = -EINVAL;
  62         if (!is_power_of_2(alg->cra_blocksize))
  63                 goto out_free_inst;
  64 
  65         inst->alg.encrypt = crypto_cbc_encrypt;
  66         inst->alg.decrypt = crypto_cbc_decrypt;
  67 
  68         err = skcipher_register_instance(tmpl, inst);
  69         if (err)
  70                 goto out_free_inst;
  71         goto out_put_alg;
  72 
  73 out_free_inst:
  74         inst->free(inst);
  75 out_put_alg:
  76         crypto_mod_put(alg);
  77         return err;
  78 }
  79 
  80 static struct crypto_template crypto_cbc_tmpl = {
  81         .name = "cbc",
  82         .create = crypto_cbc_create,
  83         .module = THIS_MODULE,
  84 };
  85 
  86 static int __init crypto_cbc_module_init(void)
  87 {
  88         return crypto_register_template(&crypto_cbc_tmpl);
  89 }
  90 
  91 static void __exit crypto_cbc_module_exit(void)
  92 {
  93         crypto_unregister_template(&crypto_cbc_tmpl);
  94 }
  95 
  96 subsys_initcall(crypto_cbc_module_init);
  97 module_exit(crypto_cbc_module_exit);
  98 
  99 MODULE_LICENSE("GPL");
 100 MODULE_DESCRIPTION("CBC block cipher mode of operation");
 101 MODULE_ALIAS_CRYPTO("cbc");

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