drbg_lib.c 28.1 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"
R
Rich Salz 已提交
17 18 19

/*
 * Support framework for NIST SP 800-90A DRBG, AES-CTR mode.
R
Rich Salz 已提交
20 21
 * The RAND_DRBG is OpenSSL's pointer to an instance of the DRBG.
 *
R
Rich Salz 已提交
22 23 24 25 26 27 28 29
 * 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.)
 */

30 31 32 33 34 35 36 37 38 39 40 41
/*
 * THE THREE SHARED DRBGs
 *
 * There are three shared DRBGs (master, public and private), which are
 * accessed concurrently by all threads.
 *
 * THE MASTER DRBG
 *
 * Not used directly by the application, only for reseeding the two other
 * DRBGs. It reseeds itself by pulling either randomness from os entropy
 * sources or by consuming randomnes which was added by RAND_add()
 */
42
static RAND_DRBG *drbg_master;
43 44 45 46 47
/*
 * THE PUBLIC DRBG
 *
 * Used by default for generating random bytes using RAND_bytes().
 */
48
static RAND_DRBG *drbg_public;
49 50 51 52 53
/*
 * THE PRIVATE DRBG
 *
 * Used by default for generating private keys using RAND_priv_bytes()
 */
54
static RAND_DRBG *drbg_private;
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
/*+
 * DRBG HIERARCHY
 *
 * In addition there are DRBGs, which are not shared, but used only by a
 * single thread at every time, for example the DRBGs which are owned by
 * an SSL context. All DRBGs are organized in a hierarchical fashion
 * with the <master> DRBG as root.
 *
 * This gives the following overall picture:
 *
 *                  <os entropy sources>
 *                         |
 *    RAND_add() ==>    <master>          \
 *                       /   \            | shared DRBGs (with locking)
 *                 <public>  <private>    /
 *                     |
 *                   <ssl>  owned by an SSL context
 *
 * AUTOMATIC RESEEDING
 *
75 76 77 78 79 80 81 82 83 84
 * Before satisfying a generate request, a DRBG reseeds itself automatically,
 * if one of the following two conditions holds:
 *
 * - the number of generate requests since the last reseeding exceeds a
 *   certain threshold, the so called |reseed_interval|. This behaviour
 *   can be disabled by setting the |reseed_interval| to 0.
 *
 * - the time elapsed since the last reseeding exceeds a certain time
 *   interval, the so called |reseed_time_interval|. This behaviour
 *   can be disabled by setting the |reseed_time_interval| to 0.
85 86 87
 *
 * MANUAL RESEEDING
 *
88 89
 * For the three shared DRBGs (and only for these) there is another way to
 * reseed them manually by calling RAND_seed() (or RAND_add() with a positive
90
 * |randomness| argument). This will immediately reseed the <master> DRBG.
91 92
 * The <public> and <private> DRBG will detect this on their next generate
 * call and reseed, pulling randomness from <master>.
D
Dr. Matthias St. Pierre 已提交
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
 *
 * LOCKING
 *
 * The three shared DRBGs are intended to be used concurrently, so they
 * support locking by default. It is the callers responsibility to wrap
 * calls to functions like RAND_DRBG_generate() which modify the DRBGs
 * internal state with calls to RAND_DRBG_lock() and RAND_DRBG_unlock().
 * The functions RAND_bytes() and RAND_priv_bytes() take the locks
 * automatically, so using the RAND api is thread safe as before.
 *
 * All other DRBG instances don't have locking enabled by default, because
 * they are intendended to be used by a single thread. If it is desired,
 * locking can be enabled using RAND_DRBG_enable_locking(). However, instead
 * of accessing a single DRBG instance concurrently from different threads,
 * it is recommended to instantiate a separate DRBG instance per thread.
108 109 110 111 112 113
 */


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

114 115
static CRYPTO_ONCE rand_drbg_init = CRYPTO_ONCE_STATIC_INIT;

116
static RAND_DRBG *drbg_setup(RAND_DRBG *parent);
117 118 119 120 121

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

R
Rich Salz 已提交
123
/*
R
Rich Salz 已提交
124
 * Set/initialize |drbg| to be of type |nid|, with optional |flags|.
125 126
 *
 * Returns 1 on success, 0 on failure.
R
Rich Salz 已提交
127
 */
R
Rich Salz 已提交
128
int RAND_DRBG_set(RAND_DRBG *drbg, int nid, unsigned int flags)
R
Rich Salz 已提交
129 130 131
{
    int ret = 1;

R
Rich Salz 已提交
132 133 134
    drbg->state = DRBG_UNINITIALISED;
    drbg->flags = flags;
    drbg->nid = nid;
R
Rich Salz 已提交
135 136 137 138

    switch (nid) {
    default:
        RANDerr(RAND_F_RAND_DRBG_SET, RAND_R_UNSUPPORTED_DRBG_TYPE);
139
        return 0;
R
Rich Salz 已提交
140 141 142 143 144 145
    case 0:
        /* Uninitialized; that's okay. */
        return 1;
    case NID_aes_128_ctr:
    case NID_aes_192_ctr:
    case NID_aes_256_ctr:
146
        ret = drbg_ctr_init(drbg);
R
Rich Salz 已提交
147 148 149
        break;
    }

150
    if (ret == 0)
R
Rich Salz 已提交
151 152 153 154 155
        RANDerr(RAND_F_RAND_DRBG_SET, RAND_R_ERROR_INITIALISING_DRBG);
    return ret;
}

/*
156 157 158
 * 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.
159 160
 *
 * Returns a pointer to the new DRBG instance on success, NULL on failure.
R
Rich Salz 已提交
161
 */
162 163 164 165
static RAND_DRBG *rand_drbg_new(int secure,
                                int type,
                                unsigned int flags,
                                RAND_DRBG *parent)
R
Rich Salz 已提交
166
{
167 168
    RAND_DRBG *drbg = secure ?
        OPENSSL_secure_zalloc(sizeof(*drbg)) : OPENSSL_zalloc(sizeof(*drbg));
R
Rich Salz 已提交
169

R
Rich Salz 已提交
170
    if (drbg == NULL) {
R
Rich Salz 已提交
171
        RANDerr(RAND_F_RAND_DRBG_NEW, ERR_R_MALLOC_FAILURE);
R
Rich Salz 已提交
172
        goto err;
R
Rich Salz 已提交
173
    }
174 175

    drbg->secure = secure && CRYPTO_secure_allocated(drbg);
R
Rich Salz 已提交
176
    drbg->fork_count = rand_fork_count;
R
Rich Salz 已提交
177
    drbg->parent = parent;
178
    if (RAND_DRBG_set(drbg, type, flags) == 0)
R
Rich Salz 已提交
179 180
        goto err;

181 182 183 184
    if (!RAND_DRBG_set_callbacks(drbg, rand_drbg_get_entropy,
                                 rand_drbg_cleanup_entropy,
                                 NULL, NULL))
        goto err;
R
Rich Salz 已提交
185 186 187 188

    return drbg;

err:
189 190 191 192 193
    if (drbg->secure)
        OPENSSL_secure_free(drbg);
    else
        OPENSSL_free(drbg);

R
Rich Salz 已提交
194
    return NULL;
R
Rich Salz 已提交
195 196
}

197 198 199 200 201 202 203 204 205 206
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 已提交
207
/*
R
Rich Salz 已提交
208
 * Uninstantiate |drbg| and free all memory.
R
Rich Salz 已提交
209
 */
R
Rich Salz 已提交
210
void RAND_DRBG_free(RAND_DRBG *drbg)
R
Rich Salz 已提交
211
{
212
    if (drbg == NULL)
R
Rich Salz 已提交
213 214
        return;

215 216
    if (drbg->meth != NULL)
        drbg->meth->uninstantiate(drbg);
217
    CRYPTO_THREAD_lock_free(drbg->lock);
R
Rich Salz 已提交
218
    CRYPTO_free_ex_data(CRYPTO_EX_INDEX_DRBG, drbg, &drbg->ex_data);
219 220 221 222 223

    if (drbg->secure)
        OPENSSL_secure_clear_free(drbg, sizeof(*drbg));
    else
        OPENSSL_clear_free(drbg, sizeof(*drbg));
R
Rich Salz 已提交
224 225 226
}

/*
R
Rich Salz 已提交
227
 * Instantiate |drbg|, after it has been initialized.  Use |pers| and
R
Rich Salz 已提交
228
 * |perslen| as prediction-resistance input.
B
Benjamin Kaduk 已提交
229 230
 *
 * Requires that drbg->lock is already locked for write, if non-null.
231 232
 *
 * Returns 1 on success, 0 on failure.
R
Rich Salz 已提交
233
 */
R
Rich Salz 已提交
234
int RAND_DRBG_instantiate(RAND_DRBG *drbg,
R
Rich Salz 已提交
235 236 237
                          const unsigned char *pers, size_t perslen)
{
    unsigned char *nonce = NULL, *entropy = NULL;
238
    size_t noncelen = 0, entropylen = 0;
R
Rich Salz 已提交
239

240
    if (perslen > drbg->max_perslen) {
R
Rich Salz 已提交
241 242
        RANDerr(RAND_F_RAND_DRBG_INSTANTIATE,
                RAND_R_PERSONALISATION_STRING_TOO_LONG);
R
Rich Salz 已提交
243 244
        goto end;
    }
245 246 247 248 249 250 251 252

    if (drbg->meth == NULL)
    {
        RANDerr(RAND_F_RAND_DRBG_INSTANTIATE,
                RAND_R_NO_DRBG_IMPLEMENTATION_SELECTED);
        goto end;
    }

R
Rich Salz 已提交
253 254 255 256
    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 已提交
257 258 259
        goto end;
    }

R
Rich Salz 已提交
260 261
    drbg->state = DRBG_ERROR;
    if (drbg->get_entropy != NULL)
262 263
        entropylen = drbg->get_entropy(drbg, &entropy, drbg->strength,
                                   drbg->min_entropylen, drbg->max_entropylen);
264 265
    if (entropylen < drbg->min_entropylen
        || entropylen > drbg->max_entropylen) {
R
Rich Salz 已提交
266
        RANDerr(RAND_F_RAND_DRBG_INSTANTIATE, RAND_R_ERROR_RETRIEVING_ENTROPY);
R
Rich Salz 已提交
267 268 269
        goto end;
    }

270
    if (drbg->max_noncelen > 0 && drbg->get_nonce != NULL) {
R
Rich Salz 已提交
271
        noncelen = drbg->get_nonce(drbg, &nonce, drbg->strength / 2,
272 273
                                   drbg->min_noncelen, drbg->max_noncelen);
        if (noncelen < drbg->min_noncelen || noncelen > drbg->max_noncelen) {
274 275
            RANDerr(RAND_F_RAND_DRBG_INSTANTIATE,
                    RAND_R_ERROR_RETRIEVING_NONCE);
R
Rich Salz 已提交
276 277 278 279
            goto end;
        }
    }

280
    if (!drbg->meth->instantiate(drbg, entropy, entropylen,
R
Rich Salz 已提交
281
                         nonce, noncelen, pers, perslen)) {
R
Rich Salz 已提交
282
        RANDerr(RAND_F_RAND_DRBG_INSTANTIATE, RAND_R_ERROR_INSTANTIATING_DRBG);
R
Rich Salz 已提交
283 284 285
        goto end;
    }

R
Rich Salz 已提交
286
    drbg->state = DRBG_READY;
287
    drbg->generate_counter = 0;
288
    drbg->reseed_time = time(NULL);
289 290 291 292 293 294
    if (drbg->reseed_counter > 0) {
        if (drbg->parent == NULL)
            drbg->reseed_counter++;
        else
            drbg->reseed_counter = drbg->parent->reseed_counter;
    }
R
Rich Salz 已提交
295 296

end:
R
Rich Salz 已提交
297
    if (entropy != NULL && drbg->cleanup_entropy != NULL)
298
        drbg->cleanup_entropy(drbg, entropy, entropylen);
R
Rich Salz 已提交
299
    if (nonce != NULL && drbg->cleanup_nonce!= NULL )
300
        drbg->cleanup_nonce(drbg, nonce, noncelen);
301 302 303 304 305 306 307 308 309
    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;
        }
        RAND_POOL_free(drbg->pool);
        drbg->pool = NULL;
    }
R
Rich Salz 已提交
310
    if (drbg->state == DRBG_READY)
R
Rich Salz 已提交
311 312 313 314 315
        return 1;
    return 0;
}

/*
R
Rich Salz 已提交
316
 * Uninstantiate |drbg|. Must be instantiated before it can be used.
B
Benjamin Kaduk 已提交
317 318
 *
 * Requires that drbg->lock is already locked for write, if non-null.
319 320
 *
 * Returns 1 on success, 0 on failure.
R
Rich Salz 已提交
321
 */
R
Rich Salz 已提交
322
int RAND_DRBG_uninstantiate(RAND_DRBG *drbg)
R
Rich Salz 已提交
323
{
324 325 326 327 328 329 330
    if (drbg->meth == NULL)
    {
        RANDerr(RAND_F_RAND_DRBG_UNINSTANTIATE,
                RAND_R_NO_DRBG_IMPLEMENTATION_SELECTED);
        return 0;
    }

331 332 333 334
    /* 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.
     */
335
    drbg->meth->uninstantiate(drbg);
336
    return RAND_DRBG_set(drbg, drbg->nid, drbg->flags);
R
Rich Salz 已提交
337 338 339
}

/*
340
 * Reseed |drbg|, mixing in the specified data
B
Benjamin Kaduk 已提交
341 342
 *
 * Requires that drbg->lock is already locked for write, if non-null.
343 344
 *
 * Returns 1 on success, 0 on failure.
R
Rich Salz 已提交
345
 */
R
Rich Salz 已提交
346
int RAND_DRBG_reseed(RAND_DRBG *drbg,
R
Rich Salz 已提交
347 348 349
                     const unsigned char *adin, size_t adinlen)
{
    unsigned char *entropy = NULL;
350
    size_t entropylen = 0;
R
Rich Salz 已提交
351 352 353 354 355 356 357 358

    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 已提交
359 360 361 362
    }

    if (adin == NULL)
        adinlen = 0;
363
    else if (adinlen > drbg->max_adinlen) {
R
Rich Salz 已提交
364 365
        RANDerr(RAND_F_RAND_DRBG_RESEED, RAND_R_ADDITIONAL_INPUT_TOO_LONG);
        return 0;
R
Rich Salz 已提交
366 367
    }

R
Rich Salz 已提交
368 369
    drbg->state = DRBG_ERROR;
    if (drbg->get_entropy != NULL)
370 371
        entropylen = drbg->get_entropy(drbg, &entropy, drbg->strength,
                                   drbg->min_entropylen, drbg->max_entropylen);
372 373
    if (entropylen < drbg->min_entropylen
        || entropylen > drbg->max_entropylen) {
R
Rich Salz 已提交
374
        RANDerr(RAND_F_RAND_DRBG_RESEED, RAND_R_ERROR_RETRIEVING_ENTROPY);
R
Rich Salz 已提交
375 376 377
        goto end;
    }

378
    if (!drbg->meth->reseed(drbg, entropy, entropylen, adin, adinlen))
R
Rich Salz 已提交
379
        goto end;
380

R
Rich Salz 已提交
381
    drbg->state = DRBG_READY;
382
    drbg->generate_counter = 0;
383
    drbg->reseed_time = time(NULL);
384 385 386 387 388 389
    if (drbg->reseed_counter > 0) {
        if (drbg->parent == NULL)
            drbg->reseed_counter++;
        else
            drbg->reseed_counter = drbg->parent->reseed_counter;
    }
R
Rich Salz 已提交
390 391

end:
R
Rich Salz 已提交
392
    if (entropy != NULL && drbg->cleanup_entropy != NULL)
393
        drbg->cleanup_entropy(drbg, entropy, entropylen);
R
Rich Salz 已提交
394
    if (drbg->state == DRBG_READY)
R
Rich Salz 已提交
395 396 397 398
        return 1;
    return 0;
}

399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459
/*
 * 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);
        RAND_POOL_free(drbg->pool);
        drbg->pool = NULL;
    }

    if (buffer != NULL) {
        if (entropy > 0) {
            if (drbg->max_entropylen < len) {
                RANDerr(RAND_F_RAND_DRBG_RESTART,
                    RAND_R_ENTROPY_INPUT_TOO_LONG);
                return 0;
            }

            if (entropy > 8 * len) {
                RANDerr(RAND_F_RAND_DRBG_RESTART, RAND_R_ENTROPY_OUT_OF_RANGE);
                return 0;
            }

            /* will be picked up by the rand_drbg_get_entropy() callback */
            drbg->pool = RAND_POOL_new(entropy, len, len);
            if (drbg->pool == NULL)
                return 0;

            RAND_POOL_add(drbg->pool, buffer, len, entropy);
        } else {
            if (drbg->max_adinlen < len) {
                RANDerr(RAND_F_RAND_DRBG_RESTART,
                        RAND_R_ADDITIONAL_INPUT_TOO_LONG);
                return 0;
            }
            adin = buffer;
            adinlen = len;
        }
    }

    /* repair error state */
460
    if (drbg->state == DRBG_ERROR)
461 462 463 464
        RAND_DRBG_uninstantiate(drbg);

    /* repair uninitialized state */
    if (drbg->state == DRBG_UNINITIALISED) {
465 466 467 468
        /* reinstantiate drbg */
        RAND_DRBG_instantiate(drbg,
                              (const unsigned char *) ossl_pers_string,
                              sizeof(ossl_pers_string) - 1);
469 470 471 472 473 474 475 476 477 478 479 480 481 482 483
        /* 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.
             */
484
            drbg->meth->reseed(drbg, adin, adinlen, NULL, 0);
485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502
        } else if (reseeded == 0) {
            /* do a full reseeding if it has not been done yet above */
            RAND_DRBG_reseed(drbg, NULL, 0);
        }
    }

    /* 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);
        RAND_POOL_free(drbg->pool);
        drbg->pool = NULL;
        return 0;
    }

    return drbg->state == DRBG_READY;
}

R
Rich Salz 已提交
503 504 505 506
/*
 * 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|.
507
 *
B
Benjamin Kaduk 已提交
508 509
 * Requires that drbg->lock is already locked for write, if non-null.
 *
510 511
 * Returns 1 on success, 0 on failure.
 *
R
Rich Salz 已提交
512
 */
R
Rich Salz 已提交
513
int RAND_DRBG_generate(RAND_DRBG *drbg, unsigned char *out, size_t outlen,
R
Rich Salz 已提交
514 515 516
                       int prediction_resistance,
                       const unsigned char *adin, size_t adinlen)
{
517 518
    int reseed_required = 0;

519 520 521 522 523 524 525 526 527 528 529 530
    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 已提交
531
    }
532

R
Rich Salz 已提交
533 534 535 536
    if (outlen > drbg->max_request) {
        RANDerr(RAND_F_RAND_DRBG_GENERATE, RAND_R_REQUEST_TOO_LARGE_FOR_DRBG);
        return 0;
    }
537
    if (adinlen > drbg->max_adinlen) {
R
Rich Salz 已提交
538 539
        RANDerr(RAND_F_RAND_DRBG_GENERATE, RAND_R_ADDITIONAL_INPUT_TOO_LONG);
        return 0;
R
Rich Salz 已提交
540 541
    }

R
Rich Salz 已提交
542 543
    if (drbg->fork_count != rand_fork_count) {
        drbg->fork_count = rand_fork_count;
544
        reseed_required = 1;
R
Rich Salz 已提交
545 546
    }

547 548 549 550
    if (drbg->reseed_interval > 0) {
        if (drbg->generate_counter >= drbg->reseed_interval)
            reseed_required = 1;
    }
551 552 553 554 555 556
    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;
    }
557 558 559 560
    if (drbg->reseed_counter > 0 && drbg->parent != NULL) {
        if (drbg->reseed_counter != drbg->parent->reseed_counter)
            reseed_required = 1;
    }
R
Rich Salz 已提交
561

562
    if (reseed_required || prediction_resistance) {
R
Rich Salz 已提交
563 564 565
        if (!RAND_DRBG_reseed(drbg, adin, adinlen)) {
            RANDerr(RAND_F_RAND_DRBG_GENERATE, RAND_R_RESEED_ERROR);
            return 0;
R
Rich Salz 已提交
566 567 568 569 570
        }
        adin = NULL;
        adinlen = 0;
    }

571
    if (!drbg->meth->generate(drbg, out, outlen, adin, adinlen)) {
R
Rich Salz 已提交
572 573 574
        drbg->state = DRBG_ERROR;
        RANDerr(RAND_F_RAND_DRBG_GENERATE, RAND_R_GENERATE_ERROR);
        return 0;
R
Rich Salz 已提交
575
    }
R
Rich Salz 已提交
576

577
    drbg->generate_counter++;
578

R
Rich Salz 已提交
579 580 581
    return 1;
}

K
Kurt Roeckx 已提交
582 583 584 585 586 587 588 589 590 591 592 593
/*
 * 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;
594
    size_t chunk;
K
Kurt Roeckx 已提交
595 596 597
    size_t ret;

    additional_len = rand_drbg_get_additional_data(&additional, drbg->max_adinlen);
598 599 600 601 602 603 604 605 606 607 608 609

    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 已提交
610 611 612 613 614 615
    if (additional_len != 0)
        OPENSSL_secure_clear_free(additional, additional_len);

    return ret;
}

R
Rich Salz 已提交
616
/*
617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652
 * Set the RAND_DRBG callbacks for obtaining entropy and nonce.
 *
 * In the following, the signature and the semantics of the
 * get_entropy() and cleanup_entropy() callbacks are explained.
 *
 * GET_ENTROPY
 *
 *     size_t get_entropy(RAND_DRBG *ctx,
 *                        unsigned char **pout,
 *                        int entropy,
 *                        size_t min_len, size_t max_len);
 *
 * This is a request to allocate and fill a buffer of size
 * |min_len| <= size <= |max_len| (in bytes) which contains
 * at least |entropy| bits of randomness. The buffer's address is
 * to be returned in |*pout| and the number of collected
 * randomness bytes (which may be less than the allocated size
 * of the buffer) as return value.
 *
 * If the callback fails to acquire at least |entropy| bits of
 * randomness, it shall return a buffer length of 0.
 *
 * CLEANUP_ENTROPY
 *
 *     void cleanup_entropy(RAND_DRBG *ctx,
 *                          unsigned char *out, size_t outlen);
 *
 * A request to clear and free the buffer allocated by get_entropy().
 * The values |out| and |outlen| are expected to be the random buffer's
 * address and length, as returned by the get_entropy() callback.
 *
 * GET_NONCE, CLEANUP_NONCE
 *
 * Signature and semantics of the get_nonce() and cleanup_nonce()
 * callbacks are analogous to get_entropy() and cleanup_entropy().
 * Currently, the nonce is used only for the known answer tests.
R
Rich Salz 已提交
653
 */
R
Rich Salz 已提交
654
int RAND_DRBG_set_callbacks(RAND_DRBG *drbg,
655 656 657 658
                            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 已提交
659
{
R
Rich Salz 已提交
660
    if (drbg->state != DRBG_UNINITIALISED)
R
Rich Salz 已提交
661
        return 0;
662 663 664 665
    drbg->get_entropy = get_entropy;
    drbg->cleanup_entropy = cleanup_entropy;
    drbg->get_nonce = get_nonce;
    drbg->cleanup_nonce = cleanup_nonce;
R
Rich Salz 已提交
666 667 668 669
    return 1;
}

/*
R
Rich Salz 已提交
670
 * Set the reseed interval.
671 672 673
 *
 * The drbg will reseed automatically whenever the number of generate
 * requests exceeds the given reseed interval. If the reseed interval
674
 * is 0, then this feature is disabled.
675 676
 *
 * Returns 1 on success, 0 on failure.
R
Rich Salz 已提交
677
 */
678
int RAND_DRBG_set_reseed_interval(RAND_DRBG *drbg, unsigned int interval)
R
Rich Salz 已提交
679
{
680
    if (interval > MAX_RESEED_INTERVAL)
681
        return 0;
R
Rich Salz 已提交
682
    drbg->reseed_interval = interval;
683
    return 1;
R
Rich Salz 已提交
684 685
}

686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703
/*
 * 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;
}

D
Dr. Matthias St. Pierre 已提交
704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749

/*
 * 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.
 */
int RAND_DRBG_lock(RAND_DRBG *drbg)
{
    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.
 */
int RAND_DRBG_unlock(RAND_DRBG *drbg)
{
    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.
 */
int RAND_DRBG_enable_locking(RAND_DRBG *drbg)
{
    if (drbg->state != DRBG_UNINITIALISED) {
        RANDerr(RAND_F_RAND_DRBG_ENABLE_LOCKING,
                RAND_R_DRBG_ALREADY_INITIALIZED);
        return 0;
    }

    if (drbg->lock == NULL) {
750
        if (drbg->parent != NULL && drbg->parent->lock == NULL) {
D
Dr. Matthias St. Pierre 已提交
751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766
            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 已提交
767 768 769
/*
 * Get and set the EXDATA
 */
R
Rich Salz 已提交
770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785
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.
 */

786
/*
787 788
 * Allocates a new global DRBG on the secure heap (if enabled) and
 * initializes it with default settings.
789 790
 *
 * Returns a pointer to the new DRBG instance on success, NULL on failure.
791
 */
792
static RAND_DRBG *drbg_setup(RAND_DRBG *parent)
793
{
794
    RAND_DRBG *drbg;
795

796
    drbg = RAND_DRBG_secure_new(RAND_DRBG_NID, 0, parent);
797 798 799
    if (drbg == NULL)
        return NULL;

800
    if (RAND_DRBG_enable_locking(drbg) == 0)
801
        goto err;
802

803
    if (parent == NULL) {
804
        drbg->reseed_interval = MASTER_RESEED_INTERVAL;
805 806
        drbg->reseed_time_interval = MASTER_RESEED_TIME_INTERVAL;
    } else {
807
        drbg->reseed_interval = SLAVE_RESEED_INTERVAL;
808
        drbg->reseed_time_interval = SLAVE_RESEED_TIME_INTERVAL;
809 810 811 812 813
    }

    /* enable seed propagation */
    drbg->reseed_counter = 1;

814 815 816 817 818 819 820 821 822
    /*
     * Ignore instantiation error so support just-in-time instantiation.
     *
     * The state of the drbg will be checked in RAND_DRBG_generate() and
     * an automatic recovery is attempted.
     */
    RAND_DRBG_instantiate(drbg,
                          (const unsigned char *) ossl_pers_string,
                          sizeof(ossl_pers_string) - 1);
823 824 825
    return drbg;

err:
826
    RAND_DRBG_free(drbg);
827
    return NULL;
828 829 830 831 832 833
}

/*
 * Initialize the global DRBGs on first use.
 * Returns 1 on success, 0 on failure.
 */
834
DEFINE_RUN_ONCE_STATIC(do_rand_drbg_init)
835
{
836 837 838 839 840 841 842
    /*
     * ensure that libcrypto is initialized, otherwise the
     * DRBG locks are not cleaned up properly
     */
    if (!OPENSSL_init_crypto(0, NULL))
        return 0;

843 844 845
    drbg_master = drbg_setup(NULL);
    drbg_public = drbg_setup(drbg_master);
    drbg_private = drbg_setup(drbg_master);
846

847 848
    if (drbg_master == NULL || drbg_public == NULL || drbg_private == NULL)
        return 0;
849

850
    return 1;
851 852 853
}

/* Clean up the global DRBGs before exit */
854
void rand_drbg_cleanup_int(void)
855
{
856 857 858
    RAND_DRBG_free(drbg_private);
    RAND_DRBG_free(drbg_public);
    RAND_DRBG_free(drbg_master);
859 860

    drbg_private = drbg_public = drbg_master = NULL;
861 862
}

863
/* Implements the default OpenSSL RAND_bytes() method */
R
Rich Salz 已提交
864 865
static int drbg_bytes(unsigned char *out, int count)
{
866
    int ret;
867
    RAND_DRBG *drbg = RAND_DRBG_get0_public();
R
Rich Salz 已提交
868

869 870 871
    if (drbg == NULL)
        return 0;

D
Dr. Matthias St. Pierre 已提交
872
    RAND_DRBG_lock(drbg);
873
    ret = RAND_DRBG_bytes(drbg, out, count);
D
Dr. Matthias St. Pierre 已提交
874
    RAND_DRBG_unlock(drbg);
875

R
Rich Salz 已提交
876 877 878
    return ret;
}

879
/* Implements the default OpenSSL RAND_add() method */
R
Rich Salz 已提交
880 881
static int drbg_add(const void *buf, int num, double randomness)
{
882
    int ret = 0;
883
    RAND_DRBG *drbg = RAND_DRBG_get0_master();
R
Rich Salz 已提交
884

885 886
    if (drbg == NULL)
        return 0;
R
Rich Salz 已提交
887

888 889
    if (num < 0 || randomness < 0.0)
        return 0;
R
Rich Salz 已提交
890

891 892 893 894 895 896 897 898
    if (randomness > (double)drbg->max_entropylen) {
        /*
         * 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()
         * call below.
         */
        return 0;
R
Rich Salz 已提交
899 900
    }

D
Dr. Matthias St. Pierre 已提交
901
    RAND_DRBG_lock(drbg);
902 903 904
    ret = rand_drbg_restart(drbg, buf,
                            (size_t)(unsigned int)num,
                            (size_t)(8*randomness));
D
Dr. Matthias St. Pierre 已提交
905
    RAND_DRBG_unlock(drbg);
906 907

    return ret;
R
Rich Salz 已提交
908 909
}

910
/* Implements the default OpenSSL RAND_seed() method */
R
Rich Salz 已提交
911 912 913 914 915
static int drbg_seed(const void *buf, int num)
{
    return drbg_add(buf, num, num);
}

916
/* Implements the default OpenSSL RAND_status() method */
R
Rich Salz 已提交
917
static int drbg_status(void)
R
Rich Salz 已提交
918
{
R
Rich Salz 已提交
919
    int ret;
920
    RAND_DRBG *drbg = RAND_DRBG_get0_master();
921 922 923

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

D
Dr. Matthias St. Pierre 已提交
925
    RAND_DRBG_lock(drbg);
926
    ret = drbg->state == DRBG_READY ? 1 : 0;
D
Dr. Matthias St. Pierre 已提交
927
    RAND_DRBG_unlock(drbg);
R
Rich Salz 已提交
928
    return ret;
R
Rich Salz 已提交
929 930
}

931
/*
932 933 934 935 936 937 938 939 940
 * 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;

941
    return drbg_master;
942 943 944 945
}

/*
 * Get the public DRBG.
946 947
 * Returns pointer to the DRBG on success, NULL on failure.
 */
948
RAND_DRBG *RAND_DRBG_get0_public(void)
949
{
950
    if (!RUN_ONCE(&rand_drbg_init, do_rand_drbg_init))
951 952
        return NULL;

953
    return drbg_public;
954 955 956
}

/*
957
 * Get the private DRBG.
958 959
 * Returns pointer to the DRBG on success, NULL on failure.
 */
960
RAND_DRBG *RAND_DRBG_get0_private(void)
961
{
962
    if (!RUN_ONCE(&rand_drbg_init, do_rand_drbg_init))
963 964
        return NULL;

965
    return drbg_private;
966 967
}

R
Rich Salz 已提交
968 969 970
RAND_METHOD rand_meth = {
    drbg_seed,
    drbg_bytes,
971
    NULL,
R
Rich Salz 已提交
972 973 974 975 976 977
    drbg_add,
    drbg_bytes,
    drbg_status
};

RAND_METHOD *RAND_OpenSSL(void)
R
Rich Salz 已提交
978
{
R
Rich Salz 已提交
979
    return &rand_meth;
R
Rich Salz 已提交
980
}