Fix data race in RAND_DRBG_generate
[openssl.git] / crypto / rand / rand_lib.c
1 /*
2  * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the OpenSSL license (the "License").  You may not use
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
7  * https://www.openssl.org/source/license.html
8  */
9
10 #include <stdio.h>
11 #include <time.h>
12 #include "internal/cryptlib.h"
13 #include <openssl/opensslconf.h>
14 #include "internal/rand_int.h"
15 #include <openssl/engine.h>
16 #include "internal/thread_once.h"
17 #include "rand_lcl.h"
18 #include "e_os.h"
19
20 #ifndef OPENSSL_NO_ENGINE
21 /* non-NULL if default_RAND_meth is ENGINE-provided */
22 static ENGINE *funct_ref;
23 static CRYPTO_RWLOCK *rand_engine_lock;
24 #endif
25 static CRYPTO_RWLOCK *rand_meth_lock;
26 static const RAND_METHOD *default_RAND_meth;
27 static CRYPTO_ONCE rand_init = CRYPTO_ONCE_STATIC_INIT;
28
29 int rand_fork_count;
30
31 static CRYPTO_RWLOCK *rand_nonce_lock;
32 static int rand_nonce_count;
33
34 static int rand_cleaning_up = 0;
35
36 #ifdef OPENSSL_RAND_SEED_RDTSC
37 /*
38  * IMPORTANT NOTE:  It is not currently possible to use this code
39  * because we are not sure about the amount of randomness it provides.
40  * Some SP900 tests have been run, but there is internal skepticism.
41  * So for now this code is not used.
42  */
43 # error "RDTSC enabled?  Should not be possible!"
44
45 /*
46  * Acquire entropy from high-speed clock
47  *
48  * Since we get some randomness from the low-order bits of the
49  * high-speed clock, it can help.
50  *
51  * Returns the total entropy count, if it exceeds the requested
52  * entropy count. Otherwise, returns an entropy count of 0.
53  */
54 size_t rand_acquire_entropy_from_tsc(RAND_POOL *pool)
55 {
56     unsigned char c;
57     int i;
58
59     if ((OPENSSL_ia32cap_P[0] & (1 << 4)) != 0) {
60         for (i = 0; i < TSC_READ_COUNT; i++) {
61             c = (unsigned char)(OPENSSL_rdtsc() & 0xFF);
62             rand_pool_add(pool, &c, 1, 4);
63         }
64     }
65     return rand_pool_entropy_available(pool);
66 }
67 #endif
68
69 #ifdef OPENSSL_RAND_SEED_RDCPU
70 size_t OPENSSL_ia32_rdseed_bytes(unsigned char *buf, size_t len);
71 size_t OPENSSL_ia32_rdrand_bytes(unsigned char *buf, size_t len);
72
73 extern unsigned int OPENSSL_ia32cap_P[];
74
75 /*
76  * Acquire entropy using Intel-specific cpu instructions
77  *
78  * Uses the RDSEED instruction if available, otherwise uses
79  * RDRAND if available.
80  *
81  * For the differences between RDSEED and RDRAND, and why RDSEED
82  * is the preferred choice, see https://goo.gl/oK3KcN
83  *
84  * Returns the total entropy count, if it exceeds the requested
85  * entropy count. Otherwise, returns an entropy count of 0.
86  */
87 size_t rand_acquire_entropy_from_cpu(RAND_POOL *pool)
88 {
89     size_t bytes_needed;
90     unsigned char *buffer;
91
92     bytes_needed = rand_pool_bytes_needed(pool, 1 /*entropy_factor*/);
93     if (bytes_needed > 0) {
94         buffer = rand_pool_add_begin(pool, bytes_needed);
95
96         if (buffer != NULL) {
97             /* Whichever comes first, use RDSEED, RDRAND or nothing */
98             if ((OPENSSL_ia32cap_P[2] & (1 << 18)) != 0) {
99                 if (OPENSSL_ia32_rdseed_bytes(buffer, bytes_needed)
100                     == bytes_needed) {
101                     rand_pool_add_end(pool, bytes_needed, 8 * bytes_needed);
102                 }
103             } else if ((OPENSSL_ia32cap_P[1] & (1 << (62 - 32))) != 0) {
104                 if (OPENSSL_ia32_rdrand_bytes(buffer, bytes_needed)
105                     == bytes_needed) {
106                     rand_pool_add_end(pool, bytes_needed, 8 * bytes_needed);
107                 }
108             } else {
109                 rand_pool_add_end(pool, 0, 0);
110             }
111         }
112     }
113
114     return rand_pool_entropy_available(pool);
115 }
116 #endif
117
118
119 /*
120  * Implements the get_entropy() callback (see RAND_DRBG_set_callbacks())
121  *
122  * If the DRBG has a parent, then the required amount of entropy input
123  * is fetched using the parent's RAND_DRBG_generate().
124  *
125  * Otherwise, the entropy is polled from the system entropy sources
126  * using rand_pool_acquire_entropy().
127  *
128  * If a random pool has been added to the DRBG using RAND_add(), then
129  * its entropy will be used up first.
130  */
131 size_t rand_drbg_get_entropy(RAND_DRBG *drbg,
132                              unsigned char **pout,
133                              int entropy, size_t min_len, size_t max_len,
134                              int prediction_resistance)
135 {
136     size_t ret = 0;
137     size_t entropy_available = 0;
138     RAND_POOL *pool;
139
140     if (drbg->parent && drbg->strength > drbg->parent->strength) {
141         /*
142          * We currently don't support the algorithm from NIST SP 800-90C
143          * 10.1.2 to use a weaker DRBG as source
144          */
145         RANDerr(RAND_F_RAND_DRBG_GET_ENTROPY, RAND_R_PARENT_STRENGTH_TOO_WEAK);
146         return 0;
147     }
148
149     if (drbg->pool != NULL) {
150         pool = drbg->pool;
151         pool->entropy_requested = entropy;
152     } else {
153         pool = rand_pool_new(entropy, min_len, max_len);
154         if (pool == NULL)
155             return 0;
156     }
157
158     if (drbg->parent) {
159         size_t bytes_needed = rand_pool_bytes_needed(pool, 1 /*entropy_factor*/);
160         unsigned char *buffer = rand_pool_add_begin(pool, bytes_needed);
161
162         if (buffer != NULL) {
163             size_t bytes = 0;
164
165             /*
166              * Get random from parent, include our state as additional input.
167              * Our lock is already held, but we need to lock our parent before
168              * generating bits from it. (Note: taking the lock will be a no-op
169              * if locking if drbg->parent->lock == NULL.)
170              */
171             rand_drbg_lock(drbg->parent);
172             if (RAND_DRBG_generate(drbg->parent,
173                                    buffer, bytes_needed,
174                                    prediction_resistance,
175                                    NULL, 0) != 0)
176                 bytes = bytes_needed;
177             drbg->reseed_next_counter
178                 = tsan_load(&drbg->parent->reseed_prop_counter);
179             rand_drbg_unlock(drbg->parent);
180
181             rand_pool_add_end(pool, bytes, 8 * bytes);
182             entropy_available = rand_pool_entropy_available(pool);
183         }
184
185     } else {
186         if (prediction_resistance) {
187             /*
188              * We don't have any entropy sources that comply with the NIST
189              * standard to provide prediction resistance (see NIST SP 800-90C,
190              * Section 5.4).
191              */
192             RANDerr(RAND_F_RAND_DRBG_GET_ENTROPY,
193                     RAND_R_PREDICTION_RESISTANCE_NOT_SUPPORTED);
194             goto err;
195         }
196
197         /* Get entropy by polling system entropy sources. */
198         entropy_available = rand_pool_acquire_entropy(pool);
199     }
200
201     if (entropy_available > 0) {
202         ret   = rand_pool_length(pool);
203         *pout = rand_pool_detach(pool);
204     }
205
206  err:
207     /* we need to reset drbg->pool in the error case */
208     if (ret == 0 && drbg->pool != NULL)
209         drbg->pool = NULL;
210
211     rand_pool_free(pool);
212     return ret;
213 }
214
215 /*
216  * Implements the cleanup_entropy() callback (see RAND_DRBG_set_callbacks())
217  *
218  */
219 void rand_drbg_cleanup_entropy(RAND_DRBG *drbg,
220                                unsigned char *out, size_t outlen)
221 {
222     if (drbg->pool == NULL)
223         OPENSSL_secure_clear_free(out, outlen);
224     else
225         drbg->pool = NULL;
226 }
227
228
229 /*
230  * Implements the get_nonce() callback (see RAND_DRBG_set_callbacks())
231  *
232  */
233 size_t rand_drbg_get_nonce(RAND_DRBG *drbg,
234                            unsigned char **pout,
235                            int entropy, size_t min_len, size_t max_len)
236 {
237     size_t ret = 0;
238     RAND_POOL *pool;
239
240     struct {
241         void * instance;
242         int count;
243     } data = { 0 };
244
245     pool = rand_pool_new(0, min_len, max_len);
246     if (pool == NULL)
247         return 0;
248
249     if (rand_pool_add_nonce_data(pool) == 0)
250         goto err;
251
252     data.instance = drbg;
253     CRYPTO_atomic_add(&rand_nonce_count, 1, &data.count, rand_nonce_lock);
254
255     if (rand_pool_add(pool, (unsigned char *)&data, sizeof(data), 0) == 0)
256         goto err;
257
258     ret   = rand_pool_length(pool);
259     *pout = rand_pool_detach(pool);
260
261  err:
262     rand_pool_free(pool);
263
264     return ret;
265 }
266
267 /*
268  * Implements the cleanup_nonce() callback (see RAND_DRBG_set_callbacks())
269  *
270  */
271 void rand_drbg_cleanup_nonce(RAND_DRBG *drbg,
272                              unsigned char *out, size_t outlen)
273 {
274     OPENSSL_secure_clear_free(out, outlen);
275 }
276
277 /*
278  * Generate additional data that can be used for the drbg. The data does
279  * not need to contain entropy, but it's useful if it contains at least
280  * some bits that are unpredictable.
281  *
282  * Returns 0 on failure.
283  *
284  * On success it allocates a buffer at |*pout| and returns the length of
285  * the data. The buffer should get freed using OPENSSL_secure_clear_free().
286  */
287 size_t rand_drbg_get_additional_data(unsigned char **pout, size_t max_len)
288 {
289     size_t ret = 0;
290     RAND_POOL *pool;
291
292     pool = rand_pool_new(0, 0, max_len);
293     if (pool == NULL)
294         return 0;
295
296     if (rand_pool_add_additional_data(pool) == 0)
297         goto err;
298
299     ret = rand_pool_length(pool);
300     *pout = rand_pool_detach(pool);
301
302  err:
303     rand_pool_free(pool);
304
305     return ret;
306 }
307
308 void rand_drbg_cleanup_additional_data(unsigned char *out, size_t outlen)
309 {
310     OPENSSL_secure_clear_free(out, outlen);
311 }
312
313 void rand_fork(void)
314 {
315     rand_fork_count++;
316 }
317
318 DEFINE_RUN_ONCE_STATIC(do_rand_init)
319 {
320 #ifndef OPENSSL_NO_ENGINE
321     rand_engine_lock = CRYPTO_THREAD_lock_new();
322     if (rand_engine_lock == NULL)
323         return 0;
324 #endif
325
326     rand_meth_lock = CRYPTO_THREAD_lock_new();
327     if (rand_meth_lock == NULL)
328         goto err1;
329
330     rand_nonce_lock = CRYPTO_THREAD_lock_new();
331     if (rand_nonce_lock == NULL)
332         goto err2;
333
334     if (!rand_cleaning_up && !rand_pool_init())
335         goto err3;
336
337     return 1;
338
339 err3:
340     rand_pool_cleanup();
341 err2:
342     CRYPTO_THREAD_lock_free(rand_meth_lock);
343     rand_meth_lock = NULL;
344 err1:
345 #ifndef OPENSSL_NO_ENGINE
346     CRYPTO_THREAD_lock_free(rand_engine_lock);
347     rand_engine_lock = NULL;
348 #endif
349     return 0;
350 }
351
352 void rand_cleanup_int(void)
353 {
354     const RAND_METHOD *meth = default_RAND_meth;
355
356     rand_cleaning_up = 1;
357
358     if (meth != NULL && meth->cleanup != NULL)
359         meth->cleanup();
360     RAND_set_rand_method(NULL);
361     rand_pool_cleanup();
362 #ifndef OPENSSL_NO_ENGINE
363     CRYPTO_THREAD_lock_free(rand_engine_lock);
364     rand_engine_lock = NULL;
365 #endif
366     CRYPTO_THREAD_lock_free(rand_meth_lock);
367     rand_meth_lock = NULL;
368     CRYPTO_THREAD_lock_free(rand_nonce_lock);
369     rand_nonce_lock = NULL;
370 }
371
372 /*
373  * RAND_close_seed_files() ensures that any seed file decriptors are
374  * closed after use.
375  */
376 void RAND_keep_random_devices_open(int keep)
377 {
378     rand_pool_keep_random_devices_open(keep);
379 }
380
381 /*
382  * RAND_poll() reseeds the default RNG using random input
383  *
384  * The random input is obtained from polling various entropy
385  * sources which depend on the operating system and are
386  * configurable via the --with-rand-seed configure option.
387  */
388 int RAND_poll(void)
389 {
390     int ret = 0;
391
392     RAND_POOL *pool = NULL;
393
394     const RAND_METHOD *meth = RAND_get_rand_method();
395
396     if (meth == RAND_OpenSSL()) {
397         /* fill random pool and seed the master DRBG */
398         RAND_DRBG *drbg = RAND_DRBG_get0_master();
399
400         if (drbg == NULL)
401             return 0;
402
403         rand_drbg_lock(drbg);
404         ret = rand_drbg_restart(drbg, NULL, 0, 0);
405         rand_drbg_unlock(drbg);
406
407         return ret;
408
409     } else {
410         /* fill random pool and seed the current legacy RNG */
411         pool = rand_pool_new(RAND_DRBG_STRENGTH,
412                              RAND_DRBG_STRENGTH / 8,
413                              RAND_POOL_MAX_LENGTH);
414         if (pool == NULL)
415             return 0;
416
417         if (rand_pool_acquire_entropy(pool) == 0)
418             goto err;
419
420         if (meth->add == NULL
421             || meth->add(rand_pool_buffer(pool),
422                          rand_pool_length(pool),
423                          (rand_pool_entropy(pool) / 8.0)) == 0)
424             goto err;
425
426         ret = 1;
427     }
428
429 err:
430     rand_pool_free(pool);
431     return ret;
432 }
433
434 /*
435  * Allocate memory and initialize a new random pool
436  */
437
438 RAND_POOL *rand_pool_new(int entropy_requested, size_t min_len, size_t max_len)
439 {
440     RAND_POOL *pool = OPENSSL_zalloc(sizeof(*pool));
441
442     if (pool == NULL) {
443         RANDerr(RAND_F_RAND_POOL_NEW, ERR_R_MALLOC_FAILURE);
444         return NULL;
445     }
446
447     pool->min_len = min_len;
448     pool->max_len = (max_len > RAND_POOL_MAX_LENGTH) ?
449         RAND_POOL_MAX_LENGTH : max_len;
450
451     pool->buffer = OPENSSL_secure_zalloc(pool->max_len);
452     if (pool->buffer == NULL) {
453         RANDerr(RAND_F_RAND_POOL_NEW, ERR_R_MALLOC_FAILURE);
454         goto err;
455     }
456
457     pool->entropy_requested = entropy_requested;
458
459     return pool;
460
461 err:
462     OPENSSL_free(pool);
463     return NULL;
464 }
465
466 /*
467  * Attach new random pool to the given buffer
468  *
469  * This function is intended to be used only for feeding random data
470  * provided by RAND_add() and RAND_seed() into the <master> DRBG.
471  */
472 RAND_POOL *rand_pool_attach(const unsigned char *buffer, size_t len,
473                             size_t entropy)
474 {
475     RAND_POOL *pool = OPENSSL_zalloc(sizeof(*pool));
476
477     if (pool == NULL) {
478         RANDerr(RAND_F_RAND_POOL_ATTACH, ERR_R_MALLOC_FAILURE);
479         return NULL;
480     }
481
482     /*
483      * The const needs to be cast away, but attached buffers will not be
484      * modified (in contrary to allocated buffers which are zeroed and
485      * freed in the end).
486      */
487     pool->buffer = (unsigned char *) buffer;
488     pool->len = len;
489
490     pool->attached = 1;
491
492     pool->min_len = pool->max_len = pool->len;
493     pool->entropy = entropy;
494
495     return pool;
496 }
497
498 /*
499  * Free |pool|, securely erasing its buffer.
500  */
501 void rand_pool_free(RAND_POOL *pool)
502 {
503     if (pool == NULL)
504         return;
505
506     /*
507      * Although it would be advisable from a cryptographical viewpoint,
508      * we are not allowed to clear attached buffers, since they are passed
509      * to rand_pool_attach() as `const unsigned char*`.
510      * (see corresponding comment in rand_pool_attach()).
511      */
512     if (!pool->attached)
513         OPENSSL_secure_clear_free(pool->buffer, pool->max_len);
514     OPENSSL_free(pool);
515 }
516
517 /*
518  * Return the |pool|'s buffer to the caller (readonly).
519  */
520 const unsigned char *rand_pool_buffer(RAND_POOL *pool)
521 {
522     return pool->buffer;
523 }
524
525 /*
526  * Return the |pool|'s entropy to the caller.
527  */
528 size_t rand_pool_entropy(RAND_POOL *pool)
529 {
530     return pool->entropy;
531 }
532
533 /*
534  * Return the |pool|'s buffer length to the caller.
535  */
536 size_t rand_pool_length(RAND_POOL *pool)
537 {
538     return pool->len;
539 }
540
541 /*
542  * Detach the |pool| buffer and return it to the caller.
543  * It's the responsibility of the caller to free the buffer
544  * using OPENSSL_secure_clear_free().
545  */
546 unsigned char *rand_pool_detach(RAND_POOL *pool)
547 {
548     unsigned char *ret = pool->buffer;
549     pool->buffer = NULL;
550     return ret;
551 }
552
553
554 /*
555  * If |entropy_factor| bits contain 1 bit of entropy, how many bytes does one
556  * need to obtain at least |bits| bits of entropy?
557  */
558 #define ENTROPY_TO_BYTES(bits, entropy_factor) \
559     (((bits) * (entropy_factor) + 7) / 8)
560
561
562 /*
563  * Checks whether the |pool|'s entropy is available to the caller.
564  * This is the case when entropy count and buffer length are high enough.
565  * Returns
566  *
567  *  |entropy|  if the entropy count and buffer size is large enough
568  *      0      otherwise
569  */
570 size_t rand_pool_entropy_available(RAND_POOL *pool)
571 {
572     if (pool->entropy < pool->entropy_requested)
573         return 0;
574
575     if (pool->len < pool->min_len)
576         return 0;
577
578     return pool->entropy;
579 }
580
581 /*
582  * Returns the (remaining) amount of entropy needed to fill
583  * the random pool.
584  */
585
586 size_t rand_pool_entropy_needed(RAND_POOL *pool)
587 {
588     if (pool->entropy < pool->entropy_requested)
589         return pool->entropy_requested - pool->entropy;
590
591     return 0;
592 }
593
594 /*
595  * Returns the number of bytes needed to fill the pool, assuming
596  * the input has 1 / |entropy_factor| entropy bits per data bit.
597  * In case of an error, 0 is returned.
598  */
599
600 size_t rand_pool_bytes_needed(RAND_POOL *pool, unsigned int entropy_factor)
601 {
602     size_t bytes_needed;
603     size_t entropy_needed = rand_pool_entropy_needed(pool);
604
605     if (entropy_factor < 1) {
606         RANDerr(RAND_F_RAND_POOL_BYTES_NEEDED, RAND_R_ARGUMENT_OUT_OF_RANGE);
607         return 0;
608     }
609
610     bytes_needed = ENTROPY_TO_BYTES(entropy_needed, entropy_factor);
611
612     if (bytes_needed > pool->max_len - pool->len) {
613         /* not enough space left */
614         RANDerr(RAND_F_RAND_POOL_BYTES_NEEDED, RAND_R_RANDOM_POOL_OVERFLOW);
615         return 0;
616     }
617
618     if (pool->len < pool->min_len &&
619         bytes_needed < pool->min_len - pool->len)
620         /* to meet the min_len requirement */
621         bytes_needed = pool->min_len - pool->len;
622
623     return bytes_needed;
624 }
625
626 /* Returns the remaining number of bytes available */
627 size_t rand_pool_bytes_remaining(RAND_POOL *pool)
628 {
629     return pool->max_len - pool->len;
630 }
631
632 /*
633  * Add random bytes to the random pool.
634  *
635  * It is expected that the |buffer| contains |len| bytes of
636  * random input which contains at least |entropy| bits of
637  * randomness.
638  *
639  * Returns 1 if the added amount is adequate, otherwise 0
640  */
641 int rand_pool_add(RAND_POOL *pool,
642                   const unsigned char *buffer, size_t len, size_t entropy)
643 {
644     if (len > pool->max_len - pool->len) {
645         RANDerr(RAND_F_RAND_POOL_ADD, RAND_R_ENTROPY_INPUT_TOO_LONG);
646         return 0;
647     }
648
649     if (len > 0) {
650         memcpy(pool->buffer + pool->len, buffer, len);
651         pool->len += len;
652         pool->entropy += entropy;
653     }
654
655     return 1;
656 }
657
658 /*
659  * Start to add random bytes to the random pool in-place.
660  *
661  * Reserves the next |len| bytes for adding random bytes in-place
662  * and returns a pointer to the buffer.
663  * The caller is allowed to copy up to |len| bytes into the buffer.
664  * If |len| == 0 this is considered a no-op and a NULL pointer
665  * is returned without producing an error message.
666  *
667  * After updating the buffer, rand_pool_add_end() needs to be called
668  * to finish the udpate operation (see next comment).
669  */
670 unsigned char *rand_pool_add_begin(RAND_POOL *pool, size_t len)
671 {
672     if (len == 0)
673         return NULL;
674
675     if (len > pool->max_len - pool->len) {
676         RANDerr(RAND_F_RAND_POOL_ADD_BEGIN, RAND_R_RANDOM_POOL_OVERFLOW);
677         return NULL;
678     }
679
680     return pool->buffer + pool->len;
681 }
682
683 /*
684  * Finish to add random bytes to the random pool in-place.
685  *
686  * Finishes an in-place update of the random pool started by
687  * rand_pool_add_begin() (see previous comment).
688  * It is expected that |len| bytes of random input have been added
689  * to the buffer which contain at least |entropy| bits of randomness.
690  * It is allowed to add less bytes than originally reserved.
691  */
692 int rand_pool_add_end(RAND_POOL *pool, size_t len, size_t entropy)
693 {
694     if (len > pool->max_len - pool->len) {
695         RANDerr(RAND_F_RAND_POOL_ADD_END, RAND_R_RANDOM_POOL_OVERFLOW);
696         return 0;
697     }
698
699     if (len > 0) {
700         pool->len += len;
701         pool->entropy += entropy;
702     }
703
704     return 1;
705 }
706
707 int RAND_set_rand_method(const RAND_METHOD *meth)
708 {
709     if (!RUN_ONCE(&rand_init, do_rand_init))
710         return 0;
711
712     CRYPTO_THREAD_write_lock(rand_meth_lock);
713 #ifndef OPENSSL_NO_ENGINE
714     ENGINE_finish(funct_ref);
715     funct_ref = NULL;
716 #endif
717     default_RAND_meth = meth;
718     CRYPTO_THREAD_unlock(rand_meth_lock);
719     return 1;
720 }
721
722 const RAND_METHOD *RAND_get_rand_method(void)
723 {
724     const RAND_METHOD *tmp_meth = NULL;
725
726     if (!RUN_ONCE(&rand_init, do_rand_init))
727         return NULL;
728
729     CRYPTO_THREAD_write_lock(rand_meth_lock);
730     if (default_RAND_meth == NULL) {
731 #ifndef OPENSSL_NO_ENGINE
732         ENGINE *e;
733
734         /* If we have an engine that can do RAND, use it. */
735         if ((e = ENGINE_get_default_RAND()) != NULL
736                 && (tmp_meth = ENGINE_get_RAND(e)) != NULL) {
737             funct_ref = e;
738             default_RAND_meth = tmp_meth;
739         } else {
740             ENGINE_finish(e);
741             default_RAND_meth = &rand_meth;
742         }
743 #else
744         default_RAND_meth = &rand_meth;
745 #endif
746     }
747     tmp_meth = default_RAND_meth;
748     CRYPTO_THREAD_unlock(rand_meth_lock);
749     return tmp_meth;
750 }
751
752 #ifndef OPENSSL_NO_ENGINE
753 int RAND_set_rand_engine(ENGINE *engine)
754 {
755     const RAND_METHOD *tmp_meth = NULL;
756
757     if (!RUN_ONCE(&rand_init, do_rand_init))
758         return 0;
759
760     if (engine != NULL) {
761         if (!ENGINE_init(engine))
762             return 0;
763         tmp_meth = ENGINE_get_RAND(engine);
764         if (tmp_meth == NULL) {
765             ENGINE_finish(engine);
766             return 0;
767         }
768     }
769     CRYPTO_THREAD_write_lock(rand_engine_lock);
770     /* This function releases any prior ENGINE so call it first */
771     RAND_set_rand_method(tmp_meth);
772     funct_ref = engine;
773     CRYPTO_THREAD_unlock(rand_engine_lock);
774     return 1;
775 }
776 #endif
777
778 void RAND_seed(const void *buf, int num)
779 {
780     const RAND_METHOD *meth = RAND_get_rand_method();
781
782     if (meth->seed != NULL)
783         meth->seed(buf, num);
784 }
785
786 void RAND_add(const void *buf, int num, double randomness)
787 {
788     const RAND_METHOD *meth = RAND_get_rand_method();
789
790     if (meth->add != NULL)
791         meth->add(buf, num, randomness);
792 }
793
794 /*
795  * This function is not part of RAND_METHOD, so if we're not using
796  * the default method, then just call RAND_bytes().  Otherwise make
797  * sure we're instantiated and use the private DRBG.
798  */
799 int RAND_priv_bytes(unsigned char *buf, int num)
800 {
801     const RAND_METHOD *meth = RAND_get_rand_method();
802     RAND_DRBG *drbg;
803     int ret;
804
805     if (meth != RAND_OpenSSL())
806         return RAND_bytes(buf, num);
807
808     drbg = RAND_DRBG_get0_private();
809     if (drbg == NULL)
810         return 0;
811
812     ret = RAND_DRBG_bytes(drbg, buf, num);
813     return ret;
814 }
815
816 int RAND_bytes(unsigned char *buf, int num)
817 {
818     const RAND_METHOD *meth = RAND_get_rand_method();
819
820     if (meth->bytes != NULL)
821         return meth->bytes(buf, num);
822     RANDerr(RAND_F_RAND_BYTES, RAND_R_FUNC_NOT_IMPLEMENTED);
823     return -1;
824 }
825
826 #if OPENSSL_API_COMPAT < 0x10100000L
827 int RAND_pseudo_bytes(unsigned char *buf, int num)
828 {
829     const RAND_METHOD *meth = RAND_get_rand_method();
830
831     if (meth->pseudorand != NULL)
832         return meth->pseudorand(buf, num);
833     return -1;
834 }
835 #endif
836
837 int RAND_status(void)
838 {
839     const RAND_METHOD *meth = RAND_get_rand_method();
840
841     if (meth->status != NULL)
842         return meth->status();
843     return 0;
844 }