blob: 147f5440c81639c44aa713fea776d6ba6b2303ac [file] [log] [blame]
Gilles Peskine077599a2021-02-03 18:55:39 +01001/* BEGIN_HEADER */
2
3/* Test random generation as a whole. */
4
Gilles Peskinee3ed8022021-02-03 20:04:08 +01005#include "mbedtls/bignum.h"
Gilles Peskine077599a2021-02-03 18:55:39 +01006#include "mbedtls/ctr_drbg.h"
Gilles Peskinee3ed8022021-02-03 20:04:08 +01007#include "mbedtls/ecdsa.h"
Gilles Peskine077599a2021-02-03 18:55:39 +01008#include "mbedtls/entropy.h"
9#include "mbedtls/hmac_drbg.h"
Gilles Peskinee3ed8022021-02-03 20:04:08 +010010#include "mbedtls/psa_util.h"
Gilles Peskine077599a2021-02-03 18:55:39 +010011#include "psa/crypto.h"
12
13/* How many bytes to generate in each test case for repeated generation.
14 * This must be high enough that the probability of generating the same
15 * output twice is infinitesimal, but low enough that random generators
16 * are willing to deliver that much. */
17#define OUTPUT_SIZE 32
18
19/* END_HEADER */
20
Mateusz Starzyk72f60df2021-04-30 13:28:22 +020021/* BEGIN_CASE depends_on:MBEDTLS_ENTROPY_C:MBEDTLS_CTR_DRBG_C */
Gilles Peskine449bd832023-01-11 14:50:10 +010022void random_twice_with_ctr_drbg()
Gilles Peskine077599a2021-02-03 18:55:39 +010023{
24 mbedtls_entropy_context entropy;
25 mbedtls_ctr_drbg_context drbg;
26 unsigned char output1[OUTPUT_SIZE];
27 unsigned char output2[OUTPUT_SIZE];
28
Manuel Pégourié-Gonnarde9319772023-03-21 18:09:40 +010029 MD_PSA_INIT();
30
Gilles Peskine077599a2021-02-03 18:55:39 +010031 /* First round */
Gilles Peskine449bd832023-01-11 14:50:10 +010032 mbedtls_entropy_init(&entropy);
33 mbedtls_ctr_drbg_init(&drbg);
34 TEST_EQUAL(0, mbedtls_ctr_drbg_seed(&drbg,
35 mbedtls_entropy_func, &entropy,
36 NULL, 0));
37 TEST_EQUAL(0, mbedtls_ctr_drbg_random(&drbg,
38 output1, sizeof(output1)));
39 mbedtls_ctr_drbg_free(&drbg);
40 mbedtls_entropy_free(&entropy);
Gilles Peskine077599a2021-02-03 18:55:39 +010041
42 /* Second round */
Gilles Peskine449bd832023-01-11 14:50:10 +010043 mbedtls_entropy_init(&entropy);
44 mbedtls_ctr_drbg_init(&drbg);
45 TEST_EQUAL(0, mbedtls_ctr_drbg_seed(&drbg,
46 mbedtls_entropy_func, &entropy,
47 NULL, 0));
48 TEST_EQUAL(0, mbedtls_ctr_drbg_random(&drbg,
49 output2, sizeof(output2)));
50 mbedtls_ctr_drbg_free(&drbg);
51 mbedtls_entropy_free(&entropy);
Gilles Peskine077599a2021-02-03 18:55:39 +010052
53 /* The two rounds must generate different random data. */
Gilles Peskine449bd832023-01-11 14:50:10 +010054 TEST_ASSERT(memcmp(output1, output2, OUTPUT_SIZE) != 0);
Gilles Peskine077599a2021-02-03 18:55:39 +010055
56exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010057 mbedtls_ctr_drbg_free(&drbg);
58 mbedtls_entropy_free(&entropy);
Manuel Pégourié-Gonnarde9319772023-03-21 18:09:40 +010059 MD_PSA_DONE();
Gilles Peskine077599a2021-02-03 18:55:39 +010060}
61/* END_CASE */
62
Mateusz Starzyk72f60df2021-04-30 13:28:22 +020063/* BEGIN_CASE depends_on:MBEDTLS_ENTROPY_C:MBEDTLS_HMAC_DRBG_C */
Gilles Peskine449bd832023-01-11 14:50:10 +010064void random_twice_with_hmac_drbg(int md_type)
Gilles Peskine077599a2021-02-03 18:55:39 +010065{
66 mbedtls_entropy_context entropy;
67 mbedtls_hmac_drbg_context drbg;
68 unsigned char output1[OUTPUT_SIZE];
69 unsigned char output2[OUTPUT_SIZE];
Gilles Peskine449bd832023-01-11 14:50:10 +010070 const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_type);
Gilles Peskine077599a2021-02-03 18:55:39 +010071
Manuel Pégourié-Gonnarde9319772023-03-21 18:09:40 +010072 MD_PSA_INIT();
73
Gilles Peskine077599a2021-02-03 18:55:39 +010074 /* First round */
Gilles Peskine449bd832023-01-11 14:50:10 +010075 mbedtls_entropy_init(&entropy);
76 mbedtls_hmac_drbg_init(&drbg);
77 TEST_EQUAL(0, mbedtls_hmac_drbg_seed(&drbg, md_info,
78 mbedtls_entropy_func, &entropy,
79 NULL, 0));
80 TEST_EQUAL(0, mbedtls_hmac_drbg_random(&drbg,
81 output1, sizeof(output1)));
82 mbedtls_hmac_drbg_free(&drbg);
83 mbedtls_entropy_free(&entropy);
Gilles Peskine077599a2021-02-03 18:55:39 +010084
85 /* Second round */
Gilles Peskine449bd832023-01-11 14:50:10 +010086 mbedtls_entropy_init(&entropy);
87 mbedtls_hmac_drbg_init(&drbg);
88 TEST_EQUAL(0, mbedtls_hmac_drbg_seed(&drbg, md_info,
89 mbedtls_entropy_func, &entropy,
90 NULL, 0));
91 TEST_EQUAL(0, mbedtls_hmac_drbg_random(&drbg,
92 output2, sizeof(output2)));
93 mbedtls_hmac_drbg_free(&drbg);
94 mbedtls_entropy_free(&entropy);
Gilles Peskine077599a2021-02-03 18:55:39 +010095
96 /* The two rounds must generate different random data. */
Gilles Peskine449bd832023-01-11 14:50:10 +010097 TEST_ASSERT(memcmp(output1, output2, OUTPUT_SIZE) != 0);
Gilles Peskine077599a2021-02-03 18:55:39 +010098
99exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100100 mbedtls_hmac_drbg_free(&drbg);
101 mbedtls_entropy_free(&entropy);
Manuel Pégourié-Gonnarde9319772023-03-21 18:09:40 +0100102 MD_PSA_DONE();
Gilles Peskine077599a2021-02-03 18:55:39 +0100103}
104/* END_CASE */
105
Mateusz Starzyk72f60df2021-04-30 13:28:22 +0200106/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C:!MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */
Gilles Peskine449bd832023-01-11 14:50:10 +0100107void random_twice_with_psa_from_classic()
Gilles Peskinee3ed8022021-02-03 20:04:08 +0100108{
109 unsigned char output1[OUTPUT_SIZE];
110 unsigned char output2[OUTPUT_SIZE];
111
112 /* First round */
Gilles Peskine449bd832023-01-11 14:50:10 +0100113 PSA_ASSERT(psa_crypto_init());
114 TEST_EQUAL(0, mbedtls_psa_get_random(MBEDTLS_PSA_RANDOM_STATE,
115 output1, sizeof(output1)));
116 PSA_DONE();
Gilles Peskinee3ed8022021-02-03 20:04:08 +0100117
118 /* Second round */
Gilles Peskine449bd832023-01-11 14:50:10 +0100119 PSA_ASSERT(psa_crypto_init());
120 TEST_EQUAL(0, mbedtls_psa_get_random(MBEDTLS_PSA_RANDOM_STATE,
121 output2, sizeof(output2)));
122 PSA_DONE();
Gilles Peskinee3ed8022021-02-03 20:04:08 +0100123
124 /* The two rounds must generate different random data. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100125 TEST_ASSERT(memcmp(output1, output2, OUTPUT_SIZE) != 0);
Gilles Peskinee3ed8022021-02-03 20:04:08 +0100126
127exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100128 PSA_DONE();
Gilles Peskinee3ed8022021-02-03 20:04:08 +0100129}
130/* END_CASE */
131
Mateusz Starzyk72f60df2021-04-30 13:28:22 +0200132/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C:!MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG */
Gilles Peskine449bd832023-01-11 14:50:10 +0100133void random_twice_with_psa_from_psa()
Gilles Peskine077599a2021-02-03 18:55:39 +0100134{
135 unsigned char output1[OUTPUT_SIZE];
136 unsigned char output2[OUTPUT_SIZE];
137
138 /* First round */
Gilles Peskine449bd832023-01-11 14:50:10 +0100139 PSA_ASSERT(psa_crypto_init());
140 PSA_ASSERT(psa_generate_random(output1, sizeof(output1)));
141 PSA_DONE();
Gilles Peskine077599a2021-02-03 18:55:39 +0100142
143 /* Second round */
Gilles Peskine449bd832023-01-11 14:50:10 +0100144 PSA_ASSERT(psa_crypto_init());
145 PSA_ASSERT(psa_generate_random(output2, sizeof(output2)));
146 PSA_DONE();
Gilles Peskine077599a2021-02-03 18:55:39 +0100147
148 /* The two rounds must generate different random data. */
Gilles Peskine449bd832023-01-11 14:50:10 +0100149 TEST_ASSERT(memcmp(output1, output2, OUTPUT_SIZE) != 0);
Gilles Peskine077599a2021-02-03 18:55:39 +0100150
151exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100152 PSA_DONE();
Gilles Peskine077599a2021-02-03 18:55:39 +0100153}
154/* END_CASE */
Gilles Peskinee3ed8022021-02-03 20:04:08 +0100155
156/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C */
Gilles Peskine449bd832023-01-11 14:50:10 +0100157void mbedtls_psa_get_random_no_init()
Gilles Peskinee3ed8022021-02-03 20:04:08 +0100158{
159 unsigned char output[1];
160
Gilles Peskine449bd832023-01-11 14:50:10 +0100161 TEST_ASSERT(mbedtls_psa_get_random(MBEDTLS_PSA_RANDOM_STATE,
162 output, sizeof(output)) != 0);
Gilles Peskinee3ed8022021-02-03 20:04:08 +0100163}
164/* END_CASE */
165
166/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C */
Gilles Peskine449bd832023-01-11 14:50:10 +0100167void mbedtls_psa_get_random_length(int n)
Gilles Peskinee3ed8022021-02-03 20:04:08 +0100168{
169 unsigned char *output = NULL;
170
Gilles Peskine449bd832023-01-11 14:50:10 +0100171 PSA_ASSERT(psa_crypto_init());
Tom Cosgrovef9ffd112023-07-20 16:48:18 +0100172 TEST_CALLOC_OR_FAIL(output, n);
Gilles Peskinee3ed8022021-02-03 20:04:08 +0100173
Gilles Peskine449bd832023-01-11 14:50:10 +0100174 TEST_EQUAL(0, mbedtls_psa_get_random(MBEDTLS_PSA_RANDOM_STATE,
175 output, n));
Gilles Peskinee3ed8022021-02-03 20:04:08 +0100176exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100177 mbedtls_free(output);
178 PSA_DONE();
Gilles Peskinee3ed8022021-02-03 20:04:08 +0100179}
180/* END_CASE */
181
182/* BEGIN_CASE depends_on:MBEDTLS_PSA_CRYPTO_C:MBEDTLS_ECDSA_C */
Gilles Peskine449bd832023-01-11 14:50:10 +0100183void mbedtls_psa_get_random_ecdsa_sign(int curve)
Gilles Peskinee3ed8022021-02-03 20:04:08 +0100184{
185 mbedtls_ecp_group grp;
186 mbedtls_mpi d, r, s;
187 unsigned char buf[] = "This is not a hash.";
188
Gilles Peskine449bd832023-01-11 14:50:10 +0100189 mbedtls_ecp_group_init(&grp);
190 mbedtls_mpi_init(&d);
191 mbedtls_mpi_init(&r);
192 mbedtls_mpi_init(&s);
Gilles Peskinee3ed8022021-02-03 20:04:08 +0100193
Gilles Peskine449bd832023-01-11 14:50:10 +0100194 TEST_EQUAL(0, mbedtls_mpi_lset(&d, 123456789));
195 TEST_EQUAL(0, mbedtls_ecp_group_load(&grp, curve));
196 PSA_ASSERT(psa_crypto_init());
197 TEST_EQUAL(0, mbedtls_ecdsa_sign(&grp, &r, &s, &d,
198 buf, sizeof(buf),
199 mbedtls_psa_get_random,
200 MBEDTLS_PSA_RANDOM_STATE));
Gilles Peskinee3ed8022021-02-03 20:04:08 +0100201exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100202 mbedtls_mpi_free(&d);
203 mbedtls_mpi_free(&r);
204 mbedtls_mpi_free(&s);
205 mbedtls_ecp_group_free(&grp);
206 PSA_DONE();
Gilles Peskinee3ed8022021-02-03 20:04:08 +0100207}
208/* END_CASE */