drbg_lib.c 28.3 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
 *
 * LOCKING
 *
 * The three shared DRBGs are intended to be used concurrently, so they
97 98 99 100 101 102 103 104 105 106 107
 * support locking. The RAND methods take the locks automatically, so using
 * the RAND api (in particular RAND_bytes() and RAND_priv_bytes()) is
 * thread-safe. Note however that accessing the shared DRBGs directly via
 * the RAND_DRBG interface is *not* thread-safe.
 *
 * All other DRBG instances don't support locking, because they are
 * intendended to be used by a single thread. Instead of accessing a single
 * DRBG instance concurrently from different threads, it is recommended to
 * instantiate a separate DRBG instance per thread. Using the same shared
 * DRBG (preferrably the public DRBG) as parent of DRBG instances on
 * different threads is safe.
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;

K
Kurt Roeckx 已提交
181 182 183 184 185 186 187 188 189
    if (parent != NULL && 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
         */
        RANDerr(RAND_F_RAND_DRBG_NEW, RAND_R_PARENT_STRENGTH_TOO_WEAK);
        goto err;
    }

190 191 192 193
    if (!RAND_DRBG_set_callbacks(drbg, rand_drbg_get_entropy,
                                 rand_drbg_cleanup_entropy,
                                 NULL, NULL))
        goto err;
R
Rich Salz 已提交
194 195 196 197

    return drbg;

err:
198 199 200 201 202
    if (drbg->secure)
        OPENSSL_secure_free(drbg);
    else
        OPENSSL_free(drbg);

R
Rich Salz 已提交
203
    return NULL;
R
Rich Salz 已提交
204 205
}

206 207 208 209 210 211 212 213 214 215
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 已提交
216
/*
R
Rich Salz 已提交
217
 * Uninstantiate |drbg| and free all memory.
R
Rich Salz 已提交
218
 */
R
Rich Salz 已提交
219
void RAND_DRBG_free(RAND_DRBG *drbg)
R
Rich Salz 已提交
220
{
221
    if (drbg == NULL)
R
Rich Salz 已提交
222 223
        return;

224 225
    if (drbg->meth != NULL)
        drbg->meth->uninstantiate(drbg);
226
    CRYPTO_THREAD_lock_free(drbg->lock);
R
Rich Salz 已提交
227
    CRYPTO_free_ex_data(CRYPTO_EX_INDEX_DRBG, drbg, &drbg->ex_data);
228 229 230 231 232

    if (drbg->secure)
        OPENSSL_secure_clear_free(drbg, sizeof(*drbg));
    else
        OPENSSL_clear_free(drbg, sizeof(*drbg));
R
Rich Salz 已提交
233 234 235
}

/*
R
Rich Salz 已提交
236
 * Instantiate |drbg|, after it has been initialized.  Use |pers| and
R
Rich Salz 已提交
237
 * |perslen| as prediction-resistance input.
B
Benjamin Kaduk 已提交
238 239
 *
 * Requires that drbg->lock is already locked for write, if non-null.
240 241
 *
 * Returns 1 on success, 0 on failure.
R
Rich Salz 已提交
242
 */
R
Rich Salz 已提交
243
int RAND_DRBG_instantiate(RAND_DRBG *drbg,
R
Rich Salz 已提交
244 245 246
                          const unsigned char *pers, size_t perslen)
{
    unsigned char *nonce = NULL, *entropy = NULL;
247
    size_t noncelen = 0, entropylen = 0;
R
Rich Salz 已提交
248

249
    if (perslen > drbg->max_perslen) {
R
Rich Salz 已提交
250 251
        RANDerr(RAND_F_RAND_DRBG_INSTANTIATE,
                RAND_R_PERSONALISATION_STRING_TOO_LONG);
R
Rich Salz 已提交
252 253
        goto end;
    }
254 255 256 257 258 259 260 261

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

R
Rich Salz 已提交
262 263 264 265
    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 已提交
266 267 268
        goto end;
    }

R
Rich Salz 已提交
269 270
    drbg->state = DRBG_ERROR;
    if (drbg->get_entropy != NULL)
271 272
        entropylen = drbg->get_entropy(drbg, &entropy, drbg->strength,
                                   drbg->min_entropylen, drbg->max_entropylen);
273 274
    if (entropylen < drbg->min_entropylen
        || entropylen > drbg->max_entropylen) {
R
Rich Salz 已提交
275
        RANDerr(RAND_F_RAND_DRBG_INSTANTIATE, RAND_R_ERROR_RETRIEVING_ENTROPY);
R
Rich Salz 已提交
276 277 278
        goto end;
    }

279
    if (drbg->max_noncelen > 0 && drbg->get_nonce != NULL) {
R
Rich Salz 已提交
280
        noncelen = drbg->get_nonce(drbg, &nonce, drbg->strength / 2,
281 282
                                   drbg->min_noncelen, drbg->max_noncelen);
        if (noncelen < drbg->min_noncelen || noncelen > drbg->max_noncelen) {
283 284
            RANDerr(RAND_F_RAND_DRBG_INSTANTIATE,
                    RAND_R_ERROR_RETRIEVING_NONCE);
R
Rich Salz 已提交
285 286 287 288
            goto end;
        }
    }

289
    if (!drbg->meth->instantiate(drbg, entropy, entropylen,
R
Rich Salz 已提交
290
                         nonce, noncelen, pers, perslen)) {
R
Rich Salz 已提交
291
        RANDerr(RAND_F_RAND_DRBG_INSTANTIATE, RAND_R_ERROR_INSTANTIATING_DRBG);
R
Rich Salz 已提交
292 293 294
        goto end;
    }

R
Rich Salz 已提交
295
    drbg->state = DRBG_READY;
296
    drbg->generate_counter = 0;
297
    drbg->reseed_time = time(NULL);
298 299 300 301 302 303
    if (drbg->reseed_counter > 0) {
        if (drbg->parent == NULL)
            drbg->reseed_counter++;
        else
            drbg->reseed_counter = drbg->parent->reseed_counter;
    }
R
Rich Salz 已提交
304 305

end:
R
Rich Salz 已提交
306
    if (entropy != NULL && drbg->cleanup_entropy != NULL)
307
        drbg->cleanup_entropy(drbg, entropy, entropylen);
R
Rich Salz 已提交
308
    if (nonce != NULL && drbg->cleanup_nonce!= NULL )
309
        drbg->cleanup_nonce(drbg, nonce, noncelen);
310 311 312 313 314 315 316 317 318
    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 已提交
319
    if (drbg->state == DRBG_READY)
R
Rich Salz 已提交
320 321 322 323 324
        return 1;
    return 0;
}

/*
R
Rich Salz 已提交
325
 * Uninstantiate |drbg|. Must be instantiated before it can be used.
B
Benjamin Kaduk 已提交
326 327
 *
 * Requires that drbg->lock is already locked for write, if non-null.
328 329
 *
 * Returns 1 on success, 0 on failure.
R
Rich Salz 已提交
330
 */
R
Rich Salz 已提交
331
int RAND_DRBG_uninstantiate(RAND_DRBG *drbg)
R
Rich Salz 已提交
332
{
333 334 335 336 337 338 339
    if (drbg->meth == NULL)
    {
        RANDerr(RAND_F_RAND_DRBG_UNINSTANTIATE,
                RAND_R_NO_DRBG_IMPLEMENTATION_SELECTED);
        return 0;
    }

340 341 342 343
    /* 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.
     */
344
    drbg->meth->uninstantiate(drbg);
345
    return RAND_DRBG_set(drbg, drbg->nid, drbg->flags);
R
Rich Salz 已提交
346 347 348
}

/*
349
 * Reseed |drbg|, mixing in the specified data
B
Benjamin Kaduk 已提交
350 351
 *
 * Requires that drbg->lock is already locked for write, if non-null.
352 353
 *
 * Returns 1 on success, 0 on failure.
R
Rich Salz 已提交
354
 */
R
Rich Salz 已提交
355
int RAND_DRBG_reseed(RAND_DRBG *drbg,
R
Rich Salz 已提交
356 357 358
                     const unsigned char *adin, size_t adinlen)
{
    unsigned char *entropy = NULL;
359
    size_t entropylen = 0;
R
Rich Salz 已提交
360 361 362 363 364 365 366 367

    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 已提交
368 369 370 371
    }

    if (adin == NULL)
        adinlen = 0;
372
    else if (adinlen > drbg->max_adinlen) {
R
Rich Salz 已提交
373 374
        RANDerr(RAND_F_RAND_DRBG_RESEED, RAND_R_ADDITIONAL_INPUT_TOO_LONG);
        return 0;
R
Rich Salz 已提交
375 376
    }

R
Rich Salz 已提交
377 378
    drbg->state = DRBG_ERROR;
    if (drbg->get_entropy != NULL)
379 380
        entropylen = drbg->get_entropy(drbg, &entropy, drbg->strength,
                                   drbg->min_entropylen, drbg->max_entropylen);
381 382
    if (entropylen < drbg->min_entropylen
        || entropylen > drbg->max_entropylen) {
R
Rich Salz 已提交
383
        RANDerr(RAND_F_RAND_DRBG_RESEED, RAND_R_ERROR_RETRIEVING_ENTROPY);
R
Rich Salz 已提交
384 385 386
        goto end;
    }

387
    if (!drbg->meth->reseed(drbg, entropy, entropylen, adin, adinlen))
R
Rich Salz 已提交
388
        goto end;
389

R
Rich Salz 已提交
390
    drbg->state = DRBG_READY;
391
    drbg->generate_counter = 0;
392
    drbg->reseed_time = time(NULL);
393 394 395 396 397 398
    if (drbg->reseed_counter > 0) {
        if (drbg->parent == NULL)
            drbg->reseed_counter++;
        else
            drbg->reseed_counter = drbg->parent->reseed_counter;
    }
R
Rich Salz 已提交
399 400

end:
R
Rich Salz 已提交
401
    if (entropy != NULL && drbg->cleanup_entropy != NULL)
402
        drbg->cleanup_entropy(drbg, entropy, entropylen);
R
Rich Salz 已提交
403
    if (drbg->state == DRBG_READY)
R
Rich Salz 已提交
404 405 406 407
        return 1;
    return 0;
}

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 460 461 462 463 464 465 466 467 468
/*
 * 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 */
469
    if (drbg->state == DRBG_ERROR)
470 471 472 473
        RAND_DRBG_uninstantiate(drbg);

    /* repair uninitialized state */
    if (drbg->state == DRBG_UNINITIALISED) {
474 475 476 477
        /* reinstantiate drbg */
        RAND_DRBG_instantiate(drbg,
                              (const unsigned char *) ossl_pers_string,
                              sizeof(ossl_pers_string) - 1);
478 479 480 481 482 483 484 485 486 487 488 489 490 491 492
        /* 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.
             */
493
            drbg->meth->reseed(drbg, adin, adinlen, NULL, 0);
494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511
        } 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 已提交
512 513 514 515
/*
 * 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|.
516
 *
B
Benjamin Kaduk 已提交
517 518
 * Requires that drbg->lock is already locked for write, if non-null.
 *
519 520
 * Returns 1 on success, 0 on failure.
 *
R
Rich Salz 已提交
521
 */
R
Rich Salz 已提交
522
int RAND_DRBG_generate(RAND_DRBG *drbg, unsigned char *out, size_t outlen,
R
Rich Salz 已提交
523 524 525
                       int prediction_resistance,
                       const unsigned char *adin, size_t adinlen)
{
526 527
    int reseed_required = 0;

528 529 530 531 532 533 534 535 536 537 538 539
    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 已提交
540
    }
541

R
Rich Salz 已提交
542 543 544 545
    if (outlen > drbg->max_request) {
        RANDerr(RAND_F_RAND_DRBG_GENERATE, RAND_R_REQUEST_TOO_LARGE_FOR_DRBG);
        return 0;
    }
546
    if (adinlen > drbg->max_adinlen) {
R
Rich Salz 已提交
547 548
        RANDerr(RAND_F_RAND_DRBG_GENERATE, RAND_R_ADDITIONAL_INPUT_TOO_LONG);
        return 0;
R
Rich Salz 已提交
549 550
    }

R
Rich Salz 已提交
551 552
    if (drbg->fork_count != rand_fork_count) {
        drbg->fork_count = rand_fork_count;
553
        reseed_required = 1;
R
Rich Salz 已提交
554 555
    }

556 557 558 559
    if (drbg->reseed_interval > 0) {
        if (drbg->generate_counter >= drbg->reseed_interval)
            reseed_required = 1;
    }
560 561 562 563 564 565
    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;
    }
566 567 568 569
    if (drbg->reseed_counter > 0 && drbg->parent != NULL) {
        if (drbg->reseed_counter != drbg->parent->reseed_counter)
            reseed_required = 1;
    }
R
Rich Salz 已提交
570

571
    if (reseed_required || prediction_resistance) {
R
Rich Salz 已提交
572 573 574
        if (!RAND_DRBG_reseed(drbg, adin, adinlen)) {
            RANDerr(RAND_F_RAND_DRBG_GENERATE, RAND_R_RESEED_ERROR);
            return 0;
R
Rich Salz 已提交
575 576 577 578 579
        }
        adin = NULL;
        adinlen = 0;
    }

580
    if (!drbg->meth->generate(drbg, out, outlen, adin, adinlen)) {
R
Rich Salz 已提交
581 582 583
        drbg->state = DRBG_ERROR;
        RANDerr(RAND_F_RAND_DRBG_GENERATE, RAND_R_GENERATE_ERROR);
        return 0;
R
Rich Salz 已提交
584
    }
R
Rich Salz 已提交
585

586
    drbg->generate_counter++;
587

R
Rich Salz 已提交
588 589 590
    return 1;
}

K
Kurt Roeckx 已提交
591 592 593 594 595 596 597 598 599 600 601 602
/*
 * 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;
603
    size_t chunk;
K
Kurt Roeckx 已提交
604 605 606
    size_t ret;

    additional_len = rand_drbg_get_additional_data(&additional, drbg->max_adinlen);
607 608 609 610 611 612 613 614 615 616 617 618

    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 已提交
619 620 621 622 623 624
    if (additional_len != 0)
        OPENSSL_secure_clear_free(additional, additional_len);

    return ret;
}

R
Rich Salz 已提交
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 653 654 655 656 657 658 659 660 661
 * 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 已提交
662
 */
R
Rich Salz 已提交
663
int RAND_DRBG_set_callbacks(RAND_DRBG *drbg,
664 665 666 667
                            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 已提交
668
{
R
Rich Salz 已提交
669
    if (drbg->state != DRBG_UNINITIALISED)
R
Rich Salz 已提交
670
        return 0;
671 672 673 674
    drbg->get_entropy = get_entropy;
    drbg->cleanup_entropy = cleanup_entropy;
    drbg->get_nonce = get_nonce;
    drbg->cleanup_nonce = cleanup_nonce;
R
Rich Salz 已提交
675 676 677 678
    return 1;
}

/*
R
Rich Salz 已提交
679
 * Set the reseed interval.
680 681 682
 *
 * The drbg will reseed automatically whenever the number of generate
 * requests exceeds the given reseed interval. If the reseed interval
683
 * is 0, then this feature is disabled.
684 685
 *
 * Returns 1 on success, 0 on failure.
R
Rich Salz 已提交
686
 */
687
int RAND_DRBG_set_reseed_interval(RAND_DRBG *drbg, unsigned int interval)
R
Rich Salz 已提交
688
{
689
    if (interval > MAX_RESEED_INTERVAL)
690
        return 0;
R
Rich Salz 已提交
691
    drbg->reseed_interval = interval;
692
    return 1;
R
Rich Salz 已提交
693 694
}

695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712
/*
 * 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 已提交
713 714 715 716 717 718 719

/*
 * 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.
 */
720
int rand_drbg_lock(RAND_DRBG *drbg)
D
Dr. Matthias St. Pierre 已提交
721 722 723 724 725 726 727 728 729 730 731 732 733
{
    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.
 */
734
int rand_drbg_unlock(RAND_DRBG *drbg)
D
Dr. Matthias St. Pierre 已提交
735 736 737 738 739 740 741 742 743 744 745 746 747 748 749
{
    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.
 */
750
int rand_drbg_enable_locking(RAND_DRBG *drbg)
D
Dr. Matthias St. Pierre 已提交
751 752 753 754 755 756 757 758
{
    if (drbg->state != DRBG_UNINITIALISED) {
        RANDerr(RAND_F_RAND_DRBG_ENABLE_LOCKING,
                RAND_R_DRBG_ALREADY_INITIALIZED);
        return 0;
    }

    if (drbg->lock == NULL) {
759
        if (drbg->parent != NULL && drbg->parent->lock == NULL) {
D
Dr. Matthias St. Pierre 已提交
760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775
            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 已提交
776 777 778
/*
 * Get and set the EXDATA
 */
R
Rich Salz 已提交
779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794
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.
 */

795
/*
796 797
 * Allocates a new global DRBG on the secure heap (if enabled) and
 * initializes it with default settings.
798 799
 *
 * Returns a pointer to the new DRBG instance on success, NULL on failure.
800
 */
801
static RAND_DRBG *drbg_setup(RAND_DRBG *parent)
802
{
803
    RAND_DRBG *drbg;
804

805
    drbg = RAND_DRBG_secure_new(RAND_DRBG_NID, 0, parent);
806 807 808
    if (drbg == NULL)
        return NULL;

809
    if (rand_drbg_enable_locking(drbg) == 0)
810
        goto err;
811

812
    if (parent == NULL) {
813
        drbg->reseed_interval = MASTER_RESEED_INTERVAL;
814 815
        drbg->reseed_time_interval = MASTER_RESEED_TIME_INTERVAL;
    } else {
816
        drbg->reseed_interval = SLAVE_RESEED_INTERVAL;
817
        drbg->reseed_time_interval = SLAVE_RESEED_TIME_INTERVAL;
818 819 820 821 822
    }

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

823 824 825 826 827 828 829 830 831
    /*
     * 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);
832 833 834
    return drbg;

err:
835
    RAND_DRBG_free(drbg);
836
    return NULL;
837 838 839 840 841 842
}

/*
 * Initialize the global DRBGs on first use.
 * Returns 1 on success, 0 on failure.
 */
843
DEFINE_RUN_ONCE_STATIC(do_rand_drbg_init)
844
{
845 846 847 848 849 850 851
    /*
     * ensure that libcrypto is initialized, otherwise the
     * DRBG locks are not cleaned up properly
     */
    if (!OPENSSL_init_crypto(0, NULL))
        return 0;

852 853 854
    drbg_master = drbg_setup(NULL);
    drbg_public = drbg_setup(drbg_master);
    drbg_private = drbg_setup(drbg_master);
855

856 857
    if (drbg_master == NULL || drbg_public == NULL || drbg_private == NULL)
        return 0;
858

859
    return 1;
860 861 862
}

/* Clean up the global DRBGs before exit */
863
void rand_drbg_cleanup_int(void)
864
{
865 866 867
    RAND_DRBG_free(drbg_private);
    RAND_DRBG_free(drbg_public);
    RAND_DRBG_free(drbg_master);
868 869

    drbg_private = drbg_public = drbg_master = NULL;
870 871
}

872
/* Implements the default OpenSSL RAND_bytes() method */
R
Rich Salz 已提交
873 874
static int drbg_bytes(unsigned char *out, int count)
{
875
    int ret;
876
    RAND_DRBG *drbg = RAND_DRBG_get0_public();
R
Rich Salz 已提交
877

878 879 880
    if (drbg == NULL)
        return 0;

881
    rand_drbg_lock(drbg);
882
    ret = RAND_DRBG_bytes(drbg, out, count);
883
    rand_drbg_unlock(drbg);
884

R
Rich Salz 已提交
885 886 887
    return ret;
}

888
/* Implements the default OpenSSL RAND_add() method */
R
Rich Salz 已提交
889 890
static int drbg_add(const void *buf, int num, double randomness)
{
891
    int ret = 0;
892
    RAND_DRBG *drbg = RAND_DRBG_get0_master();
R
Rich Salz 已提交
893

894 895
    if (drbg == NULL)
        return 0;
R
Rich Salz 已提交
896

897 898
    if (num < 0 || randomness < 0.0)
        return 0;
R
Rich Salz 已提交
899

900 901 902 903 904 905 906 907
    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 已提交
908 909
    }

910
    rand_drbg_lock(drbg);
911 912 913
    ret = rand_drbg_restart(drbg, buf,
                            (size_t)(unsigned int)num,
                            (size_t)(8*randomness));
914
    rand_drbg_unlock(drbg);
915 916

    return ret;
R
Rich Salz 已提交
917 918
}

919
/* Implements the default OpenSSL RAND_seed() method */
R
Rich Salz 已提交
920 921 922 923 924
static int drbg_seed(const void *buf, int num)
{
    return drbg_add(buf, num, num);
}

925
/* Implements the default OpenSSL RAND_status() method */
R
Rich Salz 已提交
926
static int drbg_status(void)
R
Rich Salz 已提交
927
{
R
Rich Salz 已提交
928
    int ret;
929
    RAND_DRBG *drbg = RAND_DRBG_get0_master();
930 931 932

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

934
    rand_drbg_lock(drbg);
935
    ret = drbg->state == DRBG_READY ? 1 : 0;
936
    rand_drbg_unlock(drbg);
R
Rich Salz 已提交
937
    return ret;
R
Rich Salz 已提交
938 939
}

940
/*
941 942 943 944 945 946 947 948 949
 * 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;

950
    return drbg_master;
951 952 953 954
}

/*
 * Get the public DRBG.
955 956
 * Returns pointer to the DRBG on success, NULL on failure.
 */
957
RAND_DRBG *RAND_DRBG_get0_public(void)
958
{
959
    if (!RUN_ONCE(&rand_drbg_init, do_rand_drbg_init))
960 961
        return NULL;

962
    return drbg_public;
963 964 965
}

/*
966
 * Get the private DRBG.
967 968
 * Returns pointer to the DRBG on success, NULL on failure.
 */
969
RAND_DRBG *RAND_DRBG_get0_private(void)
970
{
971
    if (!RUN_ONCE(&rand_drbg_init, do_rand_drbg_init))
972 973
        return NULL;

974
    return drbg_private;
975 976
}

R
Rich Salz 已提交
977 978 979
RAND_METHOD rand_meth = {
    drbg_seed,
    drbg_bytes,
980
    NULL,
R
Rich Salz 已提交
981 982 983 984 985 986
    drbg_add,
    drbg_bytes,
    drbg_status
};

RAND_METHOD *RAND_OpenSSL(void)
R
Rich Salz 已提交
987
{
R
Rich Salz 已提交
988
    return &rand_meth;
R
Rich Salz 已提交
989
}