lh | 9ed821d | 2023-04-07 01:36:19 -0700 | [diff] [blame^] | 1 | =pod |
| 2 | |
| 3 | =head1 NAME |
| 4 | |
| 5 | RAND |
| 6 | - the OpenSSL random generator |
| 7 | |
| 8 | =head1 DESCRIPTION |
| 9 | |
| 10 | Random numbers are a vital part of cryptography, they are needed to provide |
| 11 | unpredictability for tasks like key generation, creating salts, and many more. |
| 12 | Software-based generators must be seeded with external randomness before they |
| 13 | can be used as a cryptographically-secure pseudo-random number generator |
| 14 | (CSPRNG). |
| 15 | The availability of common hardware with special instructions and |
| 16 | modern operating systems, which may use items such as interrupt jitter |
| 17 | and network packet timings, can be reasonable sources of seeding material. |
| 18 | |
| 19 | OpenSSL comes with a default implementation of the RAND API which is based on |
| 20 | the deterministic random bit generator (DRBG) model as described in |
| 21 | [NIST SP 800-90A Rev. 1]. The default random generator will initialize |
| 22 | automatically on first use and will be fully functional without having |
| 23 | to be initialized ('seeded') explicitly. |
| 24 | It seeds and reseeds itself automatically using trusted random sources |
| 25 | provided by the operating system. |
| 26 | |
| 27 | As a normal application developer, you do not have to worry about any details, |
| 28 | just use L<RAND_bytes(3)> to obtain random data. |
| 29 | Having said that, there is one important rule to obey: Always check the error |
| 30 | return value of L<RAND_bytes(3)> and do not take randomness for granted. |
| 31 | Although (re-)seeding is automatic, it can fail because no trusted random source |
| 32 | is available or the trusted source(s) temporarily fail to provide sufficient |
| 33 | random seed material. |
| 34 | In this case the CSPRNG enters an error state and ceases to provide output, |
| 35 | until it is able to recover from the error by reseeding itself. |
| 36 | For more details on reseeding and error recovery, see L<RAND_DRBG(7)>. |
| 37 | |
| 38 | For values that should remain secret, you can use L<RAND_priv_bytes(3)> |
| 39 | instead. |
| 40 | This method does not provide 'better' randomness, it uses the same type of CSPRNG. |
| 41 | The intention behind using a dedicated CSPRNG exclusively for private |
| 42 | values is that none of its output should be visible to an attacker (e.g., |
| 43 | used as salt value), in order to reveal as little information as |
| 44 | possible about its internal state, and that a compromise of the "public" |
| 45 | CSPRNG instance will not affect the secrecy of these private values. |
| 46 | |
| 47 | In the rare case where the default implementation does not satisfy your special |
| 48 | requirements, there are two options: |
| 49 | |
| 50 | =over 2 |
| 51 | |
| 52 | =item * |
| 53 | |
| 54 | Replace the default RAND method by your own RAND method using |
| 55 | L<RAND_set_rand_method(3)>. |
| 56 | |
| 57 | =item * |
| 58 | |
| 59 | Modify the default settings of the OpenSSL RAND method by modifying the security |
| 60 | parameters of the underlying DRBG, which is described in detail in L<RAND_DRBG(7)>. |
| 61 | |
| 62 | =back |
| 63 | |
| 64 | Changing the default random generator or its default parameters should be necessary |
| 65 | only in exceptional cases and is not recommended, unless you have a profound knowledge |
| 66 | of cryptographic principles and understand the implications of your changes. |
| 67 | |
| 68 | =head1 SEE ALSO |
| 69 | |
| 70 | L<RAND_add(3)>, |
| 71 | L<RAND_bytes(3)>, |
| 72 | L<RAND_priv_bytes(3)>, |
| 73 | L<RAND_get_rand_method(3)>, |
| 74 | L<RAND_set_rand_method(3)>, |
| 75 | L<RAND_OpenSSL(3)>, |
| 76 | L<RAND_DRBG(7)> |
| 77 | |
| 78 | =head1 COPYRIGHT |
| 79 | |
| 80 | Copyright 2018-2019 The OpenSSL Project Authors. All Rights Reserved. |
| 81 | |
| 82 | Licensed under the OpenSSL license (the "License"). You may not use |
| 83 | this file except in compliance with the License. You can obtain a copy |
| 84 | in the file LICENSE in the source distribution or at |
| 85 | L<https://www.openssl.org/source/license.html>. |
| 86 | |
| 87 | =cut |