hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/crypto/adiantum.c
....@@ -32,14 +32,13 @@
3232
3333 #include <crypto/b128ops.h>
3434 #include <crypto/chacha.h>
35
+#include <crypto/internal/cipher.h>
3536 #include <crypto/internal/hash.h>
3637 #include <crypto/internal/poly1305.h>
3738 #include <crypto/internal/skcipher.h>
3839 #include <crypto/nhpoly1305.h>
3940 #include <crypto/scatterwalk.h>
4041 #include <linux/module.h>
41
-
42
-#include "internal.h"
4342
4443 /*
4544 * Size of right-hand part of input data, in bytes; also the size of the block
....@@ -64,7 +63,7 @@
6463
6564 struct adiantum_instance_ctx {
6665 struct crypto_skcipher_spawn streamcipher_spawn;
67
- struct crypto_spawn blockcipher_spawn;
66
+ struct crypto_cipher_spawn blockcipher_spawn;
6867 struct crypto_shash_spawn hash_spawn;
6968 };
7069
....@@ -135,9 +134,6 @@
135134 crypto_skcipher_get_flags(tfm) &
136135 CRYPTO_TFM_REQ_MASK);
137136 err = crypto_skcipher_setkey(tctx->streamcipher, key, keylen);
138
- crypto_skcipher_set_flags(tfm,
139
- crypto_skcipher_get_flags(tctx->streamcipher) &
140
- CRYPTO_TFM_RES_MASK);
141137 if (err)
142138 return err;
143139
....@@ -167,9 +163,6 @@
167163 CRYPTO_TFM_REQ_MASK);
168164 err = crypto_cipher_setkey(tctx->blockcipher, keyp,
169165 BLOCKCIPHER_KEY_SIZE);
170
- crypto_skcipher_set_flags(tfm,
171
- crypto_cipher_get_flags(tctx->blockcipher) &
172
- CRYPTO_TFM_RES_MASK);
173166 if (err)
174167 goto out;
175168 keyp += BLOCKCIPHER_KEY_SIZE;
....@@ -182,12 +175,10 @@
182175 crypto_shash_set_flags(tctx->hash, crypto_skcipher_get_flags(tfm) &
183176 CRYPTO_TFM_REQ_MASK);
184177 err = crypto_shash_setkey(tctx->hash, keyp, NHPOLY1305_KEY_SIZE);
185
- crypto_skcipher_set_flags(tfm, crypto_shash_get_flags(tctx->hash) &
186
- CRYPTO_TFM_RES_MASK);
187178 keyp += NHPOLY1305_KEY_SIZE;
188179 WARN_ON(keyp != &data->derived_keys[ARRAY_SIZE(data->derived_keys)]);
189180 out:
190
- kzfree(data);
181
+ kfree_sensitive(data);
191182 return err;
192183 }
193184
....@@ -266,7 +257,6 @@
266257 int err;
267258
268259 hash_desc->tfm = tctx->hash;
269
- hash_desc->flags = 0;
270260
271261 err = crypto_shash_init(hash_desc);
272262 if (err)
....@@ -437,10 +427,10 @@
437427
438428 BUILD_BUG_ON(offsetofend(struct adiantum_request_ctx, u) !=
439429 sizeof(struct adiantum_request_ctx));
440
- subreq_size = max(FIELD_SIZEOF(struct adiantum_request_ctx,
430
+ subreq_size = max(sizeof_field(struct adiantum_request_ctx,
441431 u.hash_desc) +
442432 crypto_shash_descsize(hash),
443
- FIELD_SIZEOF(struct adiantum_request_ctx,
433
+ sizeof_field(struct adiantum_request_ctx,
444434 u.streamcipher_req) +
445435 crypto_skcipher_reqsize(streamcipher));
446436
....@@ -470,7 +460,7 @@
470460 struct adiantum_instance_ctx *ictx = skcipher_instance_ctx(inst);
471461
472462 crypto_drop_skcipher(&ictx->streamcipher_spawn);
473
- crypto_drop_spawn(&ictx->blockcipher_spawn);
463
+ crypto_drop_cipher(&ictx->blockcipher_spawn);
474464 crypto_drop_shash(&ictx->hash_spawn);
475465 kfree(inst);
476466 }
....@@ -501,38 +491,18 @@
501491
502492 static int adiantum_create(struct crypto_template *tmpl, struct rtattr **tb)
503493 {
504
- struct crypto_attr_type *algt;
505
- const char *streamcipher_name;
506
- const char *blockcipher_name;
494
+ u32 mask;
507495 const char *nhpoly1305_name;
508496 struct skcipher_instance *inst;
509497 struct adiantum_instance_ctx *ictx;
510498 struct skcipher_alg *streamcipher_alg;
511499 struct crypto_alg *blockcipher_alg;
512
- struct crypto_alg *_hash_alg;
513500 struct shash_alg *hash_alg;
514501 int err;
515502
516
- algt = crypto_get_attr_type(tb);
517
- if (IS_ERR(algt))
518
- return PTR_ERR(algt);
519
-
520
- if ((algt->type ^ CRYPTO_ALG_TYPE_SKCIPHER) & algt->mask)
521
- return -EINVAL;
522
-
523
- streamcipher_name = crypto_attr_alg_name(tb[1]);
524
- if (IS_ERR(streamcipher_name))
525
- return PTR_ERR(streamcipher_name);
526
-
527
- blockcipher_name = crypto_attr_alg_name(tb[2]);
528
- if (IS_ERR(blockcipher_name))
529
- return PTR_ERR(blockcipher_name);
530
-
531
- nhpoly1305_name = crypto_attr_alg_name(tb[3]);
532
- if (nhpoly1305_name == ERR_PTR(-ENOENT))
533
- nhpoly1305_name = "nhpoly1305";
534
- if (IS_ERR(nhpoly1305_name))
535
- return PTR_ERR(nhpoly1305_name);
503
+ err = crypto_check_attr_type(tb, CRYPTO_ALG_TYPE_SKCIPHER, &mask);
504
+ if (err)
505
+ return err;
536506
537507 inst = kzalloc(sizeof(*inst) + sizeof(*ictx), GFP_KERNEL);
538508 if (!inst)
....@@ -540,37 +510,31 @@
540510 ictx = skcipher_instance_ctx(inst);
541511
542512 /* Stream cipher, e.g. "xchacha12" */
543
- crypto_set_skcipher_spawn(&ictx->streamcipher_spawn,
544
- skcipher_crypto_instance(inst));
545
- err = crypto_grab_skcipher(&ictx->streamcipher_spawn, streamcipher_name,
546
- 0, crypto_requires_sync(algt->type,
547
- algt->mask));
513
+ err = crypto_grab_skcipher(&ictx->streamcipher_spawn,
514
+ skcipher_crypto_instance(inst),
515
+ crypto_attr_alg_name(tb[1]), 0, mask);
548516 if (err)
549
- goto out_free_inst;
517
+ goto err_free_inst;
550518 streamcipher_alg = crypto_spawn_skcipher_alg(&ictx->streamcipher_spawn);
551519
552520 /* Block cipher, e.g. "aes" */
553
- crypto_set_spawn(&ictx->blockcipher_spawn,
554
- skcipher_crypto_instance(inst));
555
- err = crypto_grab_spawn(&ictx->blockcipher_spawn, blockcipher_name,
556
- CRYPTO_ALG_TYPE_CIPHER, CRYPTO_ALG_TYPE_MASK);
521
+ err = crypto_grab_cipher(&ictx->blockcipher_spawn,
522
+ skcipher_crypto_instance(inst),
523
+ crypto_attr_alg_name(tb[2]), 0, mask);
557524 if (err)
558
- goto out_drop_streamcipher;
559
- blockcipher_alg = ictx->blockcipher_spawn.alg;
525
+ goto err_free_inst;
526
+ blockcipher_alg = crypto_spawn_cipher_alg(&ictx->blockcipher_spawn);
560527
561528 /* NHPoly1305 ε-∆U hash function */
562
- _hash_alg = crypto_alg_mod_lookup(nhpoly1305_name,
563
- CRYPTO_ALG_TYPE_SHASH,
564
- CRYPTO_ALG_TYPE_MASK);
565
- if (IS_ERR(_hash_alg)) {
566
- err = PTR_ERR(_hash_alg);
567
- goto out_drop_blockcipher;
568
- }
569
- hash_alg = __crypto_shash_alg(_hash_alg);
570
- err = crypto_init_shash_spawn(&ictx->hash_spawn, hash_alg,
571
- skcipher_crypto_instance(inst));
529
+ nhpoly1305_name = crypto_attr_alg_name(tb[3]);
530
+ if (nhpoly1305_name == ERR_PTR(-ENOENT))
531
+ nhpoly1305_name = "nhpoly1305";
532
+ err = crypto_grab_shash(&ictx->hash_spawn,
533
+ skcipher_crypto_instance(inst),
534
+ nhpoly1305_name, 0, mask);
572535 if (err)
573
- goto out_put_hash;
536
+ goto err_free_inst;
537
+ hash_alg = crypto_spawn_shash_alg(&ictx->hash_spawn);
574538
575539 /* Check the set of algorithms */
576540 if (!adiantum_supported_algorithms(streamcipher_alg, blockcipher_alg,
....@@ -579,7 +543,7 @@
579543 streamcipher_alg->base.cra_name,
580544 blockcipher_alg->cra_name, hash_alg->base.cra_name);
581545 err = -EINVAL;
582
- goto out_drop_hash;
546
+ goto err_free_inst;
583547 }
584548
585549 /* Instance fields */
....@@ -588,16 +552,14 @@
588552 if (snprintf(inst->alg.base.cra_name, CRYPTO_MAX_ALG_NAME,
589553 "adiantum(%s,%s)", streamcipher_alg->base.cra_name,
590554 blockcipher_alg->cra_name) >= CRYPTO_MAX_ALG_NAME)
591
- goto out_drop_hash;
555
+ goto err_free_inst;
592556 if (snprintf(inst->alg.base.cra_driver_name, CRYPTO_MAX_ALG_NAME,
593557 "adiantum(%s,%s,%s)",
594558 streamcipher_alg->base.cra_driver_name,
595559 blockcipher_alg->cra_driver_name,
596560 hash_alg->base.cra_driver_name) >= CRYPTO_MAX_ALG_NAME)
597
- goto out_drop_hash;
561
+ goto err_free_inst;
598562
599
- inst->alg.base.cra_flags = streamcipher_alg->base.cra_flags &
600
- CRYPTO_ALG_ASYNC;
601563 inst->alg.base.cra_blocksize = BLOCKCIPHER_BLOCK_SIZE;
602564 inst->alg.base.cra_ctxsize = sizeof(struct adiantum_tfm_ctx);
603565 inst->alg.base.cra_alignmask = streamcipher_alg->base.cra_alignmask |
....@@ -624,22 +586,10 @@
624586 inst->free = adiantum_free_instance;
625587
626588 err = skcipher_register_instance(tmpl, inst);
627
- if (err)
628
- goto out_drop_hash;
629
-
630
- crypto_mod_put(_hash_alg);
631
- return 0;
632
-
633
-out_drop_hash:
634
- crypto_drop_shash(&ictx->hash_spawn);
635
-out_put_hash:
636
- crypto_mod_put(_hash_alg);
637
-out_drop_blockcipher:
638
- crypto_drop_spawn(&ictx->blockcipher_spawn);
639
-out_drop_streamcipher:
640
- crypto_drop_skcipher(&ictx->streamcipher_spawn);
641
-out_free_inst:
642
- kfree(inst);
589
+ if (err) {
590
+err_free_inst:
591
+ adiantum_free_instance(inst);
592
+ }
643593 return err;
644594 }
645595
....@@ -660,10 +610,11 @@
660610 crypto_unregister_template(&adiantum_tmpl);
661611 }
662612
663
-module_init(adiantum_module_init);
613
+subsys_initcall(adiantum_module_init);
664614 module_exit(adiantum_module_exit);
665615
666616 MODULE_DESCRIPTION("Adiantum length-preserving encryption mode");
667617 MODULE_LICENSE("GPL v2");
668618 MODULE_AUTHOR("Eric Biggers <ebiggers@google.com>");
669619 MODULE_ALIAS_CRYPTO("adiantum");
620
+MODULE_IMPORT_NS(CRYPTO_INTERNAL);