diff options
author | Eric Biggers <ebiggers@google.com> | 2019-01-03 23:16:15 -0500 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2019-01-11 01:16:57 -0500 |
commit | a5a84a9dbf3d3319c022ff3c9ea76ed3dc332978 (patch) | |
tree | 922e14925a9b2442eea81377beba18e14377b501 /crypto | |
parent | 0872da16dd632e5d1d3f80388f7ae6fbeb17ad53 (diff) |
crypto: cbc - convert to skcipher_alloc_instance_simple()
The CBC template just wraps a single block cipher algorithm, so simplify
it by converting it to use skcipher_alloc_instance_simple().
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/cbc.c | 131 |
1 files changed, 13 insertions, 118 deletions
diff --git a/crypto/cbc.c b/crypto/cbc.c index dd5f332fd566..d12efaac9230 100644 --- a/crypto/cbc.c +++ b/crypto/cbc.c | |||
@@ -18,34 +18,11 @@ | |||
18 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
19 | #include <linux/log2.h> | 19 | #include <linux/log2.h> |
20 | #include <linux/module.h> | 20 | #include <linux/module.h> |
21 | #include <linux/slab.h> | ||
22 | |||
23 | struct crypto_cbc_ctx { | ||
24 | struct crypto_cipher *child; | ||
25 | }; | ||
26 | |||
27 | static int crypto_cbc_setkey(struct crypto_skcipher *parent, const u8 *key, | ||
28 | unsigned int keylen) | ||
29 | { | ||
30 | struct crypto_cbc_ctx *ctx = crypto_skcipher_ctx(parent); | ||
31 | struct crypto_cipher *child = ctx->child; | ||
32 | int err; | ||
33 | |||
34 | crypto_cipher_clear_flags(child, CRYPTO_TFM_REQ_MASK); | ||
35 | crypto_cipher_set_flags(child, crypto_skcipher_get_flags(parent) & | ||
36 | CRYPTO_TFM_REQ_MASK); | ||
37 | err = crypto_cipher_setkey(child, key, keylen); | ||
38 | crypto_skcipher_set_flags(parent, crypto_cipher_get_flags(child) & | ||
39 | CRYPTO_TFM_RES_MASK); | ||
40 | return err; | ||
41 | } | ||
42 | 21 | ||
43 | static inline void crypto_cbc_encrypt_one(struct crypto_skcipher *tfm, | 22 | static inline void crypto_cbc_encrypt_one(struct crypto_skcipher *tfm, |
44 | const u8 *src, u8 *dst) | 23 | const u8 *src, u8 *dst) |
45 | { | 24 | { |
46 | struct crypto_cbc_ctx *ctx = crypto_skcipher_ctx(tfm); | 25 | crypto_cipher_encrypt_one(skcipher_cipher_simple(tfm), dst, src); |
47 | |||
48 | crypto_cipher_encrypt_one(ctx->child, dst, src); | ||
49 | } | 26 | } |
50 | 27 | ||
51 | static int crypto_cbc_encrypt(struct skcipher_request *req) | 28 | static int crypto_cbc_encrypt(struct skcipher_request *req) |
@@ -56,9 +33,7 @@ static int crypto_cbc_encrypt(struct skcipher_request *req) | |||
56 | static inline void crypto_cbc_decrypt_one(struct crypto_skcipher *tfm, | 33 | static inline void crypto_cbc_decrypt_one(struct crypto_skcipher *tfm, |
57 | const u8 *src, u8 *dst) | 34 | const u8 *src, u8 *dst) |
58 | { | 35 | { |
59 | struct crypto_cbc_ctx *ctx = crypto_skcipher_ctx(tfm); | 36 | crypto_cipher_decrypt_one(skcipher_cipher_simple(tfm), dst, src); |
60 | |||
61 | crypto_cipher_decrypt_one(ctx->child, dst, src); | ||
62 | } | 37 | } |
63 | 38 | ||
64 | static int crypto_cbc_decrypt(struct skcipher_request *req) | 39 | static int crypto_cbc_decrypt(struct skcipher_request *req) |
@@ -78,113 +53,33 @@ static int crypto_cbc_decrypt(struct skcipher_request *req) | |||
78 | return err; | 53 | return err; |
79 | } | 54 | } |
80 | 55 | ||
81 | static int crypto_cbc_init_tfm(struct crypto_skcipher *tfm) | ||
82 | { | ||
83 | struct skcipher_instance *inst = skcipher_alg_instance(tfm); | ||
84 | struct crypto_spawn *spawn = skcipher_instance_ctx(inst); | ||
85 | struct crypto_cbc_ctx *ctx = crypto_skcipher_ctx(tfm); | ||
86 | struct crypto_cipher *cipher; | ||
87 | |||
88 | cipher = crypto_spawn_cipher(spawn); | ||
89 | if (IS_ERR(cipher)) | ||
90 | return PTR_ERR(cipher); | ||
91 | |||
92 | ctx->child = cipher; | ||
93 | return 0; | ||
94 | } | ||
95 | |||
96 | static void crypto_cbc_exit_tfm(struct crypto_skcipher *tfm) | ||
97 | { | ||
98 | struct crypto_cbc_ctx *ctx = crypto_skcipher_ctx(tfm); | ||
99 | |||
100 | crypto_free_cipher(ctx->child); | ||
101 | } | ||
102 | |||
103 | static void crypto_cbc_free(struct skcipher_instance *inst) | ||
104 | { | ||
105 | crypto_drop_skcipher(skcipher_instance_ctx(inst)); | ||
106 | kfree(inst); | ||
107 | } | ||
108 | |||
109 | static int crypto_cbc_create(struct crypto_template *tmpl, struct rtattr **tb) | 56 | static int crypto_cbc_create(struct crypto_template *tmpl, struct rtattr **tb) |
110 | { | 57 | { |
111 | struct skcipher_instance *inst; | 58 | struct skcipher_instance *inst; |
112 | struct crypto_attr_type *algt; | ||
113 | struct crypto_spawn *spawn; | ||
114 | struct crypto_alg *alg; | 59 | struct crypto_alg *alg; |
115 | u32 mask; | ||
116 | int err; | 60 | int err; |
117 | 61 | ||
118 | err = crypto_check_attr_type(tb, CRYPTO_ALG_TYPE_SKCIPHER); | 62 | inst = skcipher_alloc_instance_simple(tmpl, tb, &alg); |
119 | if (err) | 63 | if (IS_ERR(inst)) |
120 | return err; | 64 | return PTR_ERR(inst); |
121 | |||
122 | inst = kzalloc(sizeof(*inst) + sizeof(*spawn), GFP_KERNEL); | ||
123 | if (!inst) | ||
124 | return -ENOMEM; | ||
125 | |||
126 | algt = crypto_get_attr_type(tb); | ||
127 | err = PTR_ERR(algt); | ||
128 | if (IS_ERR(algt)) | ||
129 | goto err_free_inst; | ||
130 | |||
131 | mask = CRYPTO_ALG_TYPE_MASK | | ||
132 | crypto_requires_off(algt->type, algt->mask, | ||
133 | CRYPTO_ALG_NEED_FALLBACK); | ||
134 | |||
135 | alg = crypto_get_attr_alg(tb, CRYPTO_ALG_TYPE_CIPHER, mask); | ||
136 | err = PTR_ERR(alg); | ||
137 | if (IS_ERR(alg)) | ||
138 | goto err_free_inst; | ||
139 | |||
140 | spawn = skcipher_instance_ctx(inst); | ||
141 | err = crypto_init_spawn(spawn, alg, skcipher_crypto_instance(inst), | ||
142 | CRYPTO_ALG_TYPE_MASK); | ||
143 | if (err) | ||
144 | goto err_put_alg; | ||
145 | |||
146 | err = crypto_inst_setname(skcipher_crypto_instance(inst), "cbc", alg); | ||
147 | if (err) | ||
148 | goto err_drop_spawn; | ||
149 | 65 | ||
150 | err = -EINVAL; | 66 | err = -EINVAL; |
151 | if (!is_power_of_2(alg->cra_blocksize)) | 67 | if (!is_power_of_2(alg->cra_blocksize)) |
152 | goto err_drop_spawn; | 68 | goto out_free_inst; |
153 | |||
154 | inst->alg.base.cra_priority = alg->cra_priority; | ||
155 | inst->alg.base.cra_blocksize = alg->cra_blocksize; | ||
156 | inst->alg.base.cra_alignmask = alg->cra_alignmask; | ||
157 | |||
158 | inst->alg.ivsize = alg->cra_blocksize; | ||
159 | inst->alg.min_keysize = alg->cra_cipher.cia_min_keysize; | ||
160 | inst->alg.max_keysize = alg->cra_cipher.cia_max_keysize; | ||
161 | |||
162 | inst->alg.base.cra_ctxsize = sizeof(struct crypto_cbc_ctx); | ||
163 | |||
164 | inst->alg.init = crypto_cbc_init_tfm; | ||
165 | inst->alg.exit = crypto_cbc_exit_tfm; | ||
166 | 69 | ||
167 | inst->alg.setkey = crypto_cbc_setkey; | ||
168 | inst->alg.encrypt = crypto_cbc_encrypt; | 70 | inst->alg.encrypt = crypto_cbc_encrypt; |
169 | inst->alg.decrypt = crypto_cbc_decrypt; | 71 | inst->alg.decrypt = crypto_cbc_decrypt; |
170 | 72 | ||
171 | inst->free = crypto_cbc_free; | ||
172 | |||
173 | err = skcipher_register_instance(tmpl, inst); | 73 | err = skcipher_register_instance(tmpl, inst); |
174 | if (err) | 74 | if (err) |
175 | goto err_drop_spawn; | 75 | goto out_free_inst; |
176 | crypto_mod_put(alg); | 76 | goto out_put_alg; |
177 | 77 | ||
178 | out: | 78 | out_free_inst: |
179 | return err; | 79 | inst->free(inst); |
180 | 80 | out_put_alg: | |
181 | err_drop_spawn: | ||
182 | crypto_drop_spawn(spawn); | ||
183 | err_put_alg: | ||
184 | crypto_mod_put(alg); | 81 | crypto_mod_put(alg); |
185 | err_free_inst: | 82 | return err; |
186 | kfree(inst); | ||
187 | goto out; | ||
188 | } | 83 | } |
189 | 84 | ||
190 | static struct crypto_template crypto_cbc_tmpl = { | 85 | static struct crypto_template crypto_cbc_tmpl = { |
@@ -207,5 +102,5 @@ module_init(crypto_cbc_module_init); | |||
207 | module_exit(crypto_cbc_module_exit); | 102 | module_exit(crypto_cbc_module_exit); |
208 | 103 | ||
209 | MODULE_LICENSE("GPL"); | 104 | MODULE_LICENSE("GPL"); |
210 | MODULE_DESCRIPTION("CBC block cipher algorithm"); | 105 | MODULE_DESCRIPTION("CBC block cipher mode of operation"); |
211 | MODULE_ALIAS_CRYPTO("cbc"); | 106 | MODULE_ALIAS_CRYPTO("cbc"); |