drbg_lib.c 32.8 KB
Newer Older
R
Rich Salz 已提交
1
/*
2
 * Copyright 2011-2018 The OpenSSL Project Authors. All Rights Reserved.
R
Rich Salz 已提交
3 4 5 6 7 8 9 10 11 12 13 14
 *
 * Licensed under the OpenSSL license (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */

#include <string.h>
#include <openssl/crypto.h>
#include <openssl/err.h>
#include <openssl/rand.h>
#include "rand_lcl.h"
15 16
#include "internal/thread_once.h"
#include "internal/rand_int.h"
17
#include "internal/cryptlib_int.h"
R
Rich Salz 已提交
18 19

/*
20 21 22
 * Support framework for NIST SP 800-90A DRBG
 *
 * See manual page RAND_DRBG(7) for a general overview.
R
Rich Salz 已提交
23
 *
R
Rich Salz 已提交
24 25 26 27 28 29 30 31
 * The OpenSSL model is to have new and free functions, and that new
 * does all initialization.  That is not the NIST model, which has
 * instantiation and un-instantiate, and re-use within a new/free
 * lifecycle.  (No doubt this comes from the desire to support hardware
 * DRBG, where allocation of resources on something like an HSM is
 * a much bigger deal than just re-setting an allocated resource.)
 */

32
/*
33
 * The three shared DRBG instances
34
 *
35 36 37 38 39
 * There are three shared DRBG instances: <master>, <public>, and <private>.
 */

/*
 * The <master> DRBG
40 41 42
 *
 * Not used directly by the application, only for reseeding the two other
 * DRBGs. It reseeds itself by pulling either randomness from os entropy
43
 * sources or by consuming randomness which was added by RAND_add().
44
 *
45 46 47 48 49 50 51
 * The <master> DRBG is a global instance which is accessed concurrently by
 * all threads. The necessary locking is managed automatically by its child
 * DRBG instances during reseeding.
 */
static RAND_DRBG *master_drbg;
/*
 * The <public> DRBG
52
 *
53
 * Used by default for generating random bytes using RAND_bytes().
D
Dr. Matthias St. Pierre 已提交
54
 *
55 56 57 58 59
 * The <public> DRBG is thread-local, i.e., there is one instance per thread.
 */
static CRYPTO_THREAD_LOCAL public_drbg;
/*
 * The <private> DRBG
D
Dr. Matthias St. Pierre 已提交
60
 *
61
 * Used by default for generating private keys using RAND_priv_bytes()
62
 *
63
 * The <private> DRBG is thread-local, i.e., there is one instance per thread.
64
 */
65 66
static CRYPTO_THREAD_LOCAL private_drbg;

67 68 69 70 71


/* NIST SP 800-90A DRBG recommends the use of a personalization string. */
static const char ossl_pers_string[] = "OpenSSL NIST SP 800-90A DRBG";

72 73
static CRYPTO_ONCE rand_drbg_init = CRYPTO_ONCE_STATIC_INIT;

74 75 76 77 78


static int rand_drbg_type = RAND_DRBG_TYPE;
static unsigned int rand_drbg_flags = RAND_DRBG_FLAGS;

79 80 81 82 83 84
static unsigned int master_reseed_interval = MASTER_RESEED_INTERVAL;
static unsigned int slave_reseed_interval  = SLAVE_RESEED_INTERVAL;

static time_t master_reseed_time_interval = MASTER_RESEED_TIME_INTERVAL;
static time_t slave_reseed_time_interval  = SLAVE_RESEED_TIME_INTERVAL;

85 86 87 88
/* A logical OR of all used DRBG flag bits (currently there is only one) */
static const unsigned int rand_drbg_used_flags =
    RAND_DRBG_FLAG_CTR_NO_DF;

89
static RAND_DRBG *drbg_setup(RAND_DRBG *parent);
90 91 92 93 94

static RAND_DRBG *rand_drbg_new(int secure,
                                int type,
                                unsigned int flags,
                                RAND_DRBG *parent);
95

R
Rich Salz 已提交
96
/*
97 98 99
 * Set/initialize |drbg| to be of type |type|, with optional |flags|.
 *
 * If |type| and |flags| are zero, use the defaults
100 101
 *
 * Returns 1 on success, 0 on failure.
R
Rich Salz 已提交
102
 */
103
int RAND_DRBG_set(RAND_DRBG *drbg, int type, unsigned int flags)
R
Rich Salz 已提交
104 105 106
{
    int ret = 1;

107 108 109 110 111
    if (type == 0 && flags == 0) {
        type = rand_drbg_type;
        flags = rand_drbg_flags;
    }

R
Rich Salz 已提交
112 113
    drbg->state = DRBG_UNINITIALISED;
    drbg->flags = flags;
114
    drbg->type = type;
R
Rich Salz 已提交
115

116
    switch (type) {
R
Rich Salz 已提交
117 118
    default:
        RANDerr(RAND_F_RAND_DRBG_SET, RAND_R_UNSUPPORTED_DRBG_TYPE);
119
        return 0;
R
Rich Salz 已提交
120 121 122 123 124 125
    case 0:
        /* Uninitialized; that's okay. */
        return 1;
    case NID_aes_128_ctr:
    case NID_aes_192_ctr:
    case NID_aes_256_ctr:
126
        ret = drbg_ctr_init(drbg);
R
Rich Salz 已提交
127 128 129
        break;
    }

130
    if (ret == 0)
R
Rich Salz 已提交
131 132 133 134
        RANDerr(RAND_F_RAND_DRBG_SET, RAND_R_ERROR_INITIALISING_DRBG);
    return ret;
}

135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
/*
 * Set/initialize default |type| and |flag| for new drbg instances.
 *
 * Returns 1 on success, 0 on failure.
 */
int RAND_DRBG_set_defaults(int type, unsigned int flags)
{
    int ret = 1;

    switch (type) {
    default:
        RANDerr(RAND_F_RAND_DRBG_SET_DEFAULTS, RAND_R_UNSUPPORTED_DRBG_TYPE);
        return 0;
    case NID_aes_128_ctr:
    case NID_aes_192_ctr:
    case NID_aes_256_ctr:
        break;
    }

154
    if ((flags & ~rand_drbg_used_flags) != 0) {
155 156 157 158 159 160 161 162 163 164 165
        RANDerr(RAND_F_RAND_DRBG_SET_DEFAULTS, RAND_R_UNSUPPORTED_DRBG_FLAGS);
        return 0;
    }

    rand_drbg_type  = type;
    rand_drbg_flags = flags;

    return ret;
}


R
Rich Salz 已提交
166
/*
167 168 169
 * Allocate memory and initialize a new DRBG. The DRBG is allocated on
 * the secure heap if |secure| is nonzero and the secure heap is enabled.
 * The |parent|, if not NULL, will be used as random source for reseeding.
170 171
 *
 * Returns a pointer to the new DRBG instance on success, NULL on failure.
R
Rich Salz 已提交
172
 */
173 174 175 176
static RAND_DRBG *rand_drbg_new(int secure,
                                int type,
                                unsigned int flags,
                                RAND_DRBG *parent)
R
Rich Salz 已提交
177
{
178 179
    RAND_DRBG *drbg = secure ?
        OPENSSL_secure_zalloc(sizeof(*drbg)) : OPENSSL_zalloc(sizeof(*drbg));
R
Rich Salz 已提交
180

R
Rich Salz 已提交
181
    if (drbg == NULL) {
R
Rich Salz 已提交
182
        RANDerr(RAND_F_RAND_DRBG_NEW, ERR_R_MALLOC_FAILURE);
183
        return NULL;
R
Rich Salz 已提交
184
    }
185 186

    drbg->secure = secure && CRYPTO_secure_allocated(drbg);
R
Rich Salz 已提交
187
    drbg->fork_count = rand_fork_count;
R
Rich Salz 已提交
188
    drbg->parent = parent;
189 190

    if (parent == NULL) {
191 192 193 194 195 196 197
        drbg->get_entropy = rand_drbg_get_entropy;
        drbg->cleanup_entropy = rand_drbg_cleanup_entropy;
#ifndef RAND_DRBG_GET_RANDOM_NONCE
        drbg->get_nonce = rand_drbg_get_nonce;
        drbg->cleanup_nonce = rand_drbg_cleanup_nonce;
#endif

198 199 200
        drbg->reseed_interval = master_reseed_interval;
        drbg->reseed_time_interval = master_reseed_time_interval;
    } else {
201 202 203 204 205 206 207
        drbg->get_entropy = rand_drbg_get_entropy;
        drbg->cleanup_entropy = rand_drbg_cleanup_entropy;
        /*
         * Do not provide nonce callbacks, the child DRBGs will
         * obtain their nonce using random bits from the parent.
         */

208 209 210 211
        drbg->reseed_interval = slave_reseed_interval;
        drbg->reseed_time_interval = slave_reseed_time_interval;
    }

212
    if (RAND_DRBG_set(drbg, type, flags) == 0)
R
Rich Salz 已提交
213 214
        goto err;

215 216 217 218 219 220 221 222 223 224 225 226
    if (parent != NULL) {
        rand_drbg_lock(parent);
        if (drbg->strength > parent->strength) {
            /*
             * We currently don't support the algorithm from NIST SP 800-90C
             * 10.1.2 to use a weaker DRBG as source
             */
            rand_drbg_unlock(parent);
            RANDerr(RAND_F_RAND_DRBG_NEW, RAND_R_PARENT_STRENGTH_TOO_WEAK);
            goto err;
        }
        rand_drbg_unlock(parent);
K
Kurt Roeckx 已提交
227 228
    }

R
Rich Salz 已提交
229 230
    return drbg;

F
FdaSilvaYY 已提交
231
 err:
232 233 234 235 236
    if (drbg->secure)
        OPENSSL_secure_free(drbg);
    else
        OPENSSL_free(drbg);

R
Rich Salz 已提交
237
    return NULL;
R
Rich Salz 已提交
238 239
}

240 241 242 243 244 245 246 247 248 249
RAND_DRBG *RAND_DRBG_new(int type, unsigned int flags, RAND_DRBG *parent)
{
    return rand_drbg_new(0, type, flags, parent);
}

RAND_DRBG *RAND_DRBG_secure_new(int type, unsigned int flags, RAND_DRBG *parent)
{
    return rand_drbg_new(1, type, flags, parent);
}

R
Rich Salz 已提交
250
/*
R
Rich Salz 已提交
251
 * Uninstantiate |drbg| and free all memory.
R
Rich Salz 已提交
252
 */
R
Rich Salz 已提交
253
void RAND_DRBG_free(RAND_DRBG *drbg)
R
Rich Salz 已提交
254
{
255
    if (drbg == NULL)
R
Rich Salz 已提交
256 257
        return;

258 259
    if (drbg->meth != NULL)
        drbg->meth->uninstantiate(drbg);
260
    CRYPTO_THREAD_lock_free(drbg->lock);
R
Rich Salz 已提交
261
    CRYPTO_free_ex_data(CRYPTO_EX_INDEX_DRBG, drbg, &drbg->ex_data);
262 263 264 265 266

    if (drbg->secure)
        OPENSSL_secure_clear_free(drbg, sizeof(*drbg));
    else
        OPENSSL_clear_free(drbg, sizeof(*drbg));
R
Rich Salz 已提交
267 268 269
}

/*
R
Rich Salz 已提交
270
 * Instantiate |drbg|, after it has been initialized.  Use |pers| and
R
Rich Salz 已提交
271
 * |perslen| as prediction-resistance input.
B
Benjamin Kaduk 已提交
272 273
 *
 * Requires that drbg->lock is already locked for write, if non-null.
274 275
 *
 * Returns 1 on success, 0 on failure.
R
Rich Salz 已提交
276
 */
R
Rich Salz 已提交
277
int RAND_DRBG_instantiate(RAND_DRBG *drbg,
R
Rich Salz 已提交
278 279 280
                          const unsigned char *pers, size_t perslen)
{
    unsigned char *nonce = NULL, *entropy = NULL;
281
    size_t noncelen = 0, entropylen = 0;
282 283 284
    size_t min_entropy = drbg->strength;
    size_t min_entropylen = drbg->min_entropylen;
    size_t max_entropylen = drbg->max_entropylen;
R
Rich Salz 已提交
285

286
    if (perslen > drbg->max_perslen) {
R
Rich Salz 已提交
287 288
        RANDerr(RAND_F_RAND_DRBG_INSTANTIATE,
                RAND_R_PERSONALISATION_STRING_TOO_LONG);
R
Rich Salz 已提交
289 290
        goto end;
    }
291

292
    if (drbg->meth == NULL) {
293 294 295 296 297
        RANDerr(RAND_F_RAND_DRBG_INSTANTIATE,
                RAND_R_NO_DRBG_IMPLEMENTATION_SELECTED);
        goto end;
    }

R
Rich Salz 已提交
298 299 300 301
    if (drbg->state != DRBG_UNINITIALISED) {
        RANDerr(RAND_F_RAND_DRBG_INSTANTIATE,
                drbg->state == DRBG_ERROR ? RAND_R_IN_ERROR_STATE
                                          : RAND_R_ALREADY_INSTANTIATED);
R
Rich Salz 已提交
302 303 304
        goto end;
    }

R
Rich Salz 已提交
305
    drbg->state = DRBG_ERROR;
306 307 308 309 310 311 312 313 314 315 316 317 318

    /*
     * NIST SP800-90Ar1 section 9.1 says you can combine getting the entropy
     * and nonce in 1 call by increasing the entropy with 50% and increasing
     * the minimum length to accomadate the length of the nonce.
     * We do this in case a nonce is require and get_nonce is NULL.
     */
    if (drbg->min_noncelen > 0 && drbg->get_nonce == NULL) {
        min_entropy += drbg->strength / 2;
        min_entropylen += drbg->min_noncelen;
        max_entropylen += drbg->max_noncelen;
    }

319 320 321 322 323 324 325
    drbg->reseed_next_counter = tsan_load(&drbg->reseed_prop_counter);
    if (drbg->reseed_next_counter) {
        drbg->reseed_next_counter++;
        if(!drbg->reseed_next_counter)
            drbg->reseed_next_counter = 1;
    }

R
Rich Salz 已提交
326
    if (drbg->get_entropy != NULL)
327 328 329
        entropylen = drbg->get_entropy(drbg, &entropy, min_entropy,
                                       min_entropylen, max_entropylen, 0);
    if (entropylen < min_entropylen
F
FdaSilvaYY 已提交
330
            || entropylen > max_entropylen) {
R
Rich Salz 已提交
331
        RANDerr(RAND_F_RAND_DRBG_INSTANTIATE, RAND_R_ERROR_RETRIEVING_ENTROPY);
R
Rich Salz 已提交
332 333 334
        goto end;
    }

335
    if (drbg->min_noncelen > 0 && drbg->get_nonce != NULL) {
R
Rich Salz 已提交
336
        noncelen = drbg->get_nonce(drbg, &nonce, drbg->strength / 2,
337 338
                                   drbg->min_noncelen, drbg->max_noncelen);
        if (noncelen < drbg->min_noncelen || noncelen > drbg->max_noncelen) {
339
            RANDerr(RAND_F_RAND_DRBG_INSTANTIATE, RAND_R_ERROR_RETRIEVING_NONCE);
R
Rich Salz 已提交
340 341 342 343
            goto end;
        }
    }

344
    if (!drbg->meth->instantiate(drbg, entropy, entropylen,
R
Rich Salz 已提交
345
                         nonce, noncelen, pers, perslen)) {
R
Rich Salz 已提交
346
        RANDerr(RAND_F_RAND_DRBG_INSTANTIATE, RAND_R_ERROR_INSTANTIATING_DRBG);
R
Rich Salz 已提交
347 348 349
        goto end;
    }

R
Rich Salz 已提交
350
    drbg->state = DRBG_READY;
351
    drbg->reseed_gen_counter = 0;
352
    drbg->reseed_time = time(NULL);
353
    tsan_store(&drbg->reseed_prop_counter, drbg->reseed_next_counter);
R
Rich Salz 已提交
354

F
FdaSilvaYY 已提交
355
 end:
R
Rich Salz 已提交
356
    if (entropy != NULL && drbg->cleanup_entropy != NULL)
357
        drbg->cleanup_entropy(drbg, entropy, entropylen);
F
FdaSilvaYY 已提交
358
    if (nonce != NULL && drbg->cleanup_nonce != NULL)
359
        drbg->cleanup_nonce(drbg, nonce, noncelen);
360 361 362 363 364 365
    if (drbg->pool != NULL) {
        if (drbg->state == DRBG_READY) {
            RANDerr(RAND_F_RAND_DRBG_INSTANTIATE,
                    RAND_R_ERROR_ENTROPY_POOL_WAS_IGNORED);
            drbg->state = DRBG_ERROR;
        }
366
        rand_pool_free(drbg->pool);
367 368
        drbg->pool = NULL;
    }
R
Rich Salz 已提交
369
    if (drbg->state == DRBG_READY)
R
Rich Salz 已提交
370 371 372 373 374
        return 1;
    return 0;
}

/*
R
Rich Salz 已提交
375
 * Uninstantiate |drbg|. Must be instantiated before it can be used.
B
Benjamin Kaduk 已提交
376 377
 *
 * Requires that drbg->lock is already locked for write, if non-null.
378 379
 *
 * Returns 1 on success, 0 on failure.
R
Rich Salz 已提交
380
 */
R
Rich Salz 已提交
381
int RAND_DRBG_uninstantiate(RAND_DRBG *drbg)
R
Rich Salz 已提交
382
{
383
    if (drbg->meth == NULL) {
384 385 386 387 388
        RANDerr(RAND_F_RAND_DRBG_UNINSTANTIATE,
                RAND_R_NO_DRBG_IMPLEMENTATION_SELECTED);
        return 0;
    }

389 390 391 392
    /* Clear the entire drbg->ctr struct, then reset some important
     * members of the drbg->ctr struct (e.g. keysize, df_ks) to their
     * initial values.
     */
393
    drbg->meth->uninstantiate(drbg);
394
    return RAND_DRBG_set(drbg, drbg->type, drbg->flags);
R
Rich Salz 已提交
395 396 397
}

/*
398
 * Reseed |drbg|, mixing in the specified data
B
Benjamin Kaduk 已提交
399 400
 *
 * Requires that drbg->lock is already locked for write, if non-null.
401 402
 *
 * Returns 1 on success, 0 on failure.
R
Rich Salz 已提交
403
 */
R
Rich Salz 已提交
404
int RAND_DRBG_reseed(RAND_DRBG *drbg,
405 406
                     const unsigned char *adin, size_t adinlen,
                     int prediction_resistance)
R
Rich Salz 已提交
407 408
{
    unsigned char *entropy = NULL;
409
    size_t entropylen = 0;
R
Rich Salz 已提交
410 411 412 413 414 415 416 417

    if (drbg->state == DRBG_ERROR) {
        RANDerr(RAND_F_RAND_DRBG_RESEED, RAND_R_IN_ERROR_STATE);
        return 0;
    }
    if (drbg->state == DRBG_UNINITIALISED) {
        RANDerr(RAND_F_RAND_DRBG_RESEED, RAND_R_NOT_INSTANTIATED);
        return 0;
R
Rich Salz 已提交
418 419
    }

420
    if (adin == NULL) {
R
Rich Salz 已提交
421
        adinlen = 0;
422
    } else if (adinlen > drbg->max_adinlen) {
R
Rich Salz 已提交
423 424
        RANDerr(RAND_F_RAND_DRBG_RESEED, RAND_R_ADDITIONAL_INPUT_TOO_LONG);
        return 0;
R
Rich Salz 已提交
425 426
    }

R
Rich Salz 已提交
427
    drbg->state = DRBG_ERROR;
428 429 430 431 432 433 434 435

    drbg->reseed_next_counter = tsan_load(&drbg->reseed_prop_counter);
    if (drbg->reseed_next_counter) {
        drbg->reseed_next_counter++;
        if(!drbg->reseed_next_counter)
            drbg->reseed_next_counter = 1;
    }

R
Rich Salz 已提交
436
    if (drbg->get_entropy != NULL)
437
        entropylen = drbg->get_entropy(drbg, &entropy, drbg->strength,
438 439 440
                                       drbg->min_entropylen,
                                       drbg->max_entropylen,
                                       prediction_resistance);
441
    if (entropylen < drbg->min_entropylen
F
FdaSilvaYY 已提交
442
            || entropylen > drbg->max_entropylen) {
R
Rich Salz 已提交
443
        RANDerr(RAND_F_RAND_DRBG_RESEED, RAND_R_ERROR_RETRIEVING_ENTROPY);
R
Rich Salz 已提交
444 445 446
        goto end;
    }

447
    if (!drbg->meth->reseed(drbg, entropy, entropylen, adin, adinlen))
R
Rich Salz 已提交
448
        goto end;
449

R
Rich Salz 已提交
450
    drbg->state = DRBG_READY;
451
    drbg->reseed_gen_counter = 0;
452
    drbg->reseed_time = time(NULL);
453
    tsan_store(&drbg->reseed_prop_counter, drbg->reseed_next_counter);
R
Rich Salz 已提交
454

F
FdaSilvaYY 已提交
455
 end:
R
Rich Salz 已提交
456
    if (entropy != NULL && drbg->cleanup_entropy != NULL)
457
        drbg->cleanup_entropy(drbg, entropy, entropylen);
R
Rich Salz 已提交
458
    if (drbg->state == DRBG_READY)
R
Rich Salz 已提交
459 460 461 462
        return 1;
    return 0;
}

463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488
/*
 * Restart |drbg|, using the specified entropy or additional input
 *
 * Tries its best to get the drbg instantiated by all means,
 * regardless of its current state.
 *
 * Optionally, a |buffer| of |len| random bytes can be passed,
 * which is assumed to contain at least |entropy| bits of entropy.
 *
 * If |entropy| > 0, the buffer content is used as entropy input.
 *
 * If |entropy| == 0, the buffer content is used as additional input
 *
 * Returns 1 on success, 0 on failure.
 *
 * This function is used internally only.
 */
int rand_drbg_restart(RAND_DRBG *drbg,
                      const unsigned char *buffer, size_t len, size_t entropy)
{
    int reseeded = 0;
    const unsigned char *adin = NULL;
    size_t adinlen = 0;

    if (drbg->pool != NULL) {
        RANDerr(RAND_F_RAND_DRBG_RESTART, ERR_R_INTERNAL_ERROR);
489
        drbg->state = DRBG_ERROR;
490
        rand_pool_free(drbg->pool);
491
        drbg->pool = NULL;
492
        return 0;
493 494 495 496 497 498 499
    }

    if (buffer != NULL) {
        if (entropy > 0) {
            if (drbg->max_entropylen < len) {
                RANDerr(RAND_F_RAND_DRBG_RESTART,
                    RAND_R_ENTROPY_INPUT_TOO_LONG);
500
                drbg->state = DRBG_ERROR;
501 502 503 504 505
                return 0;
            }

            if (entropy > 8 * len) {
                RANDerr(RAND_F_RAND_DRBG_RESTART, RAND_R_ENTROPY_OUT_OF_RANGE);
506
                drbg->state = DRBG_ERROR;
507 508 509 510
                return 0;
            }

            /* will be picked up by the rand_drbg_get_entropy() callback */
511
            drbg->pool = rand_pool_attach(buffer, len, entropy);
512 513 514 515 516 517
            if (drbg->pool == NULL)
                return 0;
        } else {
            if (drbg->max_adinlen < len) {
                RANDerr(RAND_F_RAND_DRBG_RESTART,
                        RAND_R_ADDITIONAL_INPUT_TOO_LONG);
518
                drbg->state = DRBG_ERROR;
519 520 521 522 523 524 525 526
                return 0;
            }
            adin = buffer;
            adinlen = len;
        }
    }

    /* repair error state */
527
    if (drbg->state == DRBG_ERROR)
528 529 530 531
        RAND_DRBG_uninstantiate(drbg);

    /* repair uninitialized state */
    if (drbg->state == DRBG_UNINITIALISED) {
532 533 534 535
        /* reinstantiate drbg */
        RAND_DRBG_instantiate(drbg,
                              (const unsigned char *) ossl_pers_string,
                              sizeof(ossl_pers_string) - 1);
536 537 538 539 540 541 542 543 544 545 546 547 548 549 550
        /* already reseeded. prevent second reseeding below */
        reseeded = (drbg->state == DRBG_READY);
    }

    /* refresh current state if entropy or additional input has been provided */
    if (drbg->state == DRBG_READY) {
        if (adin != NULL) {
            /*
             * mix in additional input without reseeding
             *
             * Similar to RAND_DRBG_reseed(), but the provided additional
             * data |adin| is mixed into the current state without pulling
             * entropy from the trusted entropy source using get_entropy().
             * This is not a reseeding in the strict sense of NIST SP 800-90A.
             */
551
            drbg->meth->reseed(drbg, adin, adinlen, NULL, 0);
552 553
        } else if (reseeded == 0) {
            /* do a full reseeding if it has not been done yet above */
554
            RAND_DRBG_reseed(drbg, NULL, 0, 0);
555 556 557 558 559 560 561
        }
    }

    /* check whether a given entropy pool was cleared properly during reseed */
    if (drbg->pool != NULL) {
        drbg->state = DRBG_ERROR;
        RANDerr(RAND_F_RAND_DRBG_RESTART, ERR_R_INTERNAL_ERROR);
562
        rand_pool_free(drbg->pool);
563 564 565 566 567 568 569
        drbg->pool = NULL;
        return 0;
    }

    return drbg->state == DRBG_READY;
}

R
Rich Salz 已提交
570 571 572 573
/*
 * Generate |outlen| bytes into the buffer at |out|.  Reseed if we need
 * to or if |prediction_resistance| is set.  Additional input can be
 * sent in |adin| and |adinlen|.
574
 *
B
Benjamin Kaduk 已提交
575 576
 * Requires that drbg->lock is already locked for write, if non-null.
 *
577 578
 * Returns 1 on success, 0 on failure.
 *
R
Rich Salz 已提交
579
 */
R
Rich Salz 已提交
580
int RAND_DRBG_generate(RAND_DRBG *drbg, unsigned char *out, size_t outlen,
R
Rich Salz 已提交
581 582 583
                       int prediction_resistance,
                       const unsigned char *adin, size_t adinlen)
{
584 585
    int reseed_required = 0;

586 587 588 589 590 591 592 593 594 595 596 597
    if (drbg->state != DRBG_READY) {
        /* try to recover from previous errors */
        rand_drbg_restart(drbg, NULL, 0, 0);

        if (drbg->state == DRBG_ERROR) {
            RANDerr(RAND_F_RAND_DRBG_GENERATE, RAND_R_IN_ERROR_STATE);
            return 0;
        }
        if (drbg->state == DRBG_UNINITIALISED) {
            RANDerr(RAND_F_RAND_DRBG_GENERATE, RAND_R_NOT_INSTANTIATED);
            return 0;
        }
R
Rich Salz 已提交
598
    }
599

R
Rich Salz 已提交
600 601 602 603
    if (outlen > drbg->max_request) {
        RANDerr(RAND_F_RAND_DRBG_GENERATE, RAND_R_REQUEST_TOO_LARGE_FOR_DRBG);
        return 0;
    }
604
    if (adinlen > drbg->max_adinlen) {
R
Rich Salz 已提交
605 606
        RANDerr(RAND_F_RAND_DRBG_GENERATE, RAND_R_ADDITIONAL_INPUT_TOO_LONG);
        return 0;
R
Rich Salz 已提交
607 608
    }

R
Rich Salz 已提交
609 610
    if (drbg->fork_count != rand_fork_count) {
        drbg->fork_count = rand_fork_count;
611
        reseed_required = 1;
R
Rich Salz 已提交
612 613
    }

614
    if (drbg->reseed_interval > 0) {
615
        if (drbg->reseed_gen_counter >= drbg->reseed_interval)
616 617
            reseed_required = 1;
    }
618 619 620 621 622 623
    if (drbg->reseed_time_interval > 0) {
        time_t now = time(NULL);
        if (now < drbg->reseed_time
            || now - drbg->reseed_time >= drbg->reseed_time_interval)
            reseed_required = 1;
    }
624 625 626 627 628
    if (drbg->parent != NULL) {
        unsigned int reseed_counter = tsan_load(&drbg->reseed_prop_counter);
        if (reseed_counter > 0
                && tsan_load(&drbg->parent->reseed_prop_counter)
                   != reseed_counter)
629 630
            reseed_required = 1;
    }
R
Rich Salz 已提交
631

632
    if (reseed_required || prediction_resistance) {
633
        if (!RAND_DRBG_reseed(drbg, adin, adinlen, prediction_resistance)) {
R
Rich Salz 已提交
634 635
            RANDerr(RAND_F_RAND_DRBG_GENERATE, RAND_R_RESEED_ERROR);
            return 0;
R
Rich Salz 已提交
636 637 638 639 640
        }
        adin = NULL;
        adinlen = 0;
    }

641
    if (!drbg->meth->generate(drbg, out, outlen, adin, adinlen)) {
R
Rich Salz 已提交
642 643 644
        drbg->state = DRBG_ERROR;
        RANDerr(RAND_F_RAND_DRBG_GENERATE, RAND_R_GENERATE_ERROR);
        return 0;
R
Rich Salz 已提交
645
    }
R
Rich Salz 已提交
646

647
    drbg->reseed_gen_counter++;
648

R
Rich Salz 已提交
649 650 651
    return 1;
}

K
Kurt Roeckx 已提交
652 653 654 655 656 657 658 659 660 661 662 663
/*
 * Generates |outlen| random bytes and stores them in |out|. It will
 * using the given |drbg| to generate the bytes.
 *
 * Requires that drbg->lock is already locked for write, if non-null.
 *
 * Returns 1 on success 0 on failure.
 */
int RAND_DRBG_bytes(RAND_DRBG *drbg, unsigned char *out, size_t outlen)
{
    unsigned char *additional = NULL;
    size_t additional_len;
664
    size_t chunk;
K
Kurt Roeckx 已提交
665 666 667
    size_t ret;

    additional_len = rand_drbg_get_additional_data(&additional, drbg->max_adinlen);
668 669 670 671 672 673 674 675 676 677 678 679

    for ( ; outlen > 0; outlen -= chunk, out += chunk) {
        chunk = outlen;
        if (chunk > drbg->max_request)
            chunk = drbg->max_request;
        ret = RAND_DRBG_generate(drbg, out, chunk, 0, additional, additional_len);
        if (!ret)
            goto err;
    }
    ret = 1;

err:
K
Kurt Roeckx 已提交
680 681 682 683 684 685
    if (additional_len != 0)
        OPENSSL_secure_clear_free(additional, additional_len);

    return ret;
}

R
Rich Salz 已提交
686
/*
687 688
 * Set the RAND_DRBG callbacks for obtaining entropy and nonce.
 *
689 690
 * Setting the callbacks is allowed only if the drbg has not been
 * initialized yet. Otherwise, the operation will fail.
691
 *
692
 * Returns 1 on success, 0 on failure.
R
Rich Salz 已提交
693
 */
R
Rich Salz 已提交
694
int RAND_DRBG_set_callbacks(RAND_DRBG *drbg,
695 696 697 698
                            RAND_DRBG_get_entropy_fn get_entropy,
                            RAND_DRBG_cleanup_entropy_fn cleanup_entropy,
                            RAND_DRBG_get_nonce_fn get_nonce,
                            RAND_DRBG_cleanup_nonce_fn cleanup_nonce)
R
Rich Salz 已提交
699
{
700 701
    if (drbg->state != DRBG_UNINITIALISED
            || drbg->parent != NULL)
R
Rich Salz 已提交
702
        return 0;
703 704 705 706
    drbg->get_entropy = get_entropy;
    drbg->cleanup_entropy = cleanup_entropy;
    drbg->get_nonce = get_nonce;
    drbg->cleanup_nonce = cleanup_nonce;
R
Rich Salz 已提交
707 708 709 710
    return 1;
}

/*
R
Rich Salz 已提交
711
 * Set the reseed interval.
712 713 714
 *
 * The drbg will reseed automatically whenever the number of generate
 * requests exceeds the given reseed interval. If the reseed interval
715
 * is 0, then this feature is disabled.
716 717
 *
 * Returns 1 on success, 0 on failure.
R
Rich Salz 已提交
718
 */
719
int RAND_DRBG_set_reseed_interval(RAND_DRBG *drbg, unsigned int interval)
R
Rich Salz 已提交
720
{
721
    if (interval > MAX_RESEED_INTERVAL)
722
        return 0;
R
Rich Salz 已提交
723
    drbg->reseed_interval = interval;
724
    return 1;
R
Rich Salz 已提交
725 726
}

727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744
/*
 * Set the reseed time interval.
 *
 * The drbg will reseed automatically whenever the time elapsed since
 * the last reseeding exceeds the given reseed time interval. For safety,
 * a reseeding will also occur if the clock has been reset to a smaller
 * value.
 *
 * Returns 1 on success, 0 on failure.
 */
int RAND_DRBG_set_reseed_time_interval(RAND_DRBG *drbg, time_t interval)
{
    if (interval > MAX_RESEED_TIME_INTERVAL)
        return 0;
    drbg->reseed_time_interval = interval;
    return 1;
}

745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776
/*
 * Set the default values for reseed (time) intervals of new DRBG instances
 *
 * The default values can be set independently for master DRBG instances
 * (without a parent) and slave DRBG instances (with parent).
 *
 * Returns 1 on success, 0 on failure.
 */

int RAND_DRBG_set_reseed_defaults(
                                  unsigned int _master_reseed_interval,
                                  unsigned int _slave_reseed_interval,
                                  time_t _master_reseed_time_interval,
                                  time_t _slave_reseed_time_interval
                                  )
{
    if (_master_reseed_interval > MAX_RESEED_INTERVAL
        || _slave_reseed_interval > MAX_RESEED_INTERVAL)
        return 0;

    if (_master_reseed_time_interval > MAX_RESEED_TIME_INTERVAL
        || _slave_reseed_time_interval > MAX_RESEED_TIME_INTERVAL)
        return 0;

    master_reseed_interval = _master_reseed_interval;
    slave_reseed_interval = _slave_reseed_interval;

    master_reseed_time_interval = _master_reseed_time_interval;
    slave_reseed_time_interval = _slave_reseed_time_interval;

    return 1;
}
D
Dr. Matthias St. Pierre 已提交
777 778 779 780 781 782 783

/*
 * Locks the given drbg. Locking a drbg which does not have locking
 * enabled is considered a successful no-op.
 *
 * Returns 1 on success, 0 on failure.
 */
784
int rand_drbg_lock(RAND_DRBG *drbg)
D
Dr. Matthias St. Pierre 已提交
785 786 787 788 789 790 791 792 793 794 795 796 797
{
    if (drbg->lock != NULL)
        return CRYPTO_THREAD_write_lock(drbg->lock);

    return 1;
}

/*
 * Unlocks the given drbg. Unlocking a drbg which does not have locking
 * enabled is considered a successful no-op.
 *
 * Returns 1 on success, 0 on failure.
 */
798
int rand_drbg_unlock(RAND_DRBG *drbg)
D
Dr. Matthias St. Pierre 已提交
799 800 801 802 803 804 805 806 807 808 809 810 811 812 813
{
    if (drbg->lock != NULL)
        return CRYPTO_THREAD_unlock(drbg->lock);

    return 1;
}

/*
 * Enables locking for the given drbg
 *
 * Locking can only be enabled if the random generator
 * is in the uninitialized state.
 *
 * Returns 1 on success, 0 on failure.
 */
814
int rand_drbg_enable_locking(RAND_DRBG *drbg)
D
Dr. Matthias St. Pierre 已提交
815 816 817 818 819 820 821 822
{
    if (drbg->state != DRBG_UNINITIALISED) {
        RANDerr(RAND_F_RAND_DRBG_ENABLE_LOCKING,
                RAND_R_DRBG_ALREADY_INITIALIZED);
        return 0;
    }

    if (drbg->lock == NULL) {
823
        if (drbg->parent != NULL && drbg->parent->lock == NULL) {
D
Dr. Matthias St. Pierre 已提交
824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839
            RANDerr(RAND_F_RAND_DRBG_ENABLE_LOCKING,
                    RAND_R_PARENT_LOCKING_NOT_ENABLED);
            return 0;
        }

        drbg->lock = CRYPTO_THREAD_lock_new();
        if (drbg->lock == NULL) {
            RANDerr(RAND_F_RAND_DRBG_ENABLE_LOCKING,
                    RAND_R_FAILED_TO_CREATE_LOCK);
            return 0;
        }
    }

    return 1;
}

R
Rich Salz 已提交
840 841 842
/*
 * Get and set the EXDATA
 */
R
Rich Salz 已提交
843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858
int RAND_DRBG_set_ex_data(RAND_DRBG *drbg, int idx, void *arg)
{
    return CRYPTO_set_ex_data(&drbg->ex_data, idx, arg);
}

void *RAND_DRBG_get_ex_data(const RAND_DRBG *drbg, int idx)
{
    return CRYPTO_get_ex_data(&drbg->ex_data, idx);
}


/*
 * The following functions provide a RAND_METHOD that works on the
 * global DRBG.  They lock.
 */

859
/*
860 861
 * Allocates a new global DRBG on the secure heap (if enabled) and
 * initializes it with default settings.
862 863
 *
 * Returns a pointer to the new DRBG instance on success, NULL on failure.
864
 */
865
static RAND_DRBG *drbg_setup(RAND_DRBG *parent)
866
{
867
    RAND_DRBG *drbg;
868

869
    drbg = RAND_DRBG_secure_new(rand_drbg_type, rand_drbg_flags, parent);
870 871 872
    if (drbg == NULL)
        return NULL;

873 874
    /* Only the master DRBG needs to have a lock */
    if (parent == NULL && rand_drbg_enable_locking(drbg) == 0)
875
        goto err;
876 877

    /* enable seed propagation */
878
    tsan_store(&drbg->reseed_prop_counter, 1);
879

880
    /*
881
     * Ignore instantiation error to support just-in-time instantiation.
882 883 884 885
     *
     * The state of the drbg will be checked in RAND_DRBG_generate() and
     * an automatic recovery is attempted.
     */
886 887 888
    (void)RAND_DRBG_instantiate(drbg,
                                (const unsigned char *) ossl_pers_string,
                                sizeof(ossl_pers_string) - 1);
889 890 891
    return drbg;

err:
892
    RAND_DRBG_free(drbg);
893
    return NULL;
894 895 896 897 898 899
}

/*
 * Initialize the global DRBGs on first use.
 * Returns 1 on success, 0 on failure.
 */
900
DEFINE_RUN_ONCE_STATIC(do_rand_drbg_init)
901
{
902 903 904 905 906 907 908
    /*
     * ensure that libcrypto is initialized, otherwise the
     * DRBG locks are not cleaned up properly
     */
    if (!OPENSSL_init_crypto(0, NULL))
        return 0;

909 910
    if (!CRYPTO_THREAD_init_local(&private_drbg, NULL))
        return 0;
911

912 913
    if (!CRYPTO_THREAD_init_local(&public_drbg, NULL))
        goto err1;
914

915 916 917
    master_drbg = drbg_setup(NULL);
    if (master_drbg == NULL)
        goto err2;
918

919
    return 1;
920 921 922 923 924 925

err2:
    CRYPTO_THREAD_cleanup_local(&public_drbg);
err1:
    CRYPTO_THREAD_cleanup_local(&private_drbg);
    return 0;
926 927 928
}

/* Clean up the global DRBGs before exit */
929
void rand_drbg_cleanup_int(void)
930
{
931 932 933
    if (master_drbg != NULL) {
        RAND_DRBG_free(master_drbg);
        master_drbg = NULL;
934

935 936 937
        CRYPTO_THREAD_cleanup_local(&private_drbg);
        CRYPTO_THREAD_cleanup_local(&public_drbg);
    }
938 939
}

940
void drbg_delete_thread_state(void)
941 942 943
{
    RAND_DRBG *drbg;

944
    drbg = CRYPTO_THREAD_get_local(&public_drbg);
945
    CRYPTO_THREAD_set_local(&public_drbg, NULL);
946 947
    RAND_DRBG_free(drbg);

948
    drbg = CRYPTO_THREAD_get_local(&private_drbg);
949
    CRYPTO_THREAD_set_local(&private_drbg, NULL);
950
    RAND_DRBG_free(drbg);
951 952
}

953
/* Implements the default OpenSSL RAND_bytes() method */
R
Rich Salz 已提交
954 955
static int drbg_bytes(unsigned char *out, int count)
{
956
    int ret;
957
    RAND_DRBG *drbg = RAND_DRBG_get0_public();
R
Rich Salz 已提交
958

959 960 961
    if (drbg == NULL)
        return 0;

962 963
    ret = RAND_DRBG_bytes(drbg, out, count);

R
Rich Salz 已提交
964 965 966
    return ret;
}

967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006
/*
 * Calculates the minimum length of a full entropy buffer
 * which is necessary to seed (i.e. instantiate) the DRBG
 * successfully.
 *
 * NOTE: There is a copy of this function in drbgtest.c.
 *       If you change anything here, you need to update
 *       the copy accordingly.
 */
static size_t rand_drbg_seedlen(RAND_DRBG *drbg)
{
    /*
     * If no os entropy source is available then RAND_seed(buffer, bufsize)
     * is expected to succeed if and only if the buffer length satisfies
     * the following requirements, which follow from the calculations
     * in RAND_DRBG_instantiate().
     */
    size_t min_entropy = drbg->strength;
    size_t min_entropylen = drbg->min_entropylen;

    /*
     * Extra entropy for the random nonce in the absence of a
     * get_nonce callback, see comment in RAND_DRBG_instantiate().
     */
    if (drbg->min_noncelen > 0 && drbg->get_nonce == NULL) {
        min_entropy += drbg->strength / 2;
        min_entropylen += drbg->min_noncelen;
    }

    /*
     * Convert entropy requirement from bits to bytes
     * (dividing by 8 without rounding upwards, because
     * all entropy requirements are divisible by 8).
     */
    min_entropy >>= 3;

    /* Return a value that satisfies both requirements */
    return min_entropy > min_entropylen ? min_entropy : min_entropylen;
}

1007
/* Implements the default OpenSSL RAND_add() method */
R
Rich Salz 已提交
1008 1009
static int drbg_add(const void *buf, int num, double randomness)
{
1010
    int ret = 0;
1011
    RAND_DRBG *drbg = RAND_DRBG_get0_master();
1012
    size_t buflen;
1013
    size_t seedlen;
R
Rich Salz 已提交
1014

1015 1016
    if (drbg == NULL)
        return 0;
R
Rich Salz 已提交
1017

1018 1019
    if (num < 0 || randomness < 0.0)
        return 0;
R
Rich Salz 已提交
1020

1021 1022
    seedlen = rand_drbg_seedlen(drbg);

1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047
    buflen = (size_t)num;

    if (buflen < seedlen || randomness < (double) seedlen) {
#if defined(OPENSSL_RAND_SEED_NONE)
        /*
         * If no os entropy source is available, a reseeding will fail
         * inevitably. So we use a trick to mix the buffer contents into
         * the DRBG state without forcing a reseeding: we generate a
         * dummy random byte, using the buffer content as additional data.
         */
        unsigned char dummy[1];

        return RAND_DRBG_generate(drbg, dummy, sizeof(dummy), 0, buf, buflen);
#else
        /*
         * If an os entropy source is avaible then we declare the buffer content
         * as additional data by setting randomness to zero and trigger a regular
         * reseeding.
         */
        randomness = 0.0;
#endif
    }


    if (randomness > (double)seedlen) {
1048 1049 1050 1051
        /*
         * The purpose of this check is to bound |randomness| by a
         * relatively small value in order to prevent an integer
         * overflow when multiplying by 8 in the rand_drbg_restart()
1052 1053 1054
         * call below. Note that randomness is measured in bytes,
         * not bits, so this value corresponds to eight times the
         * security strength.
1055
         */
1056
        randomness = (double)seedlen;
R
Rich Salz 已提交
1057 1058
    }

1059
    rand_drbg_lock(drbg);
1060
    ret = rand_drbg_restart(drbg, buf, buflen, (size_t)(8 * randomness));
1061
    rand_drbg_unlock(drbg);
1062 1063

    return ret;
R
Rich Salz 已提交
1064 1065
}

1066
/* Implements the default OpenSSL RAND_seed() method */
R
Rich Salz 已提交
1067 1068 1069 1070 1071
static int drbg_seed(const void *buf, int num)
{
    return drbg_add(buf, num, num);
}

1072
/* Implements the default OpenSSL RAND_status() method */
R
Rich Salz 已提交
1073
static int drbg_status(void)
R
Rich Salz 已提交
1074
{
R
Rich Salz 已提交
1075
    int ret;
1076
    RAND_DRBG *drbg = RAND_DRBG_get0_master();
1077 1078 1079

    if (drbg == NULL)
        return 0;
R
Rich Salz 已提交
1080

1081
    rand_drbg_lock(drbg);
1082
    ret = drbg->state == DRBG_READY ? 1 : 0;
1083
    rand_drbg_unlock(drbg);
R
Rich Salz 已提交
1084
    return ret;
R
Rich Salz 已提交
1085 1086
}

1087
/*
1088 1089 1090 1091 1092 1093 1094 1095 1096
 * Get the master DRBG.
 * Returns pointer to the DRBG on success, NULL on failure.
 *
 */
RAND_DRBG *RAND_DRBG_get0_master(void)
{
    if (!RUN_ONCE(&rand_drbg_init, do_rand_drbg_init))
        return NULL;

1097
    return master_drbg;
1098 1099 1100 1101
}

/*
 * Get the public DRBG.
1102 1103
 * Returns pointer to the DRBG on success, NULL on failure.
 */
1104
RAND_DRBG *RAND_DRBG_get0_public(void)
1105
{
1106 1107
    RAND_DRBG *drbg;

1108
    if (!RUN_ONCE(&rand_drbg_init, do_rand_drbg_init))
1109 1110
        return NULL;

1111
    drbg = CRYPTO_THREAD_get_local(&public_drbg);
1112
    if (drbg == NULL) {
1113 1114
        if (!ossl_init_thread_start(OPENSSL_INIT_THREAD_RAND))
            return NULL;
1115 1116
        drbg = drbg_setup(master_drbg);
        CRYPTO_THREAD_set_local(&public_drbg, drbg);
1117 1118
    }
    return drbg;
1119 1120 1121
}

/*
1122
 * Get the private DRBG.
1123 1124
 * Returns pointer to the DRBG on success, NULL on failure.
 */
1125
RAND_DRBG *RAND_DRBG_get0_private(void)
1126
{
1127 1128
    RAND_DRBG *drbg;

1129
    if (!RUN_ONCE(&rand_drbg_init, do_rand_drbg_init))
1130 1131
        return NULL;

1132
    drbg = CRYPTO_THREAD_get_local(&private_drbg);
1133
    if (drbg == NULL) {
1134 1135
        if (!ossl_init_thread_start(OPENSSL_INIT_THREAD_RAND))
            return NULL;
1136 1137
        drbg = drbg_setup(master_drbg);
        CRYPTO_THREAD_set_local(&private_drbg, drbg);
1138 1139
    }
    return drbg;
1140 1141
}

R
Rich Salz 已提交
1142 1143 1144
RAND_METHOD rand_meth = {
    drbg_seed,
    drbg_bytes,
1145
    NULL,
R
Rich Salz 已提交
1146 1147 1148 1149 1150 1151
    drbg_add,
    drbg_bytes,
    drbg_status
};

RAND_METHOD *RAND_OpenSSL(void)
R
Rich Salz 已提交
1152
{
R
Rich Salz 已提交
1153
    return &rand_meth;
R
Rich Salz 已提交
1154
}