hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/crypto/cts.c
....@@ -78,15 +78,11 @@
7878 {
7979 struct crypto_cts_ctx *ctx = crypto_skcipher_ctx(parent);
8080 struct crypto_skcipher *child = ctx->child;
81
- int err;
8281
8382 crypto_skcipher_clear_flags(child, CRYPTO_TFM_REQ_MASK);
8483 crypto_skcipher_set_flags(child, crypto_skcipher_get_flags(parent) &
8584 CRYPTO_TFM_REQ_MASK);
86
- err = crypto_skcipher_setkey(child, key, keylen);
87
- crypto_skcipher_set_flags(parent, crypto_skcipher_get_flags(child) &
88
- CRYPTO_TFM_RES_MASK);
89
- return err;
85
+ return crypto_skcipher_setkey(child, key, keylen);
9086 }
9187
9288 static void cts_cbc_crypt_done(struct crypto_async_request *areq, int err)
....@@ -152,12 +148,14 @@
152148 struct skcipher_request *subreq = &rctx->subreq;
153149 int bsize = crypto_skcipher_blocksize(tfm);
154150 unsigned int nbytes = req->cryptlen;
155
- int cbc_blocks = (nbytes + bsize - 1) / bsize - 1;
156151 unsigned int offset;
157152
158153 skcipher_request_set_tfm(subreq, ctx->child);
159154
160
- if (cbc_blocks <= 0) {
155
+ if (nbytes < bsize)
156
+ return -EINVAL;
157
+
158
+ if (nbytes == bsize) {
161159 skcipher_request_set_callback(subreq, req->base.flags,
162160 req->base.complete,
163161 req->base.data);
....@@ -166,7 +164,7 @@
166164 return crypto_skcipher_encrypt(subreq);
167165 }
168166
169
- offset = cbc_blocks * bsize;
167
+ offset = rounddown(nbytes - 1, bsize);
170168 rctx->offset = offset;
171169
172170 skcipher_request_set_callback(subreq, req->base.flags,
....@@ -244,13 +242,15 @@
244242 struct skcipher_request *subreq = &rctx->subreq;
245243 int bsize = crypto_skcipher_blocksize(tfm);
246244 unsigned int nbytes = req->cryptlen;
247
- int cbc_blocks = (nbytes + bsize - 1) / bsize - 1;
248245 unsigned int offset;
249246 u8 *space;
250247
251248 skcipher_request_set_tfm(subreq, ctx->child);
252249
253
- if (cbc_blocks <= 0) {
250
+ if (nbytes < bsize)
251
+ return -EINVAL;
252
+
253
+ if (nbytes == bsize) {
254254 skcipher_request_set_callback(subreq, req->base.flags,
255255 req->base.complete,
256256 req->base.data);
....@@ -264,10 +264,10 @@
264264
265265 space = crypto_cts_reqctx_space(req);
266266
267
- offset = cbc_blocks * bsize;
267
+ offset = rounddown(nbytes - 1, bsize);
268268 rctx->offset = offset;
269269
270
- if (cbc_blocks <= 1)
270
+ if (offset <= bsize)
271271 memcpy(space, req->iv, bsize);
272272 else
273273 scatterwalk_map_and_copy(space, req->src, offset - 2 * bsize,
....@@ -325,21 +325,13 @@
325325 {
326326 struct crypto_skcipher_spawn *spawn;
327327 struct skcipher_instance *inst;
328
- struct crypto_attr_type *algt;
329328 struct skcipher_alg *alg;
330
- const char *cipher_name;
329
+ u32 mask;
331330 int err;
332331
333
- algt = crypto_get_attr_type(tb);
334
- if (IS_ERR(algt))
335
- return PTR_ERR(algt);
336
-
337
- if ((algt->type ^ CRYPTO_ALG_TYPE_SKCIPHER) & algt->mask)
338
- return -EINVAL;
339
-
340
- cipher_name = crypto_attr_alg_name(tb[1]);
341
- if (IS_ERR(cipher_name))
342
- return PTR_ERR(cipher_name);
332
+ err = crypto_check_attr_type(tb, CRYPTO_ALG_TYPE_SKCIPHER, &mask);
333
+ if (err)
334
+ return err;
343335
344336 inst = kzalloc(sizeof(*inst) + sizeof(*spawn), GFP_KERNEL);
345337 if (!inst)
....@@ -347,10 +339,8 @@
347339
348340 spawn = skcipher_instance_ctx(inst);
349341
350
- crypto_set_skcipher_spawn(spawn, skcipher_crypto_instance(inst));
351
- err = crypto_grab_skcipher(spawn, cipher_name, 0,
352
- crypto_requires_sync(algt->type,
353
- algt->mask));
342
+ err = crypto_grab_skcipher(spawn, skcipher_crypto_instance(inst),
343
+ crypto_attr_alg_name(tb[1]), 0, mask);
354344 if (err)
355345 goto err_free_inst;
356346
....@@ -358,17 +348,16 @@
358348
359349 err = -EINVAL;
360350 if (crypto_skcipher_alg_ivsize(alg) != alg->base.cra_blocksize)
361
- goto err_drop_spawn;
351
+ goto err_free_inst;
362352
363353 if (strncmp(alg->base.cra_name, "cbc(", 4))
364
- goto err_drop_spawn;
354
+ goto err_free_inst;
365355
366356 err = crypto_inst_setname(skcipher_crypto_instance(inst), "cts",
367357 &alg->base);
368358 if (err)
369
- goto err_drop_spawn;
359
+ goto err_free_inst;
370360
371
- inst->alg.base.cra_flags = alg->base.cra_flags & CRYPTO_ALG_ASYNC;
372361 inst->alg.base.cra_priority = alg->base.cra_priority;
373362 inst->alg.base.cra_blocksize = alg->base.cra_blocksize;
374363 inst->alg.base.cra_alignmask = alg->base.cra_alignmask;
....@@ -390,17 +379,11 @@
390379 inst->free = crypto_cts_free;
391380
392381 err = skcipher_register_instance(tmpl, inst);
393
- if (err)
394
- goto err_drop_spawn;
395
-
396
-out:
397
- return err;
398
-
399
-err_drop_spawn:
400
- crypto_drop_skcipher(spawn);
382
+ if (err) {
401383 err_free_inst:
402
- kfree(inst);
403
- goto out;
384
+ crypto_cts_free(inst);
385
+ }
386
+ return err;
404387 }
405388
406389 static struct crypto_template crypto_cts_tmpl = {
....@@ -419,7 +402,7 @@
419402 crypto_unregister_template(&crypto_cts_tmpl);
420403 }
421404
422
-module_init(crypto_cts_module_init);
405
+subsys_initcall(crypto_cts_module_init);
423406 module_exit(crypto_cts_module_exit);
424407
425408 MODULE_LICENSE("Dual BSD/GPL");