Fix glibc version detection.
[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 #ifdef OPENSSL_SYS_UNIX
19 # include <sys/types.h>
20 # include <unistd.h>
21 # include <sys/time.h>
22 #endif
23 #include "e_os.h"
24
25 /* Macro to convert two thirty two bit values into a sixty four bit one */
26 #define TWO32TO64(a, b) ((((uint64_t)(a)) << 32) + (b))
27
28 /*
29  * Check for the existence and support of POSIX timers.  The standard
30  * says that the _POSIX_TIMERS macro will have a positive value if they
31  * are available.
32  *
33  * However, we want an additional constraint: that the timer support does
34  * not require an extra library dependency.  Early versions of glibc
35  * require -lrt to be specified on the link line to access the timers,
36  * so this needs to be checked for.
37  *
38  * It is worse because some libraries define __GLIBC__ but don't
39  * support the version testing macro (e.g. uClibc).  This means
40  * an extra check is needed.
41  *
42  * The final condition is:
43  *      "have posix timers and either not glibc or glibc without -lrt"
44  *
45  * The nested #if sequences are required to avoid using a parameterised
46  * macro that might be undefined.
47  */
48 #undef OSSL_POSIX_TIMER_OKAY
49 #if defined(_POSIX_TIMERS) && _POSIX_TIMERS > 0
50 # if defined(__GLIBC__)
51 #  if defined(__GLIBC_PREREQ)
52 #   if __GLIBC_PREREQ(2, 17)
53 #    define OSSL_POSIX_TIMER_OKAY
54 #   endif
55 #  endif
56 # else
57 #  define OSSL_POSIX_TIMER_OKAY
58 # endif
59 #endif
60
61 #ifndef OPENSSL_NO_ENGINE
62 /* non-NULL if default_RAND_meth is ENGINE-provided */
63 static ENGINE *funct_ref;
64 static CRYPTO_RWLOCK *rand_engine_lock;
65 #endif
66 static CRYPTO_RWLOCK *rand_meth_lock;
67 static const RAND_METHOD *default_RAND_meth;
68 static CRYPTO_ONCE rand_init = CRYPTO_ONCE_STATIC_INIT;
69
70 int rand_fork_count;
71
72 #ifdef OPENSSL_RAND_SEED_RDTSC
73 /*
74  * IMPORTANT NOTE:  It is not currently possible to use this code
75  * because we are not sure about the amount of randomness it provides.
76  * Some SP900 tests have been run, but there is internal skepticism.
77  * So for now this code is not used.
78  */
79 # error "RDTSC enabled?  Should not be possible!"
80
81 /*
82  * Acquire entropy from high-speed clock
83  *
84  * Since we get some randomness from the low-order bits of the
85  * high-speed clock, it can help.
86  *
87  * Returns the total entropy count, if it exceeds the requested
88  * entropy count. Otherwise, returns an entropy count of 0.
89  */
90 size_t rand_acquire_entropy_from_tsc(RAND_POOL *pool)
91 {
92     unsigned char c;
93     int i;
94
95     if ((OPENSSL_ia32cap_P[0] & (1 << 4)) != 0) {
96         for (i = 0; i < TSC_READ_COUNT; i++) {
97             c = (unsigned char)(OPENSSL_rdtsc() & 0xFF);
98             RAND_POOL_add(pool, &c, 1, 4);
99         }
100     }
101     return RAND_POOL_entropy_available(pool);
102 }
103 #endif
104
105 #ifdef OPENSSL_RAND_SEED_RDCPU
106 size_t OPENSSL_ia32_rdseed_bytes(unsigned char *buf, size_t len);
107 size_t OPENSSL_ia32_rdrand_bytes(unsigned char *buf, size_t len);
108
109 extern unsigned int OPENSSL_ia32cap_P[];
110
111 /*
112  * Acquire entropy using Intel-specific cpu instructions
113  *
114  * Uses the RDSEED instruction if available, otherwise uses
115  * RDRAND if available.
116  *
117  * For the differences between RDSEED and RDRAND, and why RDSEED
118  * is the preferred choice, see https://goo.gl/oK3KcN
119  *
120  * Returns the total entropy count, if it exceeds the requested
121  * entropy count. Otherwise, returns an entropy count of 0.
122  */
123 size_t rand_acquire_entropy_from_cpu(RAND_POOL *pool)
124 {
125     size_t bytes_needed;
126     unsigned char *buffer;
127
128     bytes_needed = RAND_POOL_bytes_needed(pool, 8 /*entropy_per_byte*/);
129     if (bytes_needed > 0) {
130         buffer = RAND_POOL_add_begin(pool, bytes_needed);
131
132         if (buffer != NULL) {
133
134             /* If RDSEED is available, use that. */
135             if ((OPENSSL_ia32cap_P[2] & (1 << 18)) != 0) {
136                 if (OPENSSL_ia32_rdseed_bytes(buffer, bytes_needed)
137                     == bytes_needed)
138                     return RAND_POOL_add_end(pool,
139                                              bytes_needed,
140                                              8 * bytes_needed);
141             }
142
143             /* Second choice is RDRAND. */
144             if ((OPENSSL_ia32cap_P[1] & (1 << (62 - 32))) != 0) {
145                 if (OPENSSL_ia32_rdrand_bytes(buffer, bytes_needed)
146                     == bytes_needed)
147                     return RAND_POOL_add_end(pool,
148                                              bytes_needed,
149                                              8 * bytes_needed);
150             }
151
152             return RAND_POOL_add_end(pool, 0, 0);
153         }
154     }
155
156     return RAND_POOL_entropy_available(pool);
157 }
158 #endif
159
160
161 /*
162  * Implements the get_entropy() callback (see RAND_DRBG_set_callbacks())
163  *
164  * If the DRBG has a parent, then the required amount of entropy input
165  * is fetched using the parent's RAND_DRBG_generate().
166  *
167  * Otherwise, the entropy is polled from the system entropy sources
168  * using RAND_POOL_acquire_entropy().
169  *
170  * If a random pool has been added to the DRBG using RAND_add(), then
171  * its entropy will be used up first.
172  */
173 size_t rand_drbg_get_entropy(RAND_DRBG *drbg,
174                         unsigned char **pout,
175                         int entropy, size_t min_len, size_t max_len)
176 {
177     size_t ret = 0;
178     size_t entropy_available = 0;
179     RAND_POOL *pool = RAND_POOL_new(entropy, min_len, max_len);
180
181     if (pool == NULL)
182         return 0;
183
184     if (drbg->pool) {
185         RAND_POOL_add(pool,
186                       RAND_POOL_buffer(drbg->pool),
187                       RAND_POOL_length(drbg->pool),
188                       RAND_POOL_entropy(drbg->pool));
189         RAND_POOL_free(drbg->pool);
190         drbg->pool = NULL;
191     }
192
193     if (drbg->parent) {
194         size_t bytes_needed = RAND_POOL_bytes_needed(pool, 8);
195         unsigned char *buffer = RAND_POOL_add_begin(pool, bytes_needed);
196
197         if (buffer != NULL) {
198             size_t bytes = 0;
199
200             /*
201              * Get random from parent, include our state as additional input.
202              * Our lock is already held, but we need to lock our parent before
203              * generating bits from it.
204              */
205             if (drbg->parent->lock)
206                 CRYPTO_THREAD_write_lock(drbg->parent->lock);
207             if (RAND_DRBG_generate(drbg->parent,
208                                    buffer, bytes_needed,
209                                    0,
210                                    (unsigned char *)drbg, sizeof(*drbg)) != 0)
211                 bytes = bytes_needed;
212             if (drbg->parent->lock)
213                 CRYPTO_THREAD_unlock(drbg->parent->lock);
214
215             entropy_available = RAND_POOL_add_end(pool, bytes, 8 * bytes);
216         }
217
218     } else {
219         /* Get entropy by polling system entropy sources. */
220         entropy_available = RAND_POOL_acquire_entropy(pool);
221     }
222
223     if (entropy_available > 0) {
224         ret   = RAND_POOL_length(pool);
225         *pout = RAND_POOL_detach(pool);
226     }
227
228     RAND_POOL_free(pool);
229     return ret;
230 }
231
232 /*
233  * Find a suitable system time.  Start with the highest resolution source
234  * and work down to the slower ones.  This is added as additional data and
235  * isn't counted as randomness, so any result is acceptable.
236  */
237 static uint64_t get_timer_bits(void)
238 {
239     uint64_t res = OPENSSL_rdtsc();
240
241     if (res != 0)
242         return res;
243 #if defined(_WIN32)
244     {
245         LARGE_INTEGER t;
246         FILETIME ft;
247
248         if (QueryPerformanceCounter(&t) != 0)
249             return t.QuadPart;
250         GetSystemTimeAsFileTime(&ft);
251         return TWO32TO64(ft.dwHighDateTime, ft.dwLowDateTime);
252     }
253 #elif defined(__sun) || defined(__hpux)
254     return gethrtime();
255 #elif defined(_AIX)
256     {
257         timebasestruct_t t;
258
259         read_wall_time(&t, TIMEBASE_SZ);
260         return TWO32TO64(t.tb_high, t.tb_low);
261     }
262 #else
263
264 #if defined(OSSL_POSIX_TIMER_OKAY)
265     {
266         struct timespec ts;
267         clockid_t cid;
268
269 #  ifdef CLOCK_BOOTTIME
270         cid = CLOCK_BOOTTIME;
271 #  elif defined(_POSIX_MONOTONIC_CLOCK)
272         cid = CLOCK_MONOTONIC;
273 #  else
274         cid = CLOCK_REALTIME;
275 #  endif
276
277         if (clock_gettime(cid, &ts) == 0)
278             return TWO32TO64(ts.tv_sec, ts.tv_nsec);
279     }
280 # endif
281 # if defined(__unix__) \
282      || (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112L)
283     {
284         struct timeval tv;
285
286         if (gettimeofday(&tv, NULL) == 0)
287             return TWO32TO64(tv.tv_sec, tv.tv_usec);
288     }
289 # endif
290     return time(NULL);
291 #endif
292 }
293
294 /*
295  * Generate additional data that can be used for the drbg. The data does
296  * not need to contain entropy, but it's useful if it contains at least
297  * some bits that are unpredictable.
298  *
299  * Returns 0 on failure.
300  *
301  * On success it allocates a buffer at |*pout| and returns the length of
302  * the data. The buffer should get freed using OPENSSL_secure_clear_free().
303  */
304 size_t rand_drbg_get_additional_data(unsigned char **pout, size_t max_len)
305 {
306     RAND_POOL *pool;
307     CRYPTO_THREAD_ID thread_id;
308     size_t len;
309 #ifdef OPENSSL_SYS_UNIX
310     pid_t pid;
311 #elif defined(OPENSSL_SYS_WIN32)
312     DWORD pid;
313 #endif
314     uint64_t tbits;
315
316     pool = RAND_POOL_new(0, 0, max_len);
317     if (pool == NULL)
318         return 0;
319
320 #ifdef OPENSSL_SYS_UNIX
321     pid = getpid();
322     RAND_POOL_add(pool, (unsigned char *)&pid, sizeof(pid), 0);
323 #elif defined(OPENSSL_SYS_WIN32)
324     pid = GetCurrentProcessId();
325     RAND_POOL_add(pool, (unsigned char *)&pid, sizeof(pid), 0);
326 #endif
327
328     thread_id = CRYPTO_THREAD_get_current_id();
329     if (thread_id != 0)
330         RAND_POOL_add(pool, (unsigned char *)&thread_id, sizeof(thread_id), 0);
331
332     tbits = get_timer_bits();
333     RAND_POOL_add(pool, (unsigned char *)&tbits, sizeof(tbits), 0);
334
335     /* TODO: Use RDSEED? */
336
337     len = RAND_POOL_length(pool);
338     if (len != 0)
339         *pout = RAND_POOL_detach(pool);
340     RAND_POOL_free(pool);
341
342     return len;
343 }
344
345 /*
346  * Implements the cleanup_entropy() callback (see RAND_DRBG_set_callbacks())
347  *
348  */
349 void rand_drbg_cleanup_entropy(RAND_DRBG *drbg,
350                                unsigned char *out, size_t outlen)
351 {
352     OPENSSL_secure_clear_free(out, outlen);
353 }
354
355 void rand_fork()
356 {
357     rand_fork_count++;
358 }
359
360 DEFINE_RUN_ONCE_STATIC(do_rand_init)
361 {
362     int ret = 1;
363
364 #ifndef OPENSSL_NO_ENGINE
365     rand_engine_lock = CRYPTO_THREAD_lock_new();
366     ret &= rand_engine_lock != NULL;
367 #endif
368     rand_meth_lock = CRYPTO_THREAD_lock_new();
369     ret &= rand_meth_lock != NULL;
370
371     return ret;
372 }
373
374 void rand_cleanup_int(void)
375 {
376     const RAND_METHOD *meth = default_RAND_meth;
377
378     if (meth != NULL && meth->cleanup != NULL)
379         meth->cleanup();
380     RAND_set_rand_method(NULL);
381 #ifndef OPENSSL_NO_ENGINE
382     CRYPTO_THREAD_lock_free(rand_engine_lock);
383 #endif
384     CRYPTO_THREAD_lock_free(rand_meth_lock);
385 }
386
387 /*
388  * RAND_poll() reseeds the default RNG using random input
389  *
390  * The random input is obtained from polling various entropy
391  * sources which depend on the operating system and are
392  * configurable via the --with-rand-seed configure option.
393  */
394 int RAND_poll(void)
395 {
396     int ret = 0;
397
398     RAND_POOL *pool = NULL;
399
400     const RAND_METHOD *meth = RAND_get_rand_method();
401
402     if (meth == RAND_OpenSSL()) {
403         /* fill random pool and seed the master DRBG */
404         RAND_DRBG *drbg = RAND_DRBG_get0_master();
405
406         if (drbg == NULL)
407             return 0;
408
409         CRYPTO_THREAD_write_lock(drbg->lock);
410         ret = rand_drbg_restart(drbg, NULL, 0, 0);
411         CRYPTO_THREAD_unlock(drbg->lock);
412
413         return ret;
414
415     } else {
416         /* fill random pool and seed the current legacy RNG */
417         pool = RAND_POOL_new(RAND_DRBG_STRENGTH,
418                              RAND_DRBG_STRENGTH / 8,
419                              DRBG_MINMAX_FACTOR * (RAND_DRBG_STRENGTH / 8));
420         if (pool == NULL)
421             return 0;
422
423         if (RAND_POOL_acquire_entropy(pool) == 0)
424             goto err;
425
426         if (meth->add == NULL
427             || meth->add(RAND_POOL_buffer(pool),
428                          RAND_POOL_length(pool),
429                          (RAND_POOL_entropy(pool) / 8.0)) == 0)
430             goto err;
431
432         ret = 1;
433     }
434
435 err:
436     RAND_POOL_free(pool);
437     return ret;
438 }
439
440 /*
441  * The 'random pool' acts as a dumb container for collecting random
442  * input from various entropy sources. The pool has no knowledge about
443  * whether its randomness is fed into a legacy RAND_METHOD via RAND_add()
444  * or into a new style RAND_DRBG. It is the callers duty to 1) initialize the
445  * random pool, 2) pass it to the polling callbacks, 3) seed the RNG, and
446  * 4) cleanup the random pool again.
447  *
448  * The random pool contains no locking mechanism because its scope and
449  * lifetime is intended to be restricted to a single stack frame.
450  */
451 struct rand_pool_st {
452     unsigned char *buffer;  /* points to the beginning of the random pool */
453     size_t len; /* current number of random bytes contained in the pool */
454
455     size_t min_len; /* minimum number of random bytes requested */
456     size_t max_len; /* maximum number of random bytes (allocated buffer size) */
457     size_t entropy; /* current entropy count in bits */
458     size_t requested_entropy; /* requested entropy count in bits */
459 };
460
461 /*
462  * Allocate memory and initialize a new random pool
463  */
464
465 RAND_POOL *RAND_POOL_new(int entropy, size_t min_len, size_t max_len)
466 {
467     RAND_POOL *pool = OPENSSL_zalloc(sizeof(*pool));
468
469     if (pool == NULL) {
470         RANDerr(RAND_F_RAND_POOL_NEW, ERR_R_MALLOC_FAILURE);
471         goto err;
472     }
473
474     pool->min_len = min_len;
475     pool->max_len = max_len;
476
477     pool->buffer = OPENSSL_secure_zalloc(pool->max_len);
478     if (pool->buffer == NULL) {
479         RANDerr(RAND_F_RAND_POOL_NEW, ERR_R_MALLOC_FAILURE);
480         goto err;
481     }
482
483     pool->requested_entropy = entropy;
484
485     return pool;
486
487 err:
488     OPENSSL_free(pool);
489     return NULL;
490 }
491
492 /*
493  * Free |pool|, securely erasing its buffer.
494  */
495 void RAND_POOL_free(RAND_POOL *pool)
496 {
497     if (pool == NULL)
498         return;
499
500     OPENSSL_secure_clear_free(pool->buffer, pool->max_len);
501     OPENSSL_free(pool);
502 }
503
504 /*
505  * Return the |pool|'s buffer to the caller (readonly).
506  */
507 const unsigned char *RAND_POOL_buffer(RAND_POOL *pool)
508 {
509     return pool->buffer;
510 }
511
512 /*
513  * Return the |pool|'s entropy to the caller.
514  */
515 size_t RAND_POOL_entropy(RAND_POOL *pool)
516 {
517     return pool->entropy;
518 }
519
520 /*
521  * Return the |pool|'s buffer length to the caller.
522  */
523 size_t RAND_POOL_length(RAND_POOL *pool)
524 {
525     return pool->len;
526 }
527
528 /*
529  * Detach the |pool| buffer and return it to the caller.
530  * It's the responsibility of the caller to free the buffer
531  * using OPENSSL_secure_clear_free().
532  */
533 unsigned char *RAND_POOL_detach(RAND_POOL *pool)
534 {
535     unsigned char *ret = pool->buffer;
536     pool->buffer = NULL;
537     return ret;
538 }
539
540
541 /*
542  * If every byte of the input contains |entropy_per_bytes| bits of entropy,
543  * how many bytes does one need to obtain at least |bits| bits of entropy?
544  */
545 #define ENTROPY_TO_BYTES(bits, entropy_per_bytes) \
546     (((bits) + ((entropy_per_bytes) - 1))/(entropy_per_bytes))
547
548
549 /*
550  * Checks whether the |pool|'s entropy is available to the caller.
551  * This is the case when entropy count and buffer length are high enough.
552  * Returns
553  *
554  *  |entropy|  if the entropy count and buffer size is large enough
555  *      0      otherwise
556  */
557 size_t RAND_POOL_entropy_available(RAND_POOL *pool)
558 {
559     if (pool->entropy < pool->requested_entropy)
560         return 0;
561
562     if (pool->len < pool->min_len)
563         return 0;
564
565     return pool->entropy;
566 }
567
568 /*
569  * Returns the (remaining) amount of entropy needed to fill
570  * the random pool.
571  */
572
573 size_t RAND_POOL_entropy_needed(RAND_POOL *pool)
574 {
575     if (pool->entropy < pool->requested_entropy)
576         return pool->requested_entropy - pool->entropy;
577
578     return 0;
579 }
580
581 /*
582  * Returns the number of bytes needed to fill the pool, assuming
583  * the input has 'entropy_per_byte' entropy bits per byte.
584  * In case of an error, 0 is returned.
585  */
586
587 size_t RAND_POOL_bytes_needed(RAND_POOL *pool, unsigned int entropy_per_byte)
588 {
589     size_t bytes_needed;
590     size_t entropy_needed = RAND_POOL_entropy_needed(pool);
591
592     if (entropy_per_byte < 1 || entropy_per_byte > 8) {
593         RANDerr(RAND_F_RAND_POOL_BYTES_NEEDED, RAND_R_ARGUMENT_OUT_OF_RANGE);
594         return 0;
595     }
596
597     bytes_needed = ENTROPY_TO_BYTES(entropy_needed, entropy_per_byte);
598
599     if (bytes_needed > pool->max_len - pool->len) {
600         /* not enough space left */
601         RANDerr(RAND_F_RAND_POOL_BYTES_NEEDED, RAND_R_RANDOM_POOL_OVERFLOW);
602         return 0;
603     }
604
605     if (pool->len < pool->min_len &&
606         bytes_needed < pool->min_len - pool->len)
607         /* to meet the min_len requirement */
608         bytes_needed = pool->min_len - pool->len;
609
610     return bytes_needed;
611 }
612
613 /* Returns the remaining number of bytes available */
614 size_t RAND_POOL_bytes_remaining(RAND_POOL *pool)
615 {
616     return pool->max_len - pool->len;
617 }
618
619 /*
620  * Add random bytes to the random pool.
621  *
622  * It is expected that the |buffer| contains |len| bytes of
623  * random input which contains at least |entropy| bits of
624  * randomness.
625  *
626  * Return available amount of entropy after this operation.
627  * (see RAND_POOL_entropy_available(pool))
628  */
629 size_t RAND_POOL_add(RAND_POOL *pool,
630                      const unsigned char *buffer, size_t len, size_t entropy)
631 {
632     if (len > pool->max_len - pool->len) {
633         RANDerr(RAND_F_RAND_POOL_ADD, RAND_R_ENTROPY_INPUT_TOO_LONG);
634         return 0;
635     }
636
637     if (len > 0) {
638         memcpy(pool->buffer + pool->len, buffer, len);
639         pool->len += len;
640         pool->entropy += entropy;
641     }
642
643     return RAND_POOL_entropy_available(pool);
644 }
645
646 /*
647  * Start to add random bytes to the random pool in-place.
648  *
649  * Reserves the next |len| bytes for adding random bytes in-place
650  * and returns a pointer to the buffer.
651  * The caller is allowed to copy up to |len| bytes into the buffer.
652  * If |len| == 0 this is considered a no-op and a NULL pointer
653  * is returned without producing an error message.
654  *
655  * After updating the buffer, RAND_POOL_add_end() needs to be called
656  * to finish the udpate operation (see next comment).
657  */
658 unsigned char *RAND_POOL_add_begin(RAND_POOL *pool, size_t len)
659 {
660     if (len == 0)
661         return NULL;
662
663     if (len > pool->max_len - pool->len) {
664         RANDerr(RAND_F_RAND_POOL_ADD_BEGIN, RAND_R_RANDOM_POOL_OVERFLOW);
665         return NULL;
666     }
667
668     return pool->buffer + pool->len;
669 }
670
671 /*
672  * Finish to add random bytes to the random pool in-place.
673  *
674  * Finishes an in-place update of the random pool started by
675  * RAND_POOL_add_begin() (see previous comment).
676  * It is expected that |len| bytes of random input have been added
677  * to the buffer which contain at least |entropy| bits of randomness.
678  * It is allowed to add less bytes than originally reserved.
679  */
680 size_t RAND_POOL_add_end(RAND_POOL *pool, size_t len, size_t entropy)
681 {
682     if (len > pool->max_len - pool->len) {
683         RANDerr(RAND_F_RAND_POOL_ADD_END, RAND_R_RANDOM_POOL_OVERFLOW);
684         return 0;
685     }
686
687     if (len > 0) {
688         pool->len += len;
689         pool->entropy += entropy;
690     }
691
692     return RAND_POOL_entropy_available(pool);
693 }
694
695 int RAND_set_rand_method(const RAND_METHOD *meth)
696 {
697     if (!RUN_ONCE(&rand_init, do_rand_init))
698         return 0;
699
700     CRYPTO_THREAD_write_lock(rand_meth_lock);
701 #ifndef OPENSSL_NO_ENGINE
702     ENGINE_finish(funct_ref);
703     funct_ref = NULL;
704 #endif
705     default_RAND_meth = meth;
706     CRYPTO_THREAD_unlock(rand_meth_lock);
707     return 1;
708 }
709
710 const RAND_METHOD *RAND_get_rand_method(void)
711 {
712     const RAND_METHOD *tmp_meth = NULL;
713
714     if (!RUN_ONCE(&rand_init, do_rand_init))
715         return NULL;
716
717     CRYPTO_THREAD_write_lock(rand_meth_lock);
718     if (default_RAND_meth == NULL) {
719 #ifndef OPENSSL_NO_ENGINE
720         ENGINE *e;
721
722         /* If we have an engine that can do RAND, use it. */
723         if ((e = ENGINE_get_default_RAND()) != NULL
724                 && (tmp_meth = ENGINE_get_RAND(e)) != NULL) {
725             funct_ref = e;
726             default_RAND_meth = tmp_meth;
727         } else {
728             ENGINE_finish(e);
729             default_RAND_meth = &rand_meth;
730         }
731 #else
732         default_RAND_meth = &rand_meth;
733 #endif
734     }
735     tmp_meth = default_RAND_meth;
736     CRYPTO_THREAD_unlock(rand_meth_lock);
737     return tmp_meth;
738 }
739
740 #ifndef OPENSSL_NO_ENGINE
741 int RAND_set_rand_engine(ENGINE *engine)
742 {
743     const RAND_METHOD *tmp_meth = NULL;
744
745     if (!RUN_ONCE(&rand_init, do_rand_init))
746         return 0;
747
748     if (engine != NULL) {
749         if (!ENGINE_init(engine))
750             return 0;
751         tmp_meth = ENGINE_get_RAND(engine);
752         if (tmp_meth == NULL) {
753             ENGINE_finish(engine);
754             return 0;
755         }
756     }
757     CRYPTO_THREAD_write_lock(rand_engine_lock);
758     /* This function releases any prior ENGINE so call it first */
759     RAND_set_rand_method(tmp_meth);
760     funct_ref = engine;
761     CRYPTO_THREAD_unlock(rand_engine_lock);
762     return 1;
763 }
764 #endif
765
766 void RAND_seed(const void *buf, int num)
767 {
768     const RAND_METHOD *meth = RAND_get_rand_method();
769
770     if (meth->seed != NULL)
771         meth->seed(buf, num);
772 }
773
774 void RAND_add(const void *buf, int num, double randomness)
775 {
776     const RAND_METHOD *meth = RAND_get_rand_method();
777
778     if (meth->add != NULL)
779         meth->add(buf, num, randomness);
780 }
781
782 /*
783  * This function is not part of RAND_METHOD, so if we're not using
784  * the default method, then just call RAND_bytes().  Otherwise make
785  * sure we're instantiated and use the private DRBG.
786  */
787 int RAND_priv_bytes(unsigned char *buf, int num)
788 {
789     const RAND_METHOD *meth = RAND_get_rand_method();
790     RAND_DRBG *drbg;
791     int ret;
792
793     if (meth != RAND_OpenSSL())
794         return RAND_bytes(buf, num);
795
796     drbg = RAND_DRBG_get0_private();
797     if (drbg == NULL)
798         return 0;
799
800     /* We have to lock the DRBG before generating bits from it. */
801     CRYPTO_THREAD_write_lock(drbg->lock);
802     ret = RAND_DRBG_bytes(drbg, buf, num);
803     CRYPTO_THREAD_unlock(drbg->lock);
804     return ret;
805 }
806
807 int RAND_bytes(unsigned char *buf, int num)
808 {
809     const RAND_METHOD *meth = RAND_get_rand_method();
810
811     if (meth->bytes != NULL)
812         return meth->bytes(buf, num);
813     RANDerr(RAND_F_RAND_BYTES, RAND_R_FUNC_NOT_IMPLEMENTED);
814     return -1;
815 }
816
817 #if OPENSSL_API_COMPAT < 0x10100000L
818 int RAND_pseudo_bytes(unsigned char *buf, int num)
819 {
820     const RAND_METHOD *meth = RAND_get_rand_method();
821
822     if (meth->pseudorand != NULL)
823         return meth->pseudorand(buf, num);
824     return -1;
825 }
826 #endif
827
828 int RAND_status(void)
829 {
830     const RAND_METHOD *meth = RAND_get_rand_method();
831
832     if (meth->status != NULL)
833         return meth->status();
834     return 0;
835 }