diff options
author | Eric Biggers <ebiggers@google.com> | 2019-01-03 23:16:20 -0500 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2019-01-11 01:16:58 -0500 |
commit | 21f3ca6cd52ecc751b68cd7017d9efd1801f51f9 (patch) | |
tree | fdb7da3019f1fdeb202472a905bc2f475290424a /crypto | |
parent | 6b611d98c6f5c5a328f1698c4cad7447544a5da7 (diff) |
crypto: ofb - convert to skcipher_alloc_instance_simple()
The OFB template just wraps a single block cipher algorithm, so simplify
it by converting it to use skcipher_alloc_instance_simple().
Cc: Gilad Ben-Yossef <gilad@benyossef.com>
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/ofb.c | 119 |
1 files changed, 7 insertions, 112 deletions
diff --git a/crypto/ofb.c b/crypto/ofb.c index cab0b80953fe..34b6e1f426f7 100644 --- a/crypto/ofb.c +++ b/crypto/ofb.c | |||
@@ -13,35 +13,11 @@ | |||
13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
15 | #include <linux/module.h> | 15 | #include <linux/module.h> |
16 | #include <linux/scatterlist.h> | ||
17 | #include <linux/slab.h> | ||
18 | |||
19 | struct crypto_ofb_ctx { | ||
20 | struct crypto_cipher *child; | ||
21 | }; | ||
22 | |||
23 | |||
24 | static int crypto_ofb_setkey(struct crypto_skcipher *parent, const u8 *key, | ||
25 | unsigned int keylen) | ||
26 | { | ||
27 | struct crypto_ofb_ctx *ctx = crypto_skcipher_ctx(parent); | ||
28 | struct crypto_cipher *child = ctx->child; | ||
29 | int err; | ||
30 | |||
31 | crypto_cipher_clear_flags(child, CRYPTO_TFM_REQ_MASK); | ||
32 | crypto_cipher_set_flags(child, crypto_skcipher_get_flags(parent) & | ||
33 | CRYPTO_TFM_REQ_MASK); | ||
34 | err = crypto_cipher_setkey(child, key, keylen); | ||
35 | crypto_skcipher_set_flags(parent, crypto_cipher_get_flags(child) & | ||
36 | CRYPTO_TFM_RES_MASK); | ||
37 | return err; | ||
38 | } | ||
39 | 16 | ||
40 | static int crypto_ofb_crypt(struct skcipher_request *req) | 17 | static int crypto_ofb_crypt(struct skcipher_request *req) |
41 | { | 18 | { |
42 | struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); | 19 | struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); |
43 | struct crypto_ofb_ctx *ctx = crypto_skcipher_ctx(tfm); | 20 | struct crypto_cipher *cipher = skcipher_cipher_simple(tfm); |
44 | struct crypto_cipher *cipher = ctx->child; | ||
45 | const unsigned int bsize = crypto_cipher_blocksize(cipher); | 21 | const unsigned int bsize = crypto_cipher_blocksize(cipher); |
46 | struct skcipher_walk walk; | 22 | struct skcipher_walk walk; |
47 | int err; | 23 | int err; |
@@ -73,75 +49,15 @@ static int crypto_ofb_crypt(struct skcipher_request *req) | |||
73 | return err; | 49 | return err; |
74 | } | 50 | } |
75 | 51 | ||
76 | static int crypto_ofb_init_tfm(struct crypto_skcipher *tfm) | ||
77 | { | ||
78 | struct skcipher_instance *inst = skcipher_alg_instance(tfm); | ||
79 | struct crypto_spawn *spawn = skcipher_instance_ctx(inst); | ||
80 | struct crypto_ofb_ctx *ctx = crypto_skcipher_ctx(tfm); | ||
81 | struct crypto_cipher *cipher; | ||
82 | |||
83 | cipher = crypto_spawn_cipher(spawn); | ||
84 | if (IS_ERR(cipher)) | ||
85 | return PTR_ERR(cipher); | ||
86 | |||
87 | ctx->child = cipher; | ||
88 | return 0; | ||
89 | } | ||
90 | |||
91 | static void crypto_ofb_exit_tfm(struct crypto_skcipher *tfm) | ||
92 | { | ||
93 | struct crypto_ofb_ctx *ctx = crypto_skcipher_ctx(tfm); | ||
94 | |||
95 | crypto_free_cipher(ctx->child); | ||
96 | } | ||
97 | |||
98 | static void crypto_ofb_free(struct skcipher_instance *inst) | ||
99 | { | ||
100 | crypto_drop_skcipher(skcipher_instance_ctx(inst)); | ||
101 | kfree(inst); | ||
102 | } | ||
103 | |||
104 | static int crypto_ofb_create(struct crypto_template *tmpl, struct rtattr **tb) | 52 | static int crypto_ofb_create(struct crypto_template *tmpl, struct rtattr **tb) |
105 | { | 53 | { |
106 | struct skcipher_instance *inst; | 54 | struct skcipher_instance *inst; |
107 | struct crypto_attr_type *algt; | ||
108 | struct crypto_spawn *spawn; | ||
109 | struct crypto_alg *alg; | 55 | struct crypto_alg *alg; |
110 | u32 mask; | ||
111 | int err; | 56 | int err; |
112 | 57 | ||
113 | err = crypto_check_attr_type(tb, CRYPTO_ALG_TYPE_SKCIPHER); | 58 | inst = skcipher_alloc_instance_simple(tmpl, tb, &alg); |
114 | if (err) | 59 | if (IS_ERR(inst)) |
115 | return err; | 60 | return PTR_ERR(inst); |
116 | |||
117 | inst = kzalloc(sizeof(*inst) + sizeof(*spawn), GFP_KERNEL); | ||
118 | if (!inst) | ||
119 | return -ENOMEM; | ||
120 | |||
121 | algt = crypto_get_attr_type(tb); | ||
122 | err = PTR_ERR(algt); | ||
123 | if (IS_ERR(algt)) | ||
124 | goto err_free_inst; | ||
125 | |||
126 | mask = CRYPTO_ALG_TYPE_MASK | | ||
127 | crypto_requires_off(algt->type, algt->mask, | ||
128 | CRYPTO_ALG_NEED_FALLBACK); | ||
129 | |||
130 | alg = crypto_get_attr_alg(tb, CRYPTO_ALG_TYPE_CIPHER, mask); | ||
131 | err = PTR_ERR(alg); | ||
132 | if (IS_ERR(alg)) | ||
133 | goto err_free_inst; | ||
134 | |||
135 | spawn = skcipher_instance_ctx(inst); | ||
136 | err = crypto_init_spawn(spawn, alg, skcipher_crypto_instance(inst), | ||
137 | CRYPTO_ALG_TYPE_MASK); | ||
138 | crypto_mod_put(alg); | ||
139 | if (err) | ||
140 | goto err_free_inst; | ||
141 | |||
142 | err = crypto_inst_setname(skcipher_crypto_instance(inst), "ofb", alg); | ||
143 | if (err) | ||
144 | goto err_drop_spawn; | ||
145 | 61 | ||
146 | /* OFB mode is a stream cipher. */ | 62 | /* OFB mode is a stream cipher. */ |
147 | inst->alg.base.cra_blocksize = 1; | 63 | inst->alg.base.cra_blocksize = 1; |
@@ -152,36 +68,15 @@ static int crypto_ofb_create(struct crypto_template *tmpl, struct rtattr **tb) | |||
152 | */ | 68 | */ |
153 | inst->alg.chunksize = alg->cra_blocksize; | 69 | inst->alg.chunksize = alg->cra_blocksize; |
154 | 70 | ||
155 | inst->alg.base.cra_priority = alg->cra_priority; | ||
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_ofb_ctx); | ||
163 | |||
164 | inst->alg.init = crypto_ofb_init_tfm; | ||
165 | inst->alg.exit = crypto_ofb_exit_tfm; | ||
166 | |||
167 | inst->alg.setkey = crypto_ofb_setkey; | ||
168 | inst->alg.encrypt = crypto_ofb_crypt; | 71 | inst->alg.encrypt = crypto_ofb_crypt; |
169 | inst->alg.decrypt = crypto_ofb_crypt; | 72 | inst->alg.decrypt = crypto_ofb_crypt; |
170 | 73 | ||
171 | inst->free = crypto_ofb_free; | ||
172 | |||
173 | err = skcipher_register_instance(tmpl, inst); | 74 | err = skcipher_register_instance(tmpl, inst); |
174 | if (err) | 75 | if (err) |
175 | goto err_drop_spawn; | 76 | inst->free(inst); |
176 | 77 | ||
177 | out: | 78 | crypto_mod_put(alg); |
178 | return err; | 79 | return err; |
179 | |||
180 | err_drop_spawn: | ||
181 | crypto_drop_spawn(spawn); | ||
182 | err_free_inst: | ||
183 | kfree(inst); | ||
184 | goto out; | ||
185 | } | 80 | } |
186 | 81 | ||
187 | static struct crypto_template crypto_ofb_tmpl = { | 82 | static struct crypto_template crypto_ofb_tmpl = { |
@@ -204,5 +99,5 @@ module_init(crypto_ofb_module_init); | |||
204 | module_exit(crypto_ofb_module_exit); | 99 | module_exit(crypto_ofb_module_exit); |
205 | 100 | ||
206 | MODULE_LICENSE("GPL"); | 101 | MODULE_LICENSE("GPL"); |
207 | MODULE_DESCRIPTION("OFB block cipher algorithm"); | 102 | MODULE_DESCRIPTION("OFB block cipher mode of operation"); |
208 | MODULE_ALIAS_CRYPTO("ofb"); | 103 | MODULE_ALIAS_CRYPTO("ofb"); |