| /* test random number generator APIs */ |
| |
| /* |
| * Copyright (c) 2016 Intel Corporation |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| /* |
| * This tests the following random number routines: |
| * void z_early_boot_rand_get(uint8_t *buf, size_t length) |
| * uint32_t sys_rand32_get(void); |
| */ |
| |
| |
| #include <ztest.h> |
| #include <kernel_internal.h> |
| #include <random/rand32.h> |
| |
| #define N_VALUES 10 |
| |
| |
| /** |
| * |
| * @brief Regression test's entry point |
| * |
| */ |
| |
| void test_rand32(void) |
| { |
| uint32_t gen, last_gen, tmp; |
| int rnd_cnt; |
| int equal_count = 0; |
| uint32_t buf[N_VALUES]; |
| |
| /* Test early boot random number generation function */ |
| /* Cover the case, where argument "length" is < size of "size_t" */ |
| z_early_boot_rand_get((uint8_t *)&tmp, (size_t)1); |
| z_early_boot_rand_get((uint8_t *)&last_gen, sizeof(last_gen)); |
| z_early_boot_rand_get((uint8_t *)&gen, sizeof(gen)); |
| zassert_true(last_gen != gen && last_gen != tmp && tmp != gen, |
| "z_early_boot_rand_get failed"); |
| |
| /* |
| * Test subsequently calls sys_rand32_get(), checking |
| * that two values are not equal. |
| */ |
| printk("Generating random numbers\n"); |
| last_gen = sys_rand32_get(); |
| /* |
| * Get several subsequent numbers as fast as possible. |
| * Based on review comments in |
| * https://github.com/zephyrproject-rtos/zephyr/pull/5066 |
| * If minimum half of the numbers generated were the same |
| * as the previously generated one, then test fails, this |
| * should catch a buggy sys_rand32_get() function. |
| */ |
| for (rnd_cnt = 0; rnd_cnt < (N_VALUES - 1); rnd_cnt++) { |
| gen = sys_rand32_get(); |
| if (gen == last_gen) { |
| equal_count++; |
| } |
| last_gen = gen; |
| } |
| |
| if (equal_count > N_VALUES / 2) { |
| zassert_false((equal_count > N_VALUES / 2), |
| "random numbers returned same value with high probability"); |
| } |
| |
| printk("Generating bulk fill random numbers\n"); |
| memset(buf, 0, sizeof(buf)); |
| sys_rand_get((uint8_t *)(&buf[0]), sizeof(buf)); |
| |
| for (rnd_cnt = 0; rnd_cnt < (N_VALUES - 1); rnd_cnt++) { |
| gen = buf[rnd_cnt]; |
| if (gen == last_gen) { |
| equal_count++; |
| } |
| last_gen = gen; |
| } |
| |
| if (equal_count > N_VALUES / 2) { |
| zassert_false((equal_count > N_VALUES / 2), |
| "random numbers returned same value with high probability"); |
| } |
| |
| #if defined(CONFIG_CSPRING_ENABLED) |
| |
| printk("Generating bulk fill cryptographically secure random numbers\n"); |
| |
| memset(buf, 0, sizeof(buf)); |
| sys_csrand_get(buf, sizeof(buf)); |
| |
| for (rnd_cnt = 0; rnd_cnt < (N_VALUES - 1); rnd_cnt++) { |
| gen = buf[rnd_cnt]; |
| if (gen == last_gen) { |
| equal_count++; |
| } |
| last_gen = gen; |
| } |
| |
| if (equal_count > N_VALUES / 2) { |
| zassert_false((equal_count > N_VALUES / 2), |
| "random numbers returned same value with high probability"); |
| } |
| |
| #else |
| |
| printk("Cryptographically secure random number APIs not enabled\n"); |
| |
| #endif /* CONFIG_CSPRING_ENABLED */ |
| } |
| |
| |
| void test_main(void) |
| { |
| ztest_test_suite(common_test, ztest_unit_test(test_rand32)); |
| |
| ztest_run_test_suite(common_test); |
| } |