Consolidate to a single asn1_time_from_tm() function
[openssl.git] / crypto / rand / rand_lib.c
1 /*
2  * Copyright 1995-2016 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
19 #ifndef OPENSSL_NO_ENGINE
20 /* non-NULL if default_RAND_meth is ENGINE-provided */
21 static ENGINE *funct_ref;
22 static CRYPTO_RWLOCK *rand_engine_lock;
23 #endif
24 static CRYPTO_RWLOCK *rand_meth_lock;
25 static const RAND_METHOD *default_RAND_meth;
26 static CRYPTO_ONCE rand_init = CRYPTO_ONCE_STATIC_INIT;
27 RAND_BYTES_BUFFER rand_bytes;
28
29 #ifdef OPENSSL_RAND_SEED_RDTSC
30 /*
31  * IMPORTANT NOTE:  It is not currently possible to use this code
32  * because we are not sure about the amount of randomness.  Some
33  * SP900 tests have been run, but there is internal skepticism.
34  * So for now this code is not used.
35  */
36 # error "RDTSC enabled?  Should not be possible!"
37
38 /*
39  * Since we get some randomness from the low-order bits of the
40  * high-speec clock, it can help.  But don't return a status since
41  * it's not sufficient to indicate whether or not the seeding was
42  * done.
43  */
44 void rand_read_tsc(RAND_poll_fn cb, void *arg)
45 {
46     unsigned char c;
47     int i;
48
49     for (i = 0; i < 10; i++) {
50         c = (unsigned char)(OPENSSL_rdtsc() & 0xFF);
51         cb(arg, &c, 1, 0.5);
52     }
53 }
54 #endif
55
56 #ifdef OPENSSL_RAND_SEED_RDCPU
57 size_t OPENSSL_ia32_rdseed(void);
58 size_t OPENSSL_ia32_rdrand(void);
59
60 extern unsigned int OPENSSL_ia32cap_P[];
61
62 int rand_read_cpu(RAND_poll_fn cb, void *arg)
63 {
64     size_t i, s;
65
66     /* If RDSEED is available, use that. */
67     if ((OPENSSL_ia32cap_P[1] & (1 << 18)) != 0) {
68         for (i = 0; i < RANDOMNESS_NEEDED; i += sizeof(s)) {
69             s = OPENSSL_ia32_rdseed();
70             if (s == 0)
71                 break;
72             cb(arg, &s, (int)sizeof(s), sizeof(s));
73         }
74         if (i >= RANDOMNESS_NEEDED)
75             return 1;
76     }
77
78     /* Second choice is RDRAND. */
79     if ((OPENSSL_ia32cap_P[1] & (1 << (62 - 32))) != 0) {
80         for (i = 0; i < RANDOMNESS_NEEDED; i += sizeof(s)) {
81             s = OPENSSL_ia32_rdrand();
82             if (s == 0)
83                 break;
84             cb(arg, &s, (int)sizeof(s), sizeof(s));
85         }
86         if (i >= RANDOMNESS_NEEDED)
87             return 1;
88     }
89
90     return 0;
91 }
92 #endif
93
94
95 /*
96  * DRBG has two sets of callbacks; we only discuss the "entropy" one
97  * here.  When the DRBG needs additional randomness bits (called entropy
98  * in the NIST document), it calls the get_entropy callback which fills in
99  * a pointer and returns the number of bytes. When the DRBG is finished with
100  * the buffer, it calls the cleanup_entropy callback, with the value of
101  * the buffer that the get_entropy callback filled in.
102  *
103  * Get entropy from the system, via RAND_poll if needed.  The |entropy|
104  * is the bits of randomness required, and is expected to fit into a buffer
105  * of |min_len|..|max__len| size.  We assume we're getting high-quality
106  * randomness from the system, and that |min_len| bytes will do.
107  */
108 size_t drbg_entropy_from_system(RAND_DRBG *drbg,
109                                 unsigned char **pout,
110                                 int entropy, size_t min_len, size_t max_len)
111 {
112     int i;
113
114
115     if (min_len > (size_t)drbg->size) {
116         /* Should not happen.  See comment near RANDOMNESS_NEEDED. */
117         min_len = drbg->size;
118     }
119
120     if (rand_drbg.filled) {
121         /* Re-use what we have. */
122         *pout = drbg->randomness;
123         return drbg->size;
124     }
125
126     /* If we don't have enough, try to get more. */
127     CRYPTO_THREAD_write_lock(rand_bytes.lock);
128     for (i = RAND_POLL_RETRIES; rand_bytes.curr < min_len && --i >= 0; ) {
129         CRYPTO_THREAD_unlock(rand_bytes.lock);
130         RAND_poll();
131         CRYPTO_THREAD_write_lock(rand_bytes.lock);
132     }
133
134     /* Get desired amount, but no more than we have. */
135     if (min_len > rand_bytes.curr)
136         min_len = rand_bytes.curr;
137     if (min_len != 0) {
138         memcpy(drbg->randomness, rand_bytes.buff, min_len);
139         rand_drbg.filled = 1;
140         /* Update amount left and shift it down. */
141         rand_bytes.curr -= min_len;
142         if (rand_bytes.curr != 0)
143             memmove(rand_bytes.buff, &rand_bytes.buff[min_len], rand_bytes.curr);
144     }
145     CRYPTO_THREAD_unlock(rand_bytes.lock);
146     return min_len;
147 }
148
149 size_t drbg_entropy_from_parent(RAND_DRBG *drbg,
150                                 unsigned char **pout,
151                                 int entropy, size_t min_len, size_t max_len)
152 {
153     int st;
154
155     if (min_len > (size_t)drbg->size) {
156         /* Should not happen.  See comment near RANDOMNESS_NEEDED. */
157         min_len = drbg->size;
158     }
159
160     /* Get random from parent, include our state as additional input. */
161     st = RAND_DRBG_generate(drbg->parent, drbg->randomness, min_len, 0,
162                             (unsigned char *)drbg, sizeof(*drbg));
163     if (st == 0)
164         return 0;
165     drbg->filled = 1;
166     return min_len;
167 }
168
169 void drbg_release_entropy(RAND_DRBG *drbg, unsigned char *out)
170 {
171     drbg->filled = 0;
172     OPENSSL_cleanse(drbg->randomness, drbg->size);
173 }
174
175
176 /*
177  * Set up a global DRBG.
178  */
179 static int setup_drbg(RAND_DRBG *drbg)
180 {
181     int ret = 1;
182
183     drbg->lock = CRYPTO_THREAD_lock_new();
184     ret &= drbg->lock != NULL;
185     drbg->size = RANDOMNESS_NEEDED;
186     drbg->randomness = OPENSSL_malloc(drbg->size);
187     ret &= drbg->randomness != NULL;
188     /* If you change these parameters, see RANDOMNESS_NEEDED */
189     ret &= RAND_DRBG_set(drbg,
190                          NID_aes_128_ctr, RAND_DRBG_FLAG_CTR_USE_DF) == 1;
191     ret &= RAND_DRBG_set_callbacks(drbg, drbg_entropy_from_system,
192                                    drbg_release_entropy, NULL, NULL) == 1;
193     return ret;
194 }
195
196 static void free_drbg(RAND_DRBG *drbg)
197 {
198     CRYPTO_THREAD_lock_free(drbg->lock);
199     OPENSSL_clear_free(drbg->randomness, drbg->size);
200     RAND_DRBG_uninstantiate(drbg);
201 }
202
203 DEFINE_RUN_ONCE_STATIC(do_rand_init)
204 {
205     int ret = 1;
206
207 #ifndef OPENSSL_NO_ENGINE
208     rand_engine_lock = CRYPTO_THREAD_lock_new();
209     ret &= rand_engine_lock != NULL;
210 #endif
211     rand_meth_lock = CRYPTO_THREAD_lock_new();
212     ret &= rand_meth_lock != NULL;
213
214     rand_bytes.lock = CRYPTO_THREAD_lock_new();
215     ret &= rand_bytes.lock != NULL;
216     rand_bytes.curr = 0;
217     rand_bytes.size = MAX_RANDOMNESS_HELD;
218     /* TODO: Should this be secure malloc? */
219     rand_bytes.buff = malloc(rand_bytes.size);
220
221     ret &= rand_bytes.buff != NULL;
222     ret &= setup_drbg(&rand_drbg);
223     ret &= setup_drbg(&priv_drbg);
224     return ret;
225 }
226
227
228 void rand_cleanup_int(void)
229 {
230     const RAND_METHOD *meth = default_RAND_meth;
231
232     if (meth != NULL && meth->cleanup != NULL)
233         meth->cleanup();
234     RAND_set_rand_method(NULL);
235 #ifndef OPENSSL_NO_ENGINE
236     CRYPTO_THREAD_lock_free(rand_engine_lock);
237 #endif
238     CRYPTO_THREAD_lock_free(rand_meth_lock);
239     CRYPTO_THREAD_lock_free(rand_bytes.lock);
240     OPENSSL_clear_free(rand_bytes.buff, rand_bytes.size);
241     free_drbg(&rand_drbg);
242     free_drbg(&priv_drbg);
243 }
244
245 /*
246  * RAND_poll_ex() gets a function pointer to call when it has random bytes.
247  * RAND_poll() sets the function pointer to be a wrapper that calls RAND_add().
248  */
249 static void call_rand_add(void* arg, const void *buf, int num, double r)
250 {
251     RAND_add(buf, num, r);
252 }
253
254 int RAND_poll(void)
255 {
256     return RAND_poll_ex(call_rand_add, NULL);
257 }
258
259 int RAND_set_rand_method(const RAND_METHOD *meth)
260 {
261     if (!RUN_ONCE(&rand_init, do_rand_init))
262         return 0;
263
264     CRYPTO_THREAD_write_lock(rand_meth_lock);
265 #ifndef OPENSSL_NO_ENGINE
266     ENGINE_finish(funct_ref);
267     funct_ref = NULL;
268 #endif
269     default_RAND_meth = meth;
270     CRYPTO_THREAD_unlock(rand_meth_lock);
271     return 1;
272 }
273
274 const RAND_METHOD *RAND_get_rand_method(void)
275 {
276     const RAND_METHOD *tmp_meth = NULL;
277
278     if (!RUN_ONCE(&rand_init, do_rand_init))
279         return NULL;
280
281     CRYPTO_THREAD_write_lock(rand_meth_lock);
282     if (default_RAND_meth == NULL) {
283 #ifndef OPENSSL_NO_ENGINE
284         ENGINE *e;
285
286         /* If we have an engine that can do RAND, use it. */
287         if ((e = ENGINE_get_default_RAND()) != NULL
288                 && (tmp_meth = ENGINE_get_RAND(e)) != NULL) {
289             funct_ref = e;
290             default_RAND_meth = tmp_meth;
291         } else {
292             ENGINE_finish(e);
293             default_RAND_meth = &rand_meth;
294         }
295 #else
296         default_RAND_meth = &rand_meth;
297 #endif
298     }
299     tmp_meth = default_RAND_meth;
300     CRYPTO_THREAD_unlock(rand_meth_lock);
301     return tmp_meth;
302 }
303
304 #ifndef OPENSSL_NO_ENGINE
305 int RAND_set_rand_engine(ENGINE *engine)
306 {
307     const RAND_METHOD *tmp_meth = NULL;
308
309     if (!RUN_ONCE(&rand_init, do_rand_init))
310         return 0;
311
312     if (engine != NULL) {
313         if (!ENGINE_init(engine))
314             return 0;
315         tmp_meth = ENGINE_get_RAND(engine);
316         if (tmp_meth == NULL) {
317             ENGINE_finish(engine);
318             return 0;
319         }
320     }
321     CRYPTO_THREAD_write_lock(rand_engine_lock);
322     /* This function releases any prior ENGINE so call it first */
323     RAND_set_rand_method(tmp_meth);
324     funct_ref = engine;
325     CRYPTO_THREAD_unlock(rand_engine_lock);
326     return 1;
327 }
328 #endif
329
330 void RAND_seed(const void *buf, int num)
331 {
332     const RAND_METHOD *meth = RAND_get_rand_method();
333
334     if (meth->seed != NULL)
335         meth->seed(buf, num);
336 }
337
338 void RAND_add(const void *buf, int num, double randomness)
339 {
340     const RAND_METHOD *meth = RAND_get_rand_method();
341
342     if (meth->add != NULL)
343         meth->add(buf, num, randomness);
344 }
345
346 /*
347  * This function is not part of RAND_METHOD, so if we're not using
348  * the default method, then just call RAND_bytes().  Otherwise make
349  * sure we're instantiated and use the private DRBG.
350  */
351 int RAND_priv_bytes(unsigned char *buf, int num)
352 {
353     const RAND_METHOD *meth = RAND_get_rand_method();
354
355     if (meth != RAND_OpenSSL())
356         return RAND_bytes(buf, num);
357
358     if (priv_drbg.state == DRBG_UNINITIALISED
359             && RAND_DRBG_instantiate(&priv_drbg, NULL, 0) == 0)
360         return 0;
361     return RAND_DRBG_generate(&priv_drbg, buf, num, 0, NULL, 0);
362
363 }
364
365 int RAND_bytes(unsigned char *buf, int num)
366 {
367     const RAND_METHOD *meth = RAND_get_rand_method();
368
369     if (meth->bytes != NULL)
370         return meth->bytes(buf, num);
371     RANDerr(RAND_F_RAND_BYTES, RAND_R_FUNC_NOT_IMPLEMENTED);
372     return -1;
373 }
374
375 #if OPENSSL_API_COMPAT < 0x10100000L
376 int RAND_pseudo_bytes(unsigned char *buf, int num)
377 {
378     const RAND_METHOD *meth = RAND_get_rand_method();
379
380     if (meth->pseudorand != NULL)
381         return meth->pseudorand(buf, num);
382     return -1;
383 }
384 #endif
385
386 int RAND_status(void)
387 {
388     const RAND_METHOD *meth = RAND_get_rand_method();
389
390     if (meth->status != NULL)
391         return meth->status();
392     return 0;
393 }