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