1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100#include <crypto/drbg.h>
101#include <crypto/internal/cipher.h>
102#include <linux/kernel.h>
103#include <linux/jiffies.h>
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118static const struct drbg_core drbg_cores[] = {
119#ifdef CONFIG_CRYPTO_DRBG_CTR
120 {
121 .flags = DRBG_CTR | DRBG_STRENGTH128,
122 .statelen = 32,
123 .blocklen_bytes = 16,
124 .cra_name = "ctr_aes128",
125 .backend_cra_name = "aes",
126 }, {
127 .flags = DRBG_CTR | DRBG_STRENGTH192,
128 .statelen = 40,
129 .blocklen_bytes = 16,
130 .cra_name = "ctr_aes192",
131 .backend_cra_name = "aes",
132 }, {
133 .flags = DRBG_CTR | DRBG_STRENGTH256,
134 .statelen = 48,
135 .blocklen_bytes = 16,
136 .cra_name = "ctr_aes256",
137 .backend_cra_name = "aes",
138 },
139#endif
140#ifdef CONFIG_CRYPTO_DRBG_HASH
141 {
142 .flags = DRBG_HASH | DRBG_STRENGTH128,
143 .statelen = 55,
144 .blocklen_bytes = 20,
145 .cra_name = "sha1",
146 .backend_cra_name = "sha1",
147 }, {
148 .flags = DRBG_HASH | DRBG_STRENGTH256,
149 .statelen = 111,
150 .blocklen_bytes = 48,
151 .cra_name = "sha384",
152 .backend_cra_name = "sha384",
153 }, {
154 .flags = DRBG_HASH | DRBG_STRENGTH256,
155 .statelen = 111,
156 .blocklen_bytes = 64,
157 .cra_name = "sha512",
158 .backend_cra_name = "sha512",
159 }, {
160 .flags = DRBG_HASH | DRBG_STRENGTH256,
161 .statelen = 55,
162 .blocklen_bytes = 32,
163 .cra_name = "sha256",
164 .backend_cra_name = "sha256",
165 },
166#endif
167#ifdef CONFIG_CRYPTO_DRBG_HMAC
168 {
169 .flags = DRBG_HMAC | DRBG_STRENGTH128,
170 .statelen = 20,
171 .blocklen_bytes = 20,
172 .cra_name = "hmac_sha1",
173 .backend_cra_name = "hmac(sha1)",
174 }, {
175 .flags = DRBG_HMAC | DRBG_STRENGTH256,
176 .statelen = 48,
177 .blocklen_bytes = 48,
178 .cra_name = "hmac_sha384",
179 .backend_cra_name = "hmac(sha384)",
180 }, {
181 .flags = DRBG_HMAC | DRBG_STRENGTH256,
182 .statelen = 32,
183 .blocklen_bytes = 32,
184 .cra_name = "hmac_sha256",
185 .backend_cra_name = "hmac(sha256)",
186 }, {
187 .flags = DRBG_HMAC | DRBG_STRENGTH256,
188 .statelen = 64,
189 .blocklen_bytes = 64,
190 .cra_name = "hmac_sha512",
191 .backend_cra_name = "hmac(sha512)",
192 },
193#endif
194};
195
196static int drbg_uninstantiate(struct drbg_state *drbg);
197
198
199
200
201
202
203
204
205
206
207
208
209
210static inline unsigned short drbg_sec_strength(drbg_flag_t flags)
211{
212 switch (flags & DRBG_STRENGTH_MASK) {
213 case DRBG_STRENGTH128:
214 return 16;
215 case DRBG_STRENGTH192:
216 return 24;
217 case DRBG_STRENGTH256:
218 return 32;
219 default:
220 return 32;
221 }
222}
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243static int drbg_fips_continuous_test(struct drbg_state *drbg,
244 const unsigned char *entropy)
245{
246 unsigned short entropylen = drbg_sec_strength(drbg->core->flags);
247 int ret = 0;
248
249 if (!IS_ENABLED(CONFIG_CRYPTO_FIPS))
250 return 0;
251
252
253 if (list_empty(&drbg->test_data.list))
254 return 0;
255
256 if (!fips_enabled)
257 return 0;
258
259 if (!drbg->fips_primed) {
260
261 memcpy(drbg->prev, entropy, entropylen);
262 drbg->fips_primed = true;
263
264 return -EAGAIN;
265 }
266 ret = memcmp(drbg->prev, entropy, entropylen);
267 if (!ret)
268 panic("DRBG continuous self test failed\n");
269 memcpy(drbg->prev, entropy, entropylen);
270
271
272 return 0;
273}
274
275
276
277
278
279
280
281
282
283#if (defined(CONFIG_CRYPTO_DRBG_HASH) || defined(CONFIG_CRYPTO_DRBG_CTR))
284static inline void drbg_cpu_to_be32(__u32 val, unsigned char *buf)
285{
286 struct s {
287 __be32 conv;
288 };
289 struct s *conversion = (struct s *) buf;
290
291 conversion->conv = cpu_to_be32(val);
292}
293#endif
294
295
296
297
298
299#ifdef CONFIG_CRYPTO_DRBG_CTR
300#define CRYPTO_DRBG_CTR_STRING "CTR "
301MODULE_ALIAS_CRYPTO("drbg_pr_ctr_aes256");
302MODULE_ALIAS_CRYPTO("drbg_nopr_ctr_aes256");
303MODULE_ALIAS_CRYPTO("drbg_pr_ctr_aes192");
304MODULE_ALIAS_CRYPTO("drbg_nopr_ctr_aes192");
305MODULE_ALIAS_CRYPTO("drbg_pr_ctr_aes128");
306MODULE_ALIAS_CRYPTO("drbg_nopr_ctr_aes128");
307
308static void drbg_kcapi_symsetkey(struct drbg_state *drbg,
309 const unsigned char *key);
310static int drbg_kcapi_sym(struct drbg_state *drbg, unsigned char *outval,
311 const struct drbg_string *in);
312static int drbg_init_sym_kernel(struct drbg_state *drbg);
313static int drbg_fini_sym_kernel(struct drbg_state *drbg);
314static int drbg_kcapi_sym_ctr(struct drbg_state *drbg,
315 u8 *inbuf, u32 inbuflen,
316 u8 *outbuf, u32 outlen);
317#define DRBG_OUTSCRATCHLEN 256
318
319
320static int drbg_ctr_bcc(struct drbg_state *drbg,
321 unsigned char *out, const unsigned char *key,
322 struct list_head *in)
323{
324 int ret = 0;
325 struct drbg_string *curr = NULL;
326 struct drbg_string data;
327 short cnt = 0;
328
329 drbg_string_fill(&data, out, drbg_blocklen(drbg));
330
331
332 drbg_kcapi_symsetkey(drbg, key);
333 list_for_each_entry(curr, in, list) {
334 const unsigned char *pos = curr->buf;
335 size_t len = curr->len;
336
337 while (len) {
338
339 if (drbg_blocklen(drbg) == cnt) {
340 cnt = 0;
341 ret = drbg_kcapi_sym(drbg, out, &data);
342 if (ret)
343 return ret;
344 }
345 out[cnt] ^= *pos;
346 pos++;
347 cnt++;
348 len--;
349 }
350 }
351
352 if (cnt)
353 ret = drbg_kcapi_sym(drbg, out, &data);
354
355 return ret;
356}
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398static int drbg_ctr_df(struct drbg_state *drbg,
399 unsigned char *df_data, size_t bytes_to_return,
400 struct list_head *seedlist)
401{
402 int ret = -EFAULT;
403 unsigned char L_N[8];
404
405 struct drbg_string S1, S2, S4, cipherin;
406 LIST_HEAD(bcc_list);
407 unsigned char *pad = df_data + drbg_statelen(drbg);
408 unsigned char *iv = pad + drbg_blocklen(drbg);
409 unsigned char *temp = iv + drbg_blocklen(drbg);
410 size_t padlen = 0;
411 unsigned int templen = 0;
412
413 unsigned int i = 0;
414
415 const unsigned char *K = (unsigned char *)
416 "\x00\x01\x02\x03\x04\x05\x06\x07"
417 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
418 "\x10\x11\x12\x13\x14\x15\x16\x17"
419 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f";
420 unsigned char *X;
421 size_t generated_len = 0;
422 size_t inputlen = 0;
423 struct drbg_string *seed = NULL;
424
425 memset(pad, 0, drbg_blocklen(drbg));
426 memset(iv, 0, drbg_blocklen(drbg));
427
428
429
430
431 if ((512/8) < bytes_to_return)
432 return -EINVAL;
433
434
435 list_for_each_entry(seed, seedlist, list)
436 inputlen += seed->len;
437 drbg_cpu_to_be32(inputlen, &L_N[0]);
438
439
440 drbg_cpu_to_be32(bytes_to_return, &L_N[4]);
441
442
443 padlen = (inputlen + sizeof(L_N) + 1) % (drbg_blocklen(drbg));
444
445 if (padlen)
446 padlen = drbg_blocklen(drbg) - padlen;
447
448
449
450
451
452 padlen++;
453 pad[0] = 0x80;
454
455
456 drbg_string_fill(&S1, iv, drbg_blocklen(drbg));
457 list_add_tail(&S1.list, &bcc_list);
458 drbg_string_fill(&S2, L_N, sizeof(L_N));
459 list_add_tail(&S2.list, &bcc_list);
460 list_splice_tail(seedlist, &bcc_list);
461 drbg_string_fill(&S4, pad, padlen);
462 list_add_tail(&S4.list, &bcc_list);
463
464
465 while (templen < (drbg_keylen(drbg) + (drbg_blocklen(drbg)))) {
466
467
468
469
470
471 drbg_cpu_to_be32(i, iv);
472
473 ret = drbg_ctr_bcc(drbg, temp + templen, K, &bcc_list);
474 if (ret)
475 goto out;
476
477 i++;
478 templen += drbg_blocklen(drbg);
479 }
480
481
482 X = temp + (drbg_keylen(drbg));
483 drbg_string_fill(&cipherin, X, drbg_blocklen(drbg));
484
485
486
487
488 drbg_kcapi_symsetkey(drbg, temp);
489 while (generated_len < bytes_to_return) {
490 short blocklen = 0;
491
492
493
494
495
496 ret = drbg_kcapi_sym(drbg, X, &cipherin);
497 if (ret)
498 goto out;
499 blocklen = (drbg_blocklen(drbg) <
500 (bytes_to_return - generated_len)) ?
501 drbg_blocklen(drbg) :
502 (bytes_to_return - generated_len);
503
504 memcpy(df_data + generated_len, X, blocklen);
505 generated_len += blocklen;
506 }
507
508 ret = 0;
509
510out:
511 memset(iv, 0, drbg_blocklen(drbg));
512 memset(temp, 0, drbg_statelen(drbg) + drbg_blocklen(drbg));
513 memset(pad, 0, drbg_blocklen(drbg));
514 return ret;
515}
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532static int drbg_ctr_update(struct drbg_state *drbg, struct list_head *seed,
533 int reseed)
534{
535 int ret = -EFAULT;
536
537 unsigned char *temp = drbg->scratchpad;
538 unsigned char *df_data = drbg->scratchpad + drbg_statelen(drbg) +
539 drbg_blocklen(drbg);
540
541 if (3 > reseed)
542 memset(df_data, 0, drbg_statelen(drbg));
543
544 if (!reseed) {
545
546
547
548
549
550
551
552 crypto_inc(drbg->V, drbg_blocklen(drbg));
553
554 ret = crypto_skcipher_setkey(drbg->ctr_handle, drbg->C,
555 drbg_keylen(drbg));
556 if (ret)
557 goto out;
558 }
559
560
561 if (seed) {
562 ret = drbg_ctr_df(drbg, df_data, drbg_statelen(drbg), seed);
563 if (ret)
564 goto out;
565 }
566
567 ret = drbg_kcapi_sym_ctr(drbg, df_data, drbg_statelen(drbg),
568 temp, drbg_statelen(drbg));
569 if (ret)
570 return ret;
571
572
573 ret = crypto_skcipher_setkey(drbg->ctr_handle, temp,
574 drbg_keylen(drbg));
575 if (ret)
576 goto out;
577
578 memcpy(drbg->V, temp + drbg_keylen(drbg), drbg_blocklen(drbg));
579
580 crypto_inc(drbg->V, drbg_blocklen(drbg));
581 ret = 0;
582
583out:
584 memset(temp, 0, drbg_statelen(drbg) + drbg_blocklen(drbg));
585 if (2 != reseed)
586 memset(df_data, 0, drbg_statelen(drbg));
587 return ret;
588}
589
590
591
592
593
594
595static int drbg_ctr_generate(struct drbg_state *drbg,
596 unsigned char *buf, unsigned int buflen,
597 struct list_head *addtl)
598{
599 int ret;
600 int len = min_t(int, buflen, INT_MAX);
601
602
603 if (addtl && !list_empty(addtl)) {
604 ret = drbg_ctr_update(drbg, addtl, 2);
605 if (ret)
606 return 0;
607 }
608
609
610 ret = drbg_kcapi_sym_ctr(drbg, NULL, 0, buf, len);
611 if (ret)
612 return ret;
613
614
615 ret = drbg_ctr_update(drbg, NULL, 3);
616 if (ret)
617 len = ret;
618
619 return len;
620}
621
622static const struct drbg_state_ops drbg_ctr_ops = {
623 .update = drbg_ctr_update,
624 .generate = drbg_ctr_generate,
625 .crypto_init = drbg_init_sym_kernel,
626 .crypto_fini = drbg_fini_sym_kernel,
627};
628#endif
629
630
631
632
633
634#if defined(CONFIG_CRYPTO_DRBG_HASH) || defined(CONFIG_CRYPTO_DRBG_HMAC)
635static int drbg_kcapi_hash(struct drbg_state *drbg, unsigned char *outval,
636 const struct list_head *in);
637static void drbg_kcapi_hmacsetkey(struct drbg_state *drbg,
638 const unsigned char *key);
639static int drbg_init_hash_kernel(struct drbg_state *drbg);
640static int drbg_fini_hash_kernel(struct drbg_state *drbg);
641#endif
642
643#ifdef CONFIG_CRYPTO_DRBG_HMAC
644#define CRYPTO_DRBG_HMAC_STRING "HMAC "
645MODULE_ALIAS_CRYPTO("drbg_pr_hmac_sha512");
646MODULE_ALIAS_CRYPTO("drbg_nopr_hmac_sha512");
647MODULE_ALIAS_CRYPTO("drbg_pr_hmac_sha384");
648MODULE_ALIAS_CRYPTO("drbg_nopr_hmac_sha384");
649MODULE_ALIAS_CRYPTO("drbg_pr_hmac_sha256");
650MODULE_ALIAS_CRYPTO("drbg_nopr_hmac_sha256");
651MODULE_ALIAS_CRYPTO("drbg_pr_hmac_sha1");
652MODULE_ALIAS_CRYPTO("drbg_nopr_hmac_sha1");
653
654
655static int drbg_hmac_update(struct drbg_state *drbg, struct list_head *seed,
656 int reseed)
657{
658 int ret = -EFAULT;
659 int i = 0;
660 struct drbg_string seed1, seed2, vdata;
661 LIST_HEAD(seedlist);
662 LIST_HEAD(vdatalist);
663
664 if (!reseed) {
665
666 memset(drbg->V, 1, drbg_statelen(drbg));
667 drbg_kcapi_hmacsetkey(drbg, drbg->C);
668 }
669
670 drbg_string_fill(&seed1, drbg->V, drbg_statelen(drbg));
671 list_add_tail(&seed1.list, &seedlist);
672
673 drbg_string_fill(&seed2, NULL, 1);
674 list_add_tail(&seed2.list, &seedlist);
675
676 if (seed)
677 list_splice_tail(seed, &seedlist);
678
679 drbg_string_fill(&vdata, drbg->V, drbg_statelen(drbg));
680 list_add_tail(&vdata.list, &vdatalist);
681 for (i = 2; 0 < i; i--) {
682
683 unsigned char prefix = DRBG_PREFIX0;
684 if (1 == i)
685 prefix = DRBG_PREFIX1;
686
687 seed2.buf = &prefix;
688 ret = drbg_kcapi_hash(drbg, drbg->C, &seedlist);
689 if (ret)
690 return ret;
691 drbg_kcapi_hmacsetkey(drbg, drbg->C);
692
693
694 ret = drbg_kcapi_hash(drbg, drbg->V, &vdatalist);
695 if (ret)
696 return ret;
697
698
699 if (!seed)
700 return ret;
701 }
702
703 return 0;
704}
705
706
707static int drbg_hmac_generate(struct drbg_state *drbg,
708 unsigned char *buf,
709 unsigned int buflen,
710 struct list_head *addtl)
711{
712 int len = 0;
713 int ret = 0;
714 struct drbg_string data;
715 LIST_HEAD(datalist);
716
717
718 if (addtl && !list_empty(addtl)) {
719 ret = drbg_hmac_update(drbg, addtl, 1);
720 if (ret)
721 return ret;
722 }
723
724 drbg_string_fill(&data, drbg->V, drbg_statelen(drbg));
725 list_add_tail(&data.list, &datalist);
726 while (len < buflen) {
727 unsigned int outlen = 0;
728
729 ret = drbg_kcapi_hash(drbg, drbg->V, &datalist);
730 if (ret)
731 return ret;
732 outlen = (drbg_blocklen(drbg) < (buflen - len)) ?
733 drbg_blocklen(drbg) : (buflen - len);
734
735
736 memcpy(buf + len, drbg->V, outlen);
737 len += outlen;
738 }
739
740
741 if (addtl && !list_empty(addtl))
742 ret = drbg_hmac_update(drbg, addtl, 1);
743 else
744 ret = drbg_hmac_update(drbg, NULL, 1);
745 if (ret)
746 return ret;
747
748 return len;
749}
750
751static const struct drbg_state_ops drbg_hmac_ops = {
752 .update = drbg_hmac_update,
753 .generate = drbg_hmac_generate,
754 .crypto_init = drbg_init_hash_kernel,
755 .crypto_fini = drbg_fini_hash_kernel,
756};
757#endif
758
759
760
761
762
763#ifdef CONFIG_CRYPTO_DRBG_HASH
764#define CRYPTO_DRBG_HASH_STRING "HASH "
765MODULE_ALIAS_CRYPTO("drbg_pr_sha512");
766MODULE_ALIAS_CRYPTO("drbg_nopr_sha512");
767MODULE_ALIAS_CRYPTO("drbg_pr_sha384");
768MODULE_ALIAS_CRYPTO("drbg_nopr_sha384");
769MODULE_ALIAS_CRYPTO("drbg_pr_sha256");
770MODULE_ALIAS_CRYPTO("drbg_nopr_sha256");
771MODULE_ALIAS_CRYPTO("drbg_pr_sha1");
772MODULE_ALIAS_CRYPTO("drbg_nopr_sha1");
773
774
775
776
777
778
779
780static inline void drbg_add_buf(unsigned char *dst, size_t dstlen,
781 const unsigned char *add, size_t addlen)
782{
783
784 unsigned char *dstptr;
785 const unsigned char *addptr;
786 unsigned int remainder = 0;
787 size_t len = addlen;
788
789 dstptr = dst + (dstlen-1);
790 addptr = add + (addlen-1);
791 while (len) {
792 remainder += *dstptr + *addptr;
793 *dstptr = remainder & 0xff;
794 remainder >>= 8;
795 len--; dstptr--; addptr--;
796 }
797 len = dstlen - addlen;
798 while (len && remainder > 0) {
799 remainder = *dstptr + 1;
800 *dstptr = remainder & 0xff;
801 remainder >>= 8;
802 len--; dstptr--;
803 }
804}
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822static int drbg_hash_df(struct drbg_state *drbg,
823 unsigned char *outval, size_t outlen,
824 struct list_head *entropylist)
825{
826 int ret = 0;
827 size_t len = 0;
828 unsigned char input[5];
829 unsigned char *tmp = drbg->scratchpad + drbg_statelen(drbg);
830 struct drbg_string data;
831
832
833 input[0] = 1;
834 drbg_cpu_to_be32((outlen * 8), &input[1]);
835
836
837 drbg_string_fill(&data, input, 5);
838 list_add(&data.list, entropylist);
839
840
841 while (len < outlen) {
842 short blocklen = 0;
843
844 ret = drbg_kcapi_hash(drbg, tmp, entropylist);
845 if (ret)
846 goto out;
847
848 input[0]++;
849 blocklen = (drbg_blocklen(drbg) < (outlen - len)) ?
850 drbg_blocklen(drbg) : (outlen - len);
851 memcpy(outval + len, tmp, blocklen);
852 len += blocklen;
853 }
854
855out:
856 memset(tmp, 0, drbg_blocklen(drbg));
857 return ret;
858}
859
860
861static int drbg_hash_update(struct drbg_state *drbg, struct list_head *seed,
862 int reseed)
863{
864 int ret = 0;
865 struct drbg_string data1, data2;
866 LIST_HEAD(datalist);
867 LIST_HEAD(datalist2);
868 unsigned char *V = drbg->scratchpad;
869 unsigned char prefix = DRBG_PREFIX1;
870
871 if (!seed)
872 return -EINVAL;
873
874 if (reseed) {
875
876 memcpy(V, drbg->V, drbg_statelen(drbg));
877 drbg_string_fill(&data1, &prefix, 1);
878 list_add_tail(&data1.list, &datalist);
879 drbg_string_fill(&data2, V, drbg_statelen(drbg));
880 list_add_tail(&data2.list, &datalist);
881 }
882 list_splice_tail(seed, &datalist);
883
884
885 ret = drbg_hash_df(drbg, drbg->V, drbg_statelen(drbg), &datalist);
886 if (ret)
887 goto out;
888
889
890 prefix = DRBG_PREFIX0;
891 drbg_string_fill(&data1, &prefix, 1);
892 list_add_tail(&data1.list, &datalist2);
893 drbg_string_fill(&data2, drbg->V, drbg_statelen(drbg));
894 list_add_tail(&data2.list, &datalist2);
895
896 ret = drbg_hash_df(drbg, drbg->C, drbg_statelen(drbg), &datalist2);
897
898out:
899 memset(drbg->scratchpad, 0, drbg_statelen(drbg));
900 return ret;
901}
902
903
904static int drbg_hash_process_addtl(struct drbg_state *drbg,
905 struct list_head *addtl)
906{
907 int ret = 0;
908 struct drbg_string data1, data2;
909 LIST_HEAD(datalist);
910 unsigned char prefix = DRBG_PREFIX2;
911
912
913 if (!addtl || list_empty(addtl))
914 return 0;
915
916
917 drbg_string_fill(&data1, &prefix, 1);
918 drbg_string_fill(&data2, drbg->V, drbg_statelen(drbg));
919 list_add_tail(&data1.list, &datalist);
920 list_add_tail(&data2.list, &datalist);
921 list_splice_tail(addtl, &datalist);
922 ret = drbg_kcapi_hash(drbg, drbg->scratchpad, &datalist);
923 if (ret)
924 goto out;
925
926
927 drbg_add_buf(drbg->V, drbg_statelen(drbg),
928 drbg->scratchpad, drbg_blocklen(drbg));
929
930out:
931 memset(drbg->scratchpad, 0, drbg_blocklen(drbg));
932 return ret;
933}
934
935
936static int drbg_hash_hashgen(struct drbg_state *drbg,
937 unsigned char *buf,
938 unsigned int buflen)
939{
940 int len = 0;
941 int ret = 0;
942 unsigned char *src = drbg->scratchpad;
943 unsigned char *dst = drbg->scratchpad + drbg_statelen(drbg);
944 struct drbg_string data;
945 LIST_HEAD(datalist);
946
947
948 memcpy(src, drbg->V, drbg_statelen(drbg));
949
950 drbg_string_fill(&data, src, drbg_statelen(drbg));
951 list_add_tail(&data.list, &datalist);
952 while (len < buflen) {
953 unsigned int outlen = 0;
954
955 ret = drbg_kcapi_hash(drbg, dst, &datalist);
956 if (ret) {
957 len = ret;
958 goto out;
959 }
960 outlen = (drbg_blocklen(drbg) < (buflen - len)) ?
961 drbg_blocklen(drbg) : (buflen - len);
962
963 memcpy(buf + len, dst, outlen);
964 len += outlen;
965
966 if (len < buflen)
967 crypto_inc(src, drbg_statelen(drbg));
968 }
969
970out:
971 memset(drbg->scratchpad, 0,
972 (drbg_statelen(drbg) + drbg_blocklen(drbg)));
973 return len;
974}
975
976
977static int drbg_hash_generate(struct drbg_state *drbg,
978 unsigned char *buf, unsigned int buflen,
979 struct list_head *addtl)
980{
981 int len = 0;
982 int ret = 0;
983 union {
984 unsigned char req[8];
985 __be64 req_int;
986 } u;
987 unsigned char prefix = DRBG_PREFIX3;
988 struct drbg_string data1, data2;
989 LIST_HEAD(datalist);
990
991
992 ret = drbg_hash_process_addtl(drbg, addtl);
993 if (ret)
994 return ret;
995
996 len = drbg_hash_hashgen(drbg, buf, buflen);
997
998
999
1000 drbg_string_fill(&data1, &prefix, 1);
1001 list_add_tail(&data1.list, &datalist);
1002 drbg_string_fill(&data2, drbg->V, drbg_statelen(drbg));
1003 list_add_tail(&data2.list, &datalist);
1004 ret = drbg_kcapi_hash(drbg, drbg->scratchpad, &datalist);
1005 if (ret) {
1006 len = ret;
1007 goto out;
1008 }
1009
1010
1011 drbg_add_buf(drbg->V, drbg_statelen(drbg),
1012 drbg->scratchpad, drbg_blocklen(drbg));
1013 drbg_add_buf(drbg->V, drbg_statelen(drbg),
1014 drbg->C, drbg_statelen(drbg));
1015 u.req_int = cpu_to_be64(drbg->reseed_ctr);
1016 drbg_add_buf(drbg->V, drbg_statelen(drbg), u.req, 8);
1017
1018out:
1019 memset(drbg->scratchpad, 0, drbg_blocklen(drbg));
1020 return len;
1021}
1022
1023
1024
1025
1026
1027static const struct drbg_state_ops drbg_hash_ops = {
1028 .update = drbg_hash_update,
1029 .generate = drbg_hash_generate,
1030 .crypto_init = drbg_init_hash_kernel,
1031 .crypto_fini = drbg_fini_hash_kernel,
1032};
1033#endif
1034
1035
1036
1037
1038
1039static inline int __drbg_seed(struct drbg_state *drbg, struct list_head *seed,
1040 int reseed, enum drbg_seed_state new_seed_state)
1041{
1042 int ret = drbg->d_ops->update(drbg, seed, reseed);
1043
1044 if (ret)
1045 return ret;
1046
1047 drbg->seeded = new_seed_state;
1048 drbg->last_seed_time = jiffies;
1049
1050 drbg->reseed_ctr = 1;
1051
1052 switch (drbg->seeded) {
1053 case DRBG_SEED_STATE_UNSEEDED:
1054
1055 fallthrough;
1056 case DRBG_SEED_STATE_PARTIAL:
1057
1058
1059
1060
1061 drbg->reseed_threshold = 50;
1062 break;
1063
1064 case DRBG_SEED_STATE_FULL:
1065
1066
1067
1068
1069 drbg->reseed_threshold = drbg_max_requests(drbg);
1070 break;
1071 }
1072
1073 return ret;
1074}
1075
1076static inline int drbg_get_random_bytes(struct drbg_state *drbg,
1077 unsigned char *entropy,
1078 unsigned int entropylen)
1079{
1080 int ret;
1081
1082 do {
1083 get_random_bytes(entropy, entropylen);
1084 ret = drbg_fips_continuous_test(drbg, entropy);
1085 if (ret && ret != -EAGAIN)
1086 return ret;
1087 } while (ret);
1088
1089 return 0;
1090}
1091
1092static int drbg_seed_from_random(struct drbg_state *drbg)
1093{
1094 struct drbg_string data;
1095 LIST_HEAD(seedlist);
1096 unsigned int entropylen = drbg_sec_strength(drbg->core->flags);
1097 unsigned char entropy[32];
1098 int ret;
1099
1100 BUG_ON(!entropylen);
1101 BUG_ON(entropylen > sizeof(entropy));
1102
1103 drbg_string_fill(&data, entropy, entropylen);
1104 list_add_tail(&data.list, &seedlist);
1105
1106 ret = drbg_get_random_bytes(drbg, entropy, entropylen);
1107 if (ret)
1108 goto out;
1109
1110 ret = __drbg_seed(drbg, &seedlist, true, DRBG_SEED_STATE_FULL);
1111
1112out:
1113 memzero_explicit(entropy, entropylen);
1114 return ret;
1115}
1116
1117static bool drbg_nopr_reseed_interval_elapsed(struct drbg_state *drbg)
1118{
1119 unsigned long next_reseed;
1120
1121
1122 if (list_empty(&drbg->test_data.list))
1123 return false;
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133 next_reseed = drbg->last_seed_time + 300 * HZ;
1134 return time_after(jiffies, next_reseed);
1135}
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148static int drbg_seed(struct drbg_state *drbg, struct drbg_string *pers,
1149 bool reseed)
1150{
1151 int ret;
1152 unsigned char entropy[((32 + 16) * 2)];
1153 unsigned int entropylen = drbg_sec_strength(drbg->core->flags);
1154 struct drbg_string data1;
1155 LIST_HEAD(seedlist);
1156 enum drbg_seed_state new_seed_state = DRBG_SEED_STATE_FULL;
1157
1158
1159 if (pers && pers->len > (drbg_max_addtl(drbg))) {
1160 pr_devel("DRBG: personalization string too long %zu\n",
1161 pers->len);
1162 return -EINVAL;
1163 }
1164
1165 if (list_empty(&drbg->test_data.list)) {
1166 drbg_string_fill(&data1, drbg->test_data.buf,
1167 drbg->test_data.len);
1168 pr_devel("DRBG: using test entropy\n");
1169 } else {
1170
1171
1172
1173
1174
1175
1176
1177
1178 BUG_ON(!entropylen);
1179 if (!reseed)
1180 entropylen = ((entropylen + 1) / 2) * 3;
1181 BUG_ON((entropylen * 2) > sizeof(entropy));
1182
1183
1184 if (!rng_is_initialized())
1185 new_seed_state = DRBG_SEED_STATE_PARTIAL;
1186
1187 ret = drbg_get_random_bytes(drbg, entropy, entropylen);
1188 if (ret)
1189 goto out;
1190
1191 if (!drbg->jent) {
1192 drbg_string_fill(&data1, entropy, entropylen);
1193 pr_devel("DRBG: (re)seeding with %u bytes of entropy\n",
1194 entropylen);
1195 } else {
1196
1197
1198
1199
1200 ret = crypto_rng_get_bytes(drbg->jent,
1201 entropy + entropylen,
1202 entropylen);
1203 if (fips_enabled && ret) {
1204 pr_devel("DRBG: jent failed with %d\n", ret);
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220 if (!reseed || ret != -EAGAIN)
1221 goto out;
1222 }
1223
1224 drbg_string_fill(&data1, entropy, entropylen * 2);
1225 pr_devel("DRBG: (re)seeding with %u bytes of entropy\n",
1226 entropylen * 2);
1227 }
1228 }
1229 list_add_tail(&data1.list, &seedlist);
1230
1231
1232
1233
1234
1235
1236 if (pers && pers->buf && 0 < pers->len) {
1237 list_add_tail(&pers->list, &seedlist);
1238 pr_devel("DRBG: using personalization string\n");
1239 }
1240
1241 if (!reseed) {
1242 memset(drbg->V, 0, drbg_statelen(drbg));
1243 memset(drbg->C, 0, drbg_statelen(drbg));
1244 }
1245
1246 ret = __drbg_seed(drbg, &seedlist, reseed, new_seed_state);
1247
1248out:
1249 memzero_explicit(entropy, entropylen * 2);
1250
1251 return ret;
1252}
1253
1254
1255static inline void drbg_dealloc_state(struct drbg_state *drbg)
1256{
1257 if (!drbg)
1258 return;
1259 kfree_sensitive(drbg->Vbuf);
1260 drbg->Vbuf = NULL;
1261 drbg->V = NULL;
1262 kfree_sensitive(drbg->Cbuf);
1263 drbg->Cbuf = NULL;
1264 drbg->C = NULL;
1265 kfree_sensitive(drbg->scratchpadbuf);
1266 drbg->scratchpadbuf = NULL;
1267 drbg->reseed_ctr = 0;
1268 drbg->d_ops = NULL;
1269 drbg->core = NULL;
1270 if (IS_ENABLED(CONFIG_CRYPTO_FIPS)) {
1271 kfree_sensitive(drbg->prev);
1272 drbg->prev = NULL;
1273 drbg->fips_primed = false;
1274 }
1275}
1276
1277
1278
1279
1280
1281static inline int drbg_alloc_state(struct drbg_state *drbg)
1282{
1283 int ret = -ENOMEM;
1284 unsigned int sb_size = 0;
1285
1286 switch (drbg->core->flags & DRBG_TYPE_MASK) {
1287#ifdef CONFIG_CRYPTO_DRBG_HMAC
1288 case DRBG_HMAC:
1289 drbg->d_ops = &drbg_hmac_ops;
1290 break;
1291#endif
1292#ifdef CONFIG_CRYPTO_DRBG_HASH
1293 case DRBG_HASH:
1294 drbg->d_ops = &drbg_hash_ops;
1295 break;
1296#endif
1297#ifdef CONFIG_CRYPTO_DRBG_CTR
1298 case DRBG_CTR:
1299 drbg->d_ops = &drbg_ctr_ops;
1300 break;
1301#endif
1302 default:
1303 ret = -EOPNOTSUPP;
1304 goto err;
1305 }
1306
1307 ret = drbg->d_ops->crypto_init(drbg);
1308 if (ret < 0)
1309 goto err;
1310
1311 drbg->Vbuf = kmalloc(drbg_statelen(drbg) + ret, GFP_KERNEL);
1312 if (!drbg->Vbuf) {
1313 ret = -ENOMEM;
1314 goto fini;
1315 }
1316 drbg->V = PTR_ALIGN(drbg->Vbuf, ret + 1);
1317 drbg->Cbuf = kmalloc(drbg_statelen(drbg) + ret, GFP_KERNEL);
1318 if (!drbg->Cbuf) {
1319 ret = -ENOMEM;
1320 goto fini;
1321 }
1322 drbg->C = PTR_ALIGN(drbg->Cbuf, ret + 1);
1323
1324 if (drbg->core->flags & DRBG_HMAC)
1325 sb_size = 0;
1326 else if (drbg->core->flags & DRBG_CTR)
1327 sb_size = drbg_statelen(drbg) + drbg_blocklen(drbg) +
1328 drbg_statelen(drbg) +
1329 drbg_blocklen(drbg) +
1330 drbg_blocklen(drbg) +
1331 drbg_statelen(drbg) + drbg_blocklen(drbg);
1332 else
1333 sb_size = drbg_statelen(drbg) + drbg_blocklen(drbg);
1334
1335 if (0 < sb_size) {
1336 drbg->scratchpadbuf = kzalloc(sb_size + ret, GFP_KERNEL);
1337 if (!drbg->scratchpadbuf) {
1338 ret = -ENOMEM;
1339 goto fini;
1340 }
1341 drbg->scratchpad = PTR_ALIGN(drbg->scratchpadbuf, ret + 1);
1342 }
1343
1344 if (IS_ENABLED(CONFIG_CRYPTO_FIPS)) {
1345 drbg->prev = kzalloc(drbg_sec_strength(drbg->core->flags),
1346 GFP_KERNEL);
1347 if (!drbg->prev) {
1348 ret = -ENOMEM;
1349 goto fini;
1350 }
1351 drbg->fips_primed = false;
1352 }
1353
1354 return 0;
1355
1356fini:
1357 drbg->d_ops->crypto_fini(drbg);
1358err:
1359 drbg_dealloc_state(drbg);
1360 return ret;
1361}
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383static int drbg_generate(struct drbg_state *drbg,
1384 unsigned char *buf, unsigned int buflen,
1385 struct drbg_string *addtl)
1386{
1387 int len = 0;
1388 LIST_HEAD(addtllist);
1389
1390 if (!drbg->core) {
1391 pr_devel("DRBG: not yet seeded\n");
1392 return -EINVAL;
1393 }
1394 if (0 == buflen || !buf) {
1395 pr_devel("DRBG: no output buffer provided\n");
1396 return -EINVAL;
1397 }
1398 if (addtl && NULL == addtl->buf && 0 < addtl->len) {
1399 pr_devel("DRBG: wrong format of additional information\n");
1400 return -EINVAL;
1401 }
1402
1403
1404 len = -EINVAL;
1405 if (buflen > (drbg_max_request_bytes(drbg))) {
1406 pr_devel("DRBG: requested random numbers too large %u\n",
1407 buflen);
1408 goto err;
1409 }
1410
1411
1412
1413
1414 if (addtl && addtl->len > (drbg_max_addtl(drbg))) {
1415 pr_devel("DRBG: additional information string too long %zu\n",
1416 addtl->len);
1417 goto err;
1418 }
1419
1420
1421
1422
1423
1424
1425 if (drbg->reseed_threshold < drbg->reseed_ctr)
1426 drbg->seeded = DRBG_SEED_STATE_UNSEEDED;
1427
1428 if (drbg->pr || drbg->seeded == DRBG_SEED_STATE_UNSEEDED) {
1429 pr_devel("DRBG: reseeding before generation (prediction "
1430 "resistance: %s, state %s)\n",
1431 drbg->pr ? "true" : "false",
1432 (drbg->seeded == DRBG_SEED_STATE_FULL ?
1433 "seeded" : "unseeded"));
1434
1435 len = drbg_seed(drbg, addtl, true);
1436 if (len)
1437 goto err;
1438
1439 addtl = NULL;
1440 } else if (rng_is_initialized() &&
1441 (drbg->seeded == DRBG_SEED_STATE_PARTIAL ||
1442 drbg_nopr_reseed_interval_elapsed(drbg))) {
1443 len = drbg_seed_from_random(drbg);
1444 if (len)
1445 goto err;
1446 }
1447
1448 if (addtl && 0 < addtl->len)
1449 list_add_tail(&addtl->list, &addtllist);
1450
1451 len = drbg->d_ops->generate(drbg, buf, buflen, &addtllist);
1452
1453
1454 drbg->reseed_ctr++;
1455 if (0 >= len)
1456 goto err;
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473#if 0
1474 if (drbg->reseed_ctr && !(drbg->reseed_ctr % 4096)) {
1475 int err = 0;
1476 pr_devel("DRBG: start to perform self test\n");
1477 if (drbg->core->flags & DRBG_HMAC)
1478 err = alg_test("drbg_pr_hmac_sha256",
1479 "drbg_pr_hmac_sha256", 0, 0);
1480 else if (drbg->core->flags & DRBG_CTR)
1481 err = alg_test("drbg_pr_ctr_aes128",
1482 "drbg_pr_ctr_aes128", 0, 0);
1483 else
1484 err = alg_test("drbg_pr_sha256",
1485 "drbg_pr_sha256", 0, 0);
1486 if (err) {
1487 pr_err("DRBG: periodical self test failed\n");
1488
1489
1490
1491
1492 drbg_uninstantiate(drbg);
1493 return 0;
1494 } else {
1495 pr_devel("DRBG: self test successful\n");
1496 }
1497 }
1498#endif
1499
1500
1501
1502
1503
1504 len = 0;
1505err:
1506 return len;
1507}
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517static int drbg_generate_long(struct drbg_state *drbg,
1518 unsigned char *buf, unsigned int buflen,
1519 struct drbg_string *addtl)
1520{
1521 unsigned int len = 0;
1522 unsigned int slice = 0;
1523 do {
1524 int err = 0;
1525 unsigned int chunk = 0;
1526 slice = ((buflen - len) / drbg_max_request_bytes(drbg));
1527 chunk = slice ? drbg_max_request_bytes(drbg) : (buflen - len);
1528 mutex_lock(&drbg->drbg_mutex);
1529 err = drbg_generate(drbg, buf + len, chunk, addtl);
1530 mutex_unlock(&drbg->drbg_mutex);
1531 if (0 > err)
1532 return err;
1533 len += chunk;
1534 } while (slice > 0 && (len < buflen));
1535 return 0;
1536}
1537
1538static int drbg_prepare_hrng(struct drbg_state *drbg)
1539{
1540
1541 if (list_empty(&drbg->test_data.list))
1542 return 0;
1543
1544 drbg->jent = crypto_alloc_rng("jitterentropy_rng", 0, 0);
1545 if (IS_ERR(drbg->jent)) {
1546 const int err = PTR_ERR(drbg->jent);
1547
1548 drbg->jent = NULL;
1549 if (fips_enabled)
1550 return err;
1551 pr_info("DRBG: Continuing without Jitter RNG\n");
1552 }
1553
1554 return 0;
1555}
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574static int drbg_instantiate(struct drbg_state *drbg, struct drbg_string *pers,
1575 int coreref, bool pr)
1576{
1577 int ret;
1578 bool reseed = true;
1579
1580 pr_devel("DRBG: Initializing DRBG core %d with prediction resistance "
1581 "%s\n", coreref, pr ? "enabled" : "disabled");
1582 mutex_lock(&drbg->drbg_mutex);
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594 if (!drbg->core) {
1595 drbg->core = &drbg_cores[coreref];
1596 drbg->pr = pr;
1597 drbg->seeded = DRBG_SEED_STATE_UNSEEDED;
1598 drbg->last_seed_time = 0;
1599 drbg->reseed_threshold = drbg_max_requests(drbg);
1600
1601 ret = drbg_alloc_state(drbg);
1602 if (ret)
1603 goto unlock;
1604
1605 ret = drbg_prepare_hrng(drbg);
1606 if (ret)
1607 goto free_everything;
1608
1609 reseed = false;
1610 }
1611
1612 ret = drbg_seed(drbg, pers, reseed);
1613
1614 if (ret && !reseed)
1615 goto free_everything;
1616
1617 mutex_unlock(&drbg->drbg_mutex);
1618 return ret;
1619
1620unlock:
1621 mutex_unlock(&drbg->drbg_mutex);
1622 return ret;
1623
1624free_everything:
1625 mutex_unlock(&drbg->drbg_mutex);
1626 drbg_uninstantiate(drbg);
1627 return ret;
1628}
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639static int drbg_uninstantiate(struct drbg_state *drbg)
1640{
1641 if (!IS_ERR_OR_NULL(drbg->jent))
1642 crypto_free_rng(drbg->jent);
1643 drbg->jent = NULL;
1644
1645 if (drbg->d_ops)
1646 drbg->d_ops->crypto_fini(drbg);
1647 drbg_dealloc_state(drbg);
1648
1649 return 0;
1650}
1651
1652
1653
1654
1655
1656
1657
1658
1659static void drbg_kcapi_set_entropy(struct crypto_rng *tfm,
1660 const u8 *data, unsigned int len)
1661{
1662 struct drbg_state *drbg = crypto_rng_ctx(tfm);
1663
1664 mutex_lock(&drbg->drbg_mutex);
1665 drbg_string_fill(&drbg->test_data, data, len);
1666 mutex_unlock(&drbg->drbg_mutex);
1667}
1668
1669
1670
1671
1672
1673#if defined(CONFIG_CRYPTO_DRBG_HASH) || defined(CONFIG_CRYPTO_DRBG_HMAC)
1674struct sdesc {
1675 struct shash_desc shash;
1676 char ctx[];
1677};
1678
1679static int drbg_init_hash_kernel(struct drbg_state *drbg)
1680{
1681 struct sdesc *sdesc;
1682 struct crypto_shash *tfm;
1683
1684 tfm = crypto_alloc_shash(drbg->core->backend_cra_name, 0, 0);
1685 if (IS_ERR(tfm)) {
1686 pr_info("DRBG: could not allocate digest TFM handle: %s\n",
1687 drbg->core->backend_cra_name);
1688 return PTR_ERR(tfm);
1689 }
1690 BUG_ON(drbg_blocklen(drbg) != crypto_shash_digestsize(tfm));
1691 sdesc = kzalloc(sizeof(struct shash_desc) + crypto_shash_descsize(tfm),
1692 GFP_KERNEL);
1693 if (!sdesc) {
1694 crypto_free_shash(tfm);
1695 return -ENOMEM;
1696 }
1697
1698 sdesc->shash.tfm = tfm;
1699 drbg->priv_data = sdesc;
1700
1701 return 0;
1702}
1703
1704static int drbg_fini_hash_kernel(struct drbg_state *drbg)
1705{
1706 struct sdesc *sdesc = drbg->priv_data;
1707 if (sdesc) {
1708 crypto_free_shash(sdesc->shash.tfm);
1709 kfree_sensitive(sdesc);
1710 }
1711 drbg->priv_data = NULL;
1712 return 0;
1713}
1714
1715static void drbg_kcapi_hmacsetkey(struct drbg_state *drbg,
1716 const unsigned char *key)
1717{
1718 struct sdesc *sdesc = drbg->priv_data;
1719
1720 crypto_shash_setkey(sdesc->shash.tfm, key, drbg_statelen(drbg));
1721}
1722
1723static int drbg_kcapi_hash(struct drbg_state *drbg, unsigned char *outval,
1724 const struct list_head *in)
1725{
1726 struct sdesc *sdesc = drbg->priv_data;
1727 struct drbg_string *input = NULL;
1728
1729 crypto_shash_init(&sdesc->shash);
1730 list_for_each_entry(input, in, list)
1731 crypto_shash_update(&sdesc->shash, input->buf, input->len);
1732 return crypto_shash_final(&sdesc->shash, outval);
1733}
1734#endif
1735
1736#ifdef CONFIG_CRYPTO_DRBG_CTR
1737static int drbg_fini_sym_kernel(struct drbg_state *drbg)
1738{
1739 struct crypto_cipher *tfm =
1740 (struct crypto_cipher *)drbg->priv_data;
1741 if (tfm)
1742 crypto_free_cipher(tfm);
1743 drbg->priv_data = NULL;
1744
1745 if (drbg->ctr_handle)
1746 crypto_free_skcipher(drbg->ctr_handle);
1747 drbg->ctr_handle = NULL;
1748
1749 if (drbg->ctr_req)
1750 skcipher_request_free(drbg->ctr_req);
1751 drbg->ctr_req = NULL;
1752
1753 kfree(drbg->outscratchpadbuf);
1754 drbg->outscratchpadbuf = NULL;
1755
1756 return 0;
1757}
1758
1759static int drbg_init_sym_kernel(struct drbg_state *drbg)
1760{
1761 struct crypto_cipher *tfm;
1762 struct crypto_skcipher *sk_tfm;
1763 struct skcipher_request *req;
1764 unsigned int alignmask;
1765 char ctr_name[CRYPTO_MAX_ALG_NAME];
1766
1767 tfm = crypto_alloc_cipher(drbg->core->backend_cra_name, 0, 0);
1768 if (IS_ERR(tfm)) {
1769 pr_info("DRBG: could not allocate cipher TFM handle: %s\n",
1770 drbg->core->backend_cra_name);
1771 return PTR_ERR(tfm);
1772 }
1773 BUG_ON(drbg_blocklen(drbg) != crypto_cipher_blocksize(tfm));
1774 drbg->priv_data = tfm;
1775
1776 if (snprintf(ctr_name, CRYPTO_MAX_ALG_NAME, "ctr(%s)",
1777 drbg->core->backend_cra_name) >= CRYPTO_MAX_ALG_NAME) {
1778 drbg_fini_sym_kernel(drbg);
1779 return -EINVAL;
1780 }
1781 sk_tfm = crypto_alloc_skcipher(ctr_name, 0, 0);
1782 if (IS_ERR(sk_tfm)) {
1783 pr_info("DRBG: could not allocate CTR cipher TFM handle: %s\n",
1784 ctr_name);
1785 drbg_fini_sym_kernel(drbg);
1786 return PTR_ERR(sk_tfm);
1787 }
1788 drbg->ctr_handle = sk_tfm;
1789 crypto_init_wait(&drbg->ctr_wait);
1790
1791 req = skcipher_request_alloc(sk_tfm, GFP_KERNEL);
1792 if (!req) {
1793 pr_info("DRBG: could not allocate request queue\n");
1794 drbg_fini_sym_kernel(drbg);
1795 return -ENOMEM;
1796 }
1797 drbg->ctr_req = req;
1798 skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG |
1799 CRYPTO_TFM_REQ_MAY_SLEEP,
1800 crypto_req_done, &drbg->ctr_wait);
1801
1802 alignmask = crypto_skcipher_alignmask(sk_tfm);
1803 drbg->outscratchpadbuf = kmalloc(DRBG_OUTSCRATCHLEN + alignmask,
1804 GFP_KERNEL);
1805 if (!drbg->outscratchpadbuf) {
1806 drbg_fini_sym_kernel(drbg);
1807 return -ENOMEM;
1808 }
1809 drbg->outscratchpad = (u8 *)PTR_ALIGN(drbg->outscratchpadbuf,
1810 alignmask + 1);
1811
1812 sg_init_table(&drbg->sg_in, 1);
1813 sg_init_one(&drbg->sg_out, drbg->outscratchpad, DRBG_OUTSCRATCHLEN);
1814
1815 return alignmask;
1816}
1817
1818static void drbg_kcapi_symsetkey(struct drbg_state *drbg,
1819 const unsigned char *key)
1820{
1821 struct crypto_cipher *tfm = drbg->priv_data;
1822
1823 crypto_cipher_setkey(tfm, key, (drbg_keylen(drbg)));
1824}
1825
1826static int drbg_kcapi_sym(struct drbg_state *drbg, unsigned char *outval,
1827 const struct drbg_string *in)
1828{
1829 struct crypto_cipher *tfm = drbg->priv_data;
1830
1831
1832 BUG_ON(in->len < drbg_blocklen(drbg));
1833 crypto_cipher_encrypt_one(tfm, outval, in->buf);
1834 return 0;
1835}
1836
1837static int drbg_kcapi_sym_ctr(struct drbg_state *drbg,
1838 u8 *inbuf, u32 inlen,
1839 u8 *outbuf, u32 outlen)
1840{
1841 struct scatterlist *sg_in = &drbg->sg_in, *sg_out = &drbg->sg_out;
1842 u32 scratchpad_use = min_t(u32, outlen, DRBG_OUTSCRATCHLEN);
1843 int ret;
1844
1845 if (inbuf) {
1846
1847 sg_set_buf(sg_in, inbuf, inlen);
1848 } else {
1849
1850 inlen = scratchpad_use;
1851 memset(drbg->outscratchpad, 0, scratchpad_use);
1852 sg_set_buf(sg_in, drbg->outscratchpad, scratchpad_use);
1853 }
1854
1855 while (outlen) {
1856 u32 cryptlen = min3(inlen, outlen, (u32)DRBG_OUTSCRATCHLEN);
1857
1858
1859 skcipher_request_set_crypt(drbg->ctr_req, sg_in, sg_out,
1860 cryptlen, drbg->V);
1861 ret = crypto_wait_req(crypto_skcipher_encrypt(drbg->ctr_req),
1862 &drbg->ctr_wait);
1863 if (ret)
1864 goto out;
1865
1866 crypto_init_wait(&drbg->ctr_wait);
1867
1868 memcpy(outbuf, drbg->outscratchpad, cryptlen);
1869 memzero_explicit(drbg->outscratchpad, cryptlen);
1870
1871 outlen -= cryptlen;
1872 outbuf += cryptlen;
1873 }
1874 ret = 0;
1875
1876out:
1877 return ret;
1878}
1879#endif
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896static inline void drbg_convert_tfm_core(const char *cra_driver_name,
1897 int *coreref, bool *pr)
1898{
1899 int i = 0;
1900 size_t start = 0;
1901 int len = 0;
1902
1903 *pr = true;
1904
1905 if (!memcmp(cra_driver_name, "drbg_nopr_", 10)) {
1906 start = 10;
1907 *pr = false;
1908 } else if (!memcmp(cra_driver_name, "drbg_pr_", 8)) {
1909 start = 8;
1910 } else {
1911 return;
1912 }
1913
1914
1915 len = strlen(cra_driver_name) - start;
1916 for (i = 0; ARRAY_SIZE(drbg_cores) > i; i++) {
1917 if (!memcmp(cra_driver_name + start, drbg_cores[i].cra_name,
1918 len)) {
1919 *coreref = i;
1920 return;
1921 }
1922 }
1923}
1924
1925static int drbg_kcapi_init(struct crypto_tfm *tfm)
1926{
1927 struct drbg_state *drbg = crypto_tfm_ctx(tfm);
1928
1929 mutex_init(&drbg->drbg_mutex);
1930
1931 return 0;
1932}
1933
1934static void drbg_kcapi_cleanup(struct crypto_tfm *tfm)
1935{
1936 drbg_uninstantiate(crypto_tfm_ctx(tfm));
1937}
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948static int drbg_kcapi_random(struct crypto_rng *tfm,
1949 const u8 *src, unsigned int slen,
1950 u8 *dst, unsigned int dlen)
1951{
1952 struct drbg_state *drbg = crypto_rng_ctx(tfm);
1953 struct drbg_string *addtl = NULL;
1954 struct drbg_string string;
1955
1956 if (slen) {
1957
1958 drbg_string_fill(&string, src, slen);
1959 addtl = &string;
1960 }
1961
1962 return drbg_generate_long(drbg, dst, dlen, addtl);
1963}
1964
1965
1966
1967
1968static int drbg_kcapi_seed(struct crypto_rng *tfm,
1969 const u8 *seed, unsigned int slen)
1970{
1971 struct drbg_state *drbg = crypto_rng_ctx(tfm);
1972 struct crypto_tfm *tfm_base = crypto_rng_tfm(tfm);
1973 bool pr = false;
1974 struct drbg_string string;
1975 struct drbg_string *seed_string = NULL;
1976 int coreref = 0;
1977
1978 drbg_convert_tfm_core(crypto_tfm_alg_driver_name(tfm_base), &coreref,
1979 &pr);
1980 if (0 < slen) {
1981 drbg_string_fill(&string, seed, slen);
1982 seed_string = &string;
1983 }
1984
1985 return drbg_instantiate(drbg, seed_string, coreref, pr);
1986}
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002static inline int __init drbg_healthcheck_sanity(void)
2003{
2004 int len = 0;
2005#define OUTBUFLEN 16
2006 unsigned char buf[OUTBUFLEN];
2007 struct drbg_state *drbg = NULL;
2008 int ret;
2009 int rc = -EFAULT;
2010 bool pr = false;
2011 int coreref = 0;
2012 struct drbg_string addtl;
2013 size_t max_addtllen, max_request_bytes;
2014
2015
2016 if (!fips_enabled)
2017 return 0;
2018
2019#ifdef CONFIG_CRYPTO_DRBG_CTR
2020 drbg_convert_tfm_core("drbg_nopr_ctr_aes128", &coreref, &pr);
2021#elif defined CONFIG_CRYPTO_DRBG_HASH
2022 drbg_convert_tfm_core("drbg_nopr_sha256", &coreref, &pr);
2023#else
2024 drbg_convert_tfm_core("drbg_nopr_hmac_sha256", &coreref, &pr);
2025#endif
2026
2027 drbg = kzalloc(sizeof(struct drbg_state), GFP_KERNEL);
2028 if (!drbg)
2029 return -ENOMEM;
2030
2031 mutex_init(&drbg->drbg_mutex);
2032 drbg->core = &drbg_cores[coreref];
2033 drbg->reseed_threshold = drbg_max_requests(drbg);
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043 max_addtllen = drbg_max_addtl(drbg);
2044 max_request_bytes = drbg_max_request_bytes(drbg);
2045 drbg_string_fill(&addtl, buf, max_addtllen + 1);
2046
2047 len = drbg_generate(drbg, buf, OUTBUFLEN, &addtl);
2048 BUG_ON(0 < len);
2049
2050 len = drbg_generate(drbg, buf, (max_request_bytes + 1), NULL);
2051 BUG_ON(0 < len);
2052
2053
2054 ret = drbg_seed(drbg, &addtl, false);
2055 BUG_ON(0 == ret);
2056
2057 rc = 0;
2058
2059 pr_devel("DRBG: Sanity tests for failure code paths successfully "
2060 "completed\n");
2061
2062 kfree(drbg);
2063 return rc;
2064}
2065
2066static struct rng_alg drbg_algs[22];
2067
2068
2069
2070
2071
2072
2073static inline void __init drbg_fill_array(struct rng_alg *alg,
2074 const struct drbg_core *core, int pr)
2075{
2076 int pos = 0;
2077 static int priority = 200;
2078
2079 memcpy(alg->base.cra_name, "stdrng", 6);
2080 if (pr) {
2081 memcpy(alg->base.cra_driver_name, "drbg_pr_", 8);
2082 pos = 8;
2083 } else {
2084 memcpy(alg->base.cra_driver_name, "drbg_nopr_", 10);
2085 pos = 10;
2086 }
2087 memcpy(alg->base.cra_driver_name + pos, core->cra_name,
2088 strlen(core->cra_name));
2089
2090 alg->base.cra_priority = priority;
2091 priority++;
2092
2093
2094
2095
2096
2097 if (fips_enabled)
2098 alg->base.cra_priority += 200;
2099
2100 alg->base.cra_ctxsize = sizeof(struct drbg_state);
2101 alg->base.cra_module = THIS_MODULE;
2102 alg->base.cra_init = drbg_kcapi_init;
2103 alg->base.cra_exit = drbg_kcapi_cleanup;
2104 alg->generate = drbg_kcapi_random;
2105 alg->seed = drbg_kcapi_seed;
2106 alg->set_ent = drbg_kcapi_set_entropy;
2107 alg->seedsize = 0;
2108}
2109
2110static int __init drbg_init(void)
2111{
2112 unsigned int i = 0;
2113 unsigned int j = 0;
2114 int ret;
2115
2116 ret = drbg_healthcheck_sanity();
2117 if (ret)
2118 return ret;
2119
2120 if (ARRAY_SIZE(drbg_cores) * 2 > ARRAY_SIZE(drbg_algs)) {
2121 pr_info("DRBG: Cannot register all DRBG types"
2122 "(slots needed: %zu, slots available: %zu)\n",
2123 ARRAY_SIZE(drbg_cores) * 2, ARRAY_SIZE(drbg_algs));
2124 return -EFAULT;
2125 }
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136 for (j = 0; ARRAY_SIZE(drbg_cores) > j; j++, i++)
2137 drbg_fill_array(&drbg_algs[i], &drbg_cores[j], 1);
2138 for (j = 0; ARRAY_SIZE(drbg_cores) > j; j++, i++)
2139 drbg_fill_array(&drbg_algs[i], &drbg_cores[j], 0);
2140 return crypto_register_rngs(drbg_algs, (ARRAY_SIZE(drbg_cores) * 2));
2141}
2142
2143static void __exit drbg_exit(void)
2144{
2145 crypto_unregister_rngs(drbg_algs, (ARRAY_SIZE(drbg_cores) * 2));
2146}
2147
2148subsys_initcall(drbg_init);
2149module_exit(drbg_exit);
2150#ifndef CRYPTO_DRBG_HASH_STRING
2151#define CRYPTO_DRBG_HASH_STRING ""
2152#endif
2153#ifndef CRYPTO_DRBG_HMAC_STRING
2154#define CRYPTO_DRBG_HMAC_STRING ""
2155#endif
2156#ifndef CRYPTO_DRBG_CTR_STRING
2157#define CRYPTO_DRBG_CTR_STRING ""
2158#endif
2159MODULE_LICENSE("GPL");
2160MODULE_AUTHOR("Stephan Mueller <smueller@chronox.de>");
2161MODULE_DESCRIPTION("NIST SP800-90A Deterministic Random Bit Generator (DRBG) "
2162 "using following cores: "
2163 CRYPTO_DRBG_HASH_STRING
2164 CRYPTO_DRBG_HMAC_STRING
2165 CRYPTO_DRBG_CTR_STRING);
2166MODULE_ALIAS_CRYPTO("stdrng");
2167MODULE_IMPORT_NS(CRYPTO_INTERNAL);
2168