Software APIs
edn_testutils.c
1// Copyright lowRISC contributors (OpenTitan project).
2// Licensed under the Apache License, Version 2.0, see LICENSE for details.
3// SPDX-License-Identifier: Apache-2.0
4
5#include "sw/device/lib/testing/edn_testutils.h"
6
7#include "sw/device/lib/dif/dif_csrng_shared.h"
9#include "sw/device/lib/testing/rand_testutils.h"
10#include "sw/device/lib/testing/test_framework/check.h"
11
12/**
13 * Returns randomized seed material.
14 */
15dif_edn_seed_material_t edn_testutils_seed_material_build(bool disable_rand) {
17 seed.len = disable_rand ? 0
18 : rand_testutils_gen32_range(
20 for (size_t i = 0; i < seed.len; ++i) {
21 seed.data[i] = rand_testutils_gen32();
22 }
23 return seed;
24}
25
26/**
27 * Returns a randomized EDN auto mode configuration.
28 */
29dif_edn_auto_params_t edn_testutils_auto_params_build(bool disable_rand,
30 unsigned int res_itval,
31 unsigned int glen_val) {
33 edn_testutils_seed_material_build(disable_rand);
35 edn_testutils_seed_material_build(disable_rand);
37 edn_testutils_seed_material_build(disable_rand);
38 // If disable_rand is true we set the glen to the default 1.
39 // If disable_rand is false we pick a random value between 1 and 10 with a
40 // bias towards 1. Otherwise, if glen would be too high, we would not see
41 // any reseeds because we do not consume enough entropy.
42 unsigned int glen = glen_val ? glen_val
43 : (disable_rand || rand_testutils_gen32_range(0, 1))
44 ? 1
45 : rand_testutils_gen32_range(2, 10);
46 // The same goes for the number of requests between reseeds
47 unsigned int num_reqs_between_reseeds =
48 res_itval ? res_itval
49 : (disable_rand || rand_testutils_gen32_range(0, 1))
50 ? 2
51 : rand_testutils_gen32_range(3, 5);
52
53 return (dif_edn_auto_params_t){
54 .instantiate_cmd =
55 {
56 .cmd = csrng_cmd_header_build(kCsrngAppCmdInstantiate,
58 seed0.len,
59 /*generate_len=*/0),
60 .seed_material = seed0,
61 },
62 .reseed_cmd =
63 {
64 .cmd = csrng_cmd_header_build(kCsrngAppCmdReseed,
66 seed1.len,
67 /*generate_len=*/0),
68 .seed_material = seed1,
69 },
70 .generate_cmd =
71 {
72 .cmd = csrng_cmd_header_build(kCsrngAppCmdGenerate,
74 seed2.len, glen),
75 .seed_material = seed2,
76 },
77 .reseed_interval = num_reqs_between_reseeds,
78 };
79}