xref: /freebsd/crypto/openssl/crypto/rand/prov_seed.c (revision b077aed3)
1*b077aed3SPierre Pronchery /*
2*b077aed3SPierre Pronchery  * Copyright 2020-2022 The OpenSSL Project Authors. All Rights Reserved.
3*b077aed3SPierre Pronchery  *
4*b077aed3SPierre Pronchery  * Licensed under the Apache License 2.0 (the "License").  You may not use
5*b077aed3SPierre Pronchery  * this file except in compliance with the License.  You can obtain a copy
6*b077aed3SPierre Pronchery  * in the file LICENSE in the source distribution or at
7*b077aed3SPierre Pronchery  * https://www.openssl.org/source/license.html
8*b077aed3SPierre Pronchery  */
9*b077aed3SPierre Pronchery 
10*b077aed3SPierre Pronchery #include "crypto/rand.h"
11*b077aed3SPierre Pronchery #include "crypto/rand_pool.h"
12*b077aed3SPierre Pronchery #include <openssl/core_dispatch.h>
13*b077aed3SPierre Pronchery #include <openssl/err.h>
14*b077aed3SPierre Pronchery 
ossl_rand_get_entropy(ossl_unused const OSSL_CORE_HANDLE * handle,unsigned char ** pout,int entropy,size_t min_len,size_t max_len)15*b077aed3SPierre Pronchery size_t ossl_rand_get_entropy(ossl_unused const OSSL_CORE_HANDLE *handle,
16*b077aed3SPierre Pronchery                              unsigned char **pout, int entropy,
17*b077aed3SPierre Pronchery                              size_t min_len, size_t max_len)
18*b077aed3SPierre Pronchery {
19*b077aed3SPierre Pronchery     size_t ret = 0;
20*b077aed3SPierre Pronchery     size_t entropy_available;
21*b077aed3SPierre Pronchery     RAND_POOL *pool;
22*b077aed3SPierre Pronchery 
23*b077aed3SPierre Pronchery     pool = ossl_rand_pool_new(entropy, 1, min_len, max_len);
24*b077aed3SPierre Pronchery     if (pool == NULL) {
25*b077aed3SPierre Pronchery         ERR_raise(ERR_LIB_RAND, ERR_R_MALLOC_FAILURE);
26*b077aed3SPierre Pronchery         return 0;
27*b077aed3SPierre Pronchery     }
28*b077aed3SPierre Pronchery 
29*b077aed3SPierre Pronchery     /* Get entropy by polling system entropy sources. */
30*b077aed3SPierre Pronchery     entropy_available = ossl_pool_acquire_entropy(pool);
31*b077aed3SPierre Pronchery 
32*b077aed3SPierre Pronchery     if (entropy_available > 0) {
33*b077aed3SPierre Pronchery         ret   = ossl_rand_pool_length(pool);
34*b077aed3SPierre Pronchery         *pout = ossl_rand_pool_detach(pool);
35*b077aed3SPierre Pronchery     }
36*b077aed3SPierre Pronchery 
37*b077aed3SPierre Pronchery     ossl_rand_pool_free(pool);
38*b077aed3SPierre Pronchery     return ret;
39*b077aed3SPierre Pronchery }
40*b077aed3SPierre Pronchery 
ossl_rand_cleanup_entropy(ossl_unused const OSSL_CORE_HANDLE * handle,unsigned char * buf,size_t len)41*b077aed3SPierre Pronchery void ossl_rand_cleanup_entropy(ossl_unused const OSSL_CORE_HANDLE *handle,
42*b077aed3SPierre Pronchery                                unsigned char *buf, size_t len)
43*b077aed3SPierre Pronchery {
44*b077aed3SPierre Pronchery     OPENSSL_secure_clear_free(buf, len);
45*b077aed3SPierre Pronchery }
46*b077aed3SPierre Pronchery 
ossl_rand_get_nonce(ossl_unused const OSSL_CORE_HANDLE * handle,unsigned char ** pout,size_t min_len,size_t max_len,const void * salt,size_t salt_len)47*b077aed3SPierre Pronchery size_t ossl_rand_get_nonce(ossl_unused const OSSL_CORE_HANDLE *handle,
48*b077aed3SPierre Pronchery                            unsigned char **pout, size_t min_len, size_t max_len,
49*b077aed3SPierre Pronchery                            const void *salt, size_t salt_len)
50*b077aed3SPierre Pronchery {
51*b077aed3SPierre Pronchery     size_t ret = 0;
52*b077aed3SPierre Pronchery     RAND_POOL *pool;
53*b077aed3SPierre Pronchery 
54*b077aed3SPierre Pronchery     pool = ossl_rand_pool_new(0, 0, min_len, max_len);
55*b077aed3SPierre Pronchery     if (pool == NULL) {
56*b077aed3SPierre Pronchery         ERR_raise(ERR_LIB_RAND, ERR_R_MALLOC_FAILURE);
57*b077aed3SPierre Pronchery         return 0;
58*b077aed3SPierre Pronchery     }
59*b077aed3SPierre Pronchery 
60*b077aed3SPierre Pronchery     if (!ossl_pool_add_nonce_data(pool))
61*b077aed3SPierre Pronchery         goto err;
62*b077aed3SPierre Pronchery 
63*b077aed3SPierre Pronchery     if (salt != NULL && !ossl_rand_pool_add(pool, salt, salt_len, 0))
64*b077aed3SPierre Pronchery         goto err;
65*b077aed3SPierre Pronchery     ret   = ossl_rand_pool_length(pool);
66*b077aed3SPierre Pronchery     *pout = ossl_rand_pool_detach(pool);
67*b077aed3SPierre Pronchery  err:
68*b077aed3SPierre Pronchery     ossl_rand_pool_free(pool);
69*b077aed3SPierre Pronchery     return ret;
70*b077aed3SPierre Pronchery }
71*b077aed3SPierre Pronchery 
ossl_rand_cleanup_nonce(ossl_unused const OSSL_CORE_HANDLE * handle,unsigned char * buf,size_t len)72*b077aed3SPierre Pronchery void ossl_rand_cleanup_nonce(ossl_unused const OSSL_CORE_HANDLE *handle,
73*b077aed3SPierre Pronchery                              unsigned char *buf, size_t len)
74*b077aed3SPierre Pronchery {
75*b077aed3SPierre Pronchery     OPENSSL_clear_free(buf, len);
76*b077aed3SPierre Pronchery }
77