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