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  */
15 dif_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  */
29 dif_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 }