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