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 <linux/kernel.h>
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116static const struct drbg_core drbg_cores[] = {
117#ifdef CONFIG_CRYPTO_DRBG_CTR
118 {
119 .flags = DRBG_CTR | DRBG_STRENGTH128,
120 .statelen = 32,
121 .blocklen_bytes = 16,
122 .cra_name = "ctr_aes128",
123 .backend_cra_name = "aes",
124 }, {
125 .flags = DRBG_CTR | DRBG_STRENGTH192,
126 .statelen = 40,
127 .blocklen_bytes = 16,
128 .cra_name = "ctr_aes192",
129 .backend_cra_name = "aes",
130 }, {
131 .flags = DRBG_CTR | DRBG_STRENGTH256,
132 .statelen = 48,
133 .blocklen_bytes = 16,
134 .cra_name = "ctr_aes256",
135 .backend_cra_name = "aes",
136 },
137#endif
138#ifdef CONFIG_CRYPTO_DRBG_HASH
139 {
140 .flags = DRBG_HASH | DRBG_STRENGTH128,
141 .statelen = 55,
142 .blocklen_bytes = 20,
143 .cra_name = "sha1",
144 .backend_cra_name = "sha1",
145 }, {
146 .flags = DRBG_HASH | DRBG_STRENGTH256,
147 .statelen = 111,
148 .blocklen_bytes = 48,
149 .cra_name = "sha384",
150 .backend_cra_name = "sha384",
151 }, {
152 .flags = DRBG_HASH | DRBG_STRENGTH256,
153 .statelen = 111,
154 .blocklen_bytes = 64,
155 .cra_name = "sha512",
156 .backend_cra_name = "sha512",
157 }, {
158 .flags = DRBG_HASH | DRBG_STRENGTH256,
159 .statelen = 55,
160 .blocklen_bytes = 32,
161 .cra_name = "sha256",
162 .backend_cra_name = "sha256",
163 },
164#endif
165#ifdef CONFIG_CRYPTO_DRBG_HMAC
166 {
167 .flags = DRBG_HMAC | DRBG_STRENGTH128,
168 .statelen = 20,
169 .blocklen_bytes = 20,
170 .cra_name = "hmac_sha1",
171 .backend_cra_name = "hmac(sha1)",
172 }, {
173 .flags = DRBG_HMAC | DRBG_STRENGTH256,
174 .statelen = 48,
175 .blocklen_bytes = 48,
176 .cra_name = "hmac_sha384",
177 .backend_cra_name = "hmac(sha384)",
178 }, {
179 .flags = DRBG_HMAC | DRBG_STRENGTH256,
180 .statelen = 64,
181 .blocklen_bytes = 64,
182 .cra_name = "hmac_sha512",
183 .backend_cra_name = "hmac(sha512)",
184 }, {
185 .flags = DRBG_HMAC | DRBG_STRENGTH256,
186 .statelen = 32,
187 .blocklen_bytes = 32,
188 .cra_name = "hmac_sha256",
189 .backend_cra_name = "hmac(sha256)",
190 },
191#endif
192};
193
194static int drbg_uninstantiate(struct drbg_state *drbg);
195
196
197
198
199
200
201
202
203
204
205
206
207
208static inline unsigned short drbg_sec_strength(drbg_flag_t flags)
209{
210 switch (flags & DRBG_STRENGTH_MASK) {
211 case DRBG_STRENGTH128:
212 return 16;
213 case DRBG_STRENGTH192:
214 return 24;
215 case DRBG_STRENGTH256:
216 return 32;
217 default:
218 return 32;
219 }
220}
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241static int drbg_fips_continuous_test(struct drbg_state *drbg,
242 const unsigned char *entropy)
243{
244 unsigned short entropylen = drbg_sec_strength(drbg->core->flags);
245 int ret = 0;
246
247 if (!IS_ENABLED(CONFIG_CRYPTO_FIPS))
248 return 0;
249
250
251 if (list_empty(&drbg->test_data.list))
252 return 0;
253
254 if (!fips_enabled)
255 return 0;
256
257 if (!drbg->fips_primed) {
258
259 memcpy(drbg->prev, entropy, entropylen);
260 drbg->fips_primed = true;
261
262 return -EAGAIN;
263 }
264 ret = memcmp(drbg->prev, entropy, entropylen);
265 if (!ret)
266 panic("DRBG continuous self test failed\n");
267 memcpy(drbg->prev, entropy, entropylen);
268
269
270 return 0;
271}
272
273
274
275
276
277
278
279
280
281#if (defined(CONFIG_CRYPTO_DRBG_HASH) || defined(CONFIG_CRYPTO_DRBG_CTR))
282static inline void drbg_cpu_to_be32(__u32 val, unsigned char *buf)
283{
284 struct s {
285 __be32 conv;
286 };
287 struct s *conversion = (struct s *) buf;
288
289 conversion->conv = cpu_to_be32(val);
290}
291#endif
292
293
294
295
296
297#ifdef CONFIG_CRYPTO_DRBG_CTR
298#define CRYPTO_DRBG_CTR_STRING "CTR "
299MODULE_ALIAS_CRYPTO("drbg_pr_ctr_aes256");
300MODULE_ALIAS_CRYPTO("drbg_nopr_ctr_aes256");
301MODULE_ALIAS_CRYPTO("drbg_pr_ctr_aes192");
302MODULE_ALIAS_CRYPTO("drbg_nopr_ctr_aes192");
303MODULE_ALIAS_CRYPTO("drbg_pr_ctr_aes128");
304MODULE_ALIAS_CRYPTO("drbg_nopr_ctr_aes128");
305
306static void drbg_kcapi_symsetkey(struct drbg_state *drbg,
307 const unsigned char *key);
308static int drbg_kcapi_sym(struct drbg_state *drbg, unsigned char *outval,
309 const struct drbg_string *in);
310static int drbg_init_sym_kernel(struct drbg_state *drbg);
311static int drbg_fini_sym_kernel(struct drbg_state *drbg);
312static int drbg_kcapi_sym_ctr(struct drbg_state *drbg,
313 u8 *inbuf, u32 inbuflen,
314 u8 *outbuf, u32 outlen);
315#define DRBG_CTR_NULL_LEN 128
316#define DRBG_OUTSCRATCHLEN DRBG_CTR_NULL_LEN
317
318
319static int drbg_ctr_bcc(struct drbg_state *drbg,
320 unsigned char *out, const unsigned char *key,
321 struct list_head *in)
322{
323 int ret = 0;
324 struct drbg_string *curr = NULL;
325 struct drbg_string data;
326 short cnt = 0;
327
328 drbg_string_fill(&data, out, drbg_blocklen(drbg));
329
330
331 drbg_kcapi_symsetkey(drbg, key);
332 list_for_each_entry(curr, in, list) {
333 const unsigned char *pos = curr->buf;
334 size_t len = curr->len;
335
336 while (len) {
337
338 if (drbg_blocklen(drbg) == cnt) {
339 cnt = 0;
340 ret = drbg_kcapi_sym(drbg, out, &data);
341 if (ret)
342 return ret;
343 }
344 out[cnt] ^= *pos;
345 pos++;
346 cnt++;
347 len--;
348 }
349 }
350
351 if (cnt)
352 ret = drbg_kcapi_sym(drbg, out, &data);
353
354 return ret;
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
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397static int drbg_ctr_df(struct drbg_state *drbg,
398 unsigned char *df_data, size_t bytes_to_return,
399 struct list_head *seedlist)
400{
401 int ret = -EFAULT;
402 unsigned char L_N[8];
403
404 struct drbg_string S1, S2, S4, cipherin;
405 LIST_HEAD(bcc_list);
406 unsigned char *pad = df_data + drbg_statelen(drbg);
407 unsigned char *iv = pad + drbg_blocklen(drbg);
408 unsigned char *temp = iv + drbg_blocklen(drbg);
409 size_t padlen = 0;
410 unsigned int templen = 0;
411
412 unsigned int i = 0;
413
414 const unsigned char *K = (unsigned char *)
415 "\x00\x01\x02\x03\x04\x05\x06\x07"
416 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
417 "\x10\x11\x12\x13\x14\x15\x16\x17"
418 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f";
419 unsigned char *X;
420 size_t generated_len = 0;
421 size_t inputlen = 0;
422 struct drbg_string *seed = NULL;
423
424 memset(pad, 0, drbg_blocklen(drbg));
425 memset(iv, 0, drbg_blocklen(drbg));
426
427
428
429
430 if ((512/8) < bytes_to_return)
431 return -EINVAL;
432
433
434 list_for_each_entry(seed, seedlist, list)
435 inputlen += seed->len;
436 drbg_cpu_to_be32(inputlen, &L_N[0]);
437
438
439 drbg_cpu_to_be32(bytes_to_return, &L_N[4]);
440
441
442 padlen = (inputlen + sizeof(L_N) + 1) % (drbg_blocklen(drbg));
443
444 if (padlen)
445 padlen = drbg_blocklen(drbg) - padlen;
446
447
448
449
450
451 padlen++;
452 pad[0] = 0x80;
453
454
455 drbg_string_fill(&S1, iv, drbg_blocklen(drbg));
456 list_add_tail(&S1.list, &bcc_list);
457 drbg_string_fill(&S2, L_N, sizeof(L_N));
458 list_add_tail(&S2.list, &bcc_list);
459 list_splice_tail(seedlist, &bcc_list);
460 drbg_string_fill(&S4, pad, padlen);
461 list_add_tail(&S4.list, &bcc_list);
462
463
464 while (templen < (drbg_keylen(drbg) + (drbg_blocklen(drbg)))) {
465
466
467
468
469
470 drbg_cpu_to_be32(i, iv);
471
472 ret = drbg_ctr_bcc(drbg, temp + templen, K, &bcc_list);
473 if (ret)
474 goto out;
475
476 i++;
477 templen += drbg_blocklen(drbg);
478 }
479
480
481 X = temp + (drbg_keylen(drbg));
482 drbg_string_fill(&cipherin, X, drbg_blocklen(drbg));
483
484
485
486
487 drbg_kcapi_symsetkey(drbg, temp);
488 while (generated_len < bytes_to_return) {
489 short blocklen = 0;
490
491
492
493
494
495 ret = drbg_kcapi_sym(drbg, X, &cipherin);
496 if (ret)
497 goto out;
498 blocklen = (drbg_blocklen(drbg) <
499 (bytes_to_return - generated_len)) ?
500 drbg_blocklen(drbg) :
501 (bytes_to_return - generated_len);
502
503 memcpy(df_data + generated_len, X, blocklen);
504 generated_len += blocklen;
505 }
506
507 ret = 0;
508
509out:
510 memset(iv, 0, drbg_blocklen(drbg));
511 memset(temp, 0, drbg_statelen(drbg) + drbg_blocklen(drbg));
512 memset(pad, 0, drbg_blocklen(drbg));
513 return ret;
514}
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531static int drbg_ctr_update(struct drbg_state *drbg, struct list_head *seed,
532 int reseed)
533{
534 int ret = -EFAULT;
535
536 unsigned char *temp = drbg->scratchpad;
537 unsigned char *df_data = drbg->scratchpad + drbg_statelen(drbg) +
538 drbg_blocklen(drbg);
539
540 if (3 > reseed)
541 memset(df_data, 0, drbg_statelen(drbg));
542
543 if (!reseed) {
544
545
546
547
548
549
550
551 crypto_inc(drbg->V, drbg_blocklen(drbg));
552
553 ret = crypto_skcipher_setkey(drbg->ctr_handle, drbg->C,
554 drbg_keylen(drbg));
555 if (ret)
556 goto out;
557 }
558
559
560 if (seed) {
561 ret = drbg_ctr_df(drbg, df_data, drbg_statelen(drbg), seed);
562 if (ret)
563 goto out;
564 }
565
566 ret = drbg_kcapi_sym_ctr(drbg, df_data, drbg_statelen(drbg),
567 temp, drbg_statelen(drbg));
568 if (ret)
569 return ret;
570
571
572 ret = crypto_skcipher_setkey(drbg->ctr_handle, temp,
573 drbg_keylen(drbg));
574 if (ret)
575 goto out;
576
577 memcpy(drbg->V, temp + drbg_keylen(drbg), drbg_blocklen(drbg));
578
579 crypto_inc(drbg->V, drbg_blocklen(drbg));
580 ret = 0;
581
582out:
583 memset(temp, 0, drbg_statelen(drbg) + drbg_blocklen(drbg));
584 if (2 != reseed)
585 memset(df_data, 0, drbg_statelen(drbg));
586 return ret;
587}
588
589
590
591
592
593
594static int drbg_ctr_generate(struct drbg_state *drbg,
595 unsigned char *buf, unsigned int buflen,
596 struct list_head *addtl)
597{
598 int ret;
599 int len = min_t(int, buflen, INT_MAX);
600
601
602 if (addtl && !list_empty(addtl)) {
603 ret = drbg_ctr_update(drbg, addtl, 2);
604 if (ret)
605 return 0;
606 }
607
608
609 ret = drbg_kcapi_sym_ctr(drbg, drbg->ctr_null_value, DRBG_CTR_NULL_LEN,
610 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)
1041{
1042 int ret = drbg->d_ops->update(drbg, seed, reseed);
1043
1044 if (ret)
1045 return ret;
1046
1047 drbg->seeded = true;
1048
1049 drbg->reseed_ctr = 1;
1050
1051 return ret;
1052}
1053
1054static inline int drbg_get_random_bytes(struct drbg_state *drbg,
1055 unsigned char *entropy,
1056 unsigned int entropylen)
1057{
1058 int ret;
1059
1060 do {
1061 get_random_bytes(entropy, entropylen);
1062 ret = drbg_fips_continuous_test(drbg, entropy);
1063 if (ret && ret != -EAGAIN)
1064 return ret;
1065 } while (ret);
1066
1067 return 0;
1068}
1069
1070static void drbg_async_seed(struct work_struct *work)
1071{
1072 struct drbg_string data;
1073 LIST_HEAD(seedlist);
1074 struct drbg_state *drbg = container_of(work, struct drbg_state,
1075 seed_work);
1076 unsigned int entropylen = drbg_sec_strength(drbg->core->flags);
1077 unsigned char entropy[32];
1078 int ret;
1079
1080 BUG_ON(!entropylen);
1081 BUG_ON(entropylen > sizeof(entropy));
1082
1083 drbg_string_fill(&data, entropy, entropylen);
1084 list_add_tail(&data.list, &seedlist);
1085
1086 mutex_lock(&drbg->drbg_mutex);
1087
1088 ret = drbg_get_random_bytes(drbg, entropy, entropylen);
1089 if (ret)
1090 goto unlock;
1091
1092
1093 crypto_free_rng(drbg->jent);
1094 drbg->jent = NULL;
1095
1096
1097
1098
1099 drbg->seeded = false;
1100
1101 __drbg_seed(drbg, &seedlist, true);
1102
1103 if (drbg->seeded)
1104 drbg->reseed_threshold = drbg_max_requests(drbg);
1105
1106unlock:
1107 mutex_unlock(&drbg->drbg_mutex);
1108
1109 memzero_explicit(entropy, entropylen);
1110}
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123static int drbg_seed(struct drbg_state *drbg, struct drbg_string *pers,
1124 bool reseed)
1125{
1126 int ret;
1127 unsigned char entropy[((32 + 16) * 2)];
1128 unsigned int entropylen = drbg_sec_strength(drbg->core->flags);
1129 struct drbg_string data1;
1130 LIST_HEAD(seedlist);
1131
1132
1133 if (pers && pers->len > (drbg_max_addtl(drbg))) {
1134 pr_devel("DRBG: personalization string too long %zu\n",
1135 pers->len);
1136 return -EINVAL;
1137 }
1138
1139 if (list_empty(&drbg->test_data.list)) {
1140 drbg_string_fill(&data1, drbg->test_data.buf,
1141 drbg->test_data.len);
1142 pr_devel("DRBG: using test entropy\n");
1143 } else {
1144
1145
1146
1147
1148
1149
1150
1151
1152 BUG_ON(!entropylen);
1153 if (!reseed)
1154 entropylen = ((entropylen + 1) / 2) * 3;
1155 BUG_ON((entropylen * 2) > sizeof(entropy));
1156
1157
1158 ret = drbg_get_random_bytes(drbg, entropy, entropylen);
1159 if (ret)
1160 goto out;
1161
1162 if (!drbg->jent) {
1163 drbg_string_fill(&data1, entropy, entropylen);
1164 pr_devel("DRBG: (re)seeding with %u bytes of entropy\n",
1165 entropylen);
1166 } else {
1167
1168 ret = crypto_rng_get_bytes(drbg->jent,
1169 entropy + entropylen,
1170 entropylen);
1171 if (ret) {
1172 pr_devel("DRBG: jent failed with %d\n", ret);
1173 goto out;
1174 }
1175
1176 drbg_string_fill(&data1, entropy, entropylen * 2);
1177 pr_devel("DRBG: (re)seeding with %u bytes of entropy\n",
1178 entropylen * 2);
1179 }
1180 }
1181 list_add_tail(&data1.list, &seedlist);
1182
1183
1184
1185
1186
1187
1188 if (pers && pers->buf && 0 < pers->len) {
1189 list_add_tail(&pers->list, &seedlist);
1190 pr_devel("DRBG: using personalization string\n");
1191 }
1192
1193 if (!reseed) {
1194 memset(drbg->V, 0, drbg_statelen(drbg));
1195 memset(drbg->C, 0, drbg_statelen(drbg));
1196 }
1197
1198 ret = __drbg_seed(drbg, &seedlist, reseed);
1199
1200out:
1201 memzero_explicit(entropy, entropylen * 2);
1202
1203 return ret;
1204}
1205
1206
1207static inline void drbg_dealloc_state(struct drbg_state *drbg)
1208{
1209 if (!drbg)
1210 return;
1211 kzfree(drbg->Vbuf);
1212 drbg->Vbuf = NULL;
1213 drbg->V = NULL;
1214 kzfree(drbg->Cbuf);
1215 drbg->Cbuf = NULL;
1216 drbg->C = NULL;
1217 kzfree(drbg->scratchpadbuf);
1218 drbg->scratchpadbuf = NULL;
1219 drbg->reseed_ctr = 0;
1220 drbg->d_ops = NULL;
1221 drbg->core = NULL;
1222 if (IS_ENABLED(CONFIG_CRYPTO_FIPS)) {
1223 kzfree(drbg->prev);
1224 drbg->prev = NULL;
1225 drbg->fips_primed = false;
1226 }
1227}
1228
1229
1230
1231
1232
1233static inline int drbg_alloc_state(struct drbg_state *drbg)
1234{
1235 int ret = -ENOMEM;
1236 unsigned int sb_size = 0;
1237
1238 switch (drbg->core->flags & DRBG_TYPE_MASK) {
1239#ifdef CONFIG_CRYPTO_DRBG_HMAC
1240 case DRBG_HMAC:
1241 drbg->d_ops = &drbg_hmac_ops;
1242 break;
1243#endif
1244#ifdef CONFIG_CRYPTO_DRBG_HASH
1245 case DRBG_HASH:
1246 drbg->d_ops = &drbg_hash_ops;
1247 break;
1248#endif
1249#ifdef CONFIG_CRYPTO_DRBG_CTR
1250 case DRBG_CTR:
1251 drbg->d_ops = &drbg_ctr_ops;
1252 break;
1253#endif
1254 default:
1255 ret = -EOPNOTSUPP;
1256 goto err;
1257 }
1258
1259 ret = drbg->d_ops->crypto_init(drbg);
1260 if (ret < 0)
1261 goto err;
1262
1263 drbg->Vbuf = kmalloc(drbg_statelen(drbg) + ret, GFP_KERNEL);
1264 if (!drbg->Vbuf) {
1265 ret = -ENOMEM;
1266 goto fini;
1267 }
1268 drbg->V = PTR_ALIGN(drbg->Vbuf, ret + 1);
1269 drbg->Cbuf = kmalloc(drbg_statelen(drbg) + ret, GFP_KERNEL);
1270 if (!drbg->Cbuf) {
1271 ret = -ENOMEM;
1272 goto fini;
1273 }
1274 drbg->C = PTR_ALIGN(drbg->Cbuf, ret + 1);
1275
1276 if (drbg->core->flags & DRBG_HMAC)
1277 sb_size = 0;
1278 else if (drbg->core->flags & DRBG_CTR)
1279 sb_size = drbg_statelen(drbg) + drbg_blocklen(drbg) +
1280 drbg_statelen(drbg) +
1281 drbg_blocklen(drbg) +
1282 drbg_blocklen(drbg) +
1283 drbg_statelen(drbg) + drbg_blocklen(drbg);
1284 else
1285 sb_size = drbg_statelen(drbg) + drbg_blocklen(drbg);
1286
1287 if (0 < sb_size) {
1288 drbg->scratchpadbuf = kzalloc(sb_size + ret, GFP_KERNEL);
1289 if (!drbg->scratchpadbuf) {
1290 ret = -ENOMEM;
1291 goto fini;
1292 }
1293 drbg->scratchpad = PTR_ALIGN(drbg->scratchpadbuf, ret + 1);
1294 }
1295
1296 if (IS_ENABLED(CONFIG_CRYPTO_FIPS)) {
1297 drbg->prev = kzalloc(drbg_sec_strength(drbg->core->flags),
1298 GFP_KERNEL);
1299 if (!drbg->prev)
1300 goto fini;
1301 drbg->fips_primed = false;
1302 }
1303
1304 return 0;
1305
1306fini:
1307 drbg->d_ops->crypto_fini(drbg);
1308err:
1309 drbg_dealloc_state(drbg);
1310 return ret;
1311}
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333static int drbg_generate(struct drbg_state *drbg,
1334 unsigned char *buf, unsigned int buflen,
1335 struct drbg_string *addtl)
1336{
1337 int len = 0;
1338 LIST_HEAD(addtllist);
1339
1340 if (!drbg->core) {
1341 pr_devel("DRBG: not yet seeded\n");
1342 return -EINVAL;
1343 }
1344 if (0 == buflen || !buf) {
1345 pr_devel("DRBG: no output buffer provided\n");
1346 return -EINVAL;
1347 }
1348 if (addtl && NULL == addtl->buf && 0 < addtl->len) {
1349 pr_devel("DRBG: wrong format of additional information\n");
1350 return -EINVAL;
1351 }
1352
1353
1354 len = -EINVAL;
1355 if (buflen > (drbg_max_request_bytes(drbg))) {
1356 pr_devel("DRBG: requested random numbers too large %u\n",
1357 buflen);
1358 goto err;
1359 }
1360
1361
1362
1363
1364 if (addtl && addtl->len > (drbg_max_addtl(drbg))) {
1365 pr_devel("DRBG: additional information string too long %zu\n",
1366 addtl->len);
1367 goto err;
1368 }
1369
1370
1371
1372
1373
1374
1375 if (drbg->reseed_threshold < drbg->reseed_ctr)
1376 drbg->seeded = false;
1377
1378 if (drbg->pr || !drbg->seeded) {
1379 pr_devel("DRBG: reseeding before generation (prediction "
1380 "resistance: %s, state %s)\n",
1381 drbg->pr ? "true" : "false",
1382 drbg->seeded ? "seeded" : "unseeded");
1383
1384 len = drbg_seed(drbg, addtl, true);
1385 if (len)
1386 goto err;
1387
1388 addtl = NULL;
1389 }
1390
1391 if (addtl && 0 < addtl->len)
1392 list_add_tail(&addtl->list, &addtllist);
1393
1394 len = drbg->d_ops->generate(drbg, buf, buflen, &addtllist);
1395
1396
1397 drbg->reseed_ctr++;
1398 if (0 >= len)
1399 goto err;
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416#if 0
1417 if (drbg->reseed_ctr && !(drbg->reseed_ctr % 4096)) {
1418 int err = 0;
1419 pr_devel("DRBG: start to perform self test\n");
1420 if (drbg->core->flags & DRBG_HMAC)
1421 err = alg_test("drbg_pr_hmac_sha256",
1422 "drbg_pr_hmac_sha256", 0, 0);
1423 else if (drbg->core->flags & DRBG_CTR)
1424 err = alg_test("drbg_pr_ctr_aes128",
1425 "drbg_pr_ctr_aes128", 0, 0);
1426 else
1427 err = alg_test("drbg_pr_sha256",
1428 "drbg_pr_sha256", 0, 0);
1429 if (err) {
1430 pr_err("DRBG: periodical self test failed\n");
1431
1432
1433
1434
1435 drbg_uninstantiate(drbg);
1436 return 0;
1437 } else {
1438 pr_devel("DRBG: self test successful\n");
1439 }
1440 }
1441#endif
1442
1443
1444
1445
1446
1447 len = 0;
1448err:
1449 return len;
1450}
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460static int drbg_generate_long(struct drbg_state *drbg,
1461 unsigned char *buf, unsigned int buflen,
1462 struct drbg_string *addtl)
1463{
1464 unsigned int len = 0;
1465 unsigned int slice = 0;
1466 do {
1467 int err = 0;
1468 unsigned int chunk = 0;
1469 slice = ((buflen - len) / drbg_max_request_bytes(drbg));
1470 chunk = slice ? drbg_max_request_bytes(drbg) : (buflen - len);
1471 mutex_lock(&drbg->drbg_mutex);
1472 err = drbg_generate(drbg, buf + len, chunk, addtl);
1473 mutex_unlock(&drbg->drbg_mutex);
1474 if (0 > err)
1475 return err;
1476 len += chunk;
1477 } while (slice > 0 && (len < buflen));
1478 return 0;
1479}
1480
1481static void drbg_schedule_async_seed(struct random_ready_callback *rdy)
1482{
1483 struct drbg_state *drbg = container_of(rdy, struct drbg_state,
1484 random_ready);
1485
1486 schedule_work(&drbg->seed_work);
1487}
1488
1489static int drbg_prepare_hrng(struct drbg_state *drbg)
1490{
1491 int err;
1492
1493
1494 if (list_empty(&drbg->test_data.list))
1495 return 0;
1496
1497 INIT_WORK(&drbg->seed_work, drbg_async_seed);
1498
1499 drbg->random_ready.owner = THIS_MODULE;
1500 drbg->random_ready.func = drbg_schedule_async_seed;
1501
1502 err = add_random_ready_callback(&drbg->random_ready);
1503
1504 switch (err) {
1505 case 0:
1506 break;
1507
1508 case -EALREADY:
1509 err = 0;
1510
1511
1512 default:
1513 drbg->random_ready.func = NULL;
1514 return err;
1515 }
1516
1517 drbg->jent = crypto_alloc_rng("jitterentropy_rng", 0, 0);
1518
1519
1520
1521
1522
1523 drbg->reseed_threshold = 50;
1524
1525 return err;
1526}
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545static int drbg_instantiate(struct drbg_state *drbg, struct drbg_string *pers,
1546 int coreref, bool pr)
1547{
1548 int ret;
1549 bool reseed = true;
1550
1551 pr_devel("DRBG: Initializing DRBG core %d with prediction resistance "
1552 "%s\n", coreref, pr ? "enabled" : "disabled");
1553 mutex_lock(&drbg->drbg_mutex);
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565 if (!drbg->core) {
1566 drbg->core = &drbg_cores[coreref];
1567 drbg->pr = pr;
1568 drbg->seeded = false;
1569 drbg->reseed_threshold = drbg_max_requests(drbg);
1570
1571 ret = drbg_alloc_state(drbg);
1572 if (ret)
1573 goto unlock;
1574
1575 ret = drbg_prepare_hrng(drbg);
1576 if (ret)
1577 goto free_everything;
1578
1579 if (IS_ERR(drbg->jent)) {
1580 ret = PTR_ERR(drbg->jent);
1581 drbg->jent = NULL;
1582 if (fips_enabled || ret != -ENOENT)
1583 goto free_everything;
1584 pr_info("DRBG: Continuing without Jitter RNG\n");
1585 }
1586
1587 reseed = false;
1588 }
1589
1590 ret = drbg_seed(drbg, pers, reseed);
1591
1592 if (ret && !reseed)
1593 goto free_everything;
1594
1595 mutex_unlock(&drbg->drbg_mutex);
1596 return ret;
1597
1598unlock:
1599 mutex_unlock(&drbg->drbg_mutex);
1600 return ret;
1601
1602free_everything:
1603 mutex_unlock(&drbg->drbg_mutex);
1604 drbg_uninstantiate(drbg);
1605 return ret;
1606}
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617static int drbg_uninstantiate(struct drbg_state *drbg)
1618{
1619 if (drbg->random_ready.func) {
1620 del_random_ready_callback(&drbg->random_ready);
1621 cancel_work_sync(&drbg->seed_work);
1622 crypto_free_rng(drbg->jent);
1623 drbg->jent = NULL;
1624 }
1625
1626 if (drbg->d_ops)
1627 drbg->d_ops->crypto_fini(drbg);
1628 drbg_dealloc_state(drbg);
1629
1630 return 0;
1631}
1632
1633
1634
1635
1636
1637
1638
1639
1640static void drbg_kcapi_set_entropy(struct crypto_rng *tfm,
1641 const u8 *data, unsigned int len)
1642{
1643 struct drbg_state *drbg = crypto_rng_ctx(tfm);
1644
1645 mutex_lock(&drbg->drbg_mutex);
1646 drbg_string_fill(&drbg->test_data, data, len);
1647 mutex_unlock(&drbg->drbg_mutex);
1648}
1649
1650
1651
1652
1653
1654#if defined(CONFIG_CRYPTO_DRBG_HASH) || defined(CONFIG_CRYPTO_DRBG_HMAC)
1655struct sdesc {
1656 struct shash_desc shash;
1657 char ctx[];
1658};
1659
1660static int drbg_init_hash_kernel(struct drbg_state *drbg)
1661{
1662 struct sdesc *sdesc;
1663 struct crypto_shash *tfm;
1664
1665 tfm = crypto_alloc_shash(drbg->core->backend_cra_name, 0, 0);
1666 if (IS_ERR(tfm)) {
1667 pr_info("DRBG: could not allocate digest TFM handle: %s\n",
1668 drbg->core->backend_cra_name);
1669 return PTR_ERR(tfm);
1670 }
1671 BUG_ON(drbg_blocklen(drbg) != crypto_shash_digestsize(tfm));
1672 sdesc = kzalloc(sizeof(struct shash_desc) + crypto_shash_descsize(tfm),
1673 GFP_KERNEL);
1674 if (!sdesc) {
1675 crypto_free_shash(tfm);
1676 return -ENOMEM;
1677 }
1678
1679 sdesc->shash.tfm = tfm;
1680 sdesc->shash.flags = 0;
1681 drbg->priv_data = sdesc;
1682
1683 return crypto_shash_alignmask(tfm);
1684}
1685
1686static int drbg_fini_hash_kernel(struct drbg_state *drbg)
1687{
1688 struct sdesc *sdesc = (struct sdesc *)drbg->priv_data;
1689 if (sdesc) {
1690 crypto_free_shash(sdesc->shash.tfm);
1691 kzfree(sdesc);
1692 }
1693 drbg->priv_data = NULL;
1694 return 0;
1695}
1696
1697static void drbg_kcapi_hmacsetkey(struct drbg_state *drbg,
1698 const unsigned char *key)
1699{
1700 struct sdesc *sdesc = (struct sdesc *)drbg->priv_data;
1701
1702 crypto_shash_setkey(sdesc->shash.tfm, key, drbg_statelen(drbg));
1703}
1704
1705static int drbg_kcapi_hash(struct drbg_state *drbg, unsigned char *outval,
1706 const struct list_head *in)
1707{
1708 struct sdesc *sdesc = (struct sdesc *)drbg->priv_data;
1709 struct drbg_string *input = NULL;
1710
1711 crypto_shash_init(&sdesc->shash);
1712 list_for_each_entry(input, in, list)
1713 crypto_shash_update(&sdesc->shash, input->buf, input->len);
1714 return crypto_shash_final(&sdesc->shash, outval);
1715}
1716#endif
1717
1718#ifdef CONFIG_CRYPTO_DRBG_CTR
1719static int drbg_fini_sym_kernel(struct drbg_state *drbg)
1720{
1721 struct crypto_cipher *tfm =
1722 (struct crypto_cipher *)drbg->priv_data;
1723 if (tfm)
1724 crypto_free_cipher(tfm);
1725 drbg->priv_data = NULL;
1726
1727 if (drbg->ctr_handle)
1728 crypto_free_skcipher(drbg->ctr_handle);
1729 drbg->ctr_handle = NULL;
1730
1731 if (drbg->ctr_req)
1732 skcipher_request_free(drbg->ctr_req);
1733 drbg->ctr_req = NULL;
1734
1735 kfree(drbg->ctr_null_value_buf);
1736 drbg->ctr_null_value = NULL;
1737
1738 kfree(drbg->outscratchpadbuf);
1739 drbg->outscratchpadbuf = NULL;
1740
1741 return 0;
1742}
1743
1744static int drbg_init_sym_kernel(struct drbg_state *drbg)
1745{
1746 struct crypto_cipher *tfm;
1747 struct crypto_skcipher *sk_tfm;
1748 struct skcipher_request *req;
1749 unsigned int alignmask;
1750 char ctr_name[CRYPTO_MAX_ALG_NAME];
1751
1752 tfm = crypto_alloc_cipher(drbg->core->backend_cra_name, 0, 0);
1753 if (IS_ERR(tfm)) {
1754 pr_info("DRBG: could not allocate cipher TFM handle: %s\n",
1755 drbg->core->backend_cra_name);
1756 return PTR_ERR(tfm);
1757 }
1758 BUG_ON(drbg_blocklen(drbg) != crypto_cipher_blocksize(tfm));
1759 drbg->priv_data = tfm;
1760
1761 if (snprintf(ctr_name, CRYPTO_MAX_ALG_NAME, "ctr(%s)",
1762 drbg->core->backend_cra_name) >= CRYPTO_MAX_ALG_NAME) {
1763 drbg_fini_sym_kernel(drbg);
1764 return -EINVAL;
1765 }
1766 sk_tfm = crypto_alloc_skcipher(ctr_name, 0, 0);
1767 if (IS_ERR(sk_tfm)) {
1768 pr_info("DRBG: could not allocate CTR cipher TFM handle: %s\n",
1769 ctr_name);
1770 drbg_fini_sym_kernel(drbg);
1771 return PTR_ERR(sk_tfm);
1772 }
1773 drbg->ctr_handle = sk_tfm;
1774 crypto_init_wait(&drbg->ctr_wait);
1775
1776 req = skcipher_request_alloc(sk_tfm, GFP_KERNEL);
1777 if (!req) {
1778 pr_info("DRBG: could not allocate request queue\n");
1779 drbg_fini_sym_kernel(drbg);
1780 return -ENOMEM;
1781 }
1782 drbg->ctr_req = req;
1783 skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG |
1784 CRYPTO_TFM_REQ_MAY_SLEEP,
1785 crypto_req_done, &drbg->ctr_wait);
1786
1787 alignmask = crypto_skcipher_alignmask(sk_tfm);
1788 drbg->ctr_null_value_buf = kzalloc(DRBG_CTR_NULL_LEN + alignmask,
1789 GFP_KERNEL);
1790 if (!drbg->ctr_null_value_buf) {
1791 drbg_fini_sym_kernel(drbg);
1792 return -ENOMEM;
1793 }
1794 drbg->ctr_null_value = (u8 *)PTR_ALIGN(drbg->ctr_null_value_buf,
1795 alignmask + 1);
1796
1797 drbg->outscratchpadbuf = kmalloc(DRBG_OUTSCRATCHLEN + alignmask,
1798 GFP_KERNEL);
1799 if (!drbg->outscratchpadbuf) {
1800 drbg_fini_sym_kernel(drbg);
1801 return -ENOMEM;
1802 }
1803 drbg->outscratchpad = (u8 *)PTR_ALIGN(drbg->outscratchpadbuf,
1804 alignmask + 1);
1805
1806 return alignmask;
1807}
1808
1809static void drbg_kcapi_symsetkey(struct drbg_state *drbg,
1810 const unsigned char *key)
1811{
1812 struct crypto_cipher *tfm =
1813 (struct crypto_cipher *)drbg->priv_data;
1814
1815 crypto_cipher_setkey(tfm, key, (drbg_keylen(drbg)));
1816}
1817
1818static int drbg_kcapi_sym(struct drbg_state *drbg, unsigned char *outval,
1819 const struct drbg_string *in)
1820{
1821 struct crypto_cipher *tfm =
1822 (struct crypto_cipher *)drbg->priv_data;
1823
1824
1825 BUG_ON(in->len < drbg_blocklen(drbg));
1826 crypto_cipher_encrypt_one(tfm, outval, in->buf);
1827 return 0;
1828}
1829
1830static int drbg_kcapi_sym_ctr(struct drbg_state *drbg,
1831 u8 *inbuf, u32 inlen,
1832 u8 *outbuf, u32 outlen)
1833{
1834 struct scatterlist sg_in, sg_out;
1835 int ret;
1836
1837 sg_init_one(&sg_in, inbuf, inlen);
1838 sg_init_one(&sg_out, drbg->outscratchpad, DRBG_OUTSCRATCHLEN);
1839
1840 while (outlen) {
1841 u32 cryptlen = min3(inlen, outlen, (u32)DRBG_OUTSCRATCHLEN);
1842
1843
1844 skcipher_request_set_crypt(drbg->ctr_req, &sg_in, &sg_out,
1845 cryptlen, drbg->V);
1846 ret = crypto_wait_req(crypto_skcipher_encrypt(drbg->ctr_req),
1847 &drbg->ctr_wait);
1848 if (ret)
1849 goto out;
1850
1851 crypto_init_wait(&drbg->ctr_wait);
1852
1853 memcpy(outbuf, drbg->outscratchpad, cryptlen);
1854
1855 outlen -= cryptlen;
1856 outbuf += cryptlen;
1857 }
1858 ret = 0;
1859
1860out:
1861 memzero_explicit(drbg->outscratchpad, DRBG_OUTSCRATCHLEN);
1862 return ret;
1863}
1864#endif
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881static inline void drbg_convert_tfm_core(const char *cra_driver_name,
1882 int *coreref, bool *pr)
1883{
1884 int i = 0;
1885 size_t start = 0;
1886 int len = 0;
1887
1888 *pr = true;
1889
1890 if (!memcmp(cra_driver_name, "drbg_nopr_", 10)) {
1891 start = 10;
1892 *pr = false;
1893 } else if (!memcmp(cra_driver_name, "drbg_pr_", 8)) {
1894 start = 8;
1895 } else {
1896 return;
1897 }
1898
1899
1900 len = strlen(cra_driver_name) - start;
1901 for (i = 0; ARRAY_SIZE(drbg_cores) > i; i++) {
1902 if (!memcmp(cra_driver_name + start, drbg_cores[i].cra_name,
1903 len)) {
1904 *coreref = i;
1905 return;
1906 }
1907 }
1908}
1909
1910static int drbg_kcapi_init(struct crypto_tfm *tfm)
1911{
1912 struct drbg_state *drbg = crypto_tfm_ctx(tfm);
1913
1914 mutex_init(&drbg->drbg_mutex);
1915
1916 return 0;
1917}
1918
1919static void drbg_kcapi_cleanup(struct crypto_tfm *tfm)
1920{
1921 drbg_uninstantiate(crypto_tfm_ctx(tfm));
1922}
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933static int drbg_kcapi_random(struct crypto_rng *tfm,
1934 const u8 *src, unsigned int slen,
1935 u8 *dst, unsigned int dlen)
1936{
1937 struct drbg_state *drbg = crypto_rng_ctx(tfm);
1938 struct drbg_string *addtl = NULL;
1939 struct drbg_string string;
1940
1941 if (slen) {
1942
1943 drbg_string_fill(&string, src, slen);
1944 addtl = &string;
1945 }
1946
1947 return drbg_generate_long(drbg, dst, dlen, addtl);
1948}
1949
1950
1951
1952
1953static int drbg_kcapi_seed(struct crypto_rng *tfm,
1954 const u8 *seed, unsigned int slen)
1955{
1956 struct drbg_state *drbg = crypto_rng_ctx(tfm);
1957 struct crypto_tfm *tfm_base = crypto_rng_tfm(tfm);
1958 bool pr = false;
1959 struct drbg_string string;
1960 struct drbg_string *seed_string = NULL;
1961 int coreref = 0;
1962
1963 drbg_convert_tfm_core(crypto_tfm_alg_driver_name(tfm_base), &coreref,
1964 &pr);
1965 if (0 < slen) {
1966 drbg_string_fill(&string, seed, slen);
1967 seed_string = &string;
1968 }
1969
1970 return drbg_instantiate(drbg, seed_string, coreref, pr);
1971}
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987static inline int __init drbg_healthcheck_sanity(void)
1988{
1989 int len = 0;
1990#define OUTBUFLEN 16
1991 unsigned char buf[OUTBUFLEN];
1992 struct drbg_state *drbg = NULL;
1993 int ret = -EFAULT;
1994 int rc = -EFAULT;
1995 bool pr = false;
1996 int coreref = 0;
1997 struct drbg_string addtl;
1998 size_t max_addtllen, max_request_bytes;
1999
2000
2001 if (!fips_enabled)
2002 return 0;
2003
2004#ifdef CONFIG_CRYPTO_DRBG_CTR
2005 drbg_convert_tfm_core("drbg_nopr_ctr_aes128", &coreref, &pr);
2006#elif defined CONFIG_CRYPTO_DRBG_HASH
2007 drbg_convert_tfm_core("drbg_nopr_sha256", &coreref, &pr);
2008#else
2009 drbg_convert_tfm_core("drbg_nopr_hmac_sha256", &coreref, &pr);
2010#endif
2011
2012 drbg = kzalloc(sizeof(struct drbg_state), GFP_KERNEL);
2013 if (!drbg)
2014 return -ENOMEM;
2015
2016 mutex_init(&drbg->drbg_mutex);
2017 drbg->core = &drbg_cores[coreref];
2018 drbg->reseed_threshold = drbg_max_requests(drbg);
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028 max_addtllen = drbg_max_addtl(drbg);
2029 max_request_bytes = drbg_max_request_bytes(drbg);
2030 drbg_string_fill(&addtl, buf, max_addtllen + 1);
2031
2032 len = drbg_generate(drbg, buf, OUTBUFLEN, &addtl);
2033 BUG_ON(0 < len);
2034
2035 len = drbg_generate(drbg, buf, (max_request_bytes + 1), NULL);
2036 BUG_ON(0 < len);
2037
2038
2039 ret = drbg_seed(drbg, &addtl, false);
2040 BUG_ON(0 == ret);
2041
2042 rc = 0;
2043
2044 pr_devel("DRBG: Sanity tests for failure code paths successfully "
2045 "completed\n");
2046
2047 kfree(drbg);
2048 return rc;
2049}
2050
2051static struct rng_alg drbg_algs[22];
2052
2053
2054
2055
2056
2057
2058static inline void __init drbg_fill_array(struct rng_alg *alg,
2059 const struct drbg_core *core, int pr)
2060{
2061 int pos = 0;
2062 static int priority = 200;
2063
2064 memcpy(alg->base.cra_name, "stdrng", 6);
2065 if (pr) {
2066 memcpy(alg->base.cra_driver_name, "drbg_pr_", 8);
2067 pos = 8;
2068 } else {
2069 memcpy(alg->base.cra_driver_name, "drbg_nopr_", 10);
2070 pos = 10;
2071 }
2072 memcpy(alg->base.cra_driver_name + pos, core->cra_name,
2073 strlen(core->cra_name));
2074
2075 alg->base.cra_priority = priority;
2076 priority++;
2077
2078
2079
2080
2081
2082 if (fips_enabled)
2083 alg->base.cra_priority += 200;
2084
2085 alg->base.cra_ctxsize = sizeof(struct drbg_state);
2086 alg->base.cra_module = THIS_MODULE;
2087 alg->base.cra_init = drbg_kcapi_init;
2088 alg->base.cra_exit = drbg_kcapi_cleanup;
2089 alg->generate = drbg_kcapi_random;
2090 alg->seed = drbg_kcapi_seed;
2091 alg->set_ent = drbg_kcapi_set_entropy;
2092 alg->seedsize = 0;
2093}
2094
2095static int __init drbg_init(void)
2096{
2097 unsigned int i = 0;
2098 unsigned int j = 0;
2099 int ret;
2100
2101 ret = drbg_healthcheck_sanity();
2102 if (ret)
2103 return ret;
2104
2105 if (ARRAY_SIZE(drbg_cores) * 2 > ARRAY_SIZE(drbg_algs)) {
2106 pr_info("DRBG: Cannot register all DRBG types"
2107 "(slots needed: %zu, slots available: %zu)\n",
2108 ARRAY_SIZE(drbg_cores) * 2, ARRAY_SIZE(drbg_algs));
2109 return -EFAULT;
2110 }
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121 for (j = 0; ARRAY_SIZE(drbg_cores) > j; j++, i++)
2122 drbg_fill_array(&drbg_algs[i], &drbg_cores[j], 1);
2123 for (j = 0; ARRAY_SIZE(drbg_cores) > j; j++, i++)
2124 drbg_fill_array(&drbg_algs[i], &drbg_cores[j], 0);
2125 return crypto_register_rngs(drbg_algs, (ARRAY_SIZE(drbg_cores) * 2));
2126}
2127
2128static void __exit drbg_exit(void)
2129{
2130 crypto_unregister_rngs(drbg_algs, (ARRAY_SIZE(drbg_cores) * 2));
2131}
2132
2133module_init(drbg_init);
2134module_exit(drbg_exit);
2135#ifndef CRYPTO_DRBG_HASH_STRING
2136#define CRYPTO_DRBG_HASH_STRING ""
2137#endif
2138#ifndef CRYPTO_DRBG_HMAC_STRING
2139#define CRYPTO_DRBG_HMAC_STRING ""
2140#endif
2141#ifndef CRYPTO_DRBG_CTR_STRING
2142#define CRYPTO_DRBG_CTR_STRING ""
2143#endif
2144MODULE_LICENSE("GPL");
2145MODULE_AUTHOR("Stephan Mueller <smueller@chronox.de>");
2146MODULE_DESCRIPTION("NIST SP800-90A Deterministic Random Bit Generator (DRBG) "
2147 "using following cores: "
2148 CRYPTO_DRBG_HASH_STRING
2149 CRYPTO_DRBG_HMAC_STRING
2150 CRYPTO_DRBG_CTR_STRING);
2151MODULE_ALIAS_CRYPTO("stdrng");
2152