1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * ECB: Electronic CodeBook mode
5 * Copyright (c) 2006 Herbert Xu <herbert@gondor.apana.org.au>
8 #include <crypto/internal/cipher.h>
9 #include <crypto/internal/skcipher.h>
10 #include <linux/err.h>
11 #include <linux/init.h>
12 #include <linux/kernel.h>
13 #include <linux/module.h>
14 #include <linux/slab.h>
16 static int crypto_ecb_crypt(struct crypto_cipher
*cipher
, const u8
*src
,
17 u8
*dst
, unsigned nbytes
, bool final
,
18 void (*fn
)(struct crypto_tfm
*, u8
*, const u8
*))
20 const unsigned int bsize
= crypto_cipher_blocksize(cipher
);
22 while (nbytes
>= bsize
) {
23 fn(crypto_cipher_tfm(cipher
), dst
, src
);
31 return nbytes
&& final
? -EINVAL
: nbytes
;
34 static int crypto_ecb_encrypt2(struct crypto_lskcipher
*tfm
, const u8
*src
,
35 u8
*dst
, unsigned len
, u8
*iv
, u32 flags
)
37 struct crypto_cipher
**ctx
= crypto_lskcipher_ctx(tfm
);
38 struct crypto_cipher
*cipher
= *ctx
;
40 return crypto_ecb_crypt(cipher
, src
, dst
, len
,
41 flags
& CRYPTO_LSKCIPHER_FLAG_FINAL
,
42 crypto_cipher_alg(cipher
)->cia_encrypt
);
45 static int crypto_ecb_decrypt2(struct crypto_lskcipher
*tfm
, const u8
*src
,
46 u8
*dst
, unsigned len
, u8
*iv
, u32 flags
)
48 struct crypto_cipher
**ctx
= crypto_lskcipher_ctx(tfm
);
49 struct crypto_cipher
*cipher
= *ctx
;
51 return crypto_ecb_crypt(cipher
, src
, dst
, len
,
52 flags
& CRYPTO_LSKCIPHER_FLAG_FINAL
,
53 crypto_cipher_alg(cipher
)->cia_decrypt
);
56 static int lskcipher_setkey_simple2(struct crypto_lskcipher
*tfm
,
57 const u8
*key
, unsigned int keylen
)
59 struct crypto_cipher
**ctx
= crypto_lskcipher_ctx(tfm
);
60 struct crypto_cipher
*cipher
= *ctx
;
62 crypto_cipher_clear_flags(cipher
, CRYPTO_TFM_REQ_MASK
);
63 crypto_cipher_set_flags(cipher
, crypto_lskcipher_get_flags(tfm
) &
65 return crypto_cipher_setkey(cipher
, key
, keylen
);
68 static int lskcipher_init_tfm_simple2(struct crypto_lskcipher
*tfm
)
70 struct lskcipher_instance
*inst
= lskcipher_alg_instance(tfm
);
71 struct crypto_cipher
**ctx
= crypto_lskcipher_ctx(tfm
);
72 struct crypto_cipher_spawn
*spawn
;
73 struct crypto_cipher
*cipher
;
75 spawn
= lskcipher_instance_ctx(inst
);
76 cipher
= crypto_spawn_cipher(spawn
);
78 return PTR_ERR(cipher
);
84 static void lskcipher_exit_tfm_simple2(struct crypto_lskcipher
*tfm
)
86 struct crypto_cipher
**ctx
= crypto_lskcipher_ctx(tfm
);
88 crypto_free_cipher(*ctx
);
91 static void lskcipher_free_instance_simple2(struct lskcipher_instance
*inst
)
93 crypto_drop_cipher(lskcipher_instance_ctx(inst
));
97 static struct lskcipher_instance
*lskcipher_alloc_instance_simple2(
98 struct crypto_template
*tmpl
, struct rtattr
**tb
)
100 struct crypto_cipher_spawn
*spawn
;
101 struct lskcipher_instance
*inst
;
102 struct crypto_alg
*cipher_alg
;
106 err
= crypto_check_attr_type(tb
, CRYPTO_ALG_TYPE_LSKCIPHER
, &mask
);
110 inst
= kzalloc(sizeof(*inst
) + sizeof(*spawn
), GFP_KERNEL
);
112 return ERR_PTR(-ENOMEM
);
113 spawn
= lskcipher_instance_ctx(inst
);
115 err
= crypto_grab_cipher(spawn
, lskcipher_crypto_instance(inst
),
116 crypto_attr_alg_name(tb
[1]), 0, mask
);
119 cipher_alg
= crypto_spawn_cipher_alg(spawn
);
121 err
= crypto_inst_setname(lskcipher_crypto_instance(inst
), tmpl
->name
,
126 inst
->free
= lskcipher_free_instance_simple2
;
128 /* Default algorithm properties, can be overridden */
129 inst
->alg
.co
.base
.cra_blocksize
= cipher_alg
->cra_blocksize
;
130 inst
->alg
.co
.base
.cra_alignmask
= cipher_alg
->cra_alignmask
;
131 inst
->alg
.co
.base
.cra_priority
= cipher_alg
->cra_priority
;
132 inst
->alg
.co
.min_keysize
= cipher_alg
->cra_cipher
.cia_min_keysize
;
133 inst
->alg
.co
.max_keysize
= cipher_alg
->cra_cipher
.cia_max_keysize
;
134 inst
->alg
.co
.ivsize
= cipher_alg
->cra_blocksize
;
136 /* Use struct crypto_cipher * by default, can be overridden */
137 inst
->alg
.co
.base
.cra_ctxsize
= sizeof(struct crypto_cipher
*);
138 inst
->alg
.setkey
= lskcipher_setkey_simple2
;
139 inst
->alg
.init
= lskcipher_init_tfm_simple2
;
140 inst
->alg
.exit
= lskcipher_exit_tfm_simple2
;
145 lskcipher_free_instance_simple2(inst
);
149 static int crypto_ecb_create2(struct crypto_template
*tmpl
, struct rtattr
**tb
)
151 struct lskcipher_instance
*inst
;
154 inst
= lskcipher_alloc_instance_simple2(tmpl
, tb
);
156 return PTR_ERR(inst
);
158 /* ECB mode doesn't take an IV */
159 inst
->alg
.co
.ivsize
= 0;
161 inst
->alg
.encrypt
= crypto_ecb_encrypt2
;
162 inst
->alg
.decrypt
= crypto_ecb_decrypt2
;
164 err
= lskcipher_register_instance(tmpl
, inst
);
171 static int crypto_ecb_create(struct crypto_template
*tmpl
, struct rtattr
**tb
)
173 struct crypto_lskcipher_spawn
*spawn
;
174 struct lskcipher_alg
*cipher_alg
;
175 struct lskcipher_instance
*inst
;
178 inst
= lskcipher_alloc_instance_simple(tmpl
, tb
);
180 err
= crypto_ecb_create2(tmpl
, tb
);
184 spawn
= lskcipher_instance_ctx(inst
);
185 cipher_alg
= crypto_lskcipher_spawn_alg(spawn
);
187 /* ECB mode doesn't take an IV */
188 inst
->alg
.co
.ivsize
= 0;
189 if (cipher_alg
->co
.ivsize
)
192 inst
->alg
.co
.base
.cra_ctxsize
= cipher_alg
->co
.base
.cra_ctxsize
;
193 inst
->alg
.setkey
= cipher_alg
->setkey
;
194 inst
->alg
.encrypt
= cipher_alg
->encrypt
;
195 inst
->alg
.decrypt
= cipher_alg
->decrypt
;
196 inst
->alg
.init
= cipher_alg
->init
;
197 inst
->alg
.exit
= cipher_alg
->exit
;
199 err
= lskcipher_register_instance(tmpl
, inst
);
206 static struct crypto_template crypto_ecb_tmpl
= {
208 .create
= crypto_ecb_create
,
209 .module
= THIS_MODULE
,
212 static int __init
crypto_ecb_module_init(void)
214 return crypto_register_template(&crypto_ecb_tmpl
);
217 static void __exit
crypto_ecb_module_exit(void)
219 crypto_unregister_template(&crypto_ecb_tmpl
);
222 subsys_initcall(crypto_ecb_module_init
);
223 module_exit(crypto_ecb_module_exit
);
225 MODULE_LICENSE("GPL");
226 MODULE_DESCRIPTION("ECB block cipher mode of operation");
227 MODULE_ALIAS_CRYPTO("ecb");
228 MODULE_IMPORT_NS("CRYPTO_INTERNAL");