1 | =pod
|
---|
2 |
|
---|
3 | =head1 NAME
|
---|
4 |
|
---|
5 | RAND_DRBG - the deterministic random bit generator
|
---|
6 |
|
---|
7 | =head1 SYNOPSIS
|
---|
8 |
|
---|
9 | #include <openssl/rand_drbg.h>
|
---|
10 |
|
---|
11 | =head1 DESCRIPTION
|
---|
12 |
|
---|
13 | The default OpenSSL RAND method is based on the RAND_DRBG class,
|
---|
14 | which implements a deterministic random bit generator (DRBG).
|
---|
15 | A DRBG is a certain type of cryptographically-secure pseudo-random
|
---|
16 | number generator (CSPRNG), which is described in
|
---|
17 | [NIST SP 800-90A Rev. 1].
|
---|
18 |
|
---|
19 | While the RAND API is the 'frontend' which is intended to be used by
|
---|
20 | application developers for obtaining random bytes, the RAND_DRBG API
|
---|
21 | serves as the 'backend', connecting the former with the operating
|
---|
22 | systems's entropy sources and providing access to the DRBG's
|
---|
23 | configuration parameters.
|
---|
24 |
|
---|
25 | =head2 Disclaimer
|
---|
26 |
|
---|
27 | Unless you have very specific requirements for your random generator,
|
---|
28 | it is in general not necessary to utilize the RAND_DRBG API directly.
|
---|
29 | The usual way to obtain random bytes is to use L<RAND_bytes(3)> or
|
---|
30 | L<RAND_priv_bytes(3)>, see also L<RAND(7)>.
|
---|
31 |
|
---|
32 | =head2 Typical Use Cases
|
---|
33 |
|
---|
34 | Typical examples for such special use cases are the following:
|
---|
35 |
|
---|
36 | =over 2
|
---|
37 |
|
---|
38 | =item *
|
---|
39 |
|
---|
40 | You want to use your own private DRBG instances.
|
---|
41 | Multiple DRBG instances which are accessed only by a single thread provide
|
---|
42 | additional security (because their internal states are independent) and
|
---|
43 | better scalability in multithreaded applications (because they don't need
|
---|
44 | to be locked).
|
---|
45 |
|
---|
46 | =item *
|
---|
47 |
|
---|
48 | You need to integrate a previously unsupported entropy source.
|
---|
49 |
|
---|
50 | =item *
|
---|
51 |
|
---|
52 | You need to change the default settings of the standard OpenSSL RAND
|
---|
53 | implementation to meet specific requirements.
|
---|
54 |
|
---|
55 | =back
|
---|
56 |
|
---|
57 |
|
---|
58 | =head1 CHAINING
|
---|
59 |
|
---|
60 | A DRBG instance can be used as the entropy source of another DRBG instance,
|
---|
61 | provided it has itself access to a valid entropy source.
|
---|
62 | The DRBG instance which acts as entropy source is called the I<parent> DRBG,
|
---|
63 | the other instance the I<child> DRBG.
|
---|
64 |
|
---|
65 | This is called chaining. A chained DRBG instance is created by passing
|
---|
66 | a pointer to the parent DRBG as argument to the RAND_DRBG_new() call.
|
---|
67 | It is possible to create chains of more than two DRBG in a row.
|
---|
68 |
|
---|
69 | =head1 THE THREE SHARED DRBG INSTANCES
|
---|
70 |
|
---|
71 | Currently, there are three shared DRBG instances,
|
---|
72 | the <master>, <public>, and <private> DRBG.
|
---|
73 | While the <master> DRBG is a single global instance, the <public> and <private>
|
---|
74 | DRBG are created per thread and accessed through thread-local storage.
|
---|
75 |
|
---|
76 | By default, the functions L<RAND_bytes(3)> and L<RAND_priv_bytes(3)> use
|
---|
77 | the thread-local <public> and <private> DRBG instance, respectively.
|
---|
78 |
|
---|
79 | =head2 The <master> DRBG instance
|
---|
80 |
|
---|
81 | The <master> DRBG is not used directly by the application, only for reseeding
|
---|
82 | the two other two DRBG instances. It reseeds itself by obtaining randomness
|
---|
83 | either from os entropy sources or by consuming randomness which was added
|
---|
84 | previously by L<RAND_add(3)>.
|
---|
85 |
|
---|
86 | =head2 The <public> DRBG instance
|
---|
87 |
|
---|
88 | This instance is used per default by L<RAND_bytes(3)>.
|
---|
89 |
|
---|
90 | =head2 The <private> DRBG instance
|
---|
91 |
|
---|
92 | This instance is used per default by L<RAND_priv_bytes(3)>
|
---|
93 |
|
---|
94 |
|
---|
95 | =head1 LOCKING
|
---|
96 |
|
---|
97 | The <master> DRBG is intended to be accessed concurrently for reseeding
|
---|
98 | by its child DRBG instances. The necessary locking is done internally.
|
---|
99 | It is I<not> thread-safe to access the <master> DRBG directly via the
|
---|
100 | RAND_DRBG interface.
|
---|
101 | The <public> and <private> DRBG are thread-local, i.e. there is an
|
---|
102 | instance of each per thread. So they can safely be accessed without
|
---|
103 | locking via the RAND_DRBG interface.
|
---|
104 |
|
---|
105 | Pointers to these DRBG instances can be obtained using
|
---|
106 | RAND_DRBG_get0_master(),
|
---|
107 | RAND_DRBG_get0_public(), and
|
---|
108 | RAND_DRBG_get0_private(), respectively.
|
---|
109 | Note that it is not allowed to store a pointer to one of the thread-local
|
---|
110 | DRBG instances in a variable or other memory location where it will be
|
---|
111 | accessed and used by multiple threads.
|
---|
112 |
|
---|
113 | All other DRBG instances created by an application don't support locking,
|
---|
114 | because they are intended to be used by a single thread.
|
---|
115 | Instead of accessing a single DRBG instance concurrently from different
|
---|
116 | threads, it is recommended to instantiate a separate DRBG instance per
|
---|
117 | thread. Using the <master> DRBG as entropy source for multiple DRBG
|
---|
118 | instances on different threads is thread-safe, because the DRBG instance
|
---|
119 | will lock the <master> DRBG automatically for obtaining random input.
|
---|
120 |
|
---|
121 | =head1 THE OVERALL PICTURE
|
---|
122 |
|
---|
123 | The following picture gives an overview over how the DRBG instances work
|
---|
124 | together and are being used.
|
---|
125 |
|
---|
126 | +--------------------+
|
---|
127 | | os entropy sources |
|
---|
128 | +--------------------+
|
---|
129 | |
|
---|
130 | v +-----------------------------+
|
---|
131 | RAND_add() ==> <master> <-| shared DRBG (with locking) |
|
---|
132 | / \ +-----------------------------+
|
---|
133 | / \ +---------------------------+
|
---|
134 | <public> <private> <- | per-thread DRBG instances |
|
---|
135 | | | +---------------------------+
|
---|
136 | v v
|
---|
137 | RAND_bytes() RAND_priv_bytes()
|
---|
138 | | ^
|
---|
139 | | |
|
---|
140 | +------------------+ +------------------------------------+
|
---|
141 | | general purpose | | used for secrets like session keys |
|
---|
142 | | random generator | | and private keys for certificates |
|
---|
143 | +------------------+ +------------------------------------+
|
---|
144 |
|
---|
145 |
|
---|
146 | The usual way to obtain random bytes is to call RAND_bytes(...) or
|
---|
147 | RAND_priv_bytes(...). These calls are roughly equivalent to calling
|
---|
148 | RAND_DRBG_bytes(<public>, ...) and RAND_DRBG_bytes(<private>, ...),
|
---|
149 | respectively. The method L<RAND_DRBG_bytes(3)> is a convenience method
|
---|
150 | wrapping the L<RAND_DRBG_generate(3)> function, which serves the actual
|
---|
151 | request for random data.
|
---|
152 |
|
---|
153 | =head1 RESEEDING
|
---|
154 |
|
---|
155 | A DRBG instance seeds itself automatically, pulling random input from
|
---|
156 | its entropy source. The entropy source can be either a trusted operating
|
---|
157 | system entropy source, or another DRBG with access to such a source.
|
---|
158 |
|
---|
159 | Automatic reseeding occurs after a predefined number of generate requests.
|
---|
160 | The selection of the trusted entropy sources is configured at build
|
---|
161 | time using the --with-rand-seed option. The following sections explain
|
---|
162 | the reseeding process in more detail.
|
---|
163 |
|
---|
164 | =head2 Automatic Reseeding
|
---|
165 |
|
---|
166 | Before satisfying a generate request (L<RAND_DRBG_generate(3)>), the DRBG
|
---|
167 | reseeds itself automatically, if one of the following conditions holds:
|
---|
168 |
|
---|
169 | - the DRBG was not instantiated (=seeded) yet or has been uninstantiated.
|
---|
170 |
|
---|
171 | - the number of generate requests since the last reseeding exceeds a
|
---|
172 | certain threshold, the so called I<reseed_interval>.
|
---|
173 | This behaviour can be disabled by setting the I<reseed_interval> to 0.
|
---|
174 |
|
---|
175 | - the time elapsed since the last reseeding exceeds a certain time
|
---|
176 | interval, the so called I<reseed_time_interval>.
|
---|
177 | This can be disabled by setting the I<reseed_time_interval> to 0.
|
---|
178 |
|
---|
179 | - the DRBG is in an error state.
|
---|
180 |
|
---|
181 | B<Note>: An error state is entered if the entropy source fails while
|
---|
182 | the DRBG is seeding or reseeding.
|
---|
183 | The last case ensures that the DRBG automatically recovers
|
---|
184 | from the error as soon as the entropy source is available again.
|
---|
185 |
|
---|
186 | =head2 Manual Reseeding
|
---|
187 |
|
---|
188 | In addition to automatic reseeding, the caller can request an immediate
|
---|
189 | reseeding of the DRBG with fresh entropy by setting the
|
---|
190 | I<prediction resistance> parameter to 1 when calling L<RAND_DRBG_generate(3)>.
|
---|
191 |
|
---|
192 | The document [NIST SP 800-90C] describes prediction resistance requests
|
---|
193 | in detail and imposes strict conditions on the entropy sources that are
|
---|
194 | approved for providing prediction resistance.
|
---|
195 | Since the default DRBG implementation does not have access to such an approved
|
---|
196 | entropy source, a request for prediction resistance will currently always fail.
|
---|
197 | In other words, prediction resistance is currently not supported yet by the DRBG.
|
---|
198 |
|
---|
199 |
|
---|
200 | For the three shared DRBGs (and only for these) there is another way to
|
---|
201 | reseed them manually:
|
---|
202 | If L<RAND_add(3)> is called with a positive I<randomness> argument
|
---|
203 | (or L<RAND_seed(3)>), then this will immediately reseed the <master> DRBG.
|
---|
204 | The <public> and <private> DRBG will detect this on their next generate
|
---|
205 | call and reseed, pulling randomness from <master>.
|
---|
206 |
|
---|
207 | The last feature has been added to support the common practice used with
|
---|
208 | previous OpenSSL versions to call RAND_add() before calling RAND_bytes().
|
---|
209 |
|
---|
210 |
|
---|
211 | =head2 Entropy Input vs. Additional Data
|
---|
212 |
|
---|
213 | The DRBG distinguishes two different types of random input: I<entropy>,
|
---|
214 | which comes from a trusted source, and I<additional input>',
|
---|
215 | which can optionally be added by the user and is considered untrusted.
|
---|
216 | It is possible to add I<additional input> not only during reseeding,
|
---|
217 | but also for every generate request.
|
---|
218 | This is in fact done automatically by L<RAND_DRBG_bytes(3)>.
|
---|
219 |
|
---|
220 |
|
---|
221 | =head2 Configuring the Random Seed Source
|
---|
222 |
|
---|
223 | In most cases OpenSSL will automatically choose a suitable seed source
|
---|
224 | for automatically seeding and reseeding its <master> DRBG. In some cases
|
---|
225 | however, it will be necessary to explicitly specify a seed source during
|
---|
226 | configuration, using the --with-rand-seed option. For more information,
|
---|
227 | see the INSTALL instructions. There are also operating systems where no
|
---|
228 | seed source is available and automatic reseeding is disabled by default.
|
---|
229 |
|
---|
230 | The following two sections describe the reseeding process of the master
|
---|
231 | DRBG, depending on whether automatic reseeding is available or not.
|
---|
232 |
|
---|
233 |
|
---|
234 | =head2 Reseeding the master DRBG with automatic seeding enabled
|
---|
235 |
|
---|
236 | Calling RAND_poll() or RAND_add() is not necessary, because the DRBG
|
---|
237 | pulls the necessary entropy from its source automatically.
|
---|
238 | However, both calls are permitted, and do reseed the RNG.
|
---|
239 |
|
---|
240 | RAND_add() can be used to add both kinds of random input, depending on the
|
---|
241 | value of the B<randomness> argument:
|
---|
242 |
|
---|
243 | =over 4
|
---|
244 |
|
---|
245 | =item randomness == 0:
|
---|
246 |
|
---|
247 | The random bytes are mixed as additional input into the current state of
|
---|
248 | the DRBG.
|
---|
249 | Mixing in additional input is not considered a full reseeding, hence the
|
---|
250 | reseed counter is not reset.
|
---|
251 |
|
---|
252 |
|
---|
253 | =item randomness > 0:
|
---|
254 |
|
---|
255 | The random bytes are used as entropy input for a full reseeding
|
---|
256 | (resp. reinstantiation) if the DRBG is instantiated
|
---|
257 | (resp. uninstantiated or in an error state).
|
---|
258 | The number of random bits required for reseeding is determined by the
|
---|
259 | security strength of the DRBG. Currently it defaults to 256 bits (32 bytes).
|
---|
260 | It is possible to provide less randomness than required.
|
---|
261 | In this case the missing randomness will be obtained by pulling random input
|
---|
262 | from the trusted entropy sources.
|
---|
263 |
|
---|
264 | =back
|
---|
265 |
|
---|
266 | =head2 Reseeding the master DRBG with automatic seeding disabled
|
---|
267 |
|
---|
268 | Calling RAND_poll() will always fail.
|
---|
269 |
|
---|
270 | RAND_add() needs to be called for initial seeding and periodic reseeding.
|
---|
271 | At least 48 bytes (384 bits) of randomness have to be provided, otherwise
|
---|
272 | the (re-)seeding of the DRBG will fail. This corresponds to one and a half
|
---|
273 | times the security strength of the DRBG. The extra half is used for the
|
---|
274 | nonce during instantiation.
|
---|
275 |
|
---|
276 | More precisely, the number of bytes needed for seeding depend on the
|
---|
277 | I<security strength> of the DRBG, which is set to 256 by default.
|
---|
278 |
|
---|
279 | =head1 SEE ALSO
|
---|
280 |
|
---|
281 | L<RAND_DRBG_bytes(3)>,
|
---|
282 | L<RAND_DRBG_generate(3)>,
|
---|
283 | L<RAND_DRBG_reseed(3)>,
|
---|
284 | L<RAND_DRBG_get0_master(3)>,
|
---|
285 | L<RAND_DRBG_get0_public(3)>,
|
---|
286 | L<RAND_DRBG_get0_private(3)>,
|
---|
287 | L<RAND_DRBG_set_reseed_interval(3)>,
|
---|
288 | L<RAND_DRBG_set_reseed_time_interval(3)>,
|
---|
289 | L<RAND_DRBG_set_reseed_defaults(3)>,
|
---|
290 | L<RAND(7)>,
|
---|
291 |
|
---|
292 | =head1 COPYRIGHT
|
---|
293 |
|
---|
294 | Copyright 2017-2018 The OpenSSL Project Authors. All Rights Reserved.
|
---|
295 |
|
---|
296 | Licensed under the OpenSSL license (the "License"). You may not use
|
---|
297 | this file except in compliance with the License. You can obtain a copy
|
---|
298 | in the file LICENSE in the source distribution or at
|
---|
299 | L<https://www.openssl.org/source/license.html>.
|
---|
300 |
|
---|
301 | =cut
|
---|