1 /* 2 * Copyright 1995-2025 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the Apache License 2.0 (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 /* We need to use some engine deprecated APIs */ 11 #define OPENSSL_SUPPRESS_DEPRECATED 12 13 #include <openssl/err.h> 14 #include <openssl/opensslconf.h> 15 #include <openssl/core_names.h> 16 #include <openssl/provider.h> 17 #include "internal/cryptlib.h" 18 #include "internal/provider.h" 19 #include "internal/thread_once.h" 20 #include "crypto/rand.h" 21 #include "crypto/cryptlib.h" 22 #include "rand_local.h" 23 #include "crypto/context.h" 24 #include "internal/provider.h" 25 26 /* clang-format off */ 27 #ifndef OPENSSL_DEFAULT_SEED_SRC 28 #define OPENSSL_DEFAULT_SEED_SRC SEED-SRC 29 #endif 30 /* clang-format on */ 31 32 typedef struct rand_global_st { 33 /* 34 * The three shared DRBG instances 35 * 36 * There are three shared DRBG instances: <primary>, <public>, and 37 * <private>. The <public> and <private> DRBGs are secondary ones. 38 * These are used for non-secret (e.g. nonces) and secret 39 * (e.g. private keys) data respectively. 40 */ 41 CRYPTO_RWLOCK *lock; 42 43 EVP_RAND_CTX *seed; 44 45 /* 46 * The <primary> DRBG 47 * 48 * Not used directly by the application, only for reseeding the two other 49 * DRBGs. It reseeds itself by pulling either randomness from os entropy 50 * sources or by consuming randomness which was added by RAND_add(). 51 * 52 * The <primary> DRBG is a global instance which is accessed concurrently by 53 * all threads. The necessary locking is managed automatically by its child 54 * DRBG instances during reseeding. 55 */ 56 EVP_RAND_CTX *primary; 57 58 /* 59 * The provider which we'll use to generate randomness. 60 */ 61 #ifndef FIPS_MODULE 62 OSSL_PROVIDER *random_provider; 63 char *random_provider_name; 64 #endif /* !FIPS_MODULE */ 65 66 /* 67 * The <public> DRBG 68 * 69 * Used by default for generating random bytes using RAND_bytes(). 70 * 71 * The <public> secondary DRBG is thread-local, i.e., there is one instance 72 * per thread. 73 */ 74 CRYPTO_THREAD_LOCAL public; 75 76 /* 77 * The <private> DRBG 78 * 79 * Used by default for generating private keys using RAND_priv_bytes() 80 * 81 * The <private> secondary DRBG is thread-local, i.e., there is one 82 * instance per thread. 83 */ 84 CRYPTO_THREAD_LOCAL private; 85 86 /* Which RNG is being used by default and it's configuration settings */ 87 char *rng_name; 88 char *rng_cipher; 89 char *rng_digest; 90 char *rng_propq; 91 92 /* Allow the randomness source to be changed */ 93 char *seed_name; 94 char *seed_propq; 95 } RAND_GLOBAL; 96 97 static EVP_RAND_CTX *rand_get0_primary(OSSL_LIB_CTX *ctx, RAND_GLOBAL *dgbl); 98 static EVP_RAND_CTX *rand_get0_public(OSSL_LIB_CTX *ctx, RAND_GLOBAL *dgbl); 99 static EVP_RAND_CTX *rand_get0_private(OSSL_LIB_CTX *ctx, RAND_GLOBAL *dgbl); 100 101 static RAND_GLOBAL *rand_get_global(OSSL_LIB_CTX *libctx) 102 { 103 return ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_DRBG_INDEX); 104 } 105 106 #ifndef FIPS_MODULE 107 #include <stdio.h> 108 #include <time.h> 109 #include <limits.h> 110 #include <openssl/conf.h> 111 #include <openssl/trace.h> 112 #include <openssl/engine.h> 113 #include "crypto/rand_pool.h" 114 #include "prov/seeding.h" 115 #include "internal/e_os.h" 116 #include "internal/property.h" 117 118 /* 119 * The default name for the random provider. 120 * This ensures that the FIPS provider will supply libcrypto's random byte 121 * requirements. 122 */ 123 static const char random_provider_fips_name[] = "fips"; 124 125 static int set_random_provider_name(RAND_GLOBAL *dgbl, const char *name) 126 { 127 if (dgbl->random_provider_name != NULL 128 && OPENSSL_strcasecmp(dgbl->random_provider_name, name) == 0) 129 return 1; 130 131 OPENSSL_free(dgbl->random_provider_name); 132 dgbl->random_provider_name = OPENSSL_strdup(name); 133 return dgbl->random_provider_name != NULL; 134 } 135 136 #ifndef OPENSSL_NO_ENGINE 137 /* non-NULL if default_RAND_meth is ENGINE-provided */ 138 static ENGINE *funct_ref; 139 static CRYPTO_RWLOCK *rand_engine_lock; 140 #endif /* !OPENSSL_NO_ENGINE */ 141 #ifndef OPENSSL_NO_DEPRECATED_3_0 142 static CRYPTO_RWLOCK *rand_meth_lock; 143 static const RAND_METHOD *default_RAND_meth; 144 #endif /* !OPENSSL_NO_DEPRECATED_3_0 */ 145 static CRYPTO_ONCE rand_init = CRYPTO_ONCE_STATIC_INIT; 146 147 static int rand_inited = 0; 148 149 DEFINE_RUN_ONCE_STATIC(do_rand_init) 150 { 151 #ifndef OPENSSL_NO_ENGINE 152 rand_engine_lock = CRYPTO_THREAD_lock_new(); 153 if (rand_engine_lock == NULL) 154 return 0; 155 #endif /* !OPENSSL_NO_ENGINE */ 156 157 #ifndef OPENSSL_NO_DEPRECATED_3_0 158 rand_meth_lock = CRYPTO_THREAD_lock_new(); 159 if (rand_meth_lock == NULL) 160 goto err; 161 #endif /* !OPENSSL_NO_DEPRECATED_3_0 */ 162 163 if (!ossl_rand_pool_init()) 164 goto err; 165 166 rand_inited = 1; 167 return 1; 168 169 err: 170 #ifndef OPENSSL_NO_DEPRECATED_3_0 171 CRYPTO_THREAD_lock_free(rand_meth_lock); 172 rand_meth_lock = NULL; 173 #endif /* !OPENSSL_NO_DEPRECATED_3_0 */ 174 #ifndef OPENSSL_NO_ENGINE 175 CRYPTO_THREAD_lock_free(rand_engine_lock); 176 rand_engine_lock = NULL; 177 #endif /* !OPENSSL_NO_ENGINE */ 178 return 0; 179 } 180 181 void ossl_rand_cleanup_int(void) 182 { 183 #ifndef OPENSSL_NO_DEPRECATED_3_0 184 const RAND_METHOD *meth = default_RAND_meth; 185 186 if (!rand_inited) 187 return; 188 189 if (meth != NULL && meth->cleanup != NULL) 190 meth->cleanup(); 191 RAND_set_rand_method(NULL); 192 #endif /* !OPENSSL_NO_DEPRECATED_3_0 */ 193 ossl_rand_pool_cleanup(); 194 #ifndef OPENSSL_NO_ENGINE 195 CRYPTO_THREAD_lock_free(rand_engine_lock); 196 rand_engine_lock = NULL; 197 #endif /* !OPENSSL_NO_ENGINE */ 198 #ifndef OPENSSL_NO_DEPRECATED_3_0 199 CRYPTO_THREAD_lock_free(rand_meth_lock); 200 rand_meth_lock = NULL; 201 #endif /* !OPENSSL_NO_DEPRECATED_3_0 */ 202 ossl_release_default_drbg_ctx(); 203 rand_inited = 0; 204 } 205 206 /* 207 * RAND_close_seed_files() ensures that any seed file descriptors are 208 * closed after use. This only applies to libcrypto/default provider, 209 * it does not apply to other providers. 210 */ 211 void RAND_keep_random_devices_open(int keep) 212 { 213 if (RUN_ONCE(&rand_init, do_rand_init)) 214 ossl_rand_pool_keep_random_devices_open(keep); 215 } 216 217 /* 218 * RAND_poll() reseeds the default RNG using random input 219 * 220 * The random input is obtained from polling various entropy 221 * sources which depend on the operating system and are 222 * configurable via the --with-rand-seed configure option. 223 */ 224 int RAND_poll(void) 225 { 226 static const char salt[] = "polling"; 227 228 #ifndef OPENSSL_NO_DEPRECATED_3_0 229 const RAND_METHOD *meth = RAND_get_rand_method(); 230 int ret = meth == RAND_OpenSSL(); 231 232 if (meth == NULL) 233 return 0; 234 235 if (!ret) { 236 /* fill random pool and seed the current legacy RNG */ 237 RAND_POOL *pool = ossl_rand_pool_new(RAND_DRBG_STRENGTH, 1, 238 (RAND_DRBG_STRENGTH + 7) / 8, 239 RAND_POOL_MAX_LENGTH); 240 241 if (pool == NULL) 242 return 0; 243 244 if (ossl_pool_acquire_entropy(pool) == 0) 245 goto err; 246 247 if (meth->add == NULL 248 || meth->add(ossl_rand_pool_buffer(pool), 249 ossl_rand_pool_length(pool), 250 (ossl_rand_pool_entropy(pool) / 8.0)) 251 == 0) 252 goto err; 253 254 ret = 1; 255 err: 256 ossl_rand_pool_free(pool); 257 return ret; 258 } 259 #endif /* !OPENSSL_NO_DEPRECATED_3_0 */ 260 261 RAND_seed(salt, sizeof(salt)); 262 return 1; 263 } 264 265 #ifndef OPENSSL_NO_DEPRECATED_3_0 266 static int rand_set_rand_method_internal(const RAND_METHOD *meth, 267 ossl_unused ENGINE *e) 268 { 269 if (!RUN_ONCE(&rand_init, do_rand_init)) 270 return 0; 271 272 if (!CRYPTO_THREAD_write_lock(rand_meth_lock)) 273 return 0; 274 #ifndef OPENSSL_NO_ENGINE 275 ENGINE_finish(funct_ref); 276 funct_ref = e; 277 #endif 278 default_RAND_meth = meth; 279 CRYPTO_THREAD_unlock(rand_meth_lock); 280 return 1; 281 } 282 283 int RAND_set_rand_method(const RAND_METHOD *meth) 284 { 285 return rand_set_rand_method_internal(meth, NULL); 286 } 287 288 const RAND_METHOD *RAND_get_rand_method(void) 289 { 290 const RAND_METHOD *tmp_meth = NULL; 291 292 if (!RUN_ONCE(&rand_init, do_rand_init)) 293 return NULL; 294 295 if (rand_meth_lock == NULL) 296 return NULL; 297 298 if (!CRYPTO_THREAD_read_lock(rand_meth_lock)) 299 return NULL; 300 tmp_meth = default_RAND_meth; 301 CRYPTO_THREAD_unlock(rand_meth_lock); 302 if (tmp_meth != NULL) 303 return tmp_meth; 304 305 if (!CRYPTO_THREAD_write_lock(rand_meth_lock)) 306 return NULL; 307 if (default_RAND_meth == NULL) { 308 #ifndef OPENSSL_NO_ENGINE 309 ENGINE *e; 310 311 /* If we have an engine that can do RAND, use it. */ 312 if ((e = ENGINE_get_default_RAND()) != NULL 313 && (tmp_meth = ENGINE_get_RAND(e)) != NULL) { 314 funct_ref = e; 315 default_RAND_meth = tmp_meth; 316 } else { 317 ENGINE_finish(e); 318 default_RAND_meth = &ossl_rand_meth; 319 } 320 #else 321 default_RAND_meth = &ossl_rand_meth; 322 #endif 323 } 324 tmp_meth = default_RAND_meth; 325 CRYPTO_THREAD_unlock(rand_meth_lock); 326 return tmp_meth; 327 } 328 329 #if !defined(OPENSSL_NO_ENGINE) 330 int RAND_set_rand_engine(ENGINE *engine) 331 { 332 const RAND_METHOD *tmp_meth = NULL; 333 334 if (!RUN_ONCE(&rand_init, do_rand_init)) 335 return 0; 336 337 if (engine != NULL) { 338 if (!ENGINE_init(engine)) 339 return 0; 340 tmp_meth = ENGINE_get_RAND(engine); 341 if (tmp_meth == NULL) { 342 ENGINE_finish(engine); 343 return 0; 344 } 345 } 346 if (!CRYPTO_THREAD_write_lock(rand_engine_lock)) { 347 ENGINE_finish(engine); 348 return 0; 349 } 350 351 /* This function releases any prior ENGINE so call it first */ 352 rand_set_rand_method_internal(tmp_meth, engine); 353 CRYPTO_THREAD_unlock(rand_engine_lock); 354 return 1; 355 } 356 #endif 357 #endif /* OPENSSL_NO_DEPRECATED_3_0 */ 358 359 void RAND_seed(const void *buf, int num) 360 { 361 EVP_RAND_CTX *drbg; 362 #ifndef OPENSSL_NO_DEPRECATED_3_0 363 const RAND_METHOD *meth = RAND_get_rand_method(); 364 365 if (meth != NULL && meth->seed != NULL) { 366 meth->seed(buf, num); 367 return; 368 } 369 #endif 370 371 drbg = RAND_get0_primary(NULL); 372 if (drbg != NULL && num > 0) 373 EVP_RAND_reseed(drbg, 0, NULL, 0, buf, num); 374 } 375 376 void RAND_add(const void *buf, int num, double randomness) 377 { 378 EVP_RAND_CTX *drbg; 379 #ifndef OPENSSL_NO_DEPRECATED_3_0 380 const RAND_METHOD *meth = RAND_get_rand_method(); 381 382 if (meth != NULL && meth->add != NULL) { 383 meth->add(buf, num, randomness); 384 return; 385 } 386 #endif 387 drbg = RAND_get0_primary(NULL); 388 if (drbg != NULL && num > 0) 389 #ifdef OPENSSL_RAND_SEED_NONE 390 /* Without an entropy source, we have to rely on the user */ 391 EVP_RAND_reseed(drbg, 0, buf, num, NULL, 0); 392 #else 393 /* With an entropy source, we downgrade this to additional input */ 394 EVP_RAND_reseed(drbg, 0, NULL, 0, buf, num); 395 #endif 396 } 397 398 #if !defined(OPENSSL_NO_DEPRECATED_1_1_0) 399 int RAND_pseudo_bytes(unsigned char *buf, int num) 400 { 401 const RAND_METHOD *meth = RAND_get_rand_method(); 402 403 if (meth != NULL && meth->pseudorand != NULL) 404 return meth->pseudorand(buf, num); 405 ERR_raise(ERR_LIB_RAND, RAND_R_FUNC_NOT_IMPLEMENTED); 406 return -1; 407 } 408 #endif 409 410 int RAND_status(void) 411 { 412 EVP_RAND_CTX *rand; 413 #ifndef OPENSSL_NO_DEPRECATED_3_0 414 const RAND_METHOD *meth = RAND_get_rand_method(); 415 416 if (meth != NULL && meth != RAND_OpenSSL()) 417 return meth->status != NULL ? meth->status() : 0; 418 #endif 419 420 if ((rand = RAND_get0_primary(NULL)) == NULL) 421 return 0; 422 return EVP_RAND_get_state(rand) == EVP_RAND_STATE_READY; 423 } 424 #else /* !FIPS_MODULE */ 425 426 #ifndef OPENSSL_NO_DEPRECATED_3_0 427 const RAND_METHOD *RAND_get_rand_method(void) 428 { 429 return NULL; 430 } 431 #endif 432 #endif /* !FIPS_MODULE */ 433 434 /* 435 * This function is not part of RAND_METHOD, so if we're not using 436 * the default method, then just call RAND_bytes(). Otherwise make 437 * sure we're instantiated and use the private DRBG. 438 */ 439 int RAND_priv_bytes_ex(OSSL_LIB_CTX *ctx, unsigned char *buf, size_t num, 440 unsigned int strength) 441 { 442 RAND_GLOBAL *dgbl; 443 EVP_RAND_CTX *rand; 444 #if !defined(OPENSSL_NO_DEPRECATED_3_0) && !defined(FIPS_MODULE) 445 const RAND_METHOD *meth = RAND_get_rand_method(); 446 447 if (meth != NULL && meth != RAND_OpenSSL()) { 448 if (meth->bytes != NULL) 449 return meth->bytes(buf, num); 450 ERR_raise(ERR_LIB_RAND, RAND_R_FUNC_NOT_IMPLEMENTED); 451 return -1; 452 } 453 #endif 454 455 dgbl = rand_get_global(ctx); 456 if (dgbl == NULL) 457 return 0; 458 #ifndef FIPS_MODULE 459 if (dgbl->random_provider != NULL) 460 return ossl_provider_random_bytes(dgbl->random_provider, 461 OSSL_PROV_RANDOM_PRIVATE, 462 buf, num, strength); 463 #endif /* !FIPS_MODULE */ 464 rand = rand_get0_private(ctx, dgbl); 465 if (rand != NULL) 466 return EVP_RAND_generate(rand, buf, num, strength, 0, NULL, 0); 467 468 return 0; 469 } 470 471 int RAND_priv_bytes(unsigned char *buf, int num) 472 { 473 if (num < 0) 474 return 0; 475 return RAND_priv_bytes_ex(NULL, buf, (size_t)num, 0); 476 } 477 478 int RAND_bytes_ex(OSSL_LIB_CTX *ctx, unsigned char *buf, size_t num, 479 unsigned int strength) 480 { 481 RAND_GLOBAL *dgbl; 482 EVP_RAND_CTX *rand; 483 #if !defined(OPENSSL_NO_DEPRECATED_3_0) && !defined(FIPS_MODULE) 484 const RAND_METHOD *meth = RAND_get_rand_method(); 485 486 if (meth != NULL && meth != RAND_OpenSSL()) { 487 if (meth->bytes != NULL) 488 return meth->bytes(buf, num); 489 ERR_raise(ERR_LIB_RAND, RAND_R_FUNC_NOT_IMPLEMENTED); 490 return -1; 491 } 492 #endif 493 494 dgbl = rand_get_global(ctx); 495 if (dgbl == NULL) 496 return 0; 497 #ifndef FIPS_MODULE 498 if (dgbl->random_provider != NULL) 499 return ossl_provider_random_bytes(dgbl->random_provider, 500 OSSL_PROV_RANDOM_PUBLIC, 501 buf, num, strength); 502 #endif /* !FIPS_MODULE */ 503 504 rand = rand_get0_public(ctx, dgbl); 505 if (rand != NULL) 506 return EVP_RAND_generate(rand, buf, num, strength, 0, NULL, 0); 507 508 return 0; 509 } 510 511 int RAND_bytes(unsigned char *buf, int num) 512 { 513 if (num < 0) 514 return 0; 515 return RAND_bytes_ex(NULL, buf, (size_t)num, 0); 516 } 517 518 /* 519 * Initialize the OSSL_LIB_CTX global DRBGs on first use. 520 * Returns the allocated global data on success or NULL on failure. 521 */ 522 void *ossl_rand_ctx_new(OSSL_LIB_CTX *libctx) 523 { 524 RAND_GLOBAL *dgbl = OPENSSL_zalloc(sizeof(*dgbl)); 525 526 if (dgbl == NULL) 527 return NULL; 528 529 #ifndef FIPS_MODULE 530 /* 531 * We need to ensure that base libcrypto thread handling has been 532 * initialised. 533 */ 534 OPENSSL_init_crypto(OPENSSL_INIT_BASE_ONLY, NULL); 535 536 /* Prepopulate the random provider name */ 537 dgbl->random_provider_name = OPENSSL_strdup(random_provider_fips_name); 538 if (dgbl->random_provider_name == NULL) 539 goto err0; 540 #endif 541 542 dgbl->lock = CRYPTO_THREAD_lock_new(); 543 if (dgbl->lock == NULL) 544 goto err1; 545 546 if (!CRYPTO_THREAD_init_local(&dgbl->private, NULL)) 547 goto err1; 548 549 if (!CRYPTO_THREAD_init_local(&dgbl->public, NULL)) 550 goto err2; 551 552 return dgbl; 553 554 err2: 555 CRYPTO_THREAD_cleanup_local(&dgbl->private); 556 err1: 557 CRYPTO_THREAD_lock_free(dgbl->lock); 558 #ifndef FIPS_MODULE 559 err0: 560 OPENSSL_free(dgbl->random_provider_name); 561 #endif 562 OPENSSL_free(dgbl); 563 return NULL; 564 } 565 566 void ossl_rand_ctx_free(void *vdgbl) 567 { 568 RAND_GLOBAL *dgbl = vdgbl; 569 570 if (dgbl == NULL) 571 return; 572 573 CRYPTO_THREAD_lock_free(dgbl->lock); 574 CRYPTO_THREAD_cleanup_local(&dgbl->private); 575 CRYPTO_THREAD_cleanup_local(&dgbl->public); 576 EVP_RAND_CTX_free(dgbl->primary); 577 EVP_RAND_CTX_free(dgbl->seed); 578 #ifndef FIPS_MODULE 579 OPENSSL_free(dgbl->random_provider_name); 580 #endif /* !FIPS_MODULE */ 581 OPENSSL_free(dgbl->rng_name); 582 OPENSSL_free(dgbl->rng_cipher); 583 OPENSSL_free(dgbl->rng_digest); 584 OPENSSL_free(dgbl->rng_propq); 585 OPENSSL_free(dgbl->seed_name); 586 OPENSSL_free(dgbl->seed_propq); 587 588 OPENSSL_free(dgbl); 589 } 590 591 static void rand_delete_thread_state(void *arg) 592 { 593 OSSL_LIB_CTX *ctx = arg; 594 RAND_GLOBAL *dgbl = rand_get_global(ctx); 595 EVP_RAND_CTX *rand; 596 597 if (dgbl == NULL) 598 return; 599 600 rand = CRYPTO_THREAD_get_local(&dgbl->public); 601 CRYPTO_THREAD_set_local(&dgbl->public, NULL); 602 EVP_RAND_CTX_free(rand); 603 604 rand = CRYPTO_THREAD_get_local(&dgbl->private); 605 CRYPTO_THREAD_set_local(&dgbl->private, NULL); 606 EVP_RAND_CTX_free(rand); 607 } 608 609 #if !defined(FIPS_MODULE) || !defined(OPENSSL_NO_FIPS_JITTER) 610 static EVP_RAND_CTX *rand_new_seed(OSSL_LIB_CTX *libctx) 611 { 612 EVP_RAND *rand; 613 const char *propq; 614 char *name; 615 EVP_RAND_CTX *ctx = NULL; 616 #ifdef OPENSSL_NO_FIPS_JITTER 617 RAND_GLOBAL *dgbl = rand_get_global(libctx); 618 619 if (dgbl == NULL) 620 return NULL; 621 propq = dgbl->seed_propq; 622 name = dgbl->seed_name != NULL ? dgbl->seed_name 623 : OPENSSL_MSTR(OPENSSL_DEFAULT_SEED_SRC); 624 #else /* !OPENSSL_NO_FIPS_JITTER */ 625 name = "JITTER"; 626 propq = ""; 627 #endif /* OPENSSL_NO_FIPS_JITTER */ 628 629 rand = EVP_RAND_fetch(libctx, name, propq); 630 if (rand == NULL) { 631 ERR_raise(ERR_LIB_RAND, RAND_R_UNABLE_TO_FETCH_DRBG); 632 goto err; 633 } 634 ctx = EVP_RAND_CTX_new(rand, NULL); 635 EVP_RAND_free(rand); 636 if (ctx == NULL) { 637 ERR_raise(ERR_LIB_RAND, RAND_R_UNABLE_TO_CREATE_DRBG); 638 goto err; 639 } 640 if (!EVP_RAND_instantiate(ctx, 0, 0, NULL, 0, NULL)) { 641 ERR_raise(ERR_LIB_RAND, RAND_R_ERROR_INSTANTIATING_DRBG); 642 goto err; 643 } 644 return ctx; 645 err: 646 EVP_RAND_CTX_free(ctx); 647 return NULL; 648 } 649 #endif /* !FIPS_MODULE || !OPENSSL_NO_FIPS_JITTER */ 650 651 #ifndef FIPS_MODULE 652 EVP_RAND_CTX *ossl_rand_get0_seed_noncreating(OSSL_LIB_CTX *ctx) 653 { 654 RAND_GLOBAL *dgbl = rand_get_global(ctx); 655 EVP_RAND_CTX *ret; 656 657 if (dgbl == NULL) 658 return NULL; 659 660 if (!CRYPTO_THREAD_read_lock(dgbl->lock)) 661 return NULL; 662 ret = dgbl->seed; 663 CRYPTO_THREAD_unlock(dgbl->lock); 664 return ret; 665 } 666 #endif /* !FIPS_MODULE */ 667 668 static EVP_RAND_CTX *rand_new_drbg(OSSL_LIB_CTX *libctx, EVP_RAND_CTX *parent, 669 unsigned int reseed_interval, 670 time_t reseed_time_interval) 671 { 672 EVP_RAND *rand; 673 RAND_GLOBAL *dgbl = rand_get_global(libctx); 674 EVP_RAND_CTX *ctx; 675 OSSL_PARAM params[9], *p = params; 676 const OSSL_PARAM *settables; 677 const char *prov_name; 678 char *name, *cipher; 679 int use_df = 1; 680 681 if (dgbl == NULL) 682 return NULL; 683 name = dgbl->rng_name != NULL ? dgbl->rng_name : "CTR-DRBG"; 684 rand = EVP_RAND_fetch(libctx, name, dgbl->rng_propq); 685 if (rand == NULL) { 686 ERR_raise(ERR_LIB_RAND, RAND_R_UNABLE_TO_FETCH_DRBG); 687 return NULL; 688 } 689 prov_name = ossl_provider_name(EVP_RAND_get0_provider(rand)); 690 ctx = EVP_RAND_CTX_new(rand, parent); 691 EVP_RAND_free(rand); 692 if (ctx == NULL) { 693 ERR_raise(ERR_LIB_RAND, RAND_R_UNABLE_TO_CREATE_DRBG); 694 return NULL; 695 } 696 697 settables = EVP_RAND_CTX_settable_params(ctx); 698 if (OSSL_PARAM_locate_const(settables, OSSL_DRBG_PARAM_CIPHER)) { 699 cipher = dgbl->rng_cipher != NULL ? dgbl->rng_cipher : "AES-256-CTR"; 700 *p++ = OSSL_PARAM_construct_utf8_string(OSSL_DRBG_PARAM_CIPHER, 701 cipher, 0); 702 } 703 if (dgbl->rng_digest != NULL 704 && OSSL_PARAM_locate_const(settables, OSSL_DRBG_PARAM_DIGEST)) 705 *p++ = OSSL_PARAM_construct_utf8_string(OSSL_DRBG_PARAM_DIGEST, 706 dgbl->rng_digest, 0); 707 if (prov_name != NULL) 708 *p++ = OSSL_PARAM_construct_utf8_string(OSSL_PROV_PARAM_CORE_PROV_NAME, 709 (char *)prov_name, 0); 710 if (dgbl->rng_propq != NULL) 711 *p++ = OSSL_PARAM_construct_utf8_string(OSSL_DRBG_PARAM_PROPERTIES, 712 dgbl->rng_propq, 0); 713 if (OSSL_PARAM_locate_const(settables, OSSL_ALG_PARAM_MAC)) 714 *p++ = OSSL_PARAM_construct_utf8_string(OSSL_ALG_PARAM_MAC, "HMAC", 0); 715 if (OSSL_PARAM_locate_const(settables, OSSL_DRBG_PARAM_USE_DF)) 716 *p++ = OSSL_PARAM_construct_int(OSSL_DRBG_PARAM_USE_DF, &use_df); 717 *p++ = OSSL_PARAM_construct_uint(OSSL_DRBG_PARAM_RESEED_REQUESTS, 718 &reseed_interval); 719 *p++ = OSSL_PARAM_construct_time_t(OSSL_DRBG_PARAM_RESEED_TIME_INTERVAL, 720 &reseed_time_interval); 721 *p = OSSL_PARAM_construct_end(); 722 if (!EVP_RAND_instantiate(ctx, 0, 0, NULL, 0, params)) { 723 ERR_raise(ERR_LIB_RAND, RAND_R_ERROR_INSTANTIATING_DRBG); 724 EVP_RAND_CTX_free(ctx); 725 return NULL; 726 } 727 return ctx; 728 } 729 730 #if defined(FIPS_MODULE) 731 static EVP_RAND_CTX *rand_new_crngt(OSSL_LIB_CTX *libctx, EVP_RAND_CTX *parent) 732 { 733 EVP_RAND *rand; 734 EVP_RAND_CTX *ctx; 735 736 rand = EVP_RAND_fetch(libctx, "CRNG-TEST", "-fips"); 737 if (rand == NULL) { 738 ERR_raise(ERR_LIB_RAND, RAND_R_UNABLE_TO_FETCH_DRBG); 739 return NULL; 740 } 741 ctx = EVP_RAND_CTX_new(rand, parent); 742 EVP_RAND_free(rand); 743 if (ctx == NULL) { 744 ERR_raise(ERR_LIB_RAND, RAND_R_UNABLE_TO_CREATE_DRBG); 745 return NULL; 746 } 747 748 if (!EVP_RAND_instantiate(ctx, 0, 0, NULL, 0, NULL)) { 749 ERR_raise(ERR_LIB_RAND, RAND_R_ERROR_INSTANTIATING_DRBG); 750 EVP_RAND_CTX_free(ctx); 751 return NULL; 752 } 753 return ctx; 754 } 755 #endif /* FIPS_MODULE */ 756 757 /* 758 * Get the primary random generator. 759 * Returns pointer to its EVP_RAND_CTX on success, NULL on failure. 760 * 761 */ 762 static EVP_RAND_CTX *rand_get0_primary(OSSL_LIB_CTX *ctx, RAND_GLOBAL *dgbl) 763 { 764 EVP_RAND_CTX *ret, *seed, *newseed = NULL, *primary; 765 766 if (dgbl == NULL) 767 return NULL; 768 769 if (!CRYPTO_THREAD_read_lock(dgbl->lock)) 770 return NULL; 771 772 ret = dgbl->primary; 773 seed = dgbl->seed; 774 CRYPTO_THREAD_unlock(dgbl->lock); 775 776 if (ret != NULL) 777 return ret; 778 779 #if !defined(FIPS_MODULE) || !defined(OPENSSL_NO_FIPS_JITTER) 780 /* Create a seed source for libcrypto or jitter enabled FIPS provider */ 781 if (seed == NULL) { 782 ERR_set_mark(); 783 seed = newseed = rand_new_seed(ctx); 784 ERR_pop_to_mark(); 785 } 786 #endif /* !FIPS_MODULE || !OPENSSL_NO_FIPS_JITTER */ 787 788 #if defined(FIPS_MODULE) 789 /* The FIPS provider has entropy health tests instead of the primary */ 790 ret = rand_new_crngt(ctx, seed); 791 #else /* FIPS_MODULE */ 792 ret = rand_new_drbg(ctx, seed, PRIMARY_RESEED_INTERVAL, 793 PRIMARY_RESEED_TIME_INTERVAL); 794 #endif /* FIPS_MODULE */ 795 796 /* 797 * The primary DRBG may be shared between multiple threads so we must 798 * enable locking. 799 */ 800 if (ret == NULL || !EVP_RAND_enable_locking(ret)) { 801 if (ret != NULL) { 802 ERR_raise(ERR_LIB_EVP, EVP_R_UNABLE_TO_ENABLE_LOCKING); 803 EVP_RAND_CTX_free(ret); 804 } 805 if (newseed == NULL) 806 return NULL; 807 /* else carry on and store seed */ 808 ret = NULL; 809 } 810 811 if (!CRYPTO_THREAD_write_lock(dgbl->lock)) 812 return NULL; 813 814 primary = dgbl->primary; 815 if (primary != NULL) { 816 CRYPTO_THREAD_unlock(dgbl->lock); 817 EVP_RAND_CTX_free(ret); 818 EVP_RAND_CTX_free(newseed); 819 return primary; 820 } 821 if (newseed != NULL) 822 dgbl->seed = newseed; 823 dgbl->primary = ret; 824 CRYPTO_THREAD_unlock(dgbl->lock); 825 826 return ret; 827 } 828 829 /* 830 * Get the primary random generator. 831 * Returns pointer to its EVP_RAND_CTX on success, NULL on failure. 832 * 833 */ 834 EVP_RAND_CTX *RAND_get0_primary(OSSL_LIB_CTX *ctx) 835 { 836 RAND_GLOBAL *dgbl = rand_get_global(ctx); 837 838 return dgbl == NULL ? NULL : rand_get0_primary(ctx, dgbl); 839 } 840 841 static EVP_RAND_CTX *rand_get0_public(OSSL_LIB_CTX *ctx, RAND_GLOBAL *dgbl) 842 { 843 EVP_RAND_CTX *rand, *primary; 844 845 if (dgbl == NULL) 846 return NULL; 847 848 rand = CRYPTO_THREAD_get_local(&dgbl->public); 849 if (rand == NULL) { 850 primary = rand_get0_primary(ctx, dgbl); 851 if (primary == NULL) 852 return NULL; 853 854 ctx = ossl_lib_ctx_get_concrete(ctx); 855 856 if (ctx == NULL) 857 return NULL; 858 /* 859 * If the private is also NULL then this is the first time we've 860 * used this thread. 861 */ 862 if (CRYPTO_THREAD_get_local(&dgbl->private) == NULL 863 && !ossl_init_thread_start(NULL, ctx, rand_delete_thread_state)) 864 return NULL; 865 rand = rand_new_drbg(ctx, primary, SECONDARY_RESEED_INTERVAL, 866 SECONDARY_RESEED_TIME_INTERVAL); 867 CRYPTO_THREAD_set_local(&dgbl->public, rand); 868 } 869 return rand; 870 } 871 872 /* 873 * Get the public random generator. 874 * Returns pointer to its EVP_RAND_CTX on success, NULL on failure. 875 */ 876 EVP_RAND_CTX *RAND_get0_public(OSSL_LIB_CTX *ctx) 877 { 878 RAND_GLOBAL *dgbl = rand_get_global(ctx); 879 880 return dgbl == NULL ? NULL : rand_get0_public(ctx, dgbl); 881 } 882 883 static EVP_RAND_CTX *rand_get0_private(OSSL_LIB_CTX *ctx, RAND_GLOBAL *dgbl) 884 { 885 EVP_RAND_CTX *rand, *primary; 886 887 rand = CRYPTO_THREAD_get_local(&dgbl->private); 888 if (rand == NULL) { 889 primary = rand_get0_primary(ctx, dgbl); 890 if (primary == NULL) 891 return NULL; 892 893 ctx = ossl_lib_ctx_get_concrete(ctx); 894 895 if (ctx == NULL) 896 return NULL; 897 /* 898 * If the public is also NULL then this is the first time we've 899 * used this thread. 900 */ 901 if (CRYPTO_THREAD_get_local(&dgbl->public) == NULL 902 && !ossl_init_thread_start(NULL, ctx, rand_delete_thread_state)) 903 return NULL; 904 rand = rand_new_drbg(ctx, primary, SECONDARY_RESEED_INTERVAL, 905 SECONDARY_RESEED_TIME_INTERVAL); 906 CRYPTO_THREAD_set_local(&dgbl->private, rand); 907 } 908 return rand; 909 } 910 911 /* 912 * Get the private random generator. 913 * Returns pointer to its EVP_RAND_CTX on success, NULL on failure. 914 */ 915 EVP_RAND_CTX *RAND_get0_private(OSSL_LIB_CTX *ctx) 916 { 917 RAND_GLOBAL *dgbl = rand_get_global(ctx); 918 919 return dgbl == NULL ? NULL : rand_get0_private(ctx, dgbl); 920 } 921 922 #ifdef FIPS_MODULE 923 EVP_RAND_CTX *ossl_rand_get0_private_noncreating(OSSL_LIB_CTX *ctx) 924 { 925 RAND_GLOBAL *dgbl = rand_get_global(ctx); 926 927 if (dgbl == NULL) 928 return NULL; 929 930 return CRYPTO_THREAD_get_local(&dgbl->private); 931 } 932 #endif 933 934 int RAND_set0_public(OSSL_LIB_CTX *ctx, EVP_RAND_CTX *rand) 935 { 936 RAND_GLOBAL *dgbl = rand_get_global(ctx); 937 EVP_RAND_CTX *old; 938 int r; 939 940 if (dgbl == NULL) 941 return 0; 942 old = CRYPTO_THREAD_get_local(&dgbl->public); 943 if ((r = CRYPTO_THREAD_set_local(&dgbl->public, rand)) > 0) 944 EVP_RAND_CTX_free(old); 945 return r; 946 } 947 948 int RAND_set0_private(OSSL_LIB_CTX *ctx, EVP_RAND_CTX *rand) 949 { 950 RAND_GLOBAL *dgbl = rand_get_global(ctx); 951 EVP_RAND_CTX *old; 952 int r; 953 954 if (dgbl == NULL) 955 return 0; 956 old = CRYPTO_THREAD_get_local(&dgbl->private); 957 if ((r = CRYPTO_THREAD_set_local(&dgbl->private, rand)) > 0) 958 EVP_RAND_CTX_free(old); 959 return r; 960 } 961 962 #ifndef FIPS_MODULE 963 static int random_set_string(char **p, const char *s) 964 { 965 char *d = NULL; 966 967 if (s != NULL) { 968 d = OPENSSL_strdup(s); 969 if (d == NULL) 970 return 0; 971 } 972 OPENSSL_free(*p); 973 *p = d; 974 return 1; 975 } 976 977 /* 978 * Load the DRBG definitions from a configuration file. 979 */ 980 static int random_conf_init(CONF_IMODULE *md, const CONF *cnf) 981 { 982 STACK_OF(CONF_VALUE) *elist; 983 CONF_VALUE *cval; 984 OSSL_LIB_CTX *libctx = NCONF_get0_libctx((CONF *)cnf); 985 RAND_GLOBAL *dgbl = rand_get_global(libctx); 986 int i, r = 1; 987 988 OSSL_TRACE1(CONF, "Loading random module: section %s\n", 989 CONF_imodule_get_value(md)); 990 991 /* Value is a section containing RANDOM configuration */ 992 elist = NCONF_get_section(cnf, CONF_imodule_get_value(md)); 993 if (elist == NULL) { 994 ERR_raise(ERR_LIB_CRYPTO, CRYPTO_R_RANDOM_SECTION_ERROR); 995 return 0; 996 } 997 998 if (dgbl == NULL) 999 return 0; 1000 1001 for (i = 0; i < sk_CONF_VALUE_num(elist); i++) { 1002 cval = sk_CONF_VALUE_value(elist, i); 1003 if (OPENSSL_strcasecmp(cval->name, "random") == 0) { 1004 if (!random_set_string(&dgbl->rng_name, cval->value)) 1005 return 0; 1006 } else if (OPENSSL_strcasecmp(cval->name, "cipher") == 0) { 1007 if (!random_set_string(&dgbl->rng_cipher, cval->value)) 1008 return 0; 1009 } else if (OPENSSL_strcasecmp(cval->name, "digest") == 0) { 1010 if (!random_set_string(&dgbl->rng_digest, cval->value)) 1011 return 0; 1012 } else if (OPENSSL_strcasecmp(cval->name, "properties") == 0) { 1013 if (!random_set_string(&dgbl->rng_propq, cval->value)) 1014 return 0; 1015 } else if (OPENSSL_strcasecmp(cval->name, "seed") == 0) { 1016 if (!random_set_string(&dgbl->seed_name, cval->value)) 1017 return 0; 1018 } else if (OPENSSL_strcasecmp(cval->name, "seed_properties") == 0) { 1019 if (!random_set_string(&dgbl->seed_propq, cval->value)) 1020 return 0; 1021 } else if (OPENSSL_strcasecmp(cval->name, "random_provider") == 0) { 1022 #ifndef FIPS_MODULE 1023 OSSL_PROVIDER *prov = ossl_provider_find(libctx, cval->value, 0); 1024 1025 if (prov != NULL) { 1026 if (!RAND_set1_random_provider(libctx, prov)) { 1027 ERR_raise(ERR_LIB_CRYPTO, ERR_R_INTERNAL_ERROR); 1028 OSSL_PROVIDER_unload(prov); 1029 return 0; 1030 } 1031 /* 1032 * We need to release the reference from ossl_provider_find because 1033 * we don't want to keep a reference counted handle to the provider. 1034 * 1035 * The provider unload code checks for the random provider and, 1036 * if present, our reference will be NULLed when it is fully freed. 1037 * The provider load code, conversely, checks the provider name 1038 * and re-hooks our reference if required. This means that a load, 1039 * hook random provider, use, unload, reload, reuse sequence will 1040 * work as expected. 1041 */ 1042 OSSL_PROVIDER_unload(prov); 1043 } else if (!set_random_provider_name(dgbl, cval->value)) 1044 return 0; 1045 #endif 1046 } else { 1047 ERR_raise_data(ERR_LIB_CRYPTO, 1048 CRYPTO_R_UNKNOWN_NAME_IN_RANDOM_SECTION, 1049 "name=%s, value=%s", cval->name, cval->value); 1050 r = 0; 1051 } 1052 } 1053 return r; 1054 } 1055 1056 static void random_conf_deinit(CONF_IMODULE *md) 1057 { 1058 OSSL_TRACE(CONF, "Cleaned up random\n"); 1059 } 1060 1061 void ossl_random_add_conf_module(void) 1062 { 1063 OSSL_TRACE(CONF, "Adding config module 'random'\n"); 1064 CONF_module_add("random", random_conf_init, random_conf_deinit); 1065 } 1066 1067 int RAND_set_DRBG_type(OSSL_LIB_CTX *ctx, const char *drbg, const char *propq, 1068 const char *cipher, const char *digest) 1069 { 1070 RAND_GLOBAL *dgbl = rand_get_global(ctx); 1071 1072 if (dgbl == NULL) 1073 return 0; 1074 if (dgbl->primary != NULL) { 1075 ERR_raise(ERR_LIB_RAND, RAND_R_ALREADY_INSTANTIATED); 1076 return 0; 1077 } 1078 return random_set_string(&dgbl->rng_name, drbg) 1079 && random_set_string(&dgbl->rng_propq, propq) 1080 && random_set_string(&dgbl->rng_cipher, cipher) 1081 && random_set_string(&dgbl->rng_digest, digest); 1082 } 1083 1084 int RAND_set_seed_source_type(OSSL_LIB_CTX *ctx, const char *seed, 1085 const char *propq) 1086 { 1087 RAND_GLOBAL *dgbl = rand_get_global(ctx); 1088 1089 if (dgbl == NULL) 1090 return 0; 1091 if (dgbl->seed != NULL) { 1092 ERR_raise(ERR_LIB_RAND, RAND_R_ALREADY_INSTANTIATED); 1093 return 0; 1094 } 1095 return random_set_string(&dgbl->seed_name, seed) 1096 && random_set_string(&dgbl->seed_propq, propq); 1097 } 1098 1099 int RAND_set1_random_provider(OSSL_LIB_CTX *ctx, OSSL_PROVIDER *prov) 1100 { 1101 RAND_GLOBAL *dgbl = rand_get_global(ctx); 1102 1103 if (dgbl == NULL) 1104 return 0; 1105 1106 if (prov == NULL) { 1107 OPENSSL_free(dgbl->random_provider_name); 1108 dgbl->random_provider_name = NULL; 1109 dgbl->random_provider = NULL; 1110 return 1; 1111 } 1112 1113 if (dgbl->random_provider == prov) 1114 return 1; 1115 1116 if (!set_random_provider_name(dgbl, OSSL_PROVIDER_get0_name(prov))) 1117 return 0; 1118 1119 dgbl->random_provider = prov; 1120 return 1; 1121 } 1122 1123 /* 1124 * When a new provider is loaded, we need to check to see if it is the 1125 * designated randomness provider and register it if it is. 1126 */ 1127 int ossl_rand_check_random_provider_on_load(OSSL_LIB_CTX *ctx, 1128 OSSL_PROVIDER *prov) 1129 { 1130 RAND_GLOBAL *dgbl = rand_get_global(ctx); 1131 1132 if (dgbl == NULL) 1133 return 0; 1134 1135 /* No random provider name specified, or one is installed already */ 1136 if (dgbl->random_provider_name == NULL || dgbl->random_provider != NULL) 1137 return 1; 1138 1139 /* Does this provider match the name we're using? */ 1140 if (strcmp(dgbl->random_provider_name, OSSL_PROVIDER_get0_name(prov)) != 0) 1141 return 1; 1142 1143 dgbl->random_provider = prov; 1144 return 1; 1145 } 1146 1147 /* 1148 * When a provider is being unloaded, if it is the randomness provider, 1149 * we need to deregister it. 1150 */ 1151 int ossl_rand_check_random_provider_on_unload(OSSL_LIB_CTX *ctx, 1152 OSSL_PROVIDER *prov) 1153 { 1154 RAND_GLOBAL *dgbl = rand_get_global(ctx); 1155 1156 if (dgbl == NULL) 1157 return 0; 1158 1159 if (dgbl->random_provider == prov) 1160 dgbl->random_provider = NULL; 1161 return 1; 1162 } 1163 1164 #endif /* !FIPS_MODULE */ 1165