/* Copyright 2022 The ChromiumOS Authors * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. * * Measure performance of the hardware True Random Number Generator (TRNG) * compared to the std::rand(). */ #include "benchmark.h" #include "console.h" #include #include #include extern "C" { #include "test_util.h" #include "trng.h" } test_static int test_rng() { constexpr int num_iterations = 100; Benchmark benchmark({ .num_iterations = num_iterations }); std::array trng_out; std::array rand_out; // Try the hardware true random number generator trng_out.fill(0); trng_init(); auto result = benchmark.run("trng", [&trng_out]() { static int i = 0; trng_rand_bytes(&trng_out[i++], sizeof(uint32_t)); }); trng_exit(); TEST_ASSERT(result.has_value()); for (int i = 0; i < trng_out.size() - 1; ++i) { TEST_NE(trng_out[i], trng_out[i + 1], "%d"); cflush(); } // Repeat the test by turning the TNRG on and off at each iteration trng_out.fill(0); result = benchmark.run("trng_on_off", [&trng_out]() { trng_init(); static int i = 0; trng_rand_bytes(&trng_out[i++], sizeof(uint32_t)); trng_exit(); }); TEST_ASSERT(result.has_value()); for (int i = 0; i < trng_out.size() - 1; ++i) { TEST_NE(trng_out[i], trng_out[i + 1], "%d"); cflush(); } // Repeat the test using std::rand() for comparison rand_out.fill(0); result = benchmark.run("std::rand", [&rand_out]() { static int i = 0; rand_out[i++] = std::rand(); }); TEST_ASSERT(result.has_value()); for (int i = 0; i < rand_out.size() - 1; ++i) { TEST_NE(rand_out[i], rand_out[i + 1], "%d"); cflush(); } benchmark.print_results(); return EC_SUCCESS; } void run_test(int argc, const char **argv) { test_reset(); RUN_TEST(test_rng); test_print_result(); }