#include <openssl/rand.h>
#include <stdio.h>
#include <gtest/gtest.h>
#include <openssl/span.h>
#include "../bcm_support.h"
#include "../fipsmodule/rand/internal.h"
#include "../test/abi_test.h"
#include "../test/test_util.h"
#if defined(OPENSSL_THREADS)
#include <array>
#include <thread>
#include <vector>
#endif
#if !defined(OPENSSL_WINDOWS)
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#endif
TEST(RandTest, NotObviouslyBroken) { … }
#if !defined(OPENSSL_WINDOWS) && !defined(OPENSSL_IOS) && \
!defined(OPENSSL_FUCHSIA) && !defined(BORINGSSL_UNSAFE_DETERMINISTIC_MODE)
static bool ForkAndRand(bssl::Span<uint8_t> out, bool fork_unsafe_buffering) { … }
TEST(RandTest, Fork) { … }
#endif
#if defined(OPENSSL_THREADS)
static void RunConcurrentRands(size_t num_threads) { … }
TEST(RandTest, Threads) { … }
#endif
#if defined(OPENSSL_X86_64) && defined(SUPPORTS_ABI_TEST)
TEST(RandTest, RdrandABI) {
if (!have_rdrand()) {
fprintf(stderr, "rdrand not supported. Skipping.\n");
return;
}
uint8_t buf[32];
CHECK_ABI_SEH(CRYPTO_rdrand, buf);
CHECK_ABI_SEH(CRYPTO_rdrand_multiple8_buf, nullptr, 0);
CHECK_ABI_SEH(CRYPTO_rdrand_multiple8_buf, buf, 8);
CHECK_ABI_SEH(CRYPTO_rdrand_multiple8_buf, buf, 16);
CHECK_ABI_SEH(CRYPTO_rdrand_multiple8_buf, buf, 24);
CHECK_ABI_SEH(CRYPTO_rdrand_multiple8_buf, buf, 32);
}
#endif