blob: 83fc73a7d16043d535a4bf321c47fccbe50643c9 [file] [log] [blame]
Janos Follath8a49a012016-02-12 13:18:20 +00001/* BEGIN_HEADER */
2#include "mbedtls/rsa.h"
3#include "mbedtls/md.h"
4/* END_HEADER */
5
6/* BEGIN_DEPENDENCIES
7 * depends_on:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C:MBEDTLS_SHA1_C
8 * END_DEPENDENCIES
9 */
10
11/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010012void pkcs1_rsaes_v15_encrypt(int mod, char *input_N,
13 char *input_E, int hash,
14 data_t *message_str, data_t *rnd_buf,
15 data_t *result_str, int result)
Janos Follath8a49a012016-02-12 13:18:20 +000016{
Ron Eldor635888b2018-11-25 15:54:52 +020017 unsigned char output[128];
Janos Follath8a49a012016-02-12 13:18:20 +000018 mbedtls_rsa_context ctx;
Ronald Cron351f0ee2020-06-10 12:12:18 +020019 mbedtls_test_rnd_buf_info info;
Hanno Becker6d43f9e2017-08-23 06:35:17 +010020 mbedtls_mpi N, E;
Janos Follath8a49a012016-02-12 13:18:20 +000021
Gilles Peskinebef30192021-03-24 00:48:57 +010022 info.fallback_f_rng = mbedtls_test_rnd_std_rand;
23 info.fallback_p_rng = NULL;
Azim Khand30ca132017-06-09 04:32:58 +010024 info.buf = rnd_buf->x;
25 info.length = rnd_buf->len;
Janos Follath8a49a012016-02-12 13:18:20 +000026
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010027 mbedtls_mpi_init(&N); mbedtls_mpi_init(&E);
28 mbedtls_rsa_init(&ctx, MBEDTLS_RSA_PKCS_V15, hash);
29 memset(output, 0x00, sizeof(output));
Janos Follath8a49a012016-02-12 13:18:20 +000030
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010031 TEST_ASSERT(mbedtls_test_read_mpi(&N, input_N) == 0);
32 TEST_ASSERT(mbedtls_test_read_mpi(&E, input_E) == 0);
33 TEST_ASSERT(mbedtls_rsa_import(&ctx, &N, NULL, NULL, NULL, &E) == 0);
34 TEST_ASSERT(mbedtls_rsa_get_len(&ctx) == (size_t) ((mod + 7) / 8));
35 TEST_ASSERT(mbedtls_rsa_check_pubkey(&ctx) == 0);
Janos Follath8a49a012016-02-12 13:18:20 +000036
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010037 if (message_str->len == 0) {
Gilles Peskine85a6dd42018-10-15 16:32:42 +020038 message_str->x = NULL;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010039 }
40 TEST_ASSERT(mbedtls_rsa_pkcs1_encrypt(&ctx,
41 &mbedtls_test_rnd_buffer_rand,
42 &info, MBEDTLS_RSA_PUBLIC,
43 message_str->len, message_str->x,
44 output) == result);
Ronald Cron6c5bd7f2020-06-10 14:08:26 +020045
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010046 if (result == 0) {
47 TEST_ASSERT(mbedtls_test_hexcmp(output, result_str->x,
48 ctx.len, result_str->len) == 0);
Janos Follath8a49a012016-02-12 13:18:20 +000049 }
50
51exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010052 mbedtls_mpi_free(&N); mbedtls_mpi_free(&E);
53 mbedtls_rsa_free(&ctx);
Janos Follath8a49a012016-02-12 13:18:20 +000054}
55/* END_CASE */
56
57/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010058void pkcs1_rsaes_v15_decrypt(int mod, char *input_P, char *input_Q,
59 char *input_N, char *input_E, int hash,
60 data_t *result_str, char *seed,
61 data_t *message_str, int result)
Janos Follath8a49a012016-02-12 13:18:20 +000062{
Ron Eldor635888b2018-11-25 15:54:52 +020063 unsigned char output[128];
Janos Follath8a49a012016-02-12 13:18:20 +000064 mbedtls_rsa_context ctx;
Janos Follath8a49a012016-02-12 13:18:20 +000065 size_t output_len;
Ronald Cron351f0ee2020-06-10 12:12:18 +020066 mbedtls_test_rnd_pseudo_info rnd_info;
Hanno Becker6d43f9e2017-08-23 06:35:17 +010067 mbedtls_mpi N, P, Q, E;
Janos Follath8a49a012016-02-12 13:18:20 +000068 ((void) seed);
69
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010070 mbedtls_mpi_init(&N); mbedtls_mpi_init(&P);
71 mbedtls_mpi_init(&Q); mbedtls_mpi_init(&E);
72 mbedtls_rsa_init(&ctx, MBEDTLS_RSA_PKCS_V15, hash);
Janos Follath8a49a012016-02-12 13:18:20 +000073
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010074 memset(output, 0x00, sizeof(output));
75 memset(&rnd_info, 0, sizeof(mbedtls_test_rnd_pseudo_info));
Janos Follath8a49a012016-02-12 13:18:20 +000076
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010077 TEST_ASSERT(mbedtls_test_read_mpi(&P, input_P) == 0);
78 TEST_ASSERT(mbedtls_test_read_mpi(&Q, input_Q) == 0);
79 TEST_ASSERT(mbedtls_test_read_mpi(&N, input_N) == 0);
80 TEST_ASSERT(mbedtls_test_read_mpi(&E, input_E) == 0);
Janos Follath8a49a012016-02-12 13:18:20 +000081
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010082 TEST_ASSERT(mbedtls_rsa_import(&ctx, &N, &P, &Q, NULL, &E) == 0);
83 TEST_ASSERT(mbedtls_rsa_get_len(&ctx) == (size_t) ((mod + 7) / 8));
84 TEST_ASSERT(mbedtls_rsa_complete(&ctx) == 0);
85 TEST_ASSERT(mbedtls_rsa_check_privkey(&ctx) == 0);
Janos Follath8a49a012016-02-12 13:18:20 +000086
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010087 if (result_str->len == 0) {
88 TEST_ASSERT(mbedtls_rsa_pkcs1_decrypt(&ctx,
89 &mbedtls_test_rnd_pseudo_rand,
90 &rnd_info,
91 MBEDTLS_RSA_PRIVATE,
92 &output_len, message_str->x,
93 NULL, 0) == result);
94 } else {
95 TEST_ASSERT(mbedtls_rsa_pkcs1_decrypt(&ctx,
96 &mbedtls_test_rnd_pseudo_rand,
97 &rnd_info, MBEDTLS_RSA_PRIVATE,
98 &output_len, message_str->x,
99 output, 1000) == result);
100 if (result == 0) {
101 TEST_ASSERT(mbedtls_test_hexcmp(output, result_str->x,
102 output_len,
103 result_str->len) == 0);
Gilles Peskine85a6dd42018-10-15 16:32:42 +0200104 }
Janos Follath8a49a012016-02-12 13:18:20 +0000105 }
106
107exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100108 mbedtls_mpi_free(&N); mbedtls_mpi_free(&P);
109 mbedtls_mpi_free(&Q); mbedtls_mpi_free(&E);
110 mbedtls_rsa_free(&ctx);
Janos Follath8a49a012016-02-12 13:18:20 +0000111}
112/* END_CASE */
113
Janos Follathe6aef9f2016-03-16 16:39:41 +0000114/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100115void pkcs1_v15_decode(int mode,
116 data_t *input,
117 int expected_plaintext_length_arg,
118 int output_size_arg,
119 int expected_result)
Gilles Peskine695a3462018-10-05 18:15:25 +0200120{
121 size_t expected_plaintext_length = expected_plaintext_length_arg;
122 size_t output_size = output_size_arg;
Ronald Cron351f0ee2020-06-10 12:12:18 +0200123 mbedtls_test_rnd_pseudo_info rnd_info;
Gilles Peskine695a3462018-10-05 18:15:25 +0200124 mbedtls_mpi Nmpi, Empi, Pmpi, Qmpi;
125 mbedtls_rsa_context ctx;
126 static unsigned char N[128] = {
127 0xc4, 0x79, 0x4c, 0x6d, 0xb2, 0xe9, 0xdf, 0xc5,
128 0xe5, 0xd7, 0x55, 0x4b, 0xfb, 0x6c, 0x2e, 0xec,
129 0x84, 0xd0, 0x88, 0x12, 0xaf, 0xbf, 0xb4, 0xf5,
130 0x47, 0x3c, 0x7e, 0x92, 0x4c, 0x58, 0xc8, 0x73,
131 0xfe, 0x8f, 0x2b, 0x8f, 0x8e, 0xc8, 0x5c, 0xf5,
132 0x05, 0xeb, 0xfb, 0x0d, 0x7b, 0x2a, 0x93, 0xde,
133 0x15, 0x0d, 0xc8, 0x13, 0xcf, 0xd2, 0x6f, 0x0d,
134 0x9d, 0xad, 0x30, 0xe5, 0x70, 0x20, 0x92, 0x9e,
135 0xb3, 0x6b, 0xba, 0x5c, 0x50, 0x0f, 0xc3, 0xb2,
136 0x7e, 0x64, 0x07, 0x94, 0x7e, 0xc9, 0x4e, 0xc1,
137 0x65, 0x04, 0xaf, 0xb3, 0x9f, 0xde, 0xa8, 0x46,
138 0xfa, 0x6c, 0xf3, 0x03, 0xaf, 0x1c, 0x1b, 0xec,
139 0x75, 0x44, 0x66, 0x77, 0xc9, 0xde, 0x51, 0x33,
140 0x64, 0x27, 0xb0, 0xd4, 0x8d, 0x31, 0x6a, 0x11,
141 0x27, 0x3c, 0x99, 0xd4, 0x22, 0xc0, 0x9d, 0x12,
142 0x01, 0xc7, 0x4a, 0x73, 0xac, 0xbf, 0xc2, 0xbb
143 };
144 static unsigned char E[1] = { 0x03 };
145 static unsigned char P[64] = {
146 0xe5, 0x53, 0x1f, 0x88, 0x51, 0xee, 0x59, 0xf8,
147 0xc1, 0xe4, 0xcc, 0x5b, 0xb3, 0x75, 0x8d, 0xc8,
148 0xe8, 0x95, 0x2f, 0xd0, 0xef, 0x37, 0xb4, 0xcd,
149 0xd3, 0x9e, 0x48, 0x8b, 0x81, 0x58, 0x60, 0xb9,
150 0x27, 0x1d, 0xb6, 0x28, 0x92, 0x64, 0xa3, 0xa5,
151 0x64, 0xbd, 0xcc, 0x53, 0x68, 0xdd, 0x3e, 0x55,
152 0xea, 0x9d, 0x5e, 0xcd, 0x1f, 0x96, 0x87, 0xf1,
153 0x29, 0x75, 0x92, 0x70, 0x8f, 0x28, 0xfb, 0x2b
154 };
155 static unsigned char Q[64] = {
156 0xdb, 0x53, 0xef, 0x74, 0x61, 0xb4, 0x20, 0x3b,
157 0x3b, 0x87, 0x76, 0x75, 0x81, 0x56, 0x11, 0x03,
158 0x59, 0x31, 0xe3, 0x38, 0x4b, 0x8c, 0x7a, 0x9c,
159 0x05, 0xd6, 0x7f, 0x1e, 0x5e, 0x60, 0xf0, 0x4e,
160 0x0b, 0xdc, 0x34, 0x54, 0x1c, 0x2e, 0x90, 0x83,
161 0x14, 0xef, 0xc0, 0x96, 0x5c, 0x30, 0x10, 0xcc,
162 0xc1, 0xba, 0xa0, 0x54, 0x3f, 0x96, 0x24, 0xca,
163 0xa3, 0xfb, 0x55, 0xbc, 0x71, 0x29, 0x4e, 0xb1
164 };
165 unsigned char original[128];
166 unsigned char intermediate[128];
167 static unsigned char default_content[128] = {
168 /* A randomly generated pattern. */
169 0x4c, 0x27, 0x54, 0xa0, 0xce, 0x0d, 0x09, 0x4a,
170 0x1c, 0x38, 0x8e, 0x2d, 0xa3, 0xc4, 0xe0, 0x19,
171 0x4c, 0x99, 0xb2, 0xbf, 0xe6, 0x65, 0x7e, 0x58,
172 0xd7, 0xb6, 0x8a, 0x05, 0x2f, 0xa5, 0xec, 0xa4,
173 0x35, 0xad, 0x10, 0x36, 0xff, 0x0d, 0x08, 0x50,
174 0x74, 0x47, 0xc9, 0x9c, 0x4a, 0xe7, 0xfd, 0xfa,
175 0x83, 0x5f, 0x14, 0x5a, 0x1e, 0xe7, 0x35, 0x08,
176 0xad, 0xf7, 0x0d, 0x86, 0xdf, 0xb8, 0xd4, 0xcf,
177 0x32, 0xb9, 0x5c, 0xbe, 0xa3, 0xd2, 0x89, 0x70,
178 0x7b, 0xc6, 0x48, 0x7e, 0x58, 0x4d, 0xf3, 0xef,
179 0x34, 0xb7, 0x57, 0x54, 0x79, 0xc5, 0x8e, 0x0a,
180 0xa3, 0xbf, 0x6d, 0x42, 0x83, 0x25, 0x13, 0xa2,
181 0x95, 0xc0, 0x0d, 0x32, 0xec, 0x77, 0x91, 0x2b,
182 0x68, 0xb6, 0x8c, 0x79, 0x15, 0xfb, 0x94, 0xde,
183 0xb9, 0x2b, 0x94, 0xb3, 0x28, 0x23, 0x86, 0x3d,
184 0x37, 0x00, 0xe6, 0xf1, 0x1f, 0x4e, 0xd4, 0x42
185 };
186 unsigned char final[128];
187 size_t output_length = 0x7EA0;
188
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100189 memset(&rnd_info, 0, sizeof(mbedtls_test_rnd_pseudo_info));
190 mbedtls_mpi_init(&Nmpi); mbedtls_mpi_init(&Empi);
191 mbedtls_mpi_init(&Pmpi); mbedtls_mpi_init(&Qmpi);
192 mbedtls_rsa_init(&ctx, MBEDTLS_RSA_PKCS_V15, 0);
Gilles Peskine695a3462018-10-05 18:15:25 +0200193
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100194 TEST_ASSERT(mbedtls_mpi_read_binary(&Nmpi, N, sizeof(N)) == 0);
195 TEST_ASSERT(mbedtls_mpi_read_binary(&Empi, E, sizeof(E)) == 0);
196 TEST_ASSERT(mbedtls_mpi_read_binary(&Pmpi, P, sizeof(P)) == 0);
197 TEST_ASSERT(mbedtls_mpi_read_binary(&Qmpi, Q, sizeof(Q)) == 0);
Gilles Peskine695a3462018-10-05 18:15:25 +0200198
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100199 TEST_ASSERT(mbedtls_rsa_import(&ctx, &Nmpi, &Pmpi, &Qmpi,
200 NULL, &Empi) == 0);
201 TEST_ASSERT(mbedtls_rsa_complete(&ctx) == 0);
Gilles Peskine695a3462018-10-05 18:15:25 +0200202
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100203 TEST_ASSERT(input->len <= sizeof(N));
204 memcpy(original, input->x, input->len);
205 memset(original + input->len, 'd', sizeof(original) - input->len);
206 if (mode == MBEDTLS_RSA_PRIVATE) {
207 TEST_ASSERT(mbedtls_rsa_public(&ctx, original, intermediate) == 0);
208 } else {
209 TEST_ASSERT(mbedtls_rsa_private(&ctx, &mbedtls_test_rnd_pseudo_rand,
210 &rnd_info, original,
211 intermediate) == 0);
Gilles Peskine695a3462018-10-05 18:15:25 +0200212 }
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100213
214 memcpy(final, default_content, sizeof(final));
215 TEST_ASSERT(mbedtls_rsa_pkcs1_decrypt(&ctx,
216 &mbedtls_test_rnd_pseudo_rand,
217 &rnd_info, mode, &output_length,
218 intermediate, final,
219 output_size) == expected_result);
220 if (expected_result == 0) {
221 TEST_ASSERT(output_length == expected_plaintext_length);
222 TEST_ASSERT(memcmp(original + sizeof(N) - output_length,
223 final,
224 output_length) == 0);
225 } else if (expected_result == MBEDTLS_ERR_RSA_INVALID_PADDING ||
226 expected_result == MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE) {
Gilles Peskine695a3462018-10-05 18:15:25 +0200227 size_t max_payload_length =
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100228 output_size > sizeof(N) - 11 ? sizeof(N) - 11 : output_size;
Gilles Peskine695a3462018-10-05 18:15:25 +0200229 size_t i;
230 size_t count = 0;
231
232#if !defined(MBEDTLS_RSA_ALT)
233 /* Check that the output in invalid cases is what the default
234 * implementation currently does. Alternative implementations
235 * may produce different output, so we only perform these precise
236 * checks when using the default implementation. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100237 TEST_ASSERT(output_length == max_payload_length);
238 for (i = 0; i < max_payload_length; i++) {
239 TEST_ASSERT(final[i] == 0);
240 }
Gilles Peskine695a3462018-10-05 18:15:25 +0200241#endif
242 /* Even in alternative implementations, the outputs must have
243 * changed, otherwise it indicates at least a timing vulnerability
244 * because no write to the outputs is performed in the bad case. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100245 TEST_ASSERT(output_length != 0x7EA0);
246 for (i = 0; i < max_payload_length; i++) {
247 count += (final[i] == default_content[i]);
248 }
Gilles Peskine695a3462018-10-05 18:15:25 +0200249 /* If more than 16 bytes are unchanged in final, that's evidence
250 * that final wasn't overwritten. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100251 TEST_ASSERT(count < 16);
Gilles Peskine695a3462018-10-05 18:15:25 +0200252 }
253
254exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100255 mbedtls_mpi_free(&Nmpi); mbedtls_mpi_free(&Empi);
256 mbedtls_mpi_free(&Pmpi); mbedtls_mpi_free(&Qmpi);
257 mbedtls_rsa_free(&ctx);
Gilles Peskine695a3462018-10-05 18:15:25 +0200258}
259/* END_CASE */
260
261/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100262void pkcs1_rsassa_v15_sign(int mod, char *input_P,
263 char *input_Q, char *input_N,
264 char *input_E, int digest, int hash,
265 data_t *message_str, data_t *rnd_buf,
266 data_t *result_str, int result)
Janos Follathe6aef9f2016-03-16 16:39:41 +0000267{
Ron Eldor635888b2018-11-25 15:54:52 +0200268 unsigned char hash_result[MBEDTLS_MD_MAX_SIZE];
269 unsigned char output[128];
Janos Follathe6aef9f2016-03-16 16:39:41 +0000270 mbedtls_rsa_context ctx;
Hanno Becker6d43f9e2017-08-23 06:35:17 +0100271 mbedtls_mpi N, P, Q, E;
Ronald Cron351f0ee2020-06-10 12:12:18 +0200272 mbedtls_test_rnd_buf_info info;
Janos Follathe6aef9f2016-03-16 16:39:41 +0000273
Gilles Peskinebef30192021-03-24 00:48:57 +0100274 info.fallback_f_rng = mbedtls_test_rnd_std_rand;
275 info.fallback_p_rng = NULL;
Azim Khand30ca132017-06-09 04:32:58 +0100276 info.buf = rnd_buf->x;
277 info.length = rnd_buf->len;
Janos Follathe6aef9f2016-03-16 16:39:41 +0000278
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100279 mbedtls_mpi_init(&N); mbedtls_mpi_init(&P);
280 mbedtls_mpi_init(&Q); mbedtls_mpi_init(&E);
281 mbedtls_rsa_init(&ctx, MBEDTLS_RSA_PKCS_V15, hash);
Janos Follathe6aef9f2016-03-16 16:39:41 +0000282
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100283 memset(hash_result, 0x00, sizeof(hash_result));
284 memset(output, 0x00, sizeof(output));
Janos Follathe6aef9f2016-03-16 16:39:41 +0000285
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100286 TEST_ASSERT(mbedtls_test_read_mpi(&P, input_P) == 0);
287 TEST_ASSERT(mbedtls_test_read_mpi(&Q, input_Q) == 0);
288 TEST_ASSERT(mbedtls_test_read_mpi(&N, input_N) == 0);
289 TEST_ASSERT(mbedtls_test_read_mpi(&E, input_E) == 0);
Janos Follathe6aef9f2016-03-16 16:39:41 +0000290
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100291 TEST_ASSERT(mbedtls_rsa_import(&ctx, &N, &P, &Q, NULL, &E) == 0);
292 TEST_ASSERT(mbedtls_rsa_get_len(&ctx) == (size_t) ((mod + 7) / 8));
293 TEST_ASSERT(mbedtls_rsa_complete(&ctx) == 0);
294 TEST_ASSERT(mbedtls_rsa_check_privkey(&ctx) == 0);
Janos Follathe6aef9f2016-03-16 16:39:41 +0000295
Janos Follathe6aef9f2016-03-16 16:39:41 +0000296
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100297 if (mbedtls_md_info_from_type(digest) != NULL) {
298 TEST_ASSERT(mbedtls_md(mbedtls_md_info_from_type(digest), message_str->x, message_str->len,
299 hash_result) == 0);
300 }
Janos Follathe6aef9f2016-03-16 16:39:41 +0000301
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100302 TEST_ASSERT(mbedtls_rsa_pkcs1_sign(&ctx, &mbedtls_test_rnd_buffer_rand,
303 &info, MBEDTLS_RSA_PRIVATE, digest,
304 0, hash_result, output) == result);
305 if (result == 0) {
Janos Follathe6aef9f2016-03-16 16:39:41 +0000306
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100307 TEST_ASSERT(mbedtls_test_hexcmp(output, result_str->x,
308 ctx.len, result_str->len) == 0);
Janos Follathe6aef9f2016-03-16 16:39:41 +0000309 }
310
311exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100312 mbedtls_mpi_free(&N); mbedtls_mpi_free(&P);
313 mbedtls_mpi_free(&Q); mbedtls_mpi_free(&E);
314 mbedtls_rsa_free(&ctx);
Janos Follathe6aef9f2016-03-16 16:39:41 +0000315}
316/* END_CASE */
317
318/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100319void pkcs1_rsassa_v15_verify(int mod, char *input_N, char *input_E,
320 int digest, int hash, data_t *message_str,
321 char *salt, data_t *result_str, int result)
Janos Follathe6aef9f2016-03-16 16:39:41 +0000322{
Ron Eldor635888b2018-11-25 15:54:52 +0200323 unsigned char hash_result[MBEDTLS_MD_MAX_SIZE];
Janos Follathe6aef9f2016-03-16 16:39:41 +0000324 mbedtls_rsa_context ctx;
Hanno Becker6d43f9e2017-08-23 06:35:17 +0100325 mbedtls_mpi N, E;
Janos Follathe6aef9f2016-03-16 16:39:41 +0000326 ((void) salt);
327
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100328 mbedtls_mpi_init(&N); mbedtls_mpi_init(&E);
329 mbedtls_rsa_init(&ctx, MBEDTLS_RSA_PKCS_V15, hash);
330 memset(hash_result, 0x00, sizeof(hash_result));
Janos Follathe6aef9f2016-03-16 16:39:41 +0000331
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100332 TEST_ASSERT(mbedtls_test_read_mpi(&N, input_N) == 0);
333 TEST_ASSERT(mbedtls_test_read_mpi(&E, input_E) == 0);
334 TEST_ASSERT(mbedtls_rsa_import(&ctx, &N, NULL, NULL, NULL, &E) == 0);
335 TEST_ASSERT(mbedtls_rsa_get_len(&ctx) == (size_t) ((mod + 7) / 8));
336 TEST_ASSERT(mbedtls_rsa_check_pubkey(&ctx) == 0);
Janos Follathe6aef9f2016-03-16 16:39:41 +0000337
Janos Follathe6aef9f2016-03-16 16:39:41 +0000338
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100339 if (mbedtls_md_info_from_type(digest) != NULL) {
340 TEST_ASSERT(mbedtls_md(mbedtls_md_info_from_type(digest), message_str->x, message_str->len,
341 hash_result) == 0);
342 }
Janos Follathe6aef9f2016-03-16 16:39:41 +0000343
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100344 TEST_ASSERT(mbedtls_rsa_pkcs1_verify(&ctx, NULL, NULL, MBEDTLS_RSA_PUBLIC, digest, 0,
345 hash_result, result_str->x) == result);
Janos Follathe6aef9f2016-03-16 16:39:41 +0000346
347exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100348 mbedtls_mpi_free(&N); mbedtls_mpi_free(&E);
349 mbedtls_rsa_free(&ctx);
Janos Follathe6aef9f2016-03-16 16:39:41 +0000350}
351/* END_CASE */