0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100 #include <crypto/drbg.h>
0101 #include <crypto/internal/cipher.h>
0102 #include <linux/kernel.h>
0103 #include <linux/jiffies.h>
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118 static const struct drbg_core drbg_cores[] = {
0119 #ifdef CONFIG_CRYPTO_DRBG_CTR
0120 {
0121 .flags = DRBG_CTR | DRBG_STRENGTH128,
0122 .statelen = 32,
0123 .blocklen_bytes = 16,
0124 .cra_name = "ctr_aes128",
0125 .backend_cra_name = "aes",
0126 }, {
0127 .flags = DRBG_CTR | DRBG_STRENGTH192,
0128 .statelen = 40,
0129 .blocklen_bytes = 16,
0130 .cra_name = "ctr_aes192",
0131 .backend_cra_name = "aes",
0132 }, {
0133 .flags = DRBG_CTR | DRBG_STRENGTH256,
0134 .statelen = 48,
0135 .blocklen_bytes = 16,
0136 .cra_name = "ctr_aes256",
0137 .backend_cra_name = "aes",
0138 },
0139 #endif
0140 #ifdef CONFIG_CRYPTO_DRBG_HASH
0141 {
0142 .flags = DRBG_HASH | DRBG_STRENGTH128,
0143 .statelen = 55,
0144 .blocklen_bytes = 20,
0145 .cra_name = "sha1",
0146 .backend_cra_name = "sha1",
0147 }, {
0148 .flags = DRBG_HASH | DRBG_STRENGTH256,
0149 .statelen = 111,
0150 .blocklen_bytes = 48,
0151 .cra_name = "sha384",
0152 .backend_cra_name = "sha384",
0153 }, {
0154 .flags = DRBG_HASH | DRBG_STRENGTH256,
0155 .statelen = 111,
0156 .blocklen_bytes = 64,
0157 .cra_name = "sha512",
0158 .backend_cra_name = "sha512",
0159 }, {
0160 .flags = DRBG_HASH | DRBG_STRENGTH256,
0161 .statelen = 55,
0162 .blocklen_bytes = 32,
0163 .cra_name = "sha256",
0164 .backend_cra_name = "sha256",
0165 },
0166 #endif
0167 #ifdef CONFIG_CRYPTO_DRBG_HMAC
0168 {
0169 .flags = DRBG_HMAC | DRBG_STRENGTH128,
0170 .statelen = 20,
0171 .blocklen_bytes = 20,
0172 .cra_name = "hmac_sha1",
0173 .backend_cra_name = "hmac(sha1)",
0174 }, {
0175 .flags = DRBG_HMAC | DRBG_STRENGTH256,
0176 .statelen = 48,
0177 .blocklen_bytes = 48,
0178 .cra_name = "hmac_sha384",
0179 .backend_cra_name = "hmac(sha384)",
0180 }, {
0181 .flags = DRBG_HMAC | DRBG_STRENGTH256,
0182 .statelen = 32,
0183 .blocklen_bytes = 32,
0184 .cra_name = "hmac_sha256",
0185 .backend_cra_name = "hmac(sha256)",
0186 }, {
0187 .flags = DRBG_HMAC | DRBG_STRENGTH256,
0188 .statelen = 64,
0189 .blocklen_bytes = 64,
0190 .cra_name = "hmac_sha512",
0191 .backend_cra_name = "hmac(sha512)",
0192 },
0193 #endif
0194 };
0195
0196 static int drbg_uninstantiate(struct drbg_state *drbg);
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210 static inline unsigned short drbg_sec_strength(drbg_flag_t flags)
0211 {
0212 switch (flags & DRBG_STRENGTH_MASK) {
0213 case DRBG_STRENGTH128:
0214 return 16;
0215 case DRBG_STRENGTH192:
0216 return 24;
0217 case DRBG_STRENGTH256:
0218 return 32;
0219 default:
0220 return 32;
0221 }
0222 }
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243 static int drbg_fips_continuous_test(struct drbg_state *drbg,
0244 const unsigned char *entropy)
0245 {
0246 unsigned short entropylen = drbg_sec_strength(drbg->core->flags);
0247 int ret = 0;
0248
0249 if (!IS_ENABLED(CONFIG_CRYPTO_FIPS))
0250 return 0;
0251
0252
0253 if (list_empty(&drbg->test_data.list))
0254 return 0;
0255
0256 if (!fips_enabled)
0257 return 0;
0258
0259 if (!drbg->fips_primed) {
0260
0261 memcpy(drbg->prev, entropy, entropylen);
0262 drbg->fips_primed = true;
0263
0264 return -EAGAIN;
0265 }
0266 ret = memcmp(drbg->prev, entropy, entropylen);
0267 if (!ret)
0268 panic("DRBG continuous self test failed\n");
0269 memcpy(drbg->prev, entropy, entropylen);
0270
0271
0272 return 0;
0273 }
0274
0275
0276
0277
0278
0279
0280
0281
0282
0283 #if (defined(CONFIG_CRYPTO_DRBG_HASH) || defined(CONFIG_CRYPTO_DRBG_CTR))
0284 static inline void drbg_cpu_to_be32(__u32 val, unsigned char *buf)
0285 {
0286 struct s {
0287 __be32 conv;
0288 };
0289 struct s *conversion = (struct s *) buf;
0290
0291 conversion->conv = cpu_to_be32(val);
0292 }
0293 #endif
0294
0295
0296
0297
0298
0299 #ifdef CONFIG_CRYPTO_DRBG_CTR
0300 #define CRYPTO_DRBG_CTR_STRING "CTR "
0301 MODULE_ALIAS_CRYPTO("drbg_pr_ctr_aes256");
0302 MODULE_ALIAS_CRYPTO("drbg_nopr_ctr_aes256");
0303 MODULE_ALIAS_CRYPTO("drbg_pr_ctr_aes192");
0304 MODULE_ALIAS_CRYPTO("drbg_nopr_ctr_aes192");
0305 MODULE_ALIAS_CRYPTO("drbg_pr_ctr_aes128");
0306 MODULE_ALIAS_CRYPTO("drbg_nopr_ctr_aes128");
0307
0308 static void drbg_kcapi_symsetkey(struct drbg_state *drbg,
0309 const unsigned char *key);
0310 static int drbg_kcapi_sym(struct drbg_state *drbg, unsigned char *outval,
0311 const struct drbg_string *in);
0312 static int drbg_init_sym_kernel(struct drbg_state *drbg);
0313 static int drbg_fini_sym_kernel(struct drbg_state *drbg);
0314 static int drbg_kcapi_sym_ctr(struct drbg_state *drbg,
0315 u8 *inbuf, u32 inbuflen,
0316 u8 *outbuf, u32 outlen);
0317 #define DRBG_OUTSCRATCHLEN 256
0318
0319
0320 static int drbg_ctr_bcc(struct drbg_state *drbg,
0321 unsigned char *out, const unsigned char *key,
0322 struct list_head *in)
0323 {
0324 int ret = 0;
0325 struct drbg_string *curr = NULL;
0326 struct drbg_string data;
0327 short cnt = 0;
0328
0329 drbg_string_fill(&data, out, drbg_blocklen(drbg));
0330
0331
0332 drbg_kcapi_symsetkey(drbg, key);
0333 list_for_each_entry(curr, in, list) {
0334 const unsigned char *pos = curr->buf;
0335 size_t len = curr->len;
0336
0337 while (len) {
0338
0339 if (drbg_blocklen(drbg) == cnt) {
0340 cnt = 0;
0341 ret = drbg_kcapi_sym(drbg, out, &data);
0342 if (ret)
0343 return ret;
0344 }
0345 out[cnt] ^= *pos;
0346 pos++;
0347 cnt++;
0348 len--;
0349 }
0350 }
0351
0352 if (cnt)
0353 ret = drbg_kcapi_sym(drbg, out, &data);
0354
0355 return ret;
0356 }
0357
0358
0359
0360
0361
0362
0363
0364
0365
0366
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379
0380
0381
0382
0383
0384
0385
0386
0387
0388
0389
0390
0391
0392
0393
0394
0395
0396
0397
0398 static int drbg_ctr_df(struct drbg_state *drbg,
0399 unsigned char *df_data, size_t bytes_to_return,
0400 struct list_head *seedlist)
0401 {
0402 int ret = -EFAULT;
0403 unsigned char L_N[8];
0404
0405 struct drbg_string S1, S2, S4, cipherin;
0406 LIST_HEAD(bcc_list);
0407 unsigned char *pad = df_data + drbg_statelen(drbg);
0408 unsigned char *iv = pad + drbg_blocklen(drbg);
0409 unsigned char *temp = iv + drbg_blocklen(drbg);
0410 size_t padlen = 0;
0411 unsigned int templen = 0;
0412
0413 unsigned int i = 0;
0414
0415 const unsigned char *K = (unsigned char *)
0416 "\x00\x01\x02\x03\x04\x05\x06\x07"
0417 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
0418 "\x10\x11\x12\x13\x14\x15\x16\x17"
0419 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f";
0420 unsigned char *X;
0421 size_t generated_len = 0;
0422 size_t inputlen = 0;
0423 struct drbg_string *seed = NULL;
0424
0425 memset(pad, 0, drbg_blocklen(drbg));
0426 memset(iv, 0, drbg_blocklen(drbg));
0427
0428
0429
0430
0431 if ((512/8) < bytes_to_return)
0432 return -EINVAL;
0433
0434
0435 list_for_each_entry(seed, seedlist, list)
0436 inputlen += seed->len;
0437 drbg_cpu_to_be32(inputlen, &L_N[0]);
0438
0439
0440 drbg_cpu_to_be32(bytes_to_return, &L_N[4]);
0441
0442
0443 padlen = (inputlen + sizeof(L_N) + 1) % (drbg_blocklen(drbg));
0444
0445 if (padlen)
0446 padlen = drbg_blocklen(drbg) - padlen;
0447
0448
0449
0450
0451
0452 padlen++;
0453 pad[0] = 0x80;
0454
0455
0456 drbg_string_fill(&S1, iv, drbg_blocklen(drbg));
0457 list_add_tail(&S1.list, &bcc_list);
0458 drbg_string_fill(&S2, L_N, sizeof(L_N));
0459 list_add_tail(&S2.list, &bcc_list);
0460 list_splice_tail(seedlist, &bcc_list);
0461 drbg_string_fill(&S4, pad, padlen);
0462 list_add_tail(&S4.list, &bcc_list);
0463
0464
0465 while (templen < (drbg_keylen(drbg) + (drbg_blocklen(drbg)))) {
0466
0467
0468
0469
0470
0471 drbg_cpu_to_be32(i, iv);
0472
0473 ret = drbg_ctr_bcc(drbg, temp + templen, K, &bcc_list);
0474 if (ret)
0475 goto out;
0476
0477 i++;
0478 templen += drbg_blocklen(drbg);
0479 }
0480
0481
0482 X = temp + (drbg_keylen(drbg));
0483 drbg_string_fill(&cipherin, X, drbg_blocklen(drbg));
0484
0485
0486
0487
0488 drbg_kcapi_symsetkey(drbg, temp);
0489 while (generated_len < bytes_to_return) {
0490 short blocklen = 0;
0491
0492
0493
0494
0495
0496 ret = drbg_kcapi_sym(drbg, X, &cipherin);
0497 if (ret)
0498 goto out;
0499 blocklen = (drbg_blocklen(drbg) <
0500 (bytes_to_return - generated_len)) ?
0501 drbg_blocklen(drbg) :
0502 (bytes_to_return - generated_len);
0503
0504 memcpy(df_data + generated_len, X, blocklen);
0505 generated_len += blocklen;
0506 }
0507
0508 ret = 0;
0509
0510 out:
0511 memset(iv, 0, drbg_blocklen(drbg));
0512 memset(temp, 0, drbg_statelen(drbg) + drbg_blocklen(drbg));
0513 memset(pad, 0, drbg_blocklen(drbg));
0514 return ret;
0515 }
0516
0517
0518
0519
0520
0521
0522
0523
0524
0525
0526
0527
0528
0529
0530
0531
0532 static int drbg_ctr_update(struct drbg_state *drbg, struct list_head *seed,
0533 int reseed)
0534 {
0535 int ret = -EFAULT;
0536
0537 unsigned char *temp = drbg->scratchpad;
0538 unsigned char *df_data = drbg->scratchpad + drbg_statelen(drbg) +
0539 drbg_blocklen(drbg);
0540
0541 if (3 > reseed)
0542 memset(df_data, 0, drbg_statelen(drbg));
0543
0544 if (!reseed) {
0545
0546
0547
0548
0549
0550
0551
0552 crypto_inc(drbg->V, drbg_blocklen(drbg));
0553
0554 ret = crypto_skcipher_setkey(drbg->ctr_handle, drbg->C,
0555 drbg_keylen(drbg));
0556 if (ret)
0557 goto out;
0558 }
0559
0560
0561 if (seed) {
0562 ret = drbg_ctr_df(drbg, df_data, drbg_statelen(drbg), seed);
0563 if (ret)
0564 goto out;
0565 }
0566
0567 ret = drbg_kcapi_sym_ctr(drbg, df_data, drbg_statelen(drbg),
0568 temp, drbg_statelen(drbg));
0569 if (ret)
0570 return ret;
0571
0572
0573 ret = crypto_skcipher_setkey(drbg->ctr_handle, temp,
0574 drbg_keylen(drbg));
0575 if (ret)
0576 goto out;
0577
0578 memcpy(drbg->V, temp + drbg_keylen(drbg), drbg_blocklen(drbg));
0579
0580 crypto_inc(drbg->V, drbg_blocklen(drbg));
0581 ret = 0;
0582
0583 out:
0584 memset(temp, 0, drbg_statelen(drbg) + drbg_blocklen(drbg));
0585 if (2 != reseed)
0586 memset(df_data, 0, drbg_statelen(drbg));
0587 return ret;
0588 }
0589
0590
0591
0592
0593
0594
0595 static int drbg_ctr_generate(struct drbg_state *drbg,
0596 unsigned char *buf, unsigned int buflen,
0597 struct list_head *addtl)
0598 {
0599 int ret;
0600 int len = min_t(int, buflen, INT_MAX);
0601
0602
0603 if (addtl && !list_empty(addtl)) {
0604 ret = drbg_ctr_update(drbg, addtl, 2);
0605 if (ret)
0606 return 0;
0607 }
0608
0609
0610 ret = drbg_kcapi_sym_ctr(drbg, NULL, 0, buf, len);
0611 if (ret)
0612 return ret;
0613
0614
0615 ret = drbg_ctr_update(drbg, NULL, 3);
0616 if (ret)
0617 len = ret;
0618
0619 return len;
0620 }
0621
0622 static const struct drbg_state_ops drbg_ctr_ops = {
0623 .update = drbg_ctr_update,
0624 .generate = drbg_ctr_generate,
0625 .crypto_init = drbg_init_sym_kernel,
0626 .crypto_fini = drbg_fini_sym_kernel,
0627 };
0628 #endif
0629
0630
0631
0632
0633
0634 #if defined(CONFIG_CRYPTO_DRBG_HASH) || defined(CONFIG_CRYPTO_DRBG_HMAC)
0635 static int drbg_kcapi_hash(struct drbg_state *drbg, unsigned char *outval,
0636 const struct list_head *in);
0637 static void drbg_kcapi_hmacsetkey(struct drbg_state *drbg,
0638 const unsigned char *key);
0639 static int drbg_init_hash_kernel(struct drbg_state *drbg);
0640 static int drbg_fini_hash_kernel(struct drbg_state *drbg);
0641 #endif
0642
0643 #ifdef CONFIG_CRYPTO_DRBG_HMAC
0644 #define CRYPTO_DRBG_HMAC_STRING "HMAC "
0645 MODULE_ALIAS_CRYPTO("drbg_pr_hmac_sha512");
0646 MODULE_ALIAS_CRYPTO("drbg_nopr_hmac_sha512");
0647 MODULE_ALIAS_CRYPTO("drbg_pr_hmac_sha384");
0648 MODULE_ALIAS_CRYPTO("drbg_nopr_hmac_sha384");
0649 MODULE_ALIAS_CRYPTO("drbg_pr_hmac_sha256");
0650 MODULE_ALIAS_CRYPTO("drbg_nopr_hmac_sha256");
0651 MODULE_ALIAS_CRYPTO("drbg_pr_hmac_sha1");
0652 MODULE_ALIAS_CRYPTO("drbg_nopr_hmac_sha1");
0653
0654
0655 static int drbg_hmac_update(struct drbg_state *drbg, struct list_head *seed,
0656 int reseed)
0657 {
0658 int ret = -EFAULT;
0659 int i = 0;
0660 struct drbg_string seed1, seed2, vdata;
0661 LIST_HEAD(seedlist);
0662 LIST_HEAD(vdatalist);
0663
0664 if (!reseed) {
0665
0666 memset(drbg->V, 1, drbg_statelen(drbg));
0667 drbg_kcapi_hmacsetkey(drbg, drbg->C);
0668 }
0669
0670 drbg_string_fill(&seed1, drbg->V, drbg_statelen(drbg));
0671 list_add_tail(&seed1.list, &seedlist);
0672
0673 drbg_string_fill(&seed2, NULL, 1);
0674 list_add_tail(&seed2.list, &seedlist);
0675
0676 if (seed)
0677 list_splice_tail(seed, &seedlist);
0678
0679 drbg_string_fill(&vdata, drbg->V, drbg_statelen(drbg));
0680 list_add_tail(&vdata.list, &vdatalist);
0681 for (i = 2; 0 < i; i--) {
0682
0683 unsigned char prefix = DRBG_PREFIX0;
0684 if (1 == i)
0685 prefix = DRBG_PREFIX1;
0686
0687 seed2.buf = &prefix;
0688 ret = drbg_kcapi_hash(drbg, drbg->C, &seedlist);
0689 if (ret)
0690 return ret;
0691 drbg_kcapi_hmacsetkey(drbg, drbg->C);
0692
0693
0694 ret = drbg_kcapi_hash(drbg, drbg->V, &vdatalist);
0695 if (ret)
0696 return ret;
0697
0698
0699 if (!seed)
0700 return ret;
0701 }
0702
0703 return 0;
0704 }
0705
0706
0707 static int drbg_hmac_generate(struct drbg_state *drbg,
0708 unsigned char *buf,
0709 unsigned int buflen,
0710 struct list_head *addtl)
0711 {
0712 int len = 0;
0713 int ret = 0;
0714 struct drbg_string data;
0715 LIST_HEAD(datalist);
0716
0717
0718 if (addtl && !list_empty(addtl)) {
0719 ret = drbg_hmac_update(drbg, addtl, 1);
0720 if (ret)
0721 return ret;
0722 }
0723
0724 drbg_string_fill(&data, drbg->V, drbg_statelen(drbg));
0725 list_add_tail(&data.list, &datalist);
0726 while (len < buflen) {
0727 unsigned int outlen = 0;
0728
0729 ret = drbg_kcapi_hash(drbg, drbg->V, &datalist);
0730 if (ret)
0731 return ret;
0732 outlen = (drbg_blocklen(drbg) < (buflen - len)) ?
0733 drbg_blocklen(drbg) : (buflen - len);
0734
0735
0736 memcpy(buf + len, drbg->V, outlen);
0737 len += outlen;
0738 }
0739
0740
0741 if (addtl && !list_empty(addtl))
0742 ret = drbg_hmac_update(drbg, addtl, 1);
0743 else
0744 ret = drbg_hmac_update(drbg, NULL, 1);
0745 if (ret)
0746 return ret;
0747
0748 return len;
0749 }
0750
0751 static const struct drbg_state_ops drbg_hmac_ops = {
0752 .update = drbg_hmac_update,
0753 .generate = drbg_hmac_generate,
0754 .crypto_init = drbg_init_hash_kernel,
0755 .crypto_fini = drbg_fini_hash_kernel,
0756 };
0757 #endif
0758
0759
0760
0761
0762
0763 #ifdef CONFIG_CRYPTO_DRBG_HASH
0764 #define CRYPTO_DRBG_HASH_STRING "HASH "
0765 MODULE_ALIAS_CRYPTO("drbg_pr_sha512");
0766 MODULE_ALIAS_CRYPTO("drbg_nopr_sha512");
0767 MODULE_ALIAS_CRYPTO("drbg_pr_sha384");
0768 MODULE_ALIAS_CRYPTO("drbg_nopr_sha384");
0769 MODULE_ALIAS_CRYPTO("drbg_pr_sha256");
0770 MODULE_ALIAS_CRYPTO("drbg_nopr_sha256");
0771 MODULE_ALIAS_CRYPTO("drbg_pr_sha1");
0772 MODULE_ALIAS_CRYPTO("drbg_nopr_sha1");
0773
0774
0775
0776
0777
0778
0779
0780 static inline void drbg_add_buf(unsigned char *dst, size_t dstlen,
0781 const unsigned char *add, size_t addlen)
0782 {
0783
0784 unsigned char *dstptr;
0785 const unsigned char *addptr;
0786 unsigned int remainder = 0;
0787 size_t len = addlen;
0788
0789 dstptr = dst + (dstlen-1);
0790 addptr = add + (addlen-1);
0791 while (len) {
0792 remainder += *dstptr + *addptr;
0793 *dstptr = remainder & 0xff;
0794 remainder >>= 8;
0795 len--; dstptr--; addptr--;
0796 }
0797 len = dstlen - addlen;
0798 while (len && remainder > 0) {
0799 remainder = *dstptr + 1;
0800 *dstptr = remainder & 0xff;
0801 remainder >>= 8;
0802 len--; dstptr--;
0803 }
0804 }
0805
0806
0807
0808
0809
0810
0811
0812
0813
0814
0815
0816
0817
0818
0819
0820
0821
0822 static int drbg_hash_df(struct drbg_state *drbg,
0823 unsigned char *outval, size_t outlen,
0824 struct list_head *entropylist)
0825 {
0826 int ret = 0;
0827 size_t len = 0;
0828 unsigned char input[5];
0829 unsigned char *tmp = drbg->scratchpad + drbg_statelen(drbg);
0830 struct drbg_string data;
0831
0832
0833 input[0] = 1;
0834 drbg_cpu_to_be32((outlen * 8), &input[1]);
0835
0836
0837 drbg_string_fill(&data, input, 5);
0838 list_add(&data.list, entropylist);
0839
0840
0841 while (len < outlen) {
0842 short blocklen = 0;
0843
0844 ret = drbg_kcapi_hash(drbg, tmp, entropylist);
0845 if (ret)
0846 goto out;
0847
0848 input[0]++;
0849 blocklen = (drbg_blocklen(drbg) < (outlen - len)) ?
0850 drbg_blocklen(drbg) : (outlen - len);
0851 memcpy(outval + len, tmp, blocklen);
0852 len += blocklen;
0853 }
0854
0855 out:
0856 memset(tmp, 0, drbg_blocklen(drbg));
0857 return ret;
0858 }
0859
0860
0861 static int drbg_hash_update(struct drbg_state *drbg, struct list_head *seed,
0862 int reseed)
0863 {
0864 int ret = 0;
0865 struct drbg_string data1, data2;
0866 LIST_HEAD(datalist);
0867 LIST_HEAD(datalist2);
0868 unsigned char *V = drbg->scratchpad;
0869 unsigned char prefix = DRBG_PREFIX1;
0870
0871 if (!seed)
0872 return -EINVAL;
0873
0874 if (reseed) {
0875
0876 memcpy(V, drbg->V, drbg_statelen(drbg));
0877 drbg_string_fill(&data1, &prefix, 1);
0878 list_add_tail(&data1.list, &datalist);
0879 drbg_string_fill(&data2, V, drbg_statelen(drbg));
0880 list_add_tail(&data2.list, &datalist);
0881 }
0882 list_splice_tail(seed, &datalist);
0883
0884
0885 ret = drbg_hash_df(drbg, drbg->V, drbg_statelen(drbg), &datalist);
0886 if (ret)
0887 goto out;
0888
0889
0890 prefix = DRBG_PREFIX0;
0891 drbg_string_fill(&data1, &prefix, 1);
0892 list_add_tail(&data1.list, &datalist2);
0893 drbg_string_fill(&data2, drbg->V, drbg_statelen(drbg));
0894 list_add_tail(&data2.list, &datalist2);
0895
0896 ret = drbg_hash_df(drbg, drbg->C, drbg_statelen(drbg), &datalist2);
0897
0898 out:
0899 memset(drbg->scratchpad, 0, drbg_statelen(drbg));
0900 return ret;
0901 }
0902
0903
0904 static int drbg_hash_process_addtl(struct drbg_state *drbg,
0905 struct list_head *addtl)
0906 {
0907 int ret = 0;
0908 struct drbg_string data1, data2;
0909 LIST_HEAD(datalist);
0910 unsigned char prefix = DRBG_PREFIX2;
0911
0912
0913 if (!addtl || list_empty(addtl))
0914 return 0;
0915
0916
0917 drbg_string_fill(&data1, &prefix, 1);
0918 drbg_string_fill(&data2, drbg->V, drbg_statelen(drbg));
0919 list_add_tail(&data1.list, &datalist);
0920 list_add_tail(&data2.list, &datalist);
0921 list_splice_tail(addtl, &datalist);
0922 ret = drbg_kcapi_hash(drbg, drbg->scratchpad, &datalist);
0923 if (ret)
0924 goto out;
0925
0926
0927 drbg_add_buf(drbg->V, drbg_statelen(drbg),
0928 drbg->scratchpad, drbg_blocklen(drbg));
0929
0930 out:
0931 memset(drbg->scratchpad, 0, drbg_blocklen(drbg));
0932 return ret;
0933 }
0934
0935
0936 static int drbg_hash_hashgen(struct drbg_state *drbg,
0937 unsigned char *buf,
0938 unsigned int buflen)
0939 {
0940 int len = 0;
0941 int ret = 0;
0942 unsigned char *src = drbg->scratchpad;
0943 unsigned char *dst = drbg->scratchpad + drbg_statelen(drbg);
0944 struct drbg_string data;
0945 LIST_HEAD(datalist);
0946
0947
0948 memcpy(src, drbg->V, drbg_statelen(drbg));
0949
0950 drbg_string_fill(&data, src, drbg_statelen(drbg));
0951 list_add_tail(&data.list, &datalist);
0952 while (len < buflen) {
0953 unsigned int outlen = 0;
0954
0955 ret = drbg_kcapi_hash(drbg, dst, &datalist);
0956 if (ret) {
0957 len = ret;
0958 goto out;
0959 }
0960 outlen = (drbg_blocklen(drbg) < (buflen - len)) ?
0961 drbg_blocklen(drbg) : (buflen - len);
0962
0963 memcpy(buf + len, dst, outlen);
0964 len += outlen;
0965
0966 if (len < buflen)
0967 crypto_inc(src, drbg_statelen(drbg));
0968 }
0969
0970 out:
0971 memset(drbg->scratchpad, 0,
0972 (drbg_statelen(drbg) + drbg_blocklen(drbg)));
0973 return len;
0974 }
0975
0976
0977 static int drbg_hash_generate(struct drbg_state *drbg,
0978 unsigned char *buf, unsigned int buflen,
0979 struct list_head *addtl)
0980 {
0981 int len = 0;
0982 int ret = 0;
0983 union {
0984 unsigned char req[8];
0985 __be64 req_int;
0986 } u;
0987 unsigned char prefix = DRBG_PREFIX3;
0988 struct drbg_string data1, data2;
0989 LIST_HEAD(datalist);
0990
0991
0992 ret = drbg_hash_process_addtl(drbg, addtl);
0993 if (ret)
0994 return ret;
0995
0996 len = drbg_hash_hashgen(drbg, buf, buflen);
0997
0998
0999
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
1018 out:
1019 memset(drbg->scratchpad, 0, drbg_blocklen(drbg));
1020 return len;
1021 }
1022
1023
1024
1025
1026
1027 static 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
1039 static 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
1076 static 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
1092 static 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
1112 out:
1113 memzero_explicit(entropy, entropylen);
1114 return ret;
1115 }
1116
1117 static 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
1148 static 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
1248 out:
1249 memzero_explicit(entropy, entropylen * 2);
1250
1251 return ret;
1252 }
1253
1254
1255 static 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
1281 static 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
1356 fini:
1357 drbg->d_ops->crypto_fini(drbg);
1358 err:
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
1383 static 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;
1505 err:
1506 return len;
1507 }
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517 static 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
1538 static 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 || err != -ENOENT)
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
1574 static 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
1620 unlock:
1621 mutex_unlock(&drbg->drbg_mutex);
1622 return ret;
1623
1624 free_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
1639 static 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
1659 static 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)
1674 struct sdesc {
1675 struct shash_desc shash;
1676 char ctx[];
1677 };
1678
1679 static 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 crypto_shash_alignmask(tfm);
1702 }
1703
1704 static int drbg_fini_hash_kernel(struct drbg_state *drbg)
1705 {
1706 struct sdesc *sdesc = (struct 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
1715 static void drbg_kcapi_hmacsetkey(struct drbg_state *drbg,
1716 const unsigned char *key)
1717 {
1718 struct sdesc *sdesc = (struct sdesc *)drbg->priv_data;
1719
1720 crypto_shash_setkey(sdesc->shash.tfm, key, drbg_statelen(drbg));
1721 }
1722
1723 static int drbg_kcapi_hash(struct drbg_state *drbg, unsigned char *outval,
1724 const struct list_head *in)
1725 {
1726 struct sdesc *sdesc = (struct 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
1737 static 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
1759 static 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
1818 static void drbg_kcapi_symsetkey(struct drbg_state *drbg,
1819 const unsigned char *key)
1820 {
1821 struct crypto_cipher *tfm =
1822 (struct crypto_cipher *)drbg->priv_data;
1823
1824 crypto_cipher_setkey(tfm, key, (drbg_keylen(drbg)));
1825 }
1826
1827 static int drbg_kcapi_sym(struct drbg_state *drbg, unsigned char *outval,
1828 const struct drbg_string *in)
1829 {
1830 struct crypto_cipher *tfm =
1831 (struct crypto_cipher *)drbg->priv_data;
1832
1833
1834 BUG_ON(in->len < drbg_blocklen(drbg));
1835 crypto_cipher_encrypt_one(tfm, outval, in->buf);
1836 return 0;
1837 }
1838
1839 static int drbg_kcapi_sym_ctr(struct drbg_state *drbg,
1840 u8 *inbuf, u32 inlen,
1841 u8 *outbuf, u32 outlen)
1842 {
1843 struct scatterlist *sg_in = &drbg->sg_in, *sg_out = &drbg->sg_out;
1844 u32 scratchpad_use = min_t(u32, outlen, DRBG_OUTSCRATCHLEN);
1845 int ret;
1846
1847 if (inbuf) {
1848
1849 sg_set_buf(sg_in, inbuf, inlen);
1850 } else {
1851
1852 inlen = scratchpad_use;
1853 memset(drbg->outscratchpad, 0, scratchpad_use);
1854 sg_set_buf(sg_in, drbg->outscratchpad, scratchpad_use);
1855 }
1856
1857 while (outlen) {
1858 u32 cryptlen = min3(inlen, outlen, (u32)DRBG_OUTSCRATCHLEN);
1859
1860
1861 skcipher_request_set_crypt(drbg->ctr_req, sg_in, sg_out,
1862 cryptlen, drbg->V);
1863 ret = crypto_wait_req(crypto_skcipher_encrypt(drbg->ctr_req),
1864 &drbg->ctr_wait);
1865 if (ret)
1866 goto out;
1867
1868 crypto_init_wait(&drbg->ctr_wait);
1869
1870 memcpy(outbuf, drbg->outscratchpad, cryptlen);
1871 memzero_explicit(drbg->outscratchpad, cryptlen);
1872
1873 outlen -= cryptlen;
1874 outbuf += cryptlen;
1875 }
1876 ret = 0;
1877
1878 out:
1879 return ret;
1880 }
1881 #endif
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898 static inline void drbg_convert_tfm_core(const char *cra_driver_name,
1899 int *coreref, bool *pr)
1900 {
1901 int i = 0;
1902 size_t start = 0;
1903 int len = 0;
1904
1905 *pr = true;
1906
1907 if (!memcmp(cra_driver_name, "drbg_nopr_", 10)) {
1908 start = 10;
1909 *pr = false;
1910 } else if (!memcmp(cra_driver_name, "drbg_pr_", 8)) {
1911 start = 8;
1912 } else {
1913 return;
1914 }
1915
1916
1917 len = strlen(cra_driver_name) - start;
1918 for (i = 0; ARRAY_SIZE(drbg_cores) > i; i++) {
1919 if (!memcmp(cra_driver_name + start, drbg_cores[i].cra_name,
1920 len)) {
1921 *coreref = i;
1922 return;
1923 }
1924 }
1925 }
1926
1927 static int drbg_kcapi_init(struct crypto_tfm *tfm)
1928 {
1929 struct drbg_state *drbg = crypto_tfm_ctx(tfm);
1930
1931 mutex_init(&drbg->drbg_mutex);
1932
1933 return 0;
1934 }
1935
1936 static void drbg_kcapi_cleanup(struct crypto_tfm *tfm)
1937 {
1938 drbg_uninstantiate(crypto_tfm_ctx(tfm));
1939 }
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950 static int drbg_kcapi_random(struct crypto_rng *tfm,
1951 const u8 *src, unsigned int slen,
1952 u8 *dst, unsigned int dlen)
1953 {
1954 struct drbg_state *drbg = crypto_rng_ctx(tfm);
1955 struct drbg_string *addtl = NULL;
1956 struct drbg_string string;
1957
1958 if (slen) {
1959
1960 drbg_string_fill(&string, src, slen);
1961 addtl = &string;
1962 }
1963
1964 return drbg_generate_long(drbg, dst, dlen, addtl);
1965 }
1966
1967
1968
1969
1970 static int drbg_kcapi_seed(struct crypto_rng *tfm,
1971 const u8 *seed, unsigned int slen)
1972 {
1973 struct drbg_state *drbg = crypto_rng_ctx(tfm);
1974 struct crypto_tfm *tfm_base = crypto_rng_tfm(tfm);
1975 bool pr = false;
1976 struct drbg_string string;
1977 struct drbg_string *seed_string = NULL;
1978 int coreref = 0;
1979
1980 drbg_convert_tfm_core(crypto_tfm_alg_driver_name(tfm_base), &coreref,
1981 &pr);
1982 if (0 < slen) {
1983 drbg_string_fill(&string, seed, slen);
1984 seed_string = &string;
1985 }
1986
1987 return drbg_instantiate(drbg, seed_string, coreref, pr);
1988 }
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004 static inline int __init drbg_healthcheck_sanity(void)
2005 {
2006 int len = 0;
2007 #define OUTBUFLEN 16
2008 unsigned char buf[OUTBUFLEN];
2009 struct drbg_state *drbg = NULL;
2010 int ret;
2011 int rc = -EFAULT;
2012 bool pr = false;
2013 int coreref = 0;
2014 struct drbg_string addtl;
2015 size_t max_addtllen, max_request_bytes;
2016
2017
2018 if (!fips_enabled)
2019 return 0;
2020
2021 #ifdef CONFIG_CRYPTO_DRBG_CTR
2022 drbg_convert_tfm_core("drbg_nopr_ctr_aes128", &coreref, &pr);
2023 #elif defined CONFIG_CRYPTO_DRBG_HASH
2024 drbg_convert_tfm_core("drbg_nopr_sha256", &coreref, &pr);
2025 #else
2026 drbg_convert_tfm_core("drbg_nopr_hmac_sha256", &coreref, &pr);
2027 #endif
2028
2029 drbg = kzalloc(sizeof(struct drbg_state), GFP_KERNEL);
2030 if (!drbg)
2031 return -ENOMEM;
2032
2033 mutex_init(&drbg->drbg_mutex);
2034 drbg->core = &drbg_cores[coreref];
2035 drbg->reseed_threshold = drbg_max_requests(drbg);
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045 max_addtllen = drbg_max_addtl(drbg);
2046 max_request_bytes = drbg_max_request_bytes(drbg);
2047 drbg_string_fill(&addtl, buf, max_addtllen + 1);
2048
2049 len = drbg_generate(drbg, buf, OUTBUFLEN, &addtl);
2050 BUG_ON(0 < len);
2051
2052 len = drbg_generate(drbg, buf, (max_request_bytes + 1), NULL);
2053 BUG_ON(0 < len);
2054
2055
2056 ret = drbg_seed(drbg, &addtl, false);
2057 BUG_ON(0 == ret);
2058
2059 rc = 0;
2060
2061 pr_devel("DRBG: Sanity tests for failure code paths successfully "
2062 "completed\n");
2063
2064 kfree(drbg);
2065 return rc;
2066 }
2067
2068 static struct rng_alg drbg_algs[22];
2069
2070
2071
2072
2073
2074
2075 static inline void __init drbg_fill_array(struct rng_alg *alg,
2076 const struct drbg_core *core, int pr)
2077 {
2078 int pos = 0;
2079 static int priority = 200;
2080
2081 memcpy(alg->base.cra_name, "stdrng", 6);
2082 if (pr) {
2083 memcpy(alg->base.cra_driver_name, "drbg_pr_", 8);
2084 pos = 8;
2085 } else {
2086 memcpy(alg->base.cra_driver_name, "drbg_nopr_", 10);
2087 pos = 10;
2088 }
2089 memcpy(alg->base.cra_driver_name + pos, core->cra_name,
2090 strlen(core->cra_name));
2091
2092 alg->base.cra_priority = priority;
2093 priority++;
2094
2095
2096
2097
2098
2099 if (fips_enabled)
2100 alg->base.cra_priority += 200;
2101
2102 alg->base.cra_ctxsize = sizeof(struct drbg_state);
2103 alg->base.cra_module = THIS_MODULE;
2104 alg->base.cra_init = drbg_kcapi_init;
2105 alg->base.cra_exit = drbg_kcapi_cleanup;
2106 alg->generate = drbg_kcapi_random;
2107 alg->seed = drbg_kcapi_seed;
2108 alg->set_ent = drbg_kcapi_set_entropy;
2109 alg->seedsize = 0;
2110 }
2111
2112 static int __init drbg_init(void)
2113 {
2114 unsigned int i = 0;
2115 unsigned int j = 0;
2116 int ret;
2117
2118 ret = drbg_healthcheck_sanity();
2119 if (ret)
2120 return ret;
2121
2122 if (ARRAY_SIZE(drbg_cores) * 2 > ARRAY_SIZE(drbg_algs)) {
2123 pr_info("DRBG: Cannot register all DRBG types"
2124 "(slots needed: %zu, slots available: %zu)\n",
2125 ARRAY_SIZE(drbg_cores) * 2, ARRAY_SIZE(drbg_algs));
2126 return -EFAULT;
2127 }
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138 for (j = 0; ARRAY_SIZE(drbg_cores) > j; j++, i++)
2139 drbg_fill_array(&drbg_algs[i], &drbg_cores[j], 1);
2140 for (j = 0; ARRAY_SIZE(drbg_cores) > j; j++, i++)
2141 drbg_fill_array(&drbg_algs[i], &drbg_cores[j], 0);
2142 return crypto_register_rngs(drbg_algs, (ARRAY_SIZE(drbg_cores) * 2));
2143 }
2144
2145 static void __exit drbg_exit(void)
2146 {
2147 crypto_unregister_rngs(drbg_algs, (ARRAY_SIZE(drbg_cores) * 2));
2148 }
2149
2150 subsys_initcall(drbg_init);
2151 module_exit(drbg_exit);
2152 #ifndef CRYPTO_DRBG_HASH_STRING
2153 #define CRYPTO_DRBG_HASH_STRING ""
2154 #endif
2155 #ifndef CRYPTO_DRBG_HMAC_STRING
2156 #define CRYPTO_DRBG_HMAC_STRING ""
2157 #endif
2158 #ifndef CRYPTO_DRBG_CTR_STRING
2159 #define CRYPTO_DRBG_CTR_STRING ""
2160 #endif
2161 MODULE_LICENSE("GPL");
2162 MODULE_AUTHOR("Stephan Mueller <smueller@chronox.de>");
2163 MODULE_DESCRIPTION("NIST SP800-90A Deterministic Random Bit Generator (DRBG) "
2164 "using following cores: "
2165 CRYPTO_DRBG_HASH_STRING
2166 CRYPTO_DRBG_HMAC_STRING
2167 CRYPTO_DRBG_CTR_STRING);
2168 MODULE_ALIAS_CRYPTO("stdrng");
2169 MODULE_IMPORT_NS(CRYPTO_INTERNAL);