1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. 23 * Copyright 2012 Nexenta Systems, Inc. All rights reserved. 24 * Copyright (c) 2015, Joyent, Inc. 25 */ 26 27 /* 28 * This file implements the interfaces that the /dev/random 29 * driver uses for read(2), write(2) and poll(2) on /dev/random or 30 * /dev/urandom. It also implements the kernel API - random_add_entropy(), 31 * random_add_pseudo_entropy(), random_get_pseudo_bytes() 32 * and random_get_bytes(). 33 * 34 * We periodically collect random bits from providers which are registered 35 * with the Kernel Cryptographic Framework (kCF) as capable of random 36 * number generation. The random bits are maintained in a cache and 37 * it is used for high quality random numbers (/dev/random) requests. 38 * We pick a provider and call its SPI routine, if the cache does not have 39 * enough bytes to satisfy a request. 40 * 41 * /dev/urandom requests use a software-based generator algorithm that uses the 42 * random bits in the cache as a seed. We create one pseudo-random generator 43 * (for /dev/urandom) per possible CPU on the system, and use it, 44 * kmem-magazine-style, to avoid cache line contention. 45 * 46 * LOCKING HIERARCHY: 47 * 1) rmp->rm_mag.rm_lock protects the per-cpu pseudo-random generators. 48 * 2) rndpool_lock protects the high-quality randomness pool. 49 * It may be locked while a rmp->rm_mag.rm_lock is held. 50 * 51 * A history note: The kernel API and the software-based algorithms in this 52 * file used to be part of the /dev/random driver. 53 */ 54 55 #include <sys/types.h> 56 #include <sys/conf.h> 57 #include <sys/sunddi.h> 58 #include <sys/disp.h> 59 #include <sys/modctl.h> 60 #include <sys/ddi.h> 61 #include <sys/crypto/common.h> 62 #include <sys/crypto/api.h> 63 #include <sys/crypto/impl.h> 64 #include <sys/crypto/sched_impl.h> 65 #include <sys/crypto/ioctladmin.h> 66 #include <sys/random.h> 67 #include <sys/sha1.h> 68 #include <sys/time.h> 69 #include <sys/sysmacros.h> 70 #include <sys/cpuvar.h> 71 #include <sys/taskq.h> 72 #include <rng/fips_random.h> 73 74 #define RNDPOOLSIZE 1024 /* Pool size in bytes */ 75 #define MINEXTRACTBYTES 20 76 #define MAXEXTRACTBYTES 1024 77 #define PRNG_MAXOBLOCKS 1310720 /* Max output block per prng key */ 78 #define TIMEOUT_INTERVAL 5 /* Periodic mixing interval in secs */ 79 80 typedef enum extract_type { 81 NONBLOCK_EXTRACT, 82 BLOCKING_EXTRACT, 83 ALWAYS_EXTRACT 84 } extract_type_t; 85 86 /* 87 * Hash-algo generic definitions. For now, they are SHA1's. We use SHA1 88 * routines directly instead of using k-API because we can't return any 89 * error code in /dev/urandom case and we can get an error using k-API 90 * if a mechanism is disabled. 91 */ 92 #define HASHSIZE 20 93 #define HASH_CTX SHA1_CTX 94 #define HashInit(ctx) SHA1Init((ctx)) 95 #define HashUpdate(ctx, p, s) SHA1Update((ctx), (p), (s)) 96 #define HashFinal(d, ctx) SHA1Final((d), (ctx)) 97 98 /* HMAC-SHA1 */ 99 #define HMAC_KEYSIZE 20 100 101 /* 102 * Cache of random bytes implemented as a circular buffer. findex and rindex 103 * track the front and back of the circular buffer. 104 */ 105 uint8_t rndpool[RNDPOOLSIZE]; 106 static int findex, rindex; 107 static int rnbyte_cnt; /* Number of bytes in the cache */ 108 109 static kmutex_t rndpool_lock; /* protects r/w accesses to the cache, */ 110 /* and the global variables */ 111 static kcondvar_t rndpool_read_cv; /* serializes poll/read syscalls */ 112 static int num_waiters; /* #threads waiting to read from /dev/random */ 113 114 static struct pollhead rnd_pollhead; 115 /* LINTED E_STATIC_UNUSED */ 116 static timeout_id_t kcf_rndtimeout_id; 117 static crypto_mech_type_t rngmech_type = CRYPTO_MECH_INVALID; 118 rnd_stats_t rnd_stats; 119 static boolean_t rng_prov_found = B_TRUE; 120 static boolean_t rng_ok_to_log = B_TRUE; 121 static boolean_t rngprov_task_idle = B_TRUE; 122 123 static void rndc_addbytes(uint8_t *, size_t); 124 static void rndc_getbytes(uint8_t *ptr, size_t len); 125 static void rnd_handler(void *); 126 static void rnd_alloc_magazines(void); 127 static void rnd_fips_discard_initial(void); 128 static void rnd_init2(void *); 129 static void rnd_schedule_timeout(void); 130 131 /* 132 * Called from kcf:_init() 133 */ 134 void 135 kcf_rnd_init() 136 { 137 hrtime_t ts; 138 time_t now; 139 140 mutex_init(&rndpool_lock, NULL, MUTEX_DEFAULT, NULL); 141 cv_init(&rndpool_read_cv, NULL, CV_DEFAULT, NULL); 142 143 /* 144 * Add bytes to the cache using 145 * . 2 unpredictable times: high resolution time since the boot-time, 146 * and the current time-of-the day. 147 * This is used only to make the timeout value in the timer 148 * unpredictable. 149 */ 150 ts = gethrtime(); 151 rndc_addbytes((uint8_t *)&ts, sizeof (ts)); 152 153 (void) drv_getparm(TIME, &now); 154 rndc_addbytes((uint8_t *)&now, sizeof (now)); 155 156 rnbyte_cnt = 0; 157 findex = rindex = 0; 158 num_waiters = 0; 159 160 rnd_alloc_magazines(); 161 162 (void) taskq_dispatch(system_taskq, rnd_init2, NULL, TQ_SLEEP); 163 } 164 165 /* 166 * This is called via the system taskq, so that we can do further 167 * initializations that have to wait until the kcf module itself is 168 * done loading. (After kcf:_init returns.) 169 */ 170 static void 171 rnd_init2(void *unused) 172 { 173 174 _NOTE(ARGUNUSED(unused)); 175 176 /* 177 * This will load a randomness provider; typically "swrand", 178 * but could be another provider if so configured. 179 */ 180 rngmech_type = crypto_mech2id(SUN_RANDOM); 181 182 /* Update rng_prov_found etc. */ 183 (void) kcf_rngprov_check(); 184 185 /* FIPS 140-2 init. */ 186 rnd_fips_discard_initial(); 187 188 /* Start rnd_handler calls. */ 189 rnd_schedule_timeout(); 190 } 191 192 /* 193 * Return TRUE if at least one provider exists that can 194 * supply random numbers. 195 */ 196 boolean_t 197 kcf_rngprov_check(void) 198 { 199 int rv; 200 kcf_provider_desc_t *pd; 201 202 if ((pd = kcf_get_mech_provider(rngmech_type, NULL, NULL, &rv, 203 NULL, CRYPTO_FG_RANDOM, 0)) != NULL) { 204 KCF_PROV_REFRELE(pd); 205 /* 206 * We logged a warning once about no provider being available 207 * and now a provider became available. So, set the flag so 208 * that we can log again if the problem recurs. 209 */ 210 rng_ok_to_log = B_TRUE; 211 rng_prov_found = B_TRUE; 212 return (B_TRUE); 213 } else { 214 rng_prov_found = B_FALSE; 215 return (B_FALSE); 216 } 217 } 218 219 /* 220 * Pick a software-based provider and submit a request to seed 221 * its random number generator. 222 */ 223 static void 224 rngprov_seed(uint8_t *buf, int len, uint_t entropy_est, uint32_t flags) 225 { 226 kcf_provider_desc_t *pd = NULL; 227 228 if (kcf_get_sw_prov(rngmech_type, &pd, NULL, B_FALSE) == 229 CRYPTO_SUCCESS) { 230 (void) KCF_PROV_SEED_RANDOM(pd, pd->pd_sid, buf, len, 231 entropy_est, flags, NULL); 232 KCF_PROV_REFRELE(pd); 233 } 234 } 235 236 /* 237 * This routine is called for blocking reads. 238 * 239 * The argument is_taskq_thr indicates whether the caller is 240 * the taskq thread dispatched by the timeout handler routine. 241 * In this case, we cycle through all the providers 242 * submitting a request to each provider to generate random numbers. 243 * 244 * For other cases, we pick a provider and submit a request to generate 245 * random numbers. We retry using another provider if we get an error. 246 * 247 * Returns the number of bytes that are written to 'ptr'. Returns -1 248 * if no provider is found. ptr and need are unchanged. 249 */ 250 static int 251 rngprov_getbytes(uint8_t *ptr, size_t need, boolean_t is_taskq_thr) 252 { 253 int rv; 254 int prov_cnt = 0; 255 int total_bytes = 0; 256 kcf_provider_desc_t *pd; 257 kcf_req_params_t params; 258 kcf_prov_tried_t *list = NULL; 259 260 while ((pd = kcf_get_mech_provider(rngmech_type, NULL, NULL, &rv, 261 list, CRYPTO_FG_RANDOM, 0)) != NULL) { 262 263 prov_cnt++; 264 265 KCF_WRAP_RANDOM_OPS_PARAMS(¶ms, KCF_OP_RANDOM_GENERATE, 266 pd->pd_sid, ptr, need, 0, 0); 267 rv = kcf_submit_request(pd, NULL, NULL, ¶ms, B_FALSE); 268 ASSERT(rv != CRYPTO_QUEUED); 269 270 if (rv == CRYPTO_SUCCESS) { 271 total_bytes += need; 272 if (is_taskq_thr) 273 rndc_addbytes(ptr, need); 274 else { 275 KCF_PROV_REFRELE(pd); 276 break; 277 } 278 } 279 280 if (is_taskq_thr || rv != CRYPTO_SUCCESS) { 281 /* Add pd to the linked list of providers tried. */ 282 if (kcf_insert_triedlist(&list, pd, KM_SLEEP) == NULL) { 283 KCF_PROV_REFRELE(pd); 284 break; 285 } 286 } 287 288 } 289 290 if (list != NULL) 291 kcf_free_triedlist(list); 292 293 if (prov_cnt == 0) { /* no provider could be found. */ 294 rng_prov_found = B_FALSE; 295 return (-1); 296 } else { 297 rng_prov_found = B_TRUE; 298 /* See comments in kcf_rngprov_check() */ 299 rng_ok_to_log = B_TRUE; 300 } 301 302 return (total_bytes); 303 } 304 305 static void 306 notify_done(void *arg, int rv) 307 { 308 uchar_t *rndbuf = arg; 309 310 if (rv == CRYPTO_SUCCESS) 311 rndc_addbytes(rndbuf, MINEXTRACTBYTES); 312 313 bzero(rndbuf, MINEXTRACTBYTES); 314 kmem_free(rndbuf, MINEXTRACTBYTES); 315 } 316 317 /* 318 * Cycle through all the providers submitting a request to each provider 319 * to generate random numbers. This is called for the modes - NONBLOCK_EXTRACT 320 * and ALWAYS_EXTRACT. 321 * 322 * Returns the number of bytes that are written to 'ptr'. Returns -1 323 * if no provider is found. ptr and len are unchanged. 324 */ 325 static int 326 rngprov_getbytes_nblk(uint8_t *ptr, size_t len) 327 { 328 int rv, total_bytes; 329 size_t blen; 330 uchar_t *rndbuf; 331 kcf_provider_desc_t *pd; 332 kcf_req_params_t params; 333 crypto_call_req_t req; 334 kcf_prov_tried_t *list = NULL; 335 int prov_cnt = 0; 336 337 blen = 0; 338 total_bytes = 0; 339 req.cr_flag = CRYPTO_SKIP_REQID; 340 req.cr_callback_func = notify_done; 341 342 while ((pd = kcf_get_mech_provider(rngmech_type, NULL, NULL, &rv, 343 list, CRYPTO_FG_RANDOM, 0)) != NULL) { 344 345 prov_cnt ++; 346 switch (pd->pd_prov_type) { 347 case CRYPTO_HW_PROVIDER: 348 /* 349 * We have to allocate a buffer here as we can not 350 * assume that the input buffer will remain valid 351 * when the callback comes. We use a fixed size buffer 352 * to simplify the book keeping. 353 */ 354 rndbuf = kmem_alloc(MINEXTRACTBYTES, KM_NOSLEEP); 355 if (rndbuf == NULL) { 356 KCF_PROV_REFRELE(pd); 357 if (list != NULL) 358 kcf_free_triedlist(list); 359 return (total_bytes); 360 } 361 req.cr_callback_arg = rndbuf; 362 KCF_WRAP_RANDOM_OPS_PARAMS(¶ms, 363 KCF_OP_RANDOM_GENERATE, 364 pd->pd_sid, rndbuf, MINEXTRACTBYTES, 0, 0); 365 break; 366 367 case CRYPTO_SW_PROVIDER: 368 /* 369 * We do not need to allocate a buffer in the software 370 * provider case as there is no callback involved. We 371 * avoid any extra data copy by directly passing 'ptr'. 372 */ 373 KCF_WRAP_RANDOM_OPS_PARAMS(¶ms, 374 KCF_OP_RANDOM_GENERATE, 375 pd->pd_sid, ptr, len, 0, 0); 376 break; 377 } 378 379 rv = kcf_submit_request(pd, NULL, &req, ¶ms, B_FALSE); 380 if (rv == CRYPTO_SUCCESS) { 381 switch (pd->pd_prov_type) { 382 case CRYPTO_HW_PROVIDER: 383 /* 384 * Since we have the input buffer handy, 385 * we directly copy to it rather than 386 * adding to the pool. 387 */ 388 blen = min(MINEXTRACTBYTES, len); 389 bcopy(rndbuf, ptr, blen); 390 if (len < MINEXTRACTBYTES) 391 rndc_addbytes(rndbuf + len, 392 MINEXTRACTBYTES - len); 393 ptr += blen; 394 len -= blen; 395 total_bytes += blen; 396 break; 397 398 case CRYPTO_SW_PROVIDER: 399 total_bytes += len; 400 len = 0; 401 break; 402 } 403 } 404 405 /* 406 * We free the buffer in the callback routine 407 * for the CRYPTO_QUEUED case. 408 */ 409 if (pd->pd_prov_type == CRYPTO_HW_PROVIDER && 410 rv != CRYPTO_QUEUED) { 411 bzero(rndbuf, MINEXTRACTBYTES); 412 kmem_free(rndbuf, MINEXTRACTBYTES); 413 } 414 415 if (len == 0) { 416 KCF_PROV_REFRELE(pd); 417 break; 418 } 419 420 if (rv != CRYPTO_SUCCESS) { 421 /* Add pd to the linked list of providers tried. */ 422 if (kcf_insert_triedlist(&list, pd, KM_NOSLEEP) == 423 NULL) { 424 KCF_PROV_REFRELE(pd); 425 break; 426 } 427 } 428 } 429 430 if (list != NULL) { 431 kcf_free_triedlist(list); 432 } 433 434 if (prov_cnt == 0) { /* no provider could be found. */ 435 rng_prov_found = B_FALSE; 436 return (-1); 437 } else { 438 rng_prov_found = B_TRUE; 439 /* See comments in kcf_rngprov_check() */ 440 rng_ok_to_log = B_TRUE; 441 } 442 443 return (total_bytes); 444 } 445 446 static void 447 rngprov_task(void *arg) 448 { 449 int len = (int)(uintptr_t)arg; 450 uchar_t tbuf[MAXEXTRACTBYTES]; 451 452 ASSERT(len <= MAXEXTRACTBYTES); 453 (void) rngprov_getbytes(tbuf, len, B_TRUE); 454 rngprov_task_idle = B_TRUE; 455 } 456 457 /* 458 * Returns "len" random or pseudo-random bytes in *ptr. 459 * Will block if not enough random bytes are available and the 460 * call is blocking. 461 * 462 * Called with rndpool_lock held (allowing caller to do optimistic locking; 463 * releases the lock before return). 464 */ 465 static int 466 rnd_get_bytes(uint8_t *ptr, size_t len, extract_type_t how) 467 { 468 size_t bytes; 469 int got; 470 471 ASSERT(mutex_owned(&rndpool_lock)); 472 /* 473 * Check if the request can be satisfied from the cache 474 * of random bytes. 475 */ 476 if (len <= rnbyte_cnt) { 477 rndc_getbytes(ptr, len); 478 mutex_exit(&rndpool_lock); 479 return (0); 480 } 481 mutex_exit(&rndpool_lock); 482 483 switch (how) { 484 case BLOCKING_EXTRACT: 485 if ((got = rngprov_getbytes(ptr, len, B_FALSE)) == -1) 486 break; /* No provider found */ 487 488 if (got == len) 489 return (0); 490 len -= got; 491 ptr += got; 492 break; 493 494 case NONBLOCK_EXTRACT: 495 case ALWAYS_EXTRACT: 496 if ((got = rngprov_getbytes_nblk(ptr, len)) == -1) { 497 /* No provider found */ 498 if (how == NONBLOCK_EXTRACT) { 499 return (EAGAIN); 500 } 501 } else { 502 if (got == len) 503 return (0); 504 len -= got; 505 ptr += got; 506 } 507 if (how == NONBLOCK_EXTRACT && (rnbyte_cnt < len)) 508 return (EAGAIN); 509 break; 510 } 511 512 mutex_enter(&rndpool_lock); 513 while (len > 0) { 514 if (how == BLOCKING_EXTRACT) { 515 /* Check if there is enough */ 516 while (rnbyte_cnt < MINEXTRACTBYTES) { 517 num_waiters++; 518 if (cv_wait_sig(&rndpool_read_cv, 519 &rndpool_lock) == 0) { 520 num_waiters--; 521 mutex_exit(&rndpool_lock); 522 return (EINTR); 523 } 524 num_waiters--; 525 } 526 } 527 528 /* Figure out how many bytes to extract */ 529 bytes = min(len, rnbyte_cnt); 530 rndc_getbytes(ptr, bytes); 531 532 len -= bytes; 533 ptr += bytes; 534 535 if (len > 0 && how == ALWAYS_EXTRACT) { 536 /* 537 * There are not enough bytes, but we can not block. 538 * This only happens in the case of /dev/urandom which 539 * runs an additional generation algorithm. So, there 540 * is no problem. 541 */ 542 while (len > 0) { 543 *ptr = rndpool[findex]; 544 ptr++; len--; 545 rindex = findex = (findex + 1) & 546 (RNDPOOLSIZE - 1); 547 } 548 break; 549 } 550 } 551 552 mutex_exit(&rndpool_lock); 553 return (0); 554 } 555 556 int 557 kcf_rnd_get_bytes(uint8_t *ptr, size_t len, boolean_t noblock) 558 { 559 extract_type_t how; 560 int error; 561 562 how = noblock ? NONBLOCK_EXTRACT : BLOCKING_EXTRACT; 563 mutex_enter(&rndpool_lock); 564 if ((error = rnd_get_bytes(ptr, len, how)) != 0) 565 return (error); 566 567 BUMP_RND_STATS(rs_rndOut, len); 568 return (0); 569 } 570 571 /* 572 * Revisit this if the structs grow or we come up with a better way 573 * of cache-line-padding structures. 574 */ 575 #define RND_CPU_CACHE_SIZE 64 576 #define RND_CPU_PAD_SIZE RND_CPU_CACHE_SIZE*6 577 #define RND_CPU_PAD (RND_CPU_PAD_SIZE - \ 578 sizeof (rndmag_t)) 579 /* 580 * Per-CPU random state. Somewhat like like kmem's magazines, this provides 581 * a per-CPU instance of the pseudo-random generator. We have it much easier 582 * than kmem, as we can afford to "leak" random bits if a CPU is DR'ed out. 583 * 584 * Note that this usage is preemption-safe; a thread 585 * entering a critical section remembers which generator it locked 586 * and unlocks the same one; should it be preempted and wind up running on 587 * a different CPU, there will be a brief period of increased contention 588 * before it exits the critical section but nothing will melt. 589 */ 590 typedef struct rndmag_s 591 { 592 kmutex_t rm_lock; 593 uint8_t *rm_buffer; /* Start of buffer */ 594 uint8_t *rm_eptr; /* End of buffer */ 595 uint8_t *rm_rptr; /* Current read pointer */ 596 uint32_t rm_oblocks; /* time to rekey? */ 597 uint32_t rm_ofuzz; /* Rekey backoff state */ 598 uint32_t rm_olimit; /* Hard rekey limit */ 599 rnd_stats_t rm_stats; /* Per-CPU Statistics */ 600 uint32_t rm_key[HASHSIZE/BYTES_IN_WORD]; /* FIPS XKEY */ 601 uint32_t rm_seed[HASHSIZE/BYTES_IN_WORD]; /* seed for rekey */ 602 uint32_t rm_previous[HASHSIZE/BYTES_IN_WORD]; /* prev random */ 603 } rndmag_t; 604 605 typedef struct rndmag_pad_s 606 { 607 rndmag_t rm_mag; 608 uint8_t rm_pad[RND_CPU_PAD]; 609 } rndmag_pad_t; 610 611 /* 612 * Generate random bytes for /dev/urandom by applying the 613 * FIPS 186-2 algorithm with a key created from bytes extracted 614 * from the pool. A maximum of PRNG_MAXOBLOCKS output blocks 615 * is generated before a new key is obtained. 616 * 617 * Note that callers to this routine are likely to assume it can't fail. 618 * 619 * Called with rmp locked; releases lock. 620 */ 621 static int 622 rnd_generate_pseudo_bytes(rndmag_pad_t *rmp, uint8_t *ptr, size_t len) 623 { 624 size_t bytes = len, size; 625 int nblock; 626 uint32_t oblocks; 627 uint32_t tempout[HASHSIZE/BYTES_IN_WORD]; 628 uint32_t seed[HASHSIZE/BYTES_IN_WORD]; 629 int i; 630 hrtime_t timestamp; 631 uint8_t *src, *dst; 632 633 ASSERT(mutex_owned(&rmp->rm_mag.rm_lock)); 634 635 /* Nothing is being asked */ 636 if (len == 0) { 637 mutex_exit(&rmp->rm_mag.rm_lock); 638 return (0); 639 } 640 641 nblock = howmany(len, HASHSIZE); 642 643 rmp->rm_mag.rm_oblocks += nblock; 644 oblocks = rmp->rm_mag.rm_oblocks; 645 646 do { 647 if (oblocks >= rmp->rm_mag.rm_olimit) { 648 649 /* 650 * Contention-avoiding rekey: see if 651 * the pool is locked, and if so, wait a bit. 652 * Do an 'exponential back-in' to ensure we don't 653 * run too long without rekey. 654 */ 655 if (rmp->rm_mag.rm_ofuzz) { 656 /* 657 * Decaying exponential back-in for rekey. 658 */ 659 if ((rnbyte_cnt < MINEXTRACTBYTES) || 660 (!mutex_tryenter(&rndpool_lock))) { 661 rmp->rm_mag.rm_olimit += 662 rmp->rm_mag.rm_ofuzz; 663 rmp->rm_mag.rm_ofuzz >>= 1; 664 goto punt; 665 } 666 } else { 667 mutex_enter(&rndpool_lock); 668 } 669 670 /* Get a new chunk of entropy */ 671 (void) rnd_get_bytes((uint8_t *)rmp->rm_mag.rm_key, 672 HMAC_KEYSIZE, ALWAYS_EXTRACT); 673 674 rmp->rm_mag.rm_olimit = PRNG_MAXOBLOCKS/2; 675 rmp->rm_mag.rm_ofuzz = PRNG_MAXOBLOCKS/4; 676 oblocks = 0; 677 rmp->rm_mag.rm_oblocks = nblock; 678 } 679 punt: 680 timestamp = gethrtime(); 681 682 src = (uint8_t *)×tamp; 683 dst = (uint8_t *)rmp->rm_mag.rm_seed; 684 685 for (i = 0; i < HASHSIZE; i++) { 686 dst[i] ^= src[i % sizeof (timestamp)]; 687 } 688 689 bcopy(rmp->rm_mag.rm_seed, seed, HASHSIZE); 690 691 fips_random_inner(rmp->rm_mag.rm_key, tempout, 692 seed); 693 694 if (bytes >= HASHSIZE) { 695 size = HASHSIZE; 696 } else { 697 size = min(bytes, HASHSIZE); 698 } 699 700 /* 701 * FIPS 140-2: Continuous RNG test - each generation 702 * of an n-bit block shall be compared with the previously 703 * generated block. Test shall fail if any two compared 704 * n-bit blocks are equal. 705 */ 706 for (i = 0; i < HASHSIZE/BYTES_IN_WORD; i++) { 707 if (tempout[i] != rmp->rm_mag.rm_previous[i]) 708 break; 709 } 710 if (i == HASHSIZE/BYTES_IN_WORD) { 711 cmn_err(CE_WARN, "kcf_random: The value of 160-bit " 712 "block random bytes are same as the previous " 713 "one.\n"); 714 /* discard random bytes and return error */ 715 mutex_exit(&rmp->rm_mag.rm_lock); 716 return (EIO); 717 } 718 719 bcopy(tempout, rmp->rm_mag.rm_previous, 720 HASHSIZE); 721 722 bcopy(tempout, ptr, size); 723 ptr += size; 724 bytes -= size; 725 oblocks++; 726 nblock--; 727 } while (bytes > 0); 728 729 /* Zero out sensitive information */ 730 bzero(seed, HASHSIZE); 731 bzero(tempout, HASHSIZE); 732 mutex_exit(&rmp->rm_mag.rm_lock); 733 return (0); 734 } 735 736 /* 737 * Per-CPU Random magazines. 738 */ 739 static rndmag_pad_t *rndmag; 740 static uint8_t *rndbuf; 741 static size_t rndmag_total; 742 /* 743 * common/os/cpu.c says that platform support code can shrinkwrap 744 * max_ncpus. On the off chance that we get loaded very early, we 745 * read it exactly once, to copy it here. 746 */ 747 static uint32_t random_max_ncpus = 0; 748 749 /* 750 * Boot-time tunables, for experimentation. 751 */ 752 size_t rndmag_threshold = 2560; 753 size_t rndbuf_len = 5120; 754 size_t rndmag_size = 1280; 755 756 757 int 758 kcf_rnd_get_pseudo_bytes(uint8_t *ptr, size_t len) 759 { 760 rndmag_pad_t *rmp; 761 uint8_t *cptr, *eptr; 762 763 /* 764 * Anyone who asks for zero bytes of randomness should get slapped. 765 */ 766 ASSERT(len > 0); 767 768 /* 769 * Fast path. 770 */ 771 for (;;) { 772 rmp = &rndmag[CPU->cpu_seqid]; 773 mutex_enter(&rmp->rm_mag.rm_lock); 774 775 /* 776 * Big requests bypass buffer and tail-call the 777 * generate routine directly. 778 */ 779 if (len > rndmag_threshold) { 780 BUMP_CPU_RND_STATS(rmp, rs_urndOut, len); 781 return (rnd_generate_pseudo_bytes(rmp, ptr, len)); 782 } 783 784 cptr = rmp->rm_mag.rm_rptr; 785 eptr = cptr + len; 786 787 if (eptr <= rmp->rm_mag.rm_eptr) { 788 rmp->rm_mag.rm_rptr = eptr; 789 bcopy(cptr, ptr, len); 790 BUMP_CPU_RND_STATS(rmp, rs_urndOut, len); 791 mutex_exit(&rmp->rm_mag.rm_lock); 792 793 return (0); 794 } 795 /* 796 * End fast path. 797 */ 798 rmp->rm_mag.rm_rptr = rmp->rm_mag.rm_buffer; 799 /* 800 * Note: We assume the generate routine always succeeds 801 * in this case (because it does at present..) 802 * It also always releases rm_lock. 803 */ 804 (void) rnd_generate_pseudo_bytes(rmp, rmp->rm_mag.rm_buffer, 805 rndbuf_len); 806 } 807 } 808 809 /* 810 * We set up (empty) magazines for all of max_ncpus, possibly wasting a 811 * little memory on big systems that don't have the full set installed. 812 * See above; "empty" means "rptr equal to eptr"; this will trigger the 813 * refill path in rnd_get_pseudo_bytes above on the first call for each CPU. 814 * 815 * TODO: make rndmag_size tunable at run time! 816 */ 817 static void 818 rnd_alloc_magazines() 819 { 820 rndmag_pad_t *rmp; 821 int i; 822 823 rndbuf_len = roundup(rndbuf_len, HASHSIZE); 824 if (rndmag_size < rndbuf_len) 825 rndmag_size = rndbuf_len; 826 rndmag_size = roundup(rndmag_size, RND_CPU_CACHE_SIZE); 827 828 random_max_ncpus = max_ncpus; 829 rndmag_total = rndmag_size * random_max_ncpus; 830 831 rndbuf = kmem_alloc(rndmag_total, KM_SLEEP); 832 rndmag = kmem_zalloc(sizeof (rndmag_pad_t) * random_max_ncpus, 833 KM_SLEEP); 834 835 for (i = 0; i < random_max_ncpus; i++) { 836 uint8_t *buf; 837 838 rmp = &rndmag[i]; 839 mutex_init(&rmp->rm_mag.rm_lock, NULL, MUTEX_DRIVER, NULL); 840 841 buf = rndbuf + i * rndmag_size; 842 843 rmp->rm_mag.rm_buffer = buf; 844 rmp->rm_mag.rm_eptr = buf + rndbuf_len; 845 rmp->rm_mag.rm_rptr = buf + rndbuf_len; 846 rmp->rm_mag.rm_oblocks = 1; 847 } 848 } 849 850 /* 851 * FIPS 140-2: the first n-bit (n > 15) block generated 852 * after power-up, initialization, or reset shall not 853 * be used, but shall be saved for comparison. 854 */ 855 static void 856 rnd_fips_discard_initial(void) 857 { 858 uint8_t discard_buf[HASHSIZE]; 859 rndmag_pad_t *rmp; 860 int i; 861 862 for (i = 0; i < random_max_ncpus; i++) { 863 rmp = &rndmag[i]; 864 865 /* rnd_get_bytes() will call mutex_exit(&rndpool_lock) */ 866 mutex_enter(&rndpool_lock); 867 (void) rnd_get_bytes(discard_buf, 868 HMAC_KEYSIZE, ALWAYS_EXTRACT); 869 bcopy(discard_buf, rmp->rm_mag.rm_previous, 870 HMAC_KEYSIZE); 871 /* rnd_get_bytes() will call mutex_exit(&rndpool_lock) */ 872 mutex_enter(&rndpool_lock); 873 (void) rnd_get_bytes((uint8_t *)rmp->rm_mag.rm_key, 874 HMAC_KEYSIZE, ALWAYS_EXTRACT); 875 /* rnd_get_bytes() will call mutex_exit(&rndpool_lock) */ 876 mutex_enter(&rndpool_lock); 877 (void) rnd_get_bytes((uint8_t *)rmp->rm_mag.rm_seed, 878 HMAC_KEYSIZE, ALWAYS_EXTRACT); 879 } 880 } 881 882 static void 883 rnd_schedule_timeout(void) 884 { 885 clock_t ut; /* time in microseconds */ 886 887 /* 888 * The new timeout value is taken from the buffer of random bytes. 889 * We're merely reading the first 32 bits from the buffer here, not 890 * consuming any random bytes. 891 * The timeout multiplier value is a random value between 0.5 sec and 892 * 1.544480 sec (0.5 sec + 0xFF000 microseconds). 893 * The new timeout is TIMEOUT_INTERVAL times that multiplier. 894 */ 895 ut = 500000 + (clock_t)((((uint32_t)rndpool[findex]) << 12) & 0xFF000); 896 kcf_rndtimeout_id = timeout(rnd_handler, NULL, 897 TIMEOUT_INTERVAL * drv_usectohz(ut)); 898 } 899 900 /* 901 * Called from the driver for a poll on /dev/random 902 * . POLLOUT always succeeds. 903 * . POLLIN and POLLRDNORM will block until a 904 * minimum amount of entropy is available. 905 * 906 * &rnd_pollhead is passed in *phpp in order to indicate the calling thread 907 * will block. When enough random bytes are available, later, the timeout 908 * handler routine will issue the pollwakeup() calls. 909 */ 910 void 911 kcf_rnd_chpoll(short events, int anyyet, short *reventsp, 912 struct pollhead **phpp) 913 { 914 *reventsp = events & POLLOUT; 915 916 if (events & (POLLIN | POLLRDNORM)) { 917 /* 918 * Sampling of rnbyte_cnt is an atomic 919 * operation. Hence we do not need any locking. 920 */ 921 if (rnbyte_cnt >= MINEXTRACTBYTES) 922 *reventsp |= (events & (POLLIN | POLLRDNORM)); 923 } 924 925 if (*reventsp == 0 && !anyyet) 926 *phpp = &rnd_pollhead; 927 } 928 929 /*ARGSUSED*/ 930 static void 931 rnd_handler(void *arg) 932 { 933 int len = 0; 934 935 if (!rng_prov_found && rng_ok_to_log) { 936 cmn_err(CE_WARN, "No randomness provider enabled for " 937 "/dev/random. Use cryptoadm(1M) to enable a provider."); 938 rng_ok_to_log = B_FALSE; 939 } 940 941 if (num_waiters > 0) 942 /* 943 * Note: len has no relationship with how many bytes 944 * a poll thread needs. 945 */ 946 len = MAXEXTRACTBYTES; 947 else if (rnbyte_cnt < RNDPOOLSIZE) 948 len = MINEXTRACTBYTES; 949 950 /* 951 * Only one thread gets to set rngprov_task_idle at a given point 952 * of time and the order of the writes is defined. Also, it is OK 953 * if we read an older value of it and skip the dispatch once 954 * since we will get the correct value during the next time here. 955 * So, no locking is needed here. 956 */ 957 if (len > 0 && rngprov_task_idle) { 958 rngprov_task_idle = B_FALSE; 959 960 /* 961 * It is OK if taskq_dispatch fails here. We will retry 962 * the next time around. Meanwhile, a thread doing a 963 * read() will go to the provider directly, if the 964 * cache becomes empty. 965 */ 966 if (taskq_dispatch(system_taskq, rngprov_task, 967 (void *)(uintptr_t)len, TQ_NOSLEEP | TQ_NOQUEUE) == 0) { 968 rngprov_task_idle = B_TRUE; 969 } 970 } 971 972 mutex_enter(&rndpool_lock); 973 /* 974 * Wake up threads waiting in poll() or for enough accumulated 975 * random bytes to read from /dev/random. In case a poll() is 976 * concurrent with a read(), the polling process may be woken up 977 * indicating that enough randomness is now available for reading, 978 * and another process *steals* the bits from the pool, causing the 979 * subsequent read() from the first process to block. It is acceptable 980 * since the blocking will eventually end, after the timeout 981 * has expired enough times to honor the read. 982 * 983 * Note - Since we hold the rndpool_lock across the pollwakeup() call 984 * we MUST NOT grab the rndpool_lock in kcf_rndchpoll(). 985 */ 986 if (rnbyte_cnt >= MINEXTRACTBYTES) 987 pollwakeup(&rnd_pollhead, POLLIN | POLLRDNORM); 988 989 if (num_waiters > 0) 990 cv_broadcast(&rndpool_read_cv); 991 mutex_exit(&rndpool_lock); 992 993 rnd_schedule_timeout(); 994 } 995 996 static void 997 rndc_addbytes(uint8_t *ptr, size_t len) 998 { 999 ASSERT(ptr != NULL && len > 0); 1000 ASSERT(rnbyte_cnt <= RNDPOOLSIZE); 1001 1002 mutex_enter(&rndpool_lock); 1003 while ((len > 0) && (rnbyte_cnt < RNDPOOLSIZE)) { 1004 rndpool[rindex] ^= *ptr; 1005 ptr++; len--; 1006 rindex = (rindex + 1) & (RNDPOOLSIZE - 1); 1007 rnbyte_cnt++; 1008 } 1009 1010 /* Handle buffer full case */ 1011 while (len > 0) { 1012 rndpool[rindex] ^= *ptr; 1013 ptr++; len--; 1014 findex = rindex = (rindex + 1) & (RNDPOOLSIZE - 1); 1015 } 1016 mutex_exit(&rndpool_lock); 1017 } 1018 1019 /* 1020 * Caller should check len <= rnbyte_cnt under the 1021 * rndpool_lock before calling. 1022 */ 1023 static void 1024 rndc_getbytes(uint8_t *ptr, size_t len) 1025 { 1026 ASSERT(MUTEX_HELD(&rndpool_lock)); 1027 ASSERT(len <= rnbyte_cnt && rnbyte_cnt <= RNDPOOLSIZE); 1028 1029 BUMP_RND_STATS(rs_rndcOut, len); 1030 1031 while (len > 0) { 1032 *ptr = rndpool[findex]; 1033 ptr++; len--; 1034 findex = (findex + 1) & (RNDPOOLSIZE - 1); 1035 rnbyte_cnt--; 1036 } 1037 } 1038 1039 /* Random number exported entry points */ 1040 1041 /* 1042 * Mix the supplied bytes into the entropy pool of a kCF 1043 * RNG provider. 1044 */ 1045 int 1046 random_add_pseudo_entropy(uint8_t *ptr, size_t len, uint_t entropy_est) 1047 { 1048 if (len < 1) 1049 return (-1); 1050 1051 rngprov_seed(ptr, len, entropy_est, 0); 1052 1053 return (0); 1054 } 1055 1056 /* 1057 * Mix the supplied bytes into the entropy pool of a kCF 1058 * RNG provider. Mix immediately. 1059 */ 1060 int 1061 random_add_entropy(uint8_t *ptr, size_t len, uint_t entropy_est) 1062 { 1063 if (len < 1) 1064 return (-1); 1065 1066 rngprov_seed(ptr, len, entropy_est, CRYPTO_SEED_NOW); 1067 1068 return (0); 1069 } 1070 1071 /* 1072 * Get bytes from the /dev/urandom generator. This function 1073 * always succeeds. Returns 0. 1074 */ 1075 int 1076 random_get_pseudo_bytes(uint8_t *ptr, size_t len) 1077 { 1078 ASSERT(!mutex_owned(&rndpool_lock)); 1079 1080 if (len < 1) 1081 return (0); 1082 return (kcf_rnd_get_pseudo_bytes(ptr, len)); 1083 } 1084 1085 /* 1086 * Get bytes from the /dev/random generator. Returns 0 1087 * on success. Returns EAGAIN if there is insufficient entropy. 1088 */ 1089 int 1090 random_get_bytes(uint8_t *ptr, size_t len) 1091 { 1092 ASSERT(!mutex_owned(&rndpool_lock)); 1093 1094 if (len < 1) 1095 return (0); 1096 return (kcf_rnd_get_bytes(ptr, len, B_TRUE)); 1097 } 1098 1099 int 1100 random_get_blocking_bytes(uint8_t *ptr, size_t len) 1101 { 1102 ASSERT(!mutex_owned(&rndpool_lock)); 1103 1104 if (len < 1) 1105 return (0); 1106 return (kcf_rnd_get_bytes(ptr, len, B_FALSE)); 1107 } 1108