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