2154 lines · c
1/*2 * DRBG: Deterministic Random Bits Generator3 * Based on NIST Recommended DRBG from NIST SP800-90A with the following4 * properties:5 * * CTR DRBG with DF with AES-128, AES-192, AES-256 cores6 * * Hash DRBG with DF with SHA-1, SHA-256, SHA-384, SHA-512 cores7 * * HMAC DRBG with DF with SHA-1, SHA-256, SHA-384, SHA-512 cores8 * * with and without prediction resistance9 *10 * Copyright Stephan Mueller <smueller@chronox.de>, 201411 *12 * Redistribution and use in source and binary forms, with or without13 * modification, are permitted provided that the following conditions14 * are met:15 * 1. Redistributions of source code must retain the above copyright16 * notice, and the entire permission notice in its entirety,17 * including the disclaimer of warranties.18 * 2. Redistributions in binary form must reproduce the above copyright19 * notice, this list of conditions and the following disclaimer in the20 * documentation and/or other materials provided with the distribution.21 * 3. The name of the author may not be used to endorse or promote22 * products derived from this software without specific prior23 * written permission.24 *25 * ALTERNATIVELY, this product may be distributed under the terms of26 * the GNU General Public License, in which case the provisions of the GPL are27 * required INSTEAD OF the above restrictions. (This clause is28 * necessary due to a potential bad interaction between the GPL and29 * the restrictions contained in a BSD-style copyright.)30 *31 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED32 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES33 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF34 * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE35 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR36 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT37 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR38 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF39 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT40 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE41 * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH42 * DAMAGE.43 *44 * DRBG Usage45 * ==========46 * The SP 800-90A DRBG allows the user to specify a personalization string47 * for initialization as well as an additional information string for each48 * random number request. The following code fragments show how a caller49 * uses the kernel crypto API to use the full functionality of the DRBG.50 *51 * Usage without any additional data52 * ---------------------------------53 * struct crypto_rng *drng;54 * int err;55 * char data[DATALEN];56 *57 * drng = crypto_alloc_rng(drng_name, 0, 0);58 * err = crypto_rng_get_bytes(drng, &data, DATALEN);59 * crypto_free_rng(drng);60 *61 *62 * Usage with personalization string during initialization63 * -------------------------------------------------------64 * struct crypto_rng *drng;65 * int err;66 * char data[DATALEN];67 * struct drbg_string pers;68 * char personalization[11] = "some-string";69 *70 * drbg_string_fill(&pers, personalization, strlen(personalization));71 * drng = crypto_alloc_rng(drng_name, 0, 0);72 * // The reset completely re-initializes the DRBG with the provided73 * // personalization string74 * err = crypto_rng_reset(drng, &personalization, strlen(personalization));75 * err = crypto_rng_get_bytes(drng, &data, DATALEN);76 * crypto_free_rng(drng);77 *78 *79 * Usage with additional information string during random number request80 * ---------------------------------------------------------------------81 * struct crypto_rng *drng;82 * int err;83 * char data[DATALEN];84 * char addtl_string[11] = "some-string";85 * string drbg_string addtl;86 *87 * drbg_string_fill(&addtl, addtl_string, strlen(addtl_string));88 * drng = crypto_alloc_rng(drng_name, 0, 0);89 * // The following call is a wrapper to crypto_rng_get_bytes() and returns90 * // the same error codes.91 * err = crypto_drbg_get_bytes_addtl(drng, &data, DATALEN, &addtl);92 * crypto_free_rng(drng);93 *94 *95 * Usage with personalization and additional information strings96 * -------------------------------------------------------------97 * Just mix both scenarios above.98 */99 100#include <crypto/drbg.h>101#include <crypto/internal/cipher.h>102#include <linux/kernel.h>103#include <linux/jiffies.h>104 105/***************************************************************106 * Backend cipher definitions available to DRBG107 ***************************************************************/108 109/*110 * The order of the DRBG definitions here matter: every DRBG is registered111 * as stdrng. Each DRBG receives an increasing cra_priority values the later112 * they are defined in this array (see drbg_fill_array).113 *114 * HMAC DRBGs are favored over Hash DRBGs over CTR DRBGs, and the115 * HMAC-SHA512 / SHA256 / AES 256 over other ciphers. Thus, the116 * favored DRBGs are the latest entries in this array.117 */118static const struct drbg_core drbg_cores[] = {119#ifdef CONFIG_CRYPTO_DRBG_CTR120 {121 .flags = DRBG_CTR | DRBG_STRENGTH128,122 .statelen = 32, /* 256 bits as defined in 10.2.1 */123 .blocklen_bytes = 16,124 .cra_name = "ctr_aes128",125 .backend_cra_name = "aes",126 }, {127 .flags = DRBG_CTR | DRBG_STRENGTH192,128 .statelen = 40, /* 320 bits as defined in 10.2.1 */129 .blocklen_bytes = 16,130 .cra_name = "ctr_aes192",131 .backend_cra_name = "aes",132 }, {133 .flags = DRBG_CTR | DRBG_STRENGTH256,134 .statelen = 48, /* 384 bits as defined in 10.2.1 */135 .blocklen_bytes = 16,136 .cra_name = "ctr_aes256",137 .backend_cra_name = "aes",138 },139#endif /* CONFIG_CRYPTO_DRBG_CTR */140#ifdef CONFIG_CRYPTO_DRBG_HASH141 {142 .flags = DRBG_HASH | DRBG_STRENGTH256,143 .statelen = 111, /* 888 bits */144 .blocklen_bytes = 48,145 .cra_name = "sha384",146 .backend_cra_name = "sha384",147 }, {148 .flags = DRBG_HASH | DRBG_STRENGTH256,149 .statelen = 111, /* 888 bits */150 .blocklen_bytes = 64,151 .cra_name = "sha512",152 .backend_cra_name = "sha512",153 }, {154 .flags = DRBG_HASH | DRBG_STRENGTH256,155 .statelen = 55, /* 440 bits */156 .blocklen_bytes = 32,157 .cra_name = "sha256",158 .backend_cra_name = "sha256",159 },160#endif /* CONFIG_CRYPTO_DRBG_HASH */161#ifdef CONFIG_CRYPTO_DRBG_HMAC162 {163 .flags = DRBG_HMAC | DRBG_STRENGTH256,164 .statelen = 48, /* block length of cipher */165 .blocklen_bytes = 48,166 .cra_name = "hmac_sha384",167 .backend_cra_name = "hmac(sha384)",168 }, {169 .flags = DRBG_HMAC | DRBG_STRENGTH256,170 .statelen = 32, /* block length of cipher */171 .blocklen_bytes = 32,172 .cra_name = "hmac_sha256",173 .backend_cra_name = "hmac(sha256)",174 }, {175 .flags = DRBG_HMAC | DRBG_STRENGTH256,176 .statelen = 64, /* block length of cipher */177 .blocklen_bytes = 64,178 .cra_name = "hmac_sha512",179 .backend_cra_name = "hmac(sha512)",180 },181#endif /* CONFIG_CRYPTO_DRBG_HMAC */182};183 184static int drbg_uninstantiate(struct drbg_state *drbg);185 186/******************************************************************187 * Generic helper functions188 ******************************************************************/189 190/*191 * Return strength of DRBG according to SP800-90A section 8.4192 *193 * @flags DRBG flags reference194 *195 * Return: normalized strength in *bytes* value or 32 as default196 * to counter programming errors197 */198static inline unsigned short drbg_sec_strength(drbg_flag_t flags)199{200 switch (flags & DRBG_STRENGTH_MASK) {201 case DRBG_STRENGTH128:202 return 16;203 case DRBG_STRENGTH192:204 return 24;205 case DRBG_STRENGTH256:206 return 32;207 default:208 return 32;209 }210}211 212/*213 * FIPS 140-2 continuous self test for the noise source214 * The test is performed on the noise source input data. Thus, the function215 * implicitly knows the size of the buffer to be equal to the security216 * strength.217 *218 * Note, this function disregards the nonce trailing the entropy data during219 * initial seeding.220 *221 * drbg->drbg_mutex must have been taken.222 *223 * @drbg DRBG handle224 * @entropy buffer of seed data to be checked225 *226 * return:227 * 0 on success228 * -EAGAIN on when the CTRNG is not yet primed229 * < 0 on error230 */231static int drbg_fips_continuous_test(struct drbg_state *drbg,232 const unsigned char *entropy)233{234 unsigned short entropylen = drbg_sec_strength(drbg->core->flags);235 int ret = 0;236 237 if (!IS_ENABLED(CONFIG_CRYPTO_FIPS))238 return 0;239 240 /* skip test if we test the overall system */241 if (list_empty(&drbg->test_data.list))242 return 0;243 /* only perform test in FIPS mode */244 if (!fips_enabled)245 return 0;246 247 if (!drbg->fips_primed) {248 /* Priming of FIPS test */249 memcpy(drbg->prev, entropy, entropylen);250 drbg->fips_primed = true;251 /* priming: another round is needed */252 return -EAGAIN;253 }254 ret = memcmp(drbg->prev, entropy, entropylen);255 if (!ret)256 panic("DRBG continuous self test failed\n");257 memcpy(drbg->prev, entropy, entropylen);258 259 /* the test shall pass when the two values are not equal */260 return 0;261}262 263/*264 * Convert an integer into a byte representation of this integer.265 * The byte representation is big-endian266 *267 * @val value to be converted268 * @buf buffer holding the converted integer -- caller must ensure that269 * buffer size is at least 32 bit270 */271#if (defined(CONFIG_CRYPTO_DRBG_HASH) || defined(CONFIG_CRYPTO_DRBG_CTR))272static inline void drbg_cpu_to_be32(__u32 val, unsigned char *buf)273{274 struct s {275 __be32 conv;276 };277 struct s *conversion = (struct s *) buf;278 279 conversion->conv = cpu_to_be32(val);280}281#endif /* defined(CONFIG_CRYPTO_DRBG_HASH) || defined(CONFIG_CRYPTO_DRBG_CTR) */282 283/******************************************************************284 * CTR DRBG callback functions285 ******************************************************************/286 287#ifdef CONFIG_CRYPTO_DRBG_CTR288#define CRYPTO_DRBG_CTR_STRING "CTR "289MODULE_ALIAS_CRYPTO("drbg_pr_ctr_aes256");290MODULE_ALIAS_CRYPTO("drbg_nopr_ctr_aes256");291MODULE_ALIAS_CRYPTO("drbg_pr_ctr_aes192");292MODULE_ALIAS_CRYPTO("drbg_nopr_ctr_aes192");293MODULE_ALIAS_CRYPTO("drbg_pr_ctr_aes128");294MODULE_ALIAS_CRYPTO("drbg_nopr_ctr_aes128");295 296static void drbg_kcapi_symsetkey(struct drbg_state *drbg,297 const unsigned char *key);298static int drbg_kcapi_sym(struct drbg_state *drbg, unsigned char *outval,299 const struct drbg_string *in);300static int drbg_init_sym_kernel(struct drbg_state *drbg);301static int drbg_fini_sym_kernel(struct drbg_state *drbg);302static int drbg_kcapi_sym_ctr(struct drbg_state *drbg,303 u8 *inbuf, u32 inbuflen,304 u8 *outbuf, u32 outlen);305#define DRBG_OUTSCRATCHLEN 256306 307/* BCC function for CTR DRBG as defined in 10.4.3 */308static int drbg_ctr_bcc(struct drbg_state *drbg,309 unsigned char *out, const unsigned char *key,310 struct list_head *in)311{312 int ret = 0;313 struct drbg_string *curr = NULL;314 struct drbg_string data;315 short cnt = 0;316 317 drbg_string_fill(&data, out, drbg_blocklen(drbg));318 319 /* 10.4.3 step 2 / 4 */320 drbg_kcapi_symsetkey(drbg, key);321 list_for_each_entry(curr, in, list) {322 const unsigned char *pos = curr->buf;323 size_t len = curr->len;324 /* 10.4.3 step 4.1 */325 while (len) {326 /* 10.4.3 step 4.2 */327 if (drbg_blocklen(drbg) == cnt) {328 cnt = 0;329 ret = drbg_kcapi_sym(drbg, out, &data);330 if (ret)331 return ret;332 }333 out[cnt] ^= *pos;334 pos++;335 cnt++;336 len--;337 }338 }339 /* 10.4.3 step 4.2 for last block */340 if (cnt)341 ret = drbg_kcapi_sym(drbg, out, &data);342 343 return ret;344}345 346/*347 * scratchpad usage: drbg_ctr_update is interlinked with drbg_ctr_df348 * (and drbg_ctr_bcc, but this function does not need any temporary buffers),349 * the scratchpad is used as follows:350 * drbg_ctr_update:351 * temp352 * start: drbg->scratchpad353 * length: drbg_statelen(drbg) + drbg_blocklen(drbg)354 * note: the cipher writing into this variable works355 * blocklen-wise. Now, when the statelen is not a multiple356 * of blocklen, the generateion loop below "spills over"357 * by at most blocklen. Thus, we need to give sufficient358 * memory.359 * df_data360 * start: drbg->scratchpad +361 * drbg_statelen(drbg) + drbg_blocklen(drbg)362 * length: drbg_statelen(drbg)363 *364 * drbg_ctr_df:365 * pad366 * start: df_data + drbg_statelen(drbg)367 * length: drbg_blocklen(drbg)368 * iv369 * start: pad + drbg_blocklen(drbg)370 * length: drbg_blocklen(drbg)371 * temp372 * start: iv + drbg_blocklen(drbg)373 * length: drbg_satelen(drbg) + drbg_blocklen(drbg)374 * note: temp is the buffer that the BCC function operates375 * on. BCC operates blockwise. drbg_statelen(drbg)376 * is sufficient when the DRBG state length is a multiple377 * of the block size. For AES192 (and maybe other ciphers)378 * this is not correct and the length for temp is379 * insufficient (yes, that also means for such ciphers,380 * the final output of all BCC rounds are truncated).381 * Therefore, add drbg_blocklen(drbg) to cover all382 * possibilities.383 */384 385/* Derivation Function for CTR DRBG as defined in 10.4.2 */386static int drbg_ctr_df(struct drbg_state *drbg,387 unsigned char *df_data, size_t bytes_to_return,388 struct list_head *seedlist)389{390 int ret = -EFAULT;391 unsigned char L_N[8];392 /* S3 is input */393 struct drbg_string S1, S2, S4, cipherin;394 LIST_HEAD(bcc_list);395 unsigned char *pad = df_data + drbg_statelen(drbg);396 unsigned char *iv = pad + drbg_blocklen(drbg);397 unsigned char *temp = iv + drbg_blocklen(drbg);398 size_t padlen = 0;399 unsigned int templen = 0;400 /* 10.4.2 step 7 */401 unsigned int i = 0;402 /* 10.4.2 step 8 */403 const unsigned char *K = (unsigned char *)404 "\x00\x01\x02\x03\x04\x05\x06\x07"405 "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"406 "\x10\x11\x12\x13\x14\x15\x16\x17"407 "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f";408 unsigned char *X;409 size_t generated_len = 0;410 size_t inputlen = 0;411 struct drbg_string *seed = NULL;412 413 memset(pad, 0, drbg_blocklen(drbg));414 memset(iv, 0, drbg_blocklen(drbg));415 416 /* 10.4.2 step 1 is implicit as we work byte-wise */417 418 /* 10.4.2 step 2 */419 if ((512/8) < bytes_to_return)420 return -EINVAL;421 422 /* 10.4.2 step 2 -- calculate the entire length of all input data */423 list_for_each_entry(seed, seedlist, list)424 inputlen += seed->len;425 drbg_cpu_to_be32(inputlen, &L_N[0]);426 427 /* 10.4.2 step 3 */428 drbg_cpu_to_be32(bytes_to_return, &L_N[4]);429 430 /* 10.4.2 step 5: length is L_N, input_string, one byte, padding */431 padlen = (inputlen + sizeof(L_N) + 1) % (drbg_blocklen(drbg));432 /* wrap the padlen appropriately */433 if (padlen)434 padlen = drbg_blocklen(drbg) - padlen;435 /*436 * pad / padlen contains the 0x80 byte and the following zero bytes.437 * As the calculated padlen value only covers the number of zero438 * bytes, this value has to be incremented by one for the 0x80 byte.439 */440 padlen++;441 pad[0] = 0x80;442 443 /* 10.4.2 step 4 -- first fill the linked list and then order it */444 drbg_string_fill(&S1, iv, drbg_blocklen(drbg));445 list_add_tail(&S1.list, &bcc_list);446 drbg_string_fill(&S2, L_N, sizeof(L_N));447 list_add_tail(&S2.list, &bcc_list);448 list_splice_tail(seedlist, &bcc_list);449 drbg_string_fill(&S4, pad, padlen);450 list_add_tail(&S4.list, &bcc_list);451 452 /* 10.4.2 step 9 */453 while (templen < (drbg_keylen(drbg) + (drbg_blocklen(drbg)))) {454 /*455 * 10.4.2 step 9.1 - the padding is implicit as the buffer456 * holds zeros after allocation -- even the increment of i457 * is irrelevant as the increment remains within length of i458 */459 drbg_cpu_to_be32(i, iv);460 /* 10.4.2 step 9.2 -- BCC and concatenation with temp */461 ret = drbg_ctr_bcc(drbg, temp + templen, K, &bcc_list);462 if (ret)463 goto out;464 /* 10.4.2 step 9.3 */465 i++;466 templen += drbg_blocklen(drbg);467 }468 469 /* 10.4.2 step 11 */470 X = temp + (drbg_keylen(drbg));471 drbg_string_fill(&cipherin, X, drbg_blocklen(drbg));472 473 /* 10.4.2 step 12: overwriting of outval is implemented in next step */474 475 /* 10.4.2 step 13 */476 drbg_kcapi_symsetkey(drbg, temp);477 while (generated_len < bytes_to_return) {478 short blocklen = 0;479 /*480 * 10.4.2 step 13.1: the truncation of the key length is481 * implicit as the key is only drbg_blocklen in size based on482 * the implementation of the cipher function callback483 */484 ret = drbg_kcapi_sym(drbg, X, &cipherin);485 if (ret)486 goto out;487 blocklen = (drbg_blocklen(drbg) <488 (bytes_to_return - generated_len)) ?489 drbg_blocklen(drbg) :490 (bytes_to_return - generated_len);491 /* 10.4.2 step 13.2 and 14 */492 memcpy(df_data + generated_len, X, blocklen);493 generated_len += blocklen;494 }495 496 ret = 0;497 498out:499 memset(iv, 0, drbg_blocklen(drbg));500 memset(temp, 0, drbg_statelen(drbg) + drbg_blocklen(drbg));501 memset(pad, 0, drbg_blocklen(drbg));502 return ret;503}504 505/*506 * update function of CTR DRBG as defined in 10.2.1.2507 *508 * The reseed variable has an enhanced meaning compared to the update509 * functions of the other DRBGs as follows:510 * 0 => initial seed from initialization511 * 1 => reseed via drbg_seed512 * 2 => first invocation from drbg_ctr_update when addtl is present. In513 * this case, the df_data scratchpad is not deleted so that it is514 * available for another calls to prevent calling the DF function515 * again.516 * 3 => second invocation from drbg_ctr_update. When the update function517 * was called with addtl, the df_data memory already contains the518 * DFed addtl information and we do not need to call DF again.519 */520static int drbg_ctr_update(struct drbg_state *drbg, struct list_head *seed,521 int reseed)522{523 int ret = -EFAULT;524 /* 10.2.1.2 step 1 */525 unsigned char *temp = drbg->scratchpad;526 unsigned char *df_data = drbg->scratchpad + drbg_statelen(drbg) +527 drbg_blocklen(drbg);528 529 if (3 > reseed)530 memset(df_data, 0, drbg_statelen(drbg));531 532 if (!reseed) {533 /*534 * The DRBG uses the CTR mode of the underlying AES cipher. The535 * CTR mode increments the counter value after the AES operation536 * but SP800-90A requires that the counter is incremented before537 * the AES operation. Hence, we increment it at the time we set538 * it by one.539 */540 crypto_inc(drbg->V, drbg_blocklen(drbg));541 542 ret = crypto_skcipher_setkey(drbg->ctr_handle, drbg->C,543 drbg_keylen(drbg));544 if (ret)545 goto out;546 }547 548 /* 10.2.1.3.2 step 2 and 10.2.1.4.2 step 2 */549 if (seed) {550 ret = drbg_ctr_df(drbg, df_data, drbg_statelen(drbg), seed);551 if (ret)552 goto out;553 }554 555 ret = drbg_kcapi_sym_ctr(drbg, df_data, drbg_statelen(drbg),556 temp, drbg_statelen(drbg));557 if (ret)558 return ret;559 560 /* 10.2.1.2 step 5 */561 ret = crypto_skcipher_setkey(drbg->ctr_handle, temp,562 drbg_keylen(drbg));563 if (ret)564 goto out;565 /* 10.2.1.2 step 6 */566 memcpy(drbg->V, temp + drbg_keylen(drbg), drbg_blocklen(drbg));567 /* See above: increment counter by one to compensate timing of CTR op */568 crypto_inc(drbg->V, drbg_blocklen(drbg));569 ret = 0;570 571out:572 memset(temp, 0, drbg_statelen(drbg) + drbg_blocklen(drbg));573 if (2 != reseed)574 memset(df_data, 0, drbg_statelen(drbg));575 return ret;576}577 578/*579 * scratchpad use: drbg_ctr_update is called independently from580 * drbg_ctr_extract_bytes. Therefore, the scratchpad is reused581 */582/* Generate function of CTR DRBG as defined in 10.2.1.5.2 */583static int drbg_ctr_generate(struct drbg_state *drbg,584 unsigned char *buf, unsigned int buflen,585 struct list_head *addtl)586{587 int ret;588 int len = min_t(int, buflen, INT_MAX);589 590 /* 10.2.1.5.2 step 2 */591 if (addtl && !list_empty(addtl)) {592 ret = drbg_ctr_update(drbg, addtl, 2);593 if (ret)594 return 0;595 }596 597 /* 10.2.1.5.2 step 4.1 */598 ret = drbg_kcapi_sym_ctr(drbg, NULL, 0, buf, len);599 if (ret)600 return ret;601 602 /* 10.2.1.5.2 step 6 */603 ret = drbg_ctr_update(drbg, NULL, 3);604 if (ret)605 len = ret;606 607 return len;608}609 610static const struct drbg_state_ops drbg_ctr_ops = {611 .update = drbg_ctr_update,612 .generate = drbg_ctr_generate,613 .crypto_init = drbg_init_sym_kernel,614 .crypto_fini = drbg_fini_sym_kernel,615};616#endif /* CONFIG_CRYPTO_DRBG_CTR */617 618/******************************************************************619 * HMAC DRBG callback functions620 ******************************************************************/621 622#if defined(CONFIG_CRYPTO_DRBG_HASH) || defined(CONFIG_CRYPTO_DRBG_HMAC)623static int drbg_kcapi_hash(struct drbg_state *drbg, unsigned char *outval,624 const struct list_head *in);625static void drbg_kcapi_hmacsetkey(struct drbg_state *drbg,626 const unsigned char *key);627static int drbg_init_hash_kernel(struct drbg_state *drbg);628static int drbg_fini_hash_kernel(struct drbg_state *drbg);629#endif /* (CONFIG_CRYPTO_DRBG_HASH || CONFIG_CRYPTO_DRBG_HMAC) */630 631#ifdef CONFIG_CRYPTO_DRBG_HMAC632#define CRYPTO_DRBG_HMAC_STRING "HMAC "633MODULE_ALIAS_CRYPTO("drbg_pr_hmac_sha512");634MODULE_ALIAS_CRYPTO("drbg_nopr_hmac_sha512");635MODULE_ALIAS_CRYPTO("drbg_pr_hmac_sha384");636MODULE_ALIAS_CRYPTO("drbg_nopr_hmac_sha384");637MODULE_ALIAS_CRYPTO("drbg_pr_hmac_sha256");638MODULE_ALIAS_CRYPTO("drbg_nopr_hmac_sha256");639 640/* update function of HMAC DRBG as defined in 10.1.2.2 */641static int drbg_hmac_update(struct drbg_state *drbg, struct list_head *seed,642 int reseed)643{644 int ret = -EFAULT;645 int i = 0;646 struct drbg_string seed1, seed2, vdata;647 LIST_HEAD(seedlist);648 LIST_HEAD(vdatalist);649 650 if (!reseed) {651 /* 10.1.2.3 step 2 -- memset(0) of C is implicit with kzalloc */652 memset(drbg->V, 1, drbg_statelen(drbg));653 drbg_kcapi_hmacsetkey(drbg, drbg->C);654 }655 656 drbg_string_fill(&seed1, drbg->V, drbg_statelen(drbg));657 list_add_tail(&seed1.list, &seedlist);658 /* buffer of seed2 will be filled in for loop below with one byte */659 drbg_string_fill(&seed2, NULL, 1);660 list_add_tail(&seed2.list, &seedlist);661 /* input data of seed is allowed to be NULL at this point */662 if (seed)663 list_splice_tail(seed, &seedlist);664 665 drbg_string_fill(&vdata, drbg->V, drbg_statelen(drbg));666 list_add_tail(&vdata.list, &vdatalist);667 for (i = 2; 0 < i; i--) {668 /* first round uses 0x0, second 0x1 */669 unsigned char prefix = DRBG_PREFIX0;670 if (1 == i)671 prefix = DRBG_PREFIX1;672 /* 10.1.2.2 step 1 and 4 -- concatenation and HMAC for key */673 seed2.buf = &prefix;674 ret = drbg_kcapi_hash(drbg, drbg->C, &seedlist);675 if (ret)676 return ret;677 drbg_kcapi_hmacsetkey(drbg, drbg->C);678 679 /* 10.1.2.2 step 2 and 5 -- HMAC for V */680 ret = drbg_kcapi_hash(drbg, drbg->V, &vdatalist);681 if (ret)682 return ret;683 684 /* 10.1.2.2 step 3 */685 if (!seed)686 return ret;687 }688 689 return 0;690}691 692/* generate function of HMAC DRBG as defined in 10.1.2.5 */693static int drbg_hmac_generate(struct drbg_state *drbg,694 unsigned char *buf,695 unsigned int buflen,696 struct list_head *addtl)697{698 int len = 0;699 int ret = 0;700 struct drbg_string data;701 LIST_HEAD(datalist);702 703 /* 10.1.2.5 step 2 */704 if (addtl && !list_empty(addtl)) {705 ret = drbg_hmac_update(drbg, addtl, 1);706 if (ret)707 return ret;708 }709 710 drbg_string_fill(&data, drbg->V, drbg_statelen(drbg));711 list_add_tail(&data.list, &datalist);712 while (len < buflen) {713 unsigned int outlen = 0;714 /* 10.1.2.5 step 4.1 */715 ret = drbg_kcapi_hash(drbg, drbg->V, &datalist);716 if (ret)717 return ret;718 outlen = (drbg_blocklen(drbg) < (buflen - len)) ?719 drbg_blocklen(drbg) : (buflen - len);720 721 /* 10.1.2.5 step 4.2 */722 memcpy(buf + len, drbg->V, outlen);723 len += outlen;724 }725 726 /* 10.1.2.5 step 6 */727 if (addtl && !list_empty(addtl))728 ret = drbg_hmac_update(drbg, addtl, 1);729 else730 ret = drbg_hmac_update(drbg, NULL, 1);731 if (ret)732 return ret;733 734 return len;735}736 737static const struct drbg_state_ops drbg_hmac_ops = {738 .update = drbg_hmac_update,739 .generate = drbg_hmac_generate,740 .crypto_init = drbg_init_hash_kernel,741 .crypto_fini = drbg_fini_hash_kernel,742};743#endif /* CONFIG_CRYPTO_DRBG_HMAC */744 745/******************************************************************746 * Hash DRBG callback functions747 ******************************************************************/748 749#ifdef CONFIG_CRYPTO_DRBG_HASH750#define CRYPTO_DRBG_HASH_STRING "HASH "751MODULE_ALIAS_CRYPTO("drbg_pr_sha512");752MODULE_ALIAS_CRYPTO("drbg_nopr_sha512");753MODULE_ALIAS_CRYPTO("drbg_pr_sha384");754MODULE_ALIAS_CRYPTO("drbg_nopr_sha384");755MODULE_ALIAS_CRYPTO("drbg_pr_sha256");756MODULE_ALIAS_CRYPTO("drbg_nopr_sha256");757 758/*759 * Increment buffer760 *761 * @dst buffer to increment762 * @add value to add763 */764static inline void drbg_add_buf(unsigned char *dst, size_t dstlen,765 const unsigned char *add, size_t addlen)766{767 /* implied: dstlen > addlen */768 unsigned char *dstptr;769 const unsigned char *addptr;770 unsigned int remainder = 0;771 size_t len = addlen;772 773 dstptr = dst + (dstlen-1);774 addptr = add + (addlen-1);775 while (len) {776 remainder += *dstptr + *addptr;777 *dstptr = remainder & 0xff;778 remainder >>= 8;779 len--; dstptr--; addptr--;780 }781 len = dstlen - addlen;782 while (len && remainder > 0) {783 remainder = *dstptr + 1;784 *dstptr = remainder & 0xff;785 remainder >>= 8;786 len--; dstptr--;787 }788}789 790/*791 * scratchpad usage: as drbg_hash_update and drbg_hash_df are used792 * interlinked, the scratchpad is used as follows:793 * drbg_hash_update794 * start: drbg->scratchpad795 * length: drbg_statelen(drbg)796 * drbg_hash_df:797 * start: drbg->scratchpad + drbg_statelen(drbg)798 * length: drbg_blocklen(drbg)799 *800 * drbg_hash_process_addtl uses the scratchpad, but fully completes801 * before either of the functions mentioned before are invoked. Therefore,802 * drbg_hash_process_addtl does not need to be specifically considered.803 */804 805/* Derivation Function for Hash DRBG as defined in 10.4.1 */806static int drbg_hash_df(struct drbg_state *drbg,807 unsigned char *outval, size_t outlen,808 struct list_head *entropylist)809{810 int ret = 0;811 size_t len = 0;812 unsigned char input[5];813 unsigned char *tmp = drbg->scratchpad + drbg_statelen(drbg);814 struct drbg_string data;815 816 /* 10.4.1 step 3 */817 input[0] = 1;818 drbg_cpu_to_be32((outlen * 8), &input[1]);819 820 /* 10.4.1 step 4.1 -- concatenation of data for input into hash */821 drbg_string_fill(&data, input, 5);822 list_add(&data.list, entropylist);823 824 /* 10.4.1 step 4 */825 while (len < outlen) {826 short blocklen = 0;827 /* 10.4.1 step 4.1 */828 ret = drbg_kcapi_hash(drbg, tmp, entropylist);829 if (ret)830 goto out;831 /* 10.4.1 step 4.2 */832 input[0]++;833 blocklen = (drbg_blocklen(drbg) < (outlen - len)) ?834 drbg_blocklen(drbg) : (outlen - len);835 memcpy(outval + len, tmp, blocklen);836 len += blocklen;837 }838 839out:840 memset(tmp, 0, drbg_blocklen(drbg));841 return ret;842}843 844/* update function for Hash DRBG as defined in 10.1.1.2 / 10.1.1.3 */845static int drbg_hash_update(struct drbg_state *drbg, struct list_head *seed,846 int reseed)847{848 int ret = 0;849 struct drbg_string data1, data2;850 LIST_HEAD(datalist);851 LIST_HEAD(datalist2);852 unsigned char *V = drbg->scratchpad;853 unsigned char prefix = DRBG_PREFIX1;854 855 if (!seed)856 return -EINVAL;857 858 if (reseed) {859 /* 10.1.1.3 step 1 */860 memcpy(V, drbg->V, drbg_statelen(drbg));861 drbg_string_fill(&data1, &prefix, 1);862 list_add_tail(&data1.list, &datalist);863 drbg_string_fill(&data2, V, drbg_statelen(drbg));864 list_add_tail(&data2.list, &datalist);865 }866 list_splice_tail(seed, &datalist);867 868 /* 10.1.1.2 / 10.1.1.3 step 2 and 3 */869 ret = drbg_hash_df(drbg, drbg->V, drbg_statelen(drbg), &datalist);870 if (ret)871 goto out;872 873 /* 10.1.1.2 / 10.1.1.3 step 4 */874 prefix = DRBG_PREFIX0;875 drbg_string_fill(&data1, &prefix, 1);876 list_add_tail(&data1.list, &datalist2);877 drbg_string_fill(&data2, drbg->V, drbg_statelen(drbg));878 list_add_tail(&data2.list, &datalist2);879 /* 10.1.1.2 / 10.1.1.3 step 4 */880 ret = drbg_hash_df(drbg, drbg->C, drbg_statelen(drbg), &datalist2);881 882out:883 memset(drbg->scratchpad, 0, drbg_statelen(drbg));884 return ret;885}886 887/* processing of additional information string for Hash DRBG */888static int drbg_hash_process_addtl(struct drbg_state *drbg,889 struct list_head *addtl)890{891 int ret = 0;892 struct drbg_string data1, data2;893 LIST_HEAD(datalist);894 unsigned char prefix = DRBG_PREFIX2;895 896 /* 10.1.1.4 step 2 */897 if (!addtl || list_empty(addtl))898 return 0;899 900 /* 10.1.1.4 step 2a */901 drbg_string_fill(&data1, &prefix, 1);902 drbg_string_fill(&data2, drbg->V, drbg_statelen(drbg));903 list_add_tail(&data1.list, &datalist);904 list_add_tail(&data2.list, &datalist);905 list_splice_tail(addtl, &datalist);906 ret = drbg_kcapi_hash(drbg, drbg->scratchpad, &datalist);907 if (ret)908 goto out;909 910 /* 10.1.1.4 step 2b */911 drbg_add_buf(drbg->V, drbg_statelen(drbg),912 drbg->scratchpad, drbg_blocklen(drbg));913 914out:915 memset(drbg->scratchpad, 0, drbg_blocklen(drbg));916 return ret;917}918 919/* Hashgen defined in 10.1.1.4 */920static int drbg_hash_hashgen(struct drbg_state *drbg,921 unsigned char *buf,922 unsigned int buflen)923{924 int len = 0;925 int ret = 0;926 unsigned char *src = drbg->scratchpad;927 unsigned char *dst = drbg->scratchpad + drbg_statelen(drbg);928 struct drbg_string data;929 LIST_HEAD(datalist);930 931 /* 10.1.1.4 step hashgen 2 */932 memcpy(src, drbg->V, drbg_statelen(drbg));933 934 drbg_string_fill(&data, src, drbg_statelen(drbg));935 list_add_tail(&data.list, &datalist);936 while (len < buflen) {937 unsigned int outlen = 0;938 /* 10.1.1.4 step hashgen 4.1 */939 ret = drbg_kcapi_hash(drbg, dst, &datalist);940 if (ret) {941 len = ret;942 goto out;943 }944 outlen = (drbg_blocklen(drbg) < (buflen - len)) ?945 drbg_blocklen(drbg) : (buflen - len);946 /* 10.1.1.4 step hashgen 4.2 */947 memcpy(buf + len, dst, outlen);948 len += outlen;949 /* 10.1.1.4 hashgen step 4.3 */950 if (len < buflen)951 crypto_inc(src, drbg_statelen(drbg));952 }953 954out:955 memset(drbg->scratchpad, 0,956 (drbg_statelen(drbg) + drbg_blocklen(drbg)));957 return len;958}959 960/* generate function for Hash DRBG as defined in 10.1.1.4 */961static int drbg_hash_generate(struct drbg_state *drbg,962 unsigned char *buf, unsigned int buflen,963 struct list_head *addtl)964{965 int len = 0;966 int ret = 0;967 union {968 unsigned char req[8];969 __be64 req_int;970 } u;971 unsigned char prefix = DRBG_PREFIX3;972 struct drbg_string data1, data2;973 LIST_HEAD(datalist);974 975 /* 10.1.1.4 step 2 */976 ret = drbg_hash_process_addtl(drbg, addtl);977 if (ret)978 return ret;979 /* 10.1.1.4 step 3 */980 len = drbg_hash_hashgen(drbg, buf, buflen);981 982 /* this is the value H as documented in 10.1.1.4 */983 /* 10.1.1.4 step 4 */984 drbg_string_fill(&data1, &prefix, 1);985 list_add_tail(&data1.list, &datalist);986 drbg_string_fill(&data2, drbg->V, drbg_statelen(drbg));987 list_add_tail(&data2.list, &datalist);988 ret = drbg_kcapi_hash(drbg, drbg->scratchpad, &datalist);989 if (ret) {990 len = ret;991 goto out;992 }993 994 /* 10.1.1.4 step 5 */995 drbg_add_buf(drbg->V, drbg_statelen(drbg),996 drbg->scratchpad, drbg_blocklen(drbg));997 drbg_add_buf(drbg->V, drbg_statelen(drbg),998 drbg->C, drbg_statelen(drbg));999 u.req_int = cpu_to_be64(drbg->reseed_ctr);1000 drbg_add_buf(drbg->V, drbg_statelen(drbg), u.req, 8);1001 1002out:1003 memset(drbg->scratchpad, 0, drbg_blocklen(drbg));1004 return len;1005}1006 1007/*1008 * scratchpad usage: as update and generate are used isolated, both1009 * can use the scratchpad1010 */1011static const struct drbg_state_ops drbg_hash_ops = {1012 .update = drbg_hash_update,1013 .generate = drbg_hash_generate,1014 .crypto_init = drbg_init_hash_kernel,1015 .crypto_fini = drbg_fini_hash_kernel,1016};1017#endif /* CONFIG_CRYPTO_DRBG_HASH */1018 1019/******************************************************************1020 * Functions common for DRBG implementations1021 ******************************************************************/1022 1023static inline int __drbg_seed(struct drbg_state *drbg, struct list_head *seed,1024 int reseed, enum drbg_seed_state new_seed_state)1025{1026 int ret = drbg->d_ops->update(drbg, seed, reseed);1027 1028 if (ret)1029 return ret;1030 1031 drbg->seeded = new_seed_state;1032 drbg->last_seed_time = jiffies;1033 /* 10.1.1.2 / 10.1.1.3 step 5 */1034 drbg->reseed_ctr = 1;1035 1036 switch (drbg->seeded) {1037 case DRBG_SEED_STATE_UNSEEDED:1038 /* Impossible, but handle it to silence compiler warnings. */1039 fallthrough;1040 case DRBG_SEED_STATE_PARTIAL:1041 /*1042 * Require frequent reseeds until the seed source is1043 * fully initialized.1044 */1045 drbg->reseed_threshold = 50;1046 break;1047 1048 case DRBG_SEED_STATE_FULL:1049 /*1050 * Seed source has become fully initialized, frequent1051 * reseeds no longer required.1052 */1053 drbg->reseed_threshold = drbg_max_requests(drbg);1054 break;1055 }1056 1057 return ret;1058}1059 1060static inline int drbg_get_random_bytes(struct drbg_state *drbg,1061 unsigned char *entropy,1062 unsigned int entropylen)1063{1064 int ret;1065 1066 do {1067 get_random_bytes(entropy, entropylen);1068 ret = drbg_fips_continuous_test(drbg, entropy);1069 if (ret && ret != -EAGAIN)1070 return ret;1071 } while (ret);1072 1073 return 0;1074}1075 1076static int drbg_seed_from_random(struct drbg_state *drbg)1077{1078 struct drbg_string data;1079 LIST_HEAD(seedlist);1080 unsigned int entropylen = drbg_sec_strength(drbg->core->flags);1081 unsigned char entropy[32];1082 int ret;1083 1084 BUG_ON(!entropylen);1085 BUG_ON(entropylen > sizeof(entropy));1086 1087 drbg_string_fill(&data, entropy, entropylen);1088 list_add_tail(&data.list, &seedlist);1089 1090 ret = drbg_get_random_bytes(drbg, entropy, entropylen);1091 if (ret)1092 goto out;1093 1094 ret = __drbg_seed(drbg, &seedlist, true, DRBG_SEED_STATE_FULL);1095 1096out:1097 memzero_explicit(entropy, entropylen);1098 return ret;1099}1100 1101static bool drbg_nopr_reseed_interval_elapsed(struct drbg_state *drbg)1102{1103 unsigned long next_reseed;1104 1105 /* Don't ever reseed from get_random_bytes() in test mode. */1106 if (list_empty(&drbg->test_data.list))1107 return false;1108 1109 /*1110 * Obtain fresh entropy for the nopr DRBGs after 300s have1111 * elapsed in order to still achieve sort of partial1112 * prediction resistance over the time domain at least. Note1113 * that the period of 300s has been chosen to match the1114 * CRNG_RESEED_INTERVAL of the get_random_bytes()' chacha1115 * rngs.1116 */1117 next_reseed = drbg->last_seed_time + 300 * HZ;1118 return time_after(jiffies, next_reseed);1119}1120 1121/*1122 * Seeding or reseeding of the DRBG1123 *1124 * @drbg: DRBG state struct1125 * @pers: personalization / additional information buffer1126 * @reseed: 0 for initial seed process, 1 for reseeding1127 *1128 * return:1129 * 0 on success1130 * error value otherwise1131 */1132static int drbg_seed(struct drbg_state *drbg, struct drbg_string *pers,1133 bool reseed)1134{1135 int ret;1136 unsigned char entropy[((32 + 16) * 2)];1137 unsigned int entropylen = drbg_sec_strength(drbg->core->flags);1138 struct drbg_string data1;1139 LIST_HEAD(seedlist);1140 enum drbg_seed_state new_seed_state = DRBG_SEED_STATE_FULL;1141 1142 /* 9.1 / 9.2 / 9.3.1 step 3 */1143 if (pers && pers->len > (drbg_max_addtl(drbg))) {1144 pr_devel("DRBG: personalization string too long %zu\n",1145 pers->len);1146 return -EINVAL;1147 }1148 1149 if (list_empty(&drbg->test_data.list)) {1150 drbg_string_fill(&data1, drbg->test_data.buf,1151 drbg->test_data.len);1152 pr_devel("DRBG: using test entropy\n");1153 } else {1154 /*1155 * Gather entropy equal to the security strength of the DRBG.1156 * With a derivation function, a nonce is required in addition1157 * to the entropy. A nonce must be at least 1/2 of the security1158 * strength of the DRBG in size. Thus, entropy + nonce is 3/21159 * of the strength. The consideration of a nonce is only1160 * applicable during initial seeding.1161 */1162 BUG_ON(!entropylen);1163 if (!reseed)1164 entropylen = ((entropylen + 1) / 2) * 3;1165 BUG_ON((entropylen * 2) > sizeof(entropy));1166 1167 /* Get seed from in-kernel /dev/urandom */1168 if (!rng_is_initialized())1169 new_seed_state = DRBG_SEED_STATE_PARTIAL;1170 1171 ret = drbg_get_random_bytes(drbg, entropy, entropylen);1172 if (ret)1173 goto out;1174 1175 if (!drbg->jent) {1176 drbg_string_fill(&data1, entropy, entropylen);1177 pr_devel("DRBG: (re)seeding with %u bytes of entropy\n",1178 entropylen);1179 } else {1180 /*1181 * Get seed from Jitter RNG, failures are1182 * fatal only in FIPS mode.1183 */1184 ret = crypto_rng_get_bytes(drbg->jent,1185 entropy + entropylen,1186 entropylen);1187 if (fips_enabled && ret) {1188 pr_devel("DRBG: jent failed with %d\n", ret);1189 1190 /*1191 * Do not treat the transient failure of the1192 * Jitter RNG as an error that needs to be1193 * reported. The combined number of the1194 * maximum reseed threshold times the maximum1195 * number of Jitter RNG transient errors is1196 * less than the reseed threshold required by1197 * SP800-90A allowing us to treat the1198 * transient errors as such.1199 *1200 * However, we mandate that at least the first1201 * seeding operation must succeed with the1202 * Jitter RNG.1203 */1204 if (!reseed || ret != -EAGAIN)1205 goto out;1206 }1207 1208 drbg_string_fill(&data1, entropy, entropylen * 2);1209 pr_devel("DRBG: (re)seeding with %u bytes of entropy\n",1210 entropylen * 2);1211 }1212 }1213 list_add_tail(&data1.list, &seedlist);1214 1215 /*1216 * concatenation of entropy with personalization str / addtl input)1217 * the variable pers is directly handed in by the caller, so check its1218 * contents whether it is appropriate1219 */1220 if (pers && pers->buf && 0 < pers->len) {1221 list_add_tail(&pers->list, &seedlist);1222 pr_devel("DRBG: using personalization string\n");1223 }1224 1225 if (!reseed) {1226 memset(drbg->V, 0, drbg_statelen(drbg));1227 memset(drbg->C, 0, drbg_statelen(drbg));1228 }1229 1230 ret = __drbg_seed(drbg, &seedlist, reseed, new_seed_state);1231 1232out:1233 memzero_explicit(entropy, entropylen * 2);1234 1235 return ret;1236}1237 1238/* Free all substructures in a DRBG state without the DRBG state structure */1239static inline void drbg_dealloc_state(struct drbg_state *drbg)1240{1241 if (!drbg)1242 return;1243 kfree_sensitive(drbg->Vbuf);1244 drbg->Vbuf = NULL;1245 drbg->V = NULL;1246 kfree_sensitive(drbg->Cbuf);1247 drbg->Cbuf = NULL;1248 drbg->C = NULL;1249 kfree_sensitive(drbg->scratchpadbuf);1250 drbg->scratchpadbuf = NULL;1251 drbg->reseed_ctr = 0;1252 drbg->d_ops = NULL;1253 drbg->core = NULL;1254 if (IS_ENABLED(CONFIG_CRYPTO_FIPS)) {1255 kfree_sensitive(drbg->prev);1256 drbg->prev = NULL;1257 drbg->fips_primed = false;1258 }1259}1260 1261/*1262 * Allocate all sub-structures for a DRBG state.1263 * The DRBG state structure must already be allocated.1264 */1265static inline int drbg_alloc_state(struct drbg_state *drbg)1266{1267 int ret = -ENOMEM;1268 unsigned int sb_size = 0;1269 1270 switch (drbg->core->flags & DRBG_TYPE_MASK) {1271#ifdef CONFIG_CRYPTO_DRBG_HMAC1272 case DRBG_HMAC:1273 drbg->d_ops = &drbg_hmac_ops;1274 break;1275#endif /* CONFIG_CRYPTO_DRBG_HMAC */1276#ifdef CONFIG_CRYPTO_DRBG_HASH1277 case DRBG_HASH:1278 drbg->d_ops = &drbg_hash_ops;1279 break;1280#endif /* CONFIG_CRYPTO_DRBG_HASH */1281#ifdef CONFIG_CRYPTO_DRBG_CTR1282 case DRBG_CTR:1283 drbg->d_ops = &drbg_ctr_ops;1284 break;1285#endif /* CONFIG_CRYPTO_DRBG_CTR */1286 default:1287 ret = -EOPNOTSUPP;1288 goto err;1289 }1290 1291 ret = drbg->d_ops->crypto_init(drbg);1292 if (ret < 0)1293 goto err;1294 1295 drbg->Vbuf = kmalloc(drbg_statelen(drbg) + ret, GFP_KERNEL);1296 if (!drbg->Vbuf) {1297 ret = -ENOMEM;1298 goto fini;1299 }1300 drbg->V = PTR_ALIGN(drbg->Vbuf, ret + 1);1301 drbg->Cbuf = kmalloc(drbg_statelen(drbg) + ret, GFP_KERNEL);1302 if (!drbg->Cbuf) {1303 ret = -ENOMEM;1304 goto fini;1305 }1306 drbg->C = PTR_ALIGN(drbg->Cbuf, ret + 1);1307 /* scratchpad is only generated for CTR and Hash */1308 if (drbg->core->flags & DRBG_HMAC)1309 sb_size = 0;1310 else if (drbg->core->flags & DRBG_CTR)1311 sb_size = drbg_statelen(drbg) + drbg_blocklen(drbg) + /* temp */1312 drbg_statelen(drbg) + /* df_data */1313 drbg_blocklen(drbg) + /* pad */1314 drbg_blocklen(drbg) + /* iv */1315 drbg_statelen(drbg) + drbg_blocklen(drbg); /* temp */1316 else1317 sb_size = drbg_statelen(drbg) + drbg_blocklen(drbg);1318 1319 if (0 < sb_size) {1320 drbg->scratchpadbuf = kzalloc(sb_size + ret, GFP_KERNEL);1321 if (!drbg->scratchpadbuf) {1322 ret = -ENOMEM;1323 goto fini;1324 }1325 drbg->scratchpad = PTR_ALIGN(drbg->scratchpadbuf, ret + 1);1326 }1327 1328 if (IS_ENABLED(CONFIG_CRYPTO_FIPS)) {1329 drbg->prev = kzalloc(drbg_sec_strength(drbg->core->flags),1330 GFP_KERNEL);1331 if (!drbg->prev) {1332 ret = -ENOMEM;1333 goto fini;1334 }1335 drbg->fips_primed = false;1336 }1337 1338 return 0;1339 1340fini:1341 drbg->d_ops->crypto_fini(drbg);1342err:1343 drbg_dealloc_state(drbg);1344 return ret;1345}1346 1347/*************************************************************************1348 * DRBG interface functions1349 *************************************************************************/1350 1351/*1352 * DRBG generate function as required by SP800-90A - this function1353 * generates random numbers1354 *1355 * @drbg DRBG state handle1356 * @buf Buffer where to store the random numbers -- the buffer must already1357 * be pre-allocated by caller1358 * @buflen Length of output buffer - this value defines the number of random1359 * bytes pulled from DRBG1360 * @addtl Additional input that is mixed into state, may be NULL -- note1361 * the entropy is pulled by the DRBG internally unconditionally1362 * as defined in SP800-90A. The additional input is mixed into1363 * the state in addition to the pulled entropy.1364 *1365 * return: 0 when all bytes are generated; < 0 in case of an error1366 */1367static int drbg_generate(struct drbg_state *drbg,1368 unsigned char *buf, unsigned int buflen,1369 struct drbg_string *addtl)1370{1371 int len = 0;1372 LIST_HEAD(addtllist);1373 1374 if (!drbg->core) {1375 pr_devel("DRBG: not yet seeded\n");1376 return -EINVAL;1377 }1378 if (0 == buflen || !buf) {1379 pr_devel("DRBG: no output buffer provided\n");1380 return -EINVAL;1381 }1382 if (addtl && NULL == addtl->buf && 0 < addtl->len) {1383 pr_devel("DRBG: wrong format of additional information\n");1384 return -EINVAL;1385 }1386 1387 /* 9.3.1 step 2 */1388 len = -EINVAL;1389 if (buflen > (drbg_max_request_bytes(drbg))) {1390 pr_devel("DRBG: requested random numbers too large %u\n",1391 buflen);1392 goto err;1393 }1394 1395 /* 9.3.1 step 3 is implicit with the chosen DRBG */1396 1397 /* 9.3.1 step 4 */1398 if (addtl && addtl->len > (drbg_max_addtl(drbg))) {1399 pr_devel("DRBG: additional information string too long %zu\n",1400 addtl->len);1401 goto err;1402 }1403 /* 9.3.1 step 5 is implicit with the chosen DRBG */1404 1405 /*1406 * 9.3.1 step 6 and 9 supplemented by 9.3.2 step c is implemented1407 * here. The spec is a bit convoluted here, we make it simpler.1408 */1409 if (drbg->reseed_threshold < drbg->reseed_ctr)1410 drbg->seeded = DRBG_SEED_STATE_UNSEEDED;1411 1412 if (drbg->pr || drbg->seeded == DRBG_SEED_STATE_UNSEEDED) {1413 pr_devel("DRBG: reseeding before generation (prediction "1414 "resistance: %s, state %s)\n",1415 drbg->pr ? "true" : "false",1416 (drbg->seeded == DRBG_SEED_STATE_FULL ?1417 "seeded" : "unseeded"));1418 /* 9.3.1 steps 7.1 through 7.3 */1419 len = drbg_seed(drbg, addtl, true);1420 if (len)1421 goto err;1422 /* 9.3.1 step 7.4 */1423 addtl = NULL;1424 } else if (rng_is_initialized() &&1425 (drbg->seeded == DRBG_SEED_STATE_PARTIAL ||1426 drbg_nopr_reseed_interval_elapsed(drbg))) {1427 len = drbg_seed_from_random(drbg);1428 if (len)1429 goto err;1430 }1431 1432 if (addtl && 0 < addtl->len)1433 list_add_tail(&addtl->list, &addtllist);1434 /* 9.3.1 step 8 and 10 */1435 len = drbg->d_ops->generate(drbg, buf, buflen, &addtllist);1436 1437 /* 10.1.1.4 step 6, 10.1.2.5 step 7, 10.2.1.5.2 step 7 */1438 drbg->reseed_ctr++;1439 if (0 >= len)1440 goto err;1441 1442 /*1443 * Section 11.3.3 requires to re-perform self tests after some1444 * generated random numbers. The chosen value after which self1445 * test is performed is arbitrary, but it should be reasonable.1446 * However, we do not perform the self tests because of the following1447 * reasons: it is mathematically impossible that the initial self tests1448 * were successfully and the following are not. If the initial would1449 * pass and the following would not, the kernel integrity is violated.1450 * In this case, the entire kernel operation is questionable and it1451 * is unlikely that the integrity violation only affects the1452 * correct operation of the DRBG.1453 *1454 * Albeit the following code is commented out, it is provided in1455 * case somebody has a need to implement the test of 11.3.3.1456 */1457#if 01458 if (drbg->reseed_ctr && !(drbg->reseed_ctr % 4096)) {1459 int err = 0;1460 pr_devel("DRBG: start to perform self test\n");1461 if (drbg->core->flags & DRBG_HMAC)1462 err = alg_test("drbg_pr_hmac_sha512",1463 "drbg_pr_hmac_sha512", 0, 0);1464 else if (drbg->core->flags & DRBG_CTR)1465 err = alg_test("drbg_pr_ctr_aes256",1466 "drbg_pr_ctr_aes256", 0, 0);1467 else1468 err = alg_test("drbg_pr_sha256",1469 "drbg_pr_sha256", 0, 0);1470 if (err) {1471 pr_err("DRBG: periodical self test failed\n");1472 /*1473 * uninstantiate implies that from now on, only errors1474 * are returned when reusing this DRBG cipher handle1475 */1476 drbg_uninstantiate(drbg);1477 return 0;1478 } else {1479 pr_devel("DRBG: self test successful\n");1480 }1481 }1482#endif1483 1484 /*1485 * All operations were successful, return 0 as mandated by1486 * the kernel crypto API interface.1487 */1488 len = 0;1489err:1490 return len;1491}1492 1493/*1494 * Wrapper around drbg_generate which can pull arbitrary long strings1495 * from the DRBG without hitting the maximum request limitation.1496 *1497 * Parameters: see drbg_generate1498 * Return codes: see drbg_generate -- if one drbg_generate request fails,1499 * the entire drbg_generate_long request fails1500 */1501static int drbg_generate_long(struct drbg_state *drbg,1502 unsigned char *buf, unsigned int buflen,1503 struct drbg_string *addtl)1504{1505 unsigned int len = 0;1506 unsigned int slice = 0;1507 do {1508 int err = 0;1509 unsigned int chunk = 0;1510 slice = ((buflen - len) / drbg_max_request_bytes(drbg));1511 chunk = slice ? drbg_max_request_bytes(drbg) : (buflen - len);1512 mutex_lock(&drbg->drbg_mutex);1513 err = drbg_generate(drbg, buf + len, chunk, addtl);1514 mutex_unlock(&drbg->drbg_mutex);1515 if (0 > err)1516 return err;1517 len += chunk;1518 } while (slice > 0 && (len < buflen));1519 return 0;1520}1521 1522static int drbg_prepare_hrng(struct drbg_state *drbg)1523{1524 /* We do not need an HRNG in test mode. */1525 if (list_empty(&drbg->test_data.list))1526 return 0;1527 1528 drbg->jent = crypto_alloc_rng("jitterentropy_rng", 0, 0);1529 if (IS_ERR(drbg->jent)) {1530 const int err = PTR_ERR(drbg->jent);1531 1532 drbg->jent = NULL;1533 if (fips_enabled)1534 return err;1535 pr_info("DRBG: Continuing without Jitter RNG\n");1536 }1537 1538 return 0;1539}1540 1541/*1542 * DRBG instantiation function as required by SP800-90A - this function1543 * sets up the DRBG handle, performs the initial seeding and all sanity1544 * checks required by SP800-90A1545 *1546 * @drbg memory of state -- if NULL, new memory is allocated1547 * @pers Personalization string that is mixed into state, may be NULL -- note1548 * the entropy is pulled by the DRBG internally unconditionally1549 * as defined in SP800-90A. The additional input is mixed into1550 * the state in addition to the pulled entropy.1551 * @coreref reference to core1552 * @pr prediction resistance enabled1553 *1554 * return1555 * 0 on success1556 * error value otherwise1557 */1558static int drbg_instantiate(struct drbg_state *drbg, struct drbg_string *pers,1559 int coreref, bool pr)1560{1561 int ret;1562 bool reseed = true;1563 1564 pr_devel("DRBG: Initializing DRBG core %d with prediction resistance "1565 "%s\n", coreref, pr ? "enabled" : "disabled");1566 mutex_lock(&drbg->drbg_mutex);1567 1568 /* 9.1 step 1 is implicit with the selected DRBG type */1569 1570 /*1571 * 9.1 step 2 is implicit as caller can select prediction resistance1572 * and the flag is copied into drbg->flags --1573 * all DRBG types support prediction resistance1574 */1575 1576 /* 9.1 step 4 is implicit in drbg_sec_strength */1577 1578 if (!drbg->core) {1579 drbg->core = &drbg_cores[coreref];1580 drbg->pr = pr;1581 drbg->seeded = DRBG_SEED_STATE_UNSEEDED;1582 drbg->last_seed_time = 0;1583 drbg->reseed_threshold = drbg_max_requests(drbg);1584 1585 ret = drbg_alloc_state(drbg);1586 if (ret)1587 goto unlock;1588 1589 ret = drbg_prepare_hrng(drbg);1590 if (ret)1591 goto free_everything;1592 1593 reseed = false;1594 }1595 1596 ret = drbg_seed(drbg, pers, reseed);1597 1598 if (ret && !reseed)1599 goto free_everything;1600 1601 mutex_unlock(&drbg->drbg_mutex);1602 return ret;1603 1604unlock:1605 mutex_unlock(&drbg->drbg_mutex);1606 return ret;1607 1608free_everything:1609 mutex_unlock(&drbg->drbg_mutex);1610 drbg_uninstantiate(drbg);1611 return ret;1612}1613 1614/*1615 * DRBG uninstantiate function as required by SP800-90A - this function1616 * frees all buffers and the DRBG handle1617 *1618 * @drbg DRBG state handle1619 *1620 * return1621 * 0 on success1622 */1623static int drbg_uninstantiate(struct drbg_state *drbg)1624{1625 if (!IS_ERR_OR_NULL(drbg->jent))1626 crypto_free_rng(drbg->jent);1627 drbg->jent = NULL;1628 1629 if (drbg->d_ops)1630 drbg->d_ops->crypto_fini(drbg);1631 drbg_dealloc_state(drbg);1632 /* no scrubbing of test_data -- this shall survive an uninstantiate */1633 return 0;1634}1635 1636/*1637 * Helper function for setting the test data in the DRBG1638 *1639 * @drbg DRBG state handle1640 * @data test data1641 * @len test data length1642 */1643static void drbg_kcapi_set_entropy(struct crypto_rng *tfm,1644 const u8 *data, unsigned int len)1645{1646 struct drbg_state *drbg = crypto_rng_ctx(tfm);1647 1648 mutex_lock(&drbg->drbg_mutex);1649 drbg_string_fill(&drbg->test_data, data, len);1650 mutex_unlock(&drbg->drbg_mutex);1651}1652 1653/***************************************************************1654 * Kernel crypto API cipher invocations requested by DRBG1655 ***************************************************************/1656 1657#if defined(CONFIG_CRYPTO_DRBG_HASH) || defined(CONFIG_CRYPTO_DRBG_HMAC)1658struct sdesc {1659 struct shash_desc shash;1660 char ctx[];1661};1662 1663static int drbg_init_hash_kernel(struct drbg_state *drbg)1664{1665 struct sdesc *sdesc;1666 struct crypto_shash *tfm;1667 1668 tfm = crypto_alloc_shash(drbg->core->backend_cra_name, 0, 0);1669 if (IS_ERR(tfm)) {1670 pr_info("DRBG: could not allocate digest TFM handle: %s\n",1671 drbg->core->backend_cra_name);1672 return PTR_ERR(tfm);1673 }1674 BUG_ON(drbg_blocklen(drbg) != crypto_shash_digestsize(tfm));1675 sdesc = kzalloc(sizeof(struct shash_desc) + crypto_shash_descsize(tfm),1676 GFP_KERNEL);1677 if (!sdesc) {1678 crypto_free_shash(tfm);1679 return -ENOMEM;1680 }1681 1682 sdesc->shash.tfm = tfm;1683 drbg->priv_data = sdesc;1684 1685 return 0;1686}1687 1688static int drbg_fini_hash_kernel(struct drbg_state *drbg)1689{1690 struct sdesc *sdesc = drbg->priv_data;1691 if (sdesc) {1692 crypto_free_shash(sdesc->shash.tfm);1693 kfree_sensitive(sdesc);1694 }1695 drbg->priv_data = NULL;1696 return 0;1697}1698 1699static void drbg_kcapi_hmacsetkey(struct drbg_state *drbg,1700 const unsigned char *key)1701{1702 struct sdesc *sdesc = drbg->priv_data;1703 1704 crypto_shash_setkey(sdesc->shash.tfm, key, drbg_statelen(drbg));1705}1706 1707static int drbg_kcapi_hash(struct drbg_state *drbg, unsigned char *outval,1708 const struct list_head *in)1709{1710 struct sdesc *sdesc = drbg->priv_data;1711 struct drbg_string *input = NULL;1712 1713 crypto_shash_init(&sdesc->shash);1714 list_for_each_entry(input, in, list)1715 crypto_shash_update(&sdesc->shash, input->buf, input->len);1716 return crypto_shash_final(&sdesc->shash, outval);1717}1718#endif /* (CONFIG_CRYPTO_DRBG_HASH || CONFIG_CRYPTO_DRBG_HMAC) */1719 1720#ifdef CONFIG_CRYPTO_DRBG_CTR1721static int drbg_fini_sym_kernel(struct drbg_state *drbg)1722{1723 struct crypto_cipher *tfm =1724 (struct crypto_cipher *)drbg->priv_data;1725 if (tfm)1726 crypto_free_cipher(tfm);1727 drbg->priv_data = NULL;1728 1729 if (drbg->ctr_handle)1730 crypto_free_skcipher(drbg->ctr_handle);1731 drbg->ctr_handle = NULL;1732 1733 if (drbg->ctr_req)1734 skcipher_request_free(drbg->ctr_req);1735 drbg->ctr_req = NULL;1736 1737 kfree(drbg->outscratchpadbuf);1738 drbg->outscratchpadbuf = NULL;1739 1740 return 0;1741}1742 1743static int drbg_init_sym_kernel(struct drbg_state *drbg)1744{1745 struct crypto_cipher *tfm;1746 struct crypto_skcipher *sk_tfm;1747 struct skcipher_request *req;1748 unsigned int alignmask;1749 char ctr_name[CRYPTO_MAX_ALG_NAME];1750 1751 tfm = crypto_alloc_cipher(drbg->core->backend_cra_name, 0, 0);1752 if (IS_ERR(tfm)) {1753 pr_info("DRBG: could not allocate cipher TFM handle: %s\n",1754 drbg->core->backend_cra_name);1755 return PTR_ERR(tfm);1756 }1757 BUG_ON(drbg_blocklen(drbg) != crypto_cipher_blocksize(tfm));1758 drbg->priv_data = tfm;1759 1760 if (snprintf(ctr_name, CRYPTO_MAX_ALG_NAME, "ctr(%s)",1761 drbg->core->backend_cra_name) >= CRYPTO_MAX_ALG_NAME) {1762 drbg_fini_sym_kernel(drbg);1763 return -EINVAL;1764 }1765 sk_tfm = crypto_alloc_skcipher(ctr_name, 0, 0);1766 if (IS_ERR(sk_tfm)) {1767 pr_info("DRBG: could not allocate CTR cipher TFM handle: %s\n",1768 ctr_name);1769 drbg_fini_sym_kernel(drbg);1770 return PTR_ERR(sk_tfm);1771 }1772 drbg->ctr_handle = sk_tfm;1773 crypto_init_wait(&drbg->ctr_wait);1774 1775 req = skcipher_request_alloc(sk_tfm, GFP_KERNEL);1776 if (!req) {1777 pr_info("DRBG: could not allocate request queue\n");1778 drbg_fini_sym_kernel(drbg);1779 return -ENOMEM;1780 }1781 drbg->ctr_req = req;1782 skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG |1783 CRYPTO_TFM_REQ_MAY_SLEEP,1784 crypto_req_done, &drbg->ctr_wait);1785 1786 alignmask = crypto_skcipher_alignmask(sk_tfm);1787 drbg->outscratchpadbuf = kmalloc(DRBG_OUTSCRATCHLEN + alignmask,1788 GFP_KERNEL);1789 if (!drbg->outscratchpadbuf) {1790 drbg_fini_sym_kernel(drbg);1791 return -ENOMEM;1792 }1793 drbg->outscratchpad = (u8 *)PTR_ALIGN(drbg->outscratchpadbuf,1794 alignmask + 1);1795 1796 sg_init_table(&drbg->sg_in, 1);1797 sg_init_one(&drbg->sg_out, drbg->outscratchpad, DRBG_OUTSCRATCHLEN);1798 1799 return alignmask;1800}1801 1802static void drbg_kcapi_symsetkey(struct drbg_state *drbg,1803 const unsigned char *key)1804{1805 struct crypto_cipher *tfm = drbg->priv_data;1806 1807 crypto_cipher_setkey(tfm, key, (drbg_keylen(drbg)));1808}1809 1810static int drbg_kcapi_sym(struct drbg_state *drbg, unsigned char *outval,1811 const struct drbg_string *in)1812{1813 struct crypto_cipher *tfm = drbg->priv_data;1814 1815 /* there is only component in *in */1816 BUG_ON(in->len < drbg_blocklen(drbg));1817 crypto_cipher_encrypt_one(tfm, outval, in->buf);1818 return 0;1819}1820 1821static int drbg_kcapi_sym_ctr(struct drbg_state *drbg,1822 u8 *inbuf, u32 inlen,1823 u8 *outbuf, u32 outlen)1824{1825 struct scatterlist *sg_in = &drbg->sg_in, *sg_out = &drbg->sg_out;1826 u32 scratchpad_use = min_t(u32, outlen, DRBG_OUTSCRATCHLEN);1827 int ret;1828 1829 if (inbuf) {1830 /* Use caller-provided input buffer */1831 sg_set_buf(sg_in, inbuf, inlen);1832 } else {1833 /* Use scratchpad for in-place operation */1834 inlen = scratchpad_use;1835 memset(drbg->outscratchpad, 0, scratchpad_use);1836 sg_set_buf(sg_in, drbg->outscratchpad, scratchpad_use);1837 }1838 1839 while (outlen) {1840 u32 cryptlen = min3(inlen, outlen, (u32)DRBG_OUTSCRATCHLEN);1841 1842 /* Output buffer may not be valid for SGL, use scratchpad */1843 skcipher_request_set_crypt(drbg->ctr_req, sg_in, sg_out,1844 cryptlen, drbg->V);1845 ret = crypto_wait_req(crypto_skcipher_encrypt(drbg->ctr_req),1846 &drbg->ctr_wait);1847 if (ret)1848 goto out;1849 1850 crypto_init_wait(&drbg->ctr_wait);1851 1852 memcpy(outbuf, drbg->outscratchpad, cryptlen);1853 memzero_explicit(drbg->outscratchpad, cryptlen);1854 1855 outlen -= cryptlen;1856 outbuf += cryptlen;1857 }1858 ret = 0;1859 1860out:1861 return ret;1862}1863#endif /* CONFIG_CRYPTO_DRBG_CTR */1864 1865/***************************************************************1866 * Kernel crypto API interface to register DRBG1867 ***************************************************************/1868 1869/*1870 * Look up the DRBG flags by given kernel crypto API cra_name1871 * The code uses the drbg_cores definition to do this1872 *1873 * @cra_name kernel crypto API cra_name1874 * @coreref reference to integer which is filled with the pointer to1875 * the applicable core1876 * @pr reference for setting prediction resistance1877 *1878 * return: flags1879 */1880static inline void drbg_convert_tfm_core(const char *cra_driver_name,1881 int *coreref, bool *pr)1882{1883 int i = 0;1884 size_t start = 0;1885 int len = 0;1886 1887 *pr = true;1888 /* disassemble the names */1889 if (!memcmp(cra_driver_name, "drbg_nopr_", 10)) {1890 start = 10;1891 *pr = false;1892 } else if (!memcmp(cra_driver_name, "drbg_pr_", 8)) {1893 start = 8;1894 } else {1895 return;1896 }1897 1898 /* remove the first part */1899 len = strlen(cra_driver_name) - start;1900 for (i = 0; ARRAY_SIZE(drbg_cores) > i; i++) {1901 if (!memcmp(cra_driver_name + start, drbg_cores[i].cra_name,1902 len)) {1903 *coreref = i;1904 return;1905 }1906 }1907}1908 1909static int drbg_kcapi_init(struct crypto_tfm *tfm)1910{1911 struct drbg_state *drbg = crypto_tfm_ctx(tfm);1912 1913 mutex_init(&drbg->drbg_mutex);1914 1915 return 0;1916}1917 1918static void drbg_kcapi_cleanup(struct crypto_tfm *tfm)1919{1920 drbg_uninstantiate(crypto_tfm_ctx(tfm));1921}1922 1923/*1924 * Generate random numbers invoked by the kernel crypto API:1925 * The API of the kernel crypto API is extended as follows:1926 *1927 * src is additional input supplied to the RNG.1928 * slen is the length of src.1929 * dst is the output buffer where random data is to be stored.1930 * dlen is the length of dst.1931 */1932static int drbg_kcapi_random(struct crypto_rng *tfm,1933 const u8 *src, unsigned int slen,1934 u8 *dst, unsigned int dlen)1935{1936 struct drbg_state *drbg = crypto_rng_ctx(tfm);1937 struct drbg_string *addtl = NULL;1938 struct drbg_string string;1939 1940 if (slen) {1941 /* linked list variable is now local to allow modification */1942 drbg_string_fill(&string, src, slen);1943 addtl = &string;1944 }1945 1946 return drbg_generate_long(drbg, dst, dlen, addtl);1947}1948 1949/*1950 * Seed the DRBG invoked by the kernel crypto API1951 */1952static int drbg_kcapi_seed(struct crypto_rng *tfm,1953 const u8 *seed, unsigned int slen)1954{1955 struct drbg_state *drbg = crypto_rng_ctx(tfm);1956 struct crypto_tfm *tfm_base = crypto_rng_tfm(tfm);1957 bool pr = false;1958 struct drbg_string string;1959 struct drbg_string *seed_string = NULL;1960 int coreref = 0;1961 1962 drbg_convert_tfm_core(crypto_tfm_alg_driver_name(tfm_base), &coreref,1963 &pr);1964 if (0 < slen) {1965 drbg_string_fill(&string, seed, slen);1966 seed_string = &string;1967 }1968 1969 return drbg_instantiate(drbg, seed_string, coreref, pr);1970}1971 1972/***************************************************************1973 * Kernel module: code to load the module1974 ***************************************************************/1975 1976/*1977 * Tests as defined in 11.3.2 in addition to the cipher tests: testing1978 * of the error handling.1979 *1980 * Note: testing of failing seed source as defined in 11.3.2 is not applicable1981 * as seed source of get_random_bytes does not fail.1982 *1983 * Note 2: There is no sensible way of testing the reseed counter1984 * enforcement, so skip it.1985 */1986static inline int __init drbg_healthcheck_sanity(void)1987{1988 int len = 0;1989#define OUTBUFLEN 161990 unsigned char buf[OUTBUFLEN];1991 struct drbg_state *drbg = NULL;1992 int ret;1993 int rc = -EFAULT;1994 bool pr = false;1995 int coreref = 0;1996 struct drbg_string addtl;1997 size_t max_addtllen, max_request_bytes;1998 1999 /* only perform test in FIPS mode */2000 if (!fips_enabled)2001 return 0;2002 2003#ifdef CONFIG_CRYPTO_DRBG_CTR2004 drbg_convert_tfm_core("drbg_nopr_ctr_aes256", &coreref, &pr);2005#endif2006#ifdef CONFIG_CRYPTO_DRBG_HASH2007 drbg_convert_tfm_core("drbg_nopr_sha256", &coreref, &pr);2008#endif2009#ifdef CONFIG_CRYPTO_DRBG_HMAC2010 drbg_convert_tfm_core("drbg_nopr_hmac_sha512", &coreref, &pr);2011#endif2012 2013 drbg = kzalloc(sizeof(struct drbg_state), GFP_KERNEL);2014 if (!drbg)2015 return -ENOMEM;2016 2017 mutex_init(&drbg->drbg_mutex);2018 drbg->core = &drbg_cores[coreref];2019 drbg->reseed_threshold = drbg_max_requests(drbg);2020 2021 /*2022 * if the following tests fail, it is likely that there is a buffer2023 * overflow as buf is much smaller than the requested or provided2024 * string lengths -- in case the error handling does not succeed2025 * we may get an OOPS. And we want to get an OOPS as this is a2026 * grave bug.2027 */2028 2029 max_addtllen = drbg_max_addtl(drbg);2030 max_request_bytes = drbg_max_request_bytes(drbg);2031 drbg_string_fill(&addtl, buf, max_addtllen + 1);2032 /* overflow addtllen with additonal info string */2033 len = drbg_generate(drbg, buf, OUTBUFLEN, &addtl);2034 BUG_ON(0 < len);2035 /* overflow max_bits */2036 len = drbg_generate(drbg, buf, (max_request_bytes + 1), NULL);2037 BUG_ON(0 < len);2038 2039 /* overflow max addtllen with personalization string */2040 ret = drbg_seed(drbg, &addtl, false);2041 BUG_ON(0 == ret);2042 /* all tests passed */2043 rc = 0;2044 2045 pr_devel("DRBG: Sanity tests for failure code paths successfully "2046 "completed\n");2047 2048 kfree(drbg);2049 return rc;2050}2051 2052static struct rng_alg drbg_algs[22];2053 2054/*2055 * Fill the array drbg_algs used to register the different DRBGs2056 * with the kernel crypto API. To fill the array, the information2057 * from drbg_cores[] is used.2058 */2059static inline void __init drbg_fill_array(struct rng_alg *alg,2060 const struct drbg_core *core, int pr)2061{2062 int pos = 0;2063 static int priority = 200;2064 2065 memcpy(alg->base.cra_name, "stdrng", 6);2066 if (pr) {2067 memcpy(alg->base.cra_driver_name, "drbg_pr_", 8);2068 pos = 8;2069 } else {2070 memcpy(alg->base.cra_driver_name, "drbg_nopr_", 10);2071 pos = 10;2072 }2073 memcpy(alg->base.cra_driver_name + pos, core->cra_name,2074 strlen(core->cra_name));2075 2076 alg->base.cra_priority = priority;2077 priority++;2078 /*2079 * If FIPS mode enabled, the selected DRBG shall have the2080 * highest cra_priority over other stdrng instances to ensure2081 * it is selected.2082 */2083 if (fips_enabled)2084 alg->base.cra_priority += 200;2085 2086 alg->base.cra_ctxsize = sizeof(struct drbg_state);2087 alg->base.cra_module = THIS_MODULE;2088 alg->base.cra_init = drbg_kcapi_init;2089 alg->base.cra_exit = drbg_kcapi_cleanup;2090 alg->generate = drbg_kcapi_random;2091 alg->seed = drbg_kcapi_seed;2092 alg->set_ent = drbg_kcapi_set_entropy;2093 alg->seedsize = 0;2094}2095 2096static int __init drbg_init(void)2097{2098 unsigned int i = 0; /* pointer to drbg_algs */2099 unsigned int j = 0; /* pointer to drbg_cores */2100 int ret;2101 2102 ret = drbg_healthcheck_sanity();2103 if (ret)2104 return ret;2105 2106 if (ARRAY_SIZE(drbg_cores) * 2 > ARRAY_SIZE(drbg_algs)) {2107 pr_info("DRBG: Cannot register all DRBG types"2108 "(slots needed: %zu, slots available: %zu)\n",2109 ARRAY_SIZE(drbg_cores) * 2, ARRAY_SIZE(drbg_algs));2110 return -EFAULT;2111 }2112 2113 /*2114 * each DRBG definition can be used with PR and without PR, thus2115 * we instantiate each DRBG in drbg_cores[] twice.2116 *2117 * As the order of placing them into the drbg_algs array matters2118 * (the later DRBGs receive a higher cra_priority) we register the2119 * prediction resistance DRBGs first as the should not be too2120 * interesting.2121 */2122 for (j = 0; ARRAY_SIZE(drbg_cores) > j; j++, i++)2123 drbg_fill_array(&drbg_algs[i], &drbg_cores[j], 1);2124 for (j = 0; ARRAY_SIZE(drbg_cores) > j; j++, i++)2125 drbg_fill_array(&drbg_algs[i], &drbg_cores[j], 0);2126 return crypto_register_rngs(drbg_algs, (ARRAY_SIZE(drbg_cores) * 2));2127}2128 2129static void __exit drbg_exit(void)2130{2131 crypto_unregister_rngs(drbg_algs, (ARRAY_SIZE(drbg_cores) * 2));2132}2133 2134subsys_initcall(drbg_init);2135module_exit(drbg_exit);2136#ifndef CRYPTO_DRBG_HASH_STRING2137#define CRYPTO_DRBG_HASH_STRING ""2138#endif2139#ifndef CRYPTO_DRBG_HMAC_STRING2140#define CRYPTO_DRBG_HMAC_STRING ""2141#endif2142#ifndef CRYPTO_DRBG_CTR_STRING2143#define CRYPTO_DRBG_CTR_STRING ""2144#endif2145MODULE_LICENSE("GPL");2146MODULE_AUTHOR("Stephan Mueller <smueller@chronox.de>");2147MODULE_DESCRIPTION("NIST SP800-90A Deterministic Random Bit Generator (DRBG) "2148 "using following cores: "2149 CRYPTO_DRBG_HASH_STRING2150 CRYPTO_DRBG_HMAC_STRING2151 CRYPTO_DRBG_CTR_STRING);2152MODULE_ALIAS_CRYPTO("stdrng");2153MODULE_IMPORT_NS(CRYPTO_INTERNAL);2154