1=pod
2
3=head1 NAME
4
5RAND_DRBG_set_callbacks,
6RAND_DRBG_get_entropy_fn,
7RAND_DRBG_cleanup_entropy_fn,
8RAND_DRBG_get_nonce_fn,
9RAND_DRBG_cleanup_nonce_fn
10- set callbacks for reseeding
11
12=head1 SYNOPSIS
13
14 #include <openssl/rand_drbg.h>
15
16
17 int RAND_DRBG_set_callbacks(RAND_DRBG *drbg,
18                             RAND_DRBG_get_entropy_fn get_entropy,
19                             RAND_DRBG_cleanup_entropy_fn cleanup_entropy,
20                             RAND_DRBG_get_nonce_fn get_nonce,
21                             RAND_DRBG_cleanup_nonce_fn cleanup_nonce);
22
23
24=head2 Callback Functions
25
26 typedef size_t (*RAND_DRBG_get_entropy_fn)(
27                       RAND_DRBG *drbg,
28                       unsigned char **pout,
29                       int entropy,
30                       size_t min_len, size_t max_len,
31                       int prediction_resistance);
32
33 typedef void (*RAND_DRBG_cleanup_entropy_fn)(
34                     RAND_DRBG *drbg,
35                     unsigned char *out, size_t outlen);
36
37 typedef size_t (*RAND_DRBG_get_nonce_fn)(
38                       RAND_DRBG *drbg,
39                       unsigned char **pout,
40                       int entropy,
41                       size_t min_len, size_t max_len);
42
43 typedef void (*RAND_DRBG_cleanup_nonce_fn)(
44                     RAND_DRBG *drbg,
45                     unsigned char *out, size_t outlen);
46
47
48
49=head1 DESCRIPTION
50
51RAND_DRBG_set_callbacks() sets the callbacks for obtaining fresh entropy and
52the nonce when reseeding the given B<drbg>.
53The callback functions are implemented and provided by the caller.
54Their parameter lists need to match the function prototypes above.
55
56Setting the callbacks is allowed only if the DRBG has not been initialized yet.
57Otherwise, the operation will fail.
58To change the settings for one of the three shared DRBGs it is necessary to call
59RAND_DRBG_uninstantiate() first.
60
61The B<get_entropy>() callback is called by the B<drbg> when it requests fresh
62random input.
63It is expected that the callback allocates and fills a random buffer of size
64B<min_len> <= size <= B<max_len> (in bytes) which contains at least B<entropy>
65bits of randomness.
66The B<prediction_resistance> flag indicates whether the reseeding was
67triggered by a prediction resistance request.
68
69The buffer's address is to be returned in *B<pout> and the number of collected
70randomness bytes as return value.
71
72If the callback fails to acquire at least B<entropy> bits of randomness,
73it must indicate an error by returning a buffer length of 0.
74
75If B<prediction_resistance> was requested and the random source of the DRBG
76does not satisfy the conditions requested by [NIST SP 800-90C], then
77it must also indicate an error by returning a buffer length of 0.
78See NOTES section for more details.
79
80The B<cleanup_entropy>() callback is called from the B<drbg> to to clear and
81free the buffer allocated previously by get_entropy().
82The values B<out> and B<outlen> are the random buffer's address and length,
83as returned by the get_entropy() callback.
84
85The B<get_nonce>() and B<cleanup_nonce>() callbacks are used to obtain a nonce
86and free it again. A nonce is only required for instantiation (not for reseeding)
87and only in the case where the DRBG uses a derivation function.
88The callbacks are analogous to get_entropy() and cleanup_entropy(),
89except for the missing prediction_resistance flag.
90
91If the derivation function is disabled, then no nonce is used for instantiation,
92and the B<get_nonce>() and B<cleanup_nonce>() callbacks can be omitted by
93setting them to NULL.
94
95
96=head1 RETURN VALUES
97
98RAND_DRBG_set_callbacks() return 1 on success, and 0 on failure
99
100=head1 NOTES
101
102It is important that B<cleanup_entropy>() and B<cleanup_nonce>() clear the buffer
103contents safely before freeing it, in order not to leave sensitive information
104about the DRBG's state in memory.
105
106A request for prediction resistance can only be satisfied by pulling fresh
107entropy from one of the approved entropy sources listed in section 5.5.2 of
108[NIST SP 800-90C].
109Since the default implementation of the get_entropy callback does not have access
110to such an approved entropy source, a request for prediction resistance will
111always fail.
112In other words, prediction resistance is currently not supported yet by the DRBG.
113
114The derivation function is disabled during initialization by calling the
115RAND_DRBG_set() function with the RAND_DRBG_FLAG_CTR_NO_DF flag.
116For more information on the derivation function and when it can be omitted,
117see [NIST SP 800-90A Rev. 1]. Roughly speaking it can be omitted if the random
118source has "full entropy", i.e., contains 8 bits of entropy per byte.
119
120Even if a nonce is required, the B<get_nonce>() and B<cleanup_nonce>()
121callbacks can be omitted by setting them to NULL.
122In this case the DRBG will automatically request an extra amount of entropy
123(using the B<get_entropy>() and B<cleanup_entropy>() callbacks) which it will
124utilize for the nonce, following the recommendations of [NIST SP 800-90A Rev. 1],
125section 8.6.7.
126
127=head1 SEE ALSO
128
129L<RAND_DRBG_new(3)>,
130L<RAND_DRBG_reseed(3)>,
131L<RAND_DRBG(7)>
132
133=head1 HISTORY
134
135The RAND_DRBG functions were added in OpenSSL 1.1.1.
136
137=head1 COPYRIGHT
138
139Copyright 2017-2019 The OpenSSL Project Authors. All Rights Reserved.
140
141Licensed under the OpenSSL license (the "License").  You may not use
142this file except in compliance with the License.  You can obtain a copy
143in the file LICENSE in the source distribution or at
144L<https://www.openssl.org/source/license.html>.
145
146=cut
147