/src/openssl31/crypto/rand/prov_seed.c
Line  | Count  | Source (jump to first uncovered line)  | 
1  |  | /*  | 
2  |  |  * Copyright 2020-2023 The OpenSSL Project Authors. All Rights Reserved.  | 
3  |  |  *  | 
4  |  |  * Licensed under the Apache License 2.0 (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 "rand_local.h"  | 
11  |  | #include "crypto/evp.h"  | 
12  |  | #include "crypto/rand.h"  | 
13  |  | #include "crypto/rand_pool.h"  | 
14  |  | #include "internal/core.h"  | 
15  |  | #include <openssl/core_dispatch.h>  | 
16  |  | #include <openssl/err.h>  | 
17  |  |  | 
18  |  | size_t ossl_rand_get_entropy(ossl_unused OSSL_LIB_CTX *ctx,  | 
19  |  |                              unsigned char **pout, int entropy,  | 
20  |  |                              size_t min_len, size_t max_len)  | 
21  | 208  | { | 
22  | 208  |     size_t ret = 0;  | 
23  | 208  |     size_t entropy_available;  | 
24  | 208  |     RAND_POOL *pool;  | 
25  |  |  | 
26  | 208  |     pool = ossl_rand_pool_new(entropy, 1, min_len, max_len);  | 
27  | 208  |     if (pool == NULL) { | 
28  | 0  |         ERR_raise(ERR_LIB_RAND, ERR_R_MALLOC_FAILURE);  | 
29  | 0  |         return 0;  | 
30  | 0  |     }  | 
31  |  |  | 
32  |  |     /* Get entropy by polling system entropy sources. */  | 
33  | 208  |     entropy_available = ossl_pool_acquire_entropy(pool);  | 
34  |  |  | 
35  | 208  |     if (entropy_available > 0) { | 
36  | 208  |         ret   = ossl_rand_pool_length(pool);  | 
37  | 208  |         *pout = ossl_rand_pool_detach(pool);  | 
38  | 208  |     }  | 
39  |  |  | 
40  | 208  |     ossl_rand_pool_free(pool);  | 
41  | 208  |     return ret;  | 
42  | 208  | }  | 
43  |  |  | 
44  |  | size_t ossl_rand_get_user_entropy(OSSL_LIB_CTX *ctx,  | 
45  |  |                                   unsigned char **pout, int entropy,  | 
46  |  |                                   size_t min_len, size_t max_len)  | 
47  | 208  | { | 
48  | 208  |     EVP_RAND_CTX *rng = ossl_rand_get0_seed_noncreating(ctx);  | 
49  |  |  | 
50  | 208  |     if (rng != NULL && evp_rand_can_seed(rng))  | 
51  | 0  |         return evp_rand_get_seed(rng, pout, entropy, min_len, max_len,  | 
52  | 0  |                                  0, NULL, 0);  | 
53  | 208  |     else  | 
54  | 208  |         return ossl_rand_get_entropy(ctx, pout, entropy, min_len, max_len);  | 
55  | 208  | }  | 
56  |  |  | 
57  |  | void ossl_rand_cleanup_entropy(ossl_unused OSSL_LIB_CTX *ctx,  | 
58  |  |                                unsigned char *buf, size_t len)  | 
59  | 0  | { | 
60  | 0  |     OPENSSL_secure_clear_free(buf, len);  | 
61  | 0  | }  | 
62  |  |  | 
63  |  | void ossl_rand_cleanup_user_entropy(OSSL_LIB_CTX *ctx,  | 
64  |  |                                     unsigned char *buf, size_t len)  | 
65  | 208  | { | 
66  | 208  |     EVP_RAND_CTX *rng = ossl_rand_get0_seed_noncreating(ctx);  | 
67  |  |  | 
68  | 208  |     if (rng != NULL && evp_rand_can_seed(rng))  | 
69  | 0  |         evp_rand_clear_seed(rng, buf, len);  | 
70  | 208  |     else  | 
71  | 208  |         OPENSSL_secure_clear_free(buf, len);  | 
72  | 208  | }  | 
73  |  |  | 
74  |  | size_t ossl_rand_get_nonce(ossl_unused OSSL_LIB_CTX *ctx,  | 
75  |  |                            unsigned char **pout,  | 
76  |  |                            size_t min_len, ossl_unused size_t max_len,  | 
77  |  |                            const void *salt, size_t salt_len)  | 
78  | 100  | { | 
79  | 100  |     size_t ret = 0;  | 
80  | 100  |     RAND_POOL *pool;  | 
81  |  |  | 
82  | 100  |     pool = ossl_rand_pool_new(0, 0, min_len, max_len);  | 
83  | 100  |     if (pool == NULL) { | 
84  | 0  |         ERR_raise(ERR_LIB_RAND, ERR_R_MALLOC_FAILURE);  | 
85  | 0  |         return 0;  | 
86  | 0  |     }  | 
87  |  |  | 
88  | 100  |     if (!ossl_pool_add_nonce_data(pool))  | 
89  | 0  |         goto err;  | 
90  |  |  | 
91  | 100  |     if (salt != NULL && !ossl_rand_pool_add(pool, salt, salt_len, 0))  | 
92  | 0  |         goto err;  | 
93  | 100  |     ret   = ossl_rand_pool_length(pool);  | 
94  | 100  |     *pout = ossl_rand_pool_detach(pool);  | 
95  | 100  |  err:  | 
96  | 100  |     ossl_rand_pool_free(pool);  | 
97  | 100  |     return ret;  | 
98  | 100  | }  | 
99  |  |  | 
100  |  | size_t ossl_rand_get_user_nonce(OSSL_LIB_CTX *ctx,  | 
101  |  |                                 unsigned char **pout,  | 
102  |  |                                 size_t min_len, size_t max_len,  | 
103  |  |                                 const void *salt, size_t salt_len)  | 
104  | 100  | { | 
105  | 100  |     unsigned char *buf;  | 
106  | 100  |     EVP_RAND_CTX *rng = ossl_rand_get0_seed_noncreating(ctx);  | 
107  |  |  | 
108  | 100  |     if (rng == NULL)  | 
109  | 100  |         return ossl_rand_get_nonce(ctx, pout, min_len, max_len, salt, salt_len);  | 
110  |  |  | 
111  | 0  |     if ((buf = OPENSSL_malloc(min_len)) == NULL)  | 
112  | 0  |         return 0;  | 
113  |  |  | 
114  | 0  |     if (!EVP_RAND_generate(rng, buf, min_len, 0, 0, salt, salt_len)) { | 
115  | 0  |         OPENSSL_free(buf);  | 
116  | 0  |         return 0;  | 
117  | 0  |     }  | 
118  | 0  |     *pout = buf;  | 
119  | 0  |     return min_len;  | 
120  | 0  | }  | 
121  |  |  | 
122  |  | void ossl_rand_cleanup_nonce(ossl_unused OSSL_LIB_CTX *ctx,  | 
123  |  |                              unsigned char *buf, size_t len)  | 
124  | 0  | { | 
125  | 0  |     OPENSSL_clear_free(buf, len);  | 
126  | 0  | }  | 
127  |  |  | 
128  |  | void ossl_rand_cleanup_user_nonce(ossl_unused OSSL_LIB_CTX *ctx,  | 
129  |  |                                   unsigned char *buf, size_t len)  | 
130  | 100  | { | 
131  | 100  |     OPENSSL_clear_free(buf, len);  | 
132  | 100  | }  |