blob: 6261979953a0f724fd627077a807cdcbfa30ead7 [file] [log] [blame]
Paul Bakker33b43f12013-08-20 11:48:36 +02001/* BEGIN_HEADER */
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +00002#include "mbedtls/rsa.h"
Paul Bakker33b43f12013-08-20 11:48:36 +02003/* END_HEADER */
Paul Bakker9dcc3222011-03-08 14:16:06 +00004
Paul Bakker33b43f12013-08-20 11:48:36 +02005/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnarde741c612022-07-27 13:13:55 +02006 * depends_on:MBEDTLS_PKCS1_V21:MBEDTLS_RSA_C
Paul Bakker33b43f12013-08-20 11:48:36 +02007 * END_DEPENDENCIES
8 */
Paul Bakker5690efc2011-05-26 13:16:06 +00009
Paul Bakker33b43f12013-08-20 11:48:36 +020010/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010011void pkcs1_rsaes_oaep_encrypt(int mod, data_t *input_N, data_t *input_E,
12 int hash, data_t *message_str, data_t *rnd_buf,
13 data_t *result_str, int result)
Paul Bakker9dcc3222011-03-08 14:16:06 +000014{
Ron Eldor5b8f1202018-11-22 15:49:49 +020015 unsigned char output[256];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020016 mbedtls_rsa_context ctx;
Ronald Cron351f0ee2020-06-10 12:12:18 +020017 mbedtls_test_rnd_buf_info info;
Hanno Becker6326a6d2017-08-23 06:38:22 +010018 mbedtls_mpi N, E;
Paul Bakker9dcc3222011-03-08 14:16:06 +000019
Manuel Pégourié-Gonnardfb8d90a2023-03-16 10:47:59 +010020 MD_PSA_INIT();
21
Gilles Peskineecacc3c2021-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;
Paul Bakker9dcc3222011-03-08 14:16:06 +000026
Gilles Peskine449bd832023-01-11 14:50:10 +010027 mbedtls_mpi_init(&N); mbedtls_mpi_init(&E);
28 mbedtls_rsa_init(&ctx);
29 TEST_ASSERT(mbedtls_rsa_set_padding(&ctx,
30 MBEDTLS_RSA_PKCS_V21, hash) == 0);
31 memset(output, 0x00, sizeof(output));
Paul Bakker9dcc3222011-03-08 14:16:06 +000032
Yanray Wang69bc8402023-03-17 20:33:03 +080033 TEST_EQUAL(mbedtls_rsa_get_padding_mode(&ctx), MBEDTLS_RSA_PKCS_V21);
34 TEST_EQUAL(mbedtls_rsa_get_md_alg(&ctx), hash);
Yanray Wang15d3df72023-03-17 19:34:01 +080035
Gilles Peskine449bd832023-01-11 14:50:10 +010036 TEST_ASSERT(mbedtls_mpi_read_binary(&N, input_N->x, input_N->len) == 0);
37 TEST_ASSERT(mbedtls_mpi_read_binary(&E, input_E->x, input_E->len) == 0);
38 TEST_ASSERT(mbedtls_rsa_import(&ctx, &N, NULL, NULL, NULL, &E) == 0);
39 TEST_ASSERT(mbedtls_rsa_get_len(&ctx) == (size_t) ((mod + 7) / 8));
40 TEST_ASSERT(mbedtls_rsa_check_pubkey(&ctx) == 0);
Paul Bakker9dcc3222011-03-08 14:16:06 +000041
Gilles Peskine449bd832023-01-11 14:50:10 +010042 if (message_str->len == 0) {
Gilles Peskine85a6dd42018-10-15 16:32:42 +020043 message_str->x = NULL;
Gilles Peskine449bd832023-01-11 14:50:10 +010044 }
45 TEST_ASSERT(mbedtls_rsa_pkcs1_encrypt(&ctx,
46 &mbedtls_test_rnd_buffer_rand,
47 &info, message_str->len,
48 message_str->x,
49 output) == result);
50 if (result == 0) {
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +010051 TEST_MEMORY_COMPARE(output, ctx.len, result_str->x, result_str->len);
Paul Bakker9dcc3222011-03-08 14:16:06 +000052 }
Paul Bakker58ef6ec2013-01-03 11:33:48 +010053
Paul Bakkerbd51b262014-07-10 15:26:12 +020054exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010055 mbedtls_mpi_free(&N); mbedtls_mpi_free(&E);
56 mbedtls_rsa_free(&ctx);
Manuel Pégourié-Gonnardfb8d90a2023-03-16 10:47:59 +010057 MD_PSA_DONE();
Paul Bakker9dcc3222011-03-08 14:16:06 +000058}
Paul Bakker33b43f12013-08-20 11:48:36 +020059/* END_CASE */
Paul Bakker9dcc3222011-03-08 14:16:06 +000060
Paul Bakker33b43f12013-08-20 11:48:36 +020061/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010062void pkcs1_rsaes_oaep_decrypt(int mod, data_t *input_P, data_t *input_Q,
63 data_t *input_N, data_t *input_E, int hash,
64 data_t *result_str, char *seed, data_t *message_str,
65 int result)
Paul Bakker9dcc3222011-03-08 14:16:06 +000066{
Ron Eldor5b8f1202018-11-22 15:49:49 +020067 unsigned char output[64];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020068 mbedtls_rsa_context ctx;
Paul Bakkerf4a3f302011-04-24 15:53:29 +000069 size_t output_len;
Ronald Cron351f0ee2020-06-10 12:12:18 +020070 mbedtls_test_rnd_pseudo_info rnd_info;
Hanno Becker6326a6d2017-08-23 06:38:22 +010071 mbedtls_mpi N, P, Q, E;
Paul Bakkerdbd443d2013-08-16 13:38:47 +020072 ((void) seed);
Paul Bakker9dcc3222011-03-08 14:16:06 +000073
Manuel Pégourié-Gonnardfb8d90a2023-03-16 10:47:59 +010074 MD_PSA_INIT();
75
Gilles Peskine449bd832023-01-11 14:50:10 +010076 mbedtls_mpi_init(&N); mbedtls_mpi_init(&P);
77 mbedtls_mpi_init(&Q); mbedtls_mpi_init(&E);
Hanno Becker6326a6d2017-08-23 06:38:22 +010078
Gilles Peskine449bd832023-01-11 14:50:10 +010079 mbedtls_rsa_init(&ctx);
80 TEST_ASSERT(mbedtls_rsa_set_padding(&ctx,
81 MBEDTLS_RSA_PKCS_V21, hash) == 0);
Paul Bakker9dcc3222011-03-08 14:16:06 +000082
Yanray Wang69bc8402023-03-17 20:33:03 +080083 TEST_EQUAL(mbedtls_rsa_get_padding_mode(&ctx), MBEDTLS_RSA_PKCS_V21);
84 TEST_EQUAL(mbedtls_rsa_get_md_alg(&ctx), hash);
Yanray Wang15d3df72023-03-17 19:34:01 +080085
Gilles Peskine449bd832023-01-11 14:50:10 +010086 memset(output, 0x00, sizeof(output));
87 memset(&rnd_info, 0, sizeof(mbedtls_test_rnd_pseudo_info));
Paul Bakker9dcc3222011-03-08 14:16:06 +000088
Gilles Peskine449bd832023-01-11 14:50:10 +010089 TEST_ASSERT(mbedtls_mpi_read_binary(&P, input_P->x, input_P->len) == 0);
90 TEST_ASSERT(mbedtls_mpi_read_binary(&Q, input_Q->x, input_Q->len) == 0);
91 TEST_ASSERT(mbedtls_mpi_read_binary(&N, input_N->x, input_N->len) == 0);
92 TEST_ASSERT(mbedtls_mpi_read_binary(&E, input_E->x, input_E->len) == 0);
Paul Bakker548957d2013-08-30 10:30:02 +020093
Gilles Peskine449bd832023-01-11 14:50:10 +010094 TEST_ASSERT(mbedtls_rsa_import(&ctx, &N, &P, &Q, NULL, &E) == 0);
95 TEST_ASSERT(mbedtls_rsa_get_len(&ctx) == (size_t) ((mod + 7) / 8));
96 TEST_ASSERT(mbedtls_rsa_complete(&ctx) == 0);
97 TEST_ASSERT(mbedtls_rsa_check_privkey(&ctx) == 0);
Paul Bakker9dcc3222011-03-08 14:16:06 +000098
Gilles Peskine449bd832023-01-11 14:50:10 +010099 if (result_str->len == 0) {
100 TEST_ASSERT(mbedtls_rsa_pkcs1_decrypt(&ctx,
101 &mbedtls_test_rnd_pseudo_rand,
102 &rnd_info,
103 &output_len, message_str->x,
104 NULL, 0) == result);
105 } else {
106 TEST_ASSERT(mbedtls_rsa_pkcs1_decrypt(&ctx,
107 &mbedtls_test_rnd_pseudo_rand,
108 &rnd_info,
109 &output_len, message_str->x,
110 output,
111 sizeof(output)) == result);
112 if (result == 0) {
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100113 TEST_MEMORY_COMPARE(output, output_len, result_str->x, result_str->len);
Gilles Peskine85a6dd42018-10-15 16:32:42 +0200114 }
Paul Bakker9dcc3222011-03-08 14:16:06 +0000115 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000116
Paul Bakkerbd51b262014-07-10 15:26:12 +0200117exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100118 mbedtls_mpi_free(&N); mbedtls_mpi_free(&P);
119 mbedtls_mpi_free(&Q); mbedtls_mpi_free(&E);
120 mbedtls_rsa_free(&ctx);
Manuel Pégourié-Gonnardfb8d90a2023-03-16 10:47:59 +0100121 MD_PSA_DONE();
Paul Bakker9dcc3222011-03-08 14:16:06 +0000122}
Paul Bakker33b43f12013-08-20 11:48:36 +0200123/* END_CASE */
Paul Bakker9dcc3222011-03-08 14:16:06 +0000124
Paul Bakker33b43f12013-08-20 11:48:36 +0200125/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100126void pkcs1_rsassa_pss_sign(int mod, data_t *input_P, data_t *input_Q,
127 data_t *input_N, data_t *input_E, int digest,
128 int hash, data_t *hash_digest, data_t *rnd_buf,
129 data_t *result_str, int fixed_salt_length,
130 int result)
Cédric Meuter668a78d2020-04-30 11:57:04 +0200131{
Cédric Meuter668a78d2020-04-30 11:57:04 +0200132 unsigned char output[512];
133 mbedtls_rsa_context ctx;
134 mbedtls_test_rnd_buf_info info;
135 mbedtls_mpi N, P, Q, E;
136
Manuel Pégourié-Gonnardfb8d90a2023-03-16 10:47:59 +0100137 MD_PSA_INIT();
138
Gilles Peskineecacc3c2021-03-24 00:48:57 +0100139 info.fallback_f_rng = mbedtls_test_rnd_std_rand;
140 info.fallback_p_rng = NULL;
Cédric Meuter668a78d2020-04-30 11:57:04 +0200141 info.buf = rnd_buf->x;
142 info.length = rnd_buf->len;
143
Gilles Peskine449bd832023-01-11 14:50:10 +0100144 mbedtls_mpi_init(&N); mbedtls_mpi_init(&P);
145 mbedtls_mpi_init(&Q); mbedtls_mpi_init(&E);
146 mbedtls_rsa_init(&ctx);
147 TEST_ASSERT(mbedtls_rsa_set_padding(&ctx,
148 MBEDTLS_RSA_PKCS_V21, hash) == 0);
Cédric Meuter668a78d2020-04-30 11:57:04 +0200149
Yanray Wang69bc8402023-03-17 20:33:03 +0800150 TEST_EQUAL(mbedtls_rsa_get_padding_mode(&ctx), MBEDTLS_RSA_PKCS_V21);
151 TEST_EQUAL(mbedtls_rsa_get_md_alg(&ctx), hash);
Yanray Wang15d3df72023-03-17 19:34:01 +0800152
Gilles Peskine449bd832023-01-11 14:50:10 +0100153 memset(output, 0x00, sizeof(output));
Cédric Meuter668a78d2020-04-30 11:57:04 +0200154
Gilles Peskine449bd832023-01-11 14:50:10 +0100155 TEST_ASSERT(mbedtls_mpi_read_binary(&P, input_P->x, input_P->len) == 0);
156 TEST_ASSERT(mbedtls_mpi_read_binary(&Q, input_Q->x, input_Q->len) == 0);
157 TEST_ASSERT(mbedtls_mpi_read_binary(&N, input_N->x, input_N->len) == 0);
158 TEST_ASSERT(mbedtls_mpi_read_binary(&E, input_E->x, input_E->len) == 0);
Cédric Meuter668a78d2020-04-30 11:57:04 +0200159
Gilles Peskine449bd832023-01-11 14:50:10 +0100160 TEST_ASSERT(mbedtls_rsa_import(&ctx, &N, &P, &Q, NULL, &E) == 0);
161 TEST_ASSERT(mbedtls_rsa_get_len(&ctx) == (size_t) ((mod + 7) / 8));
162 TEST_ASSERT(mbedtls_rsa_complete(&ctx) == 0);
163 TEST_ASSERT(mbedtls_rsa_check_privkey(&ctx) == 0);
Cédric Meuter668a78d2020-04-30 11:57:04 +0200164
Gilles Peskine449bd832023-01-11 14:50:10 +0100165 if (fixed_salt_length == MBEDTLS_RSA_SALT_LEN_ANY) {
166 TEST_ASSERT(mbedtls_rsa_pkcs1_sign(
167 &ctx, &mbedtls_test_rnd_buffer_rand, &info,
168 digest, hash_digest->len, hash_digest->x, output) == result);
169 if (result == 0) {
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100170 TEST_MEMORY_COMPARE(output, ctx.len, result_str->x, result_str->len);
Cédric Meuter61adfd62021-01-10 11:52:39 +0100171 }
172
173 info.buf = rnd_buf->x;
174 info.length = rnd_buf->len;
175 }
176
Gilles Peskine449bd832023-01-11 14:50:10 +0100177 TEST_ASSERT(mbedtls_rsa_rsassa_pss_sign_ext(
178 &ctx, &mbedtls_test_rnd_buffer_rand, &info,
179 digest, hash_digest->len, hash_digest->x,
180 fixed_salt_length, output) == result);
181 if (result == 0) {
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100182 TEST_MEMORY_COMPARE(output, ctx.len, result_str->x, result_str->len);
Cédric Meuter668a78d2020-04-30 11:57:04 +0200183 }
184
185exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100186 mbedtls_mpi_free(&N); mbedtls_mpi_free(&P);
187 mbedtls_mpi_free(&Q); mbedtls_mpi_free(&E);
188 mbedtls_rsa_free(&ctx);
Manuel Pégourié-Gonnardfb8d90a2023-03-16 10:47:59 +0100189 MD_PSA_DONE();
Cédric Meuter668a78d2020-04-30 11:57:04 +0200190}
191/* END_CASE */
192
193/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100194void pkcs1_rsassa_pss_verify(int mod, data_t *input_N, data_t *input_E,
195 int digest, int hash, data_t *hash_digest,
196 char *salt, data_t *result_str, int result)
Paul Bakker9dcc3222011-03-08 14:16:06 +0000197{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200198 mbedtls_rsa_context ctx;
Hanno Becker6326a6d2017-08-23 06:38:22 +0100199 mbedtls_mpi N, E;
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200200 ((void) salt);
Paul Bakker9dcc3222011-03-08 14:16:06 +0000201
Manuel Pégourié-Gonnardfb8d90a2023-03-16 10:47:59 +0100202 MD_PSA_INIT();
203
Gilles Peskine449bd832023-01-11 14:50:10 +0100204 mbedtls_mpi_init(&N); mbedtls_mpi_init(&E);
205 mbedtls_rsa_init(&ctx);
206 TEST_ASSERT(mbedtls_rsa_set_padding(&ctx,
207 MBEDTLS_RSA_PKCS_V21, hash) == 0);
Paul Bakker9dcc3222011-03-08 14:16:06 +0000208
Yanray Wang69bc8402023-03-17 20:33:03 +0800209 TEST_EQUAL(mbedtls_rsa_get_padding_mode(&ctx), MBEDTLS_RSA_PKCS_V21);
210 TEST_EQUAL(mbedtls_rsa_get_md_alg(&ctx), hash);
Yanray Wang15d3df72023-03-17 19:34:01 +0800211
Gilles Peskine449bd832023-01-11 14:50:10 +0100212 TEST_ASSERT(mbedtls_mpi_read_binary(&N, input_N->x, input_N->len) == 0);
213 TEST_ASSERT(mbedtls_mpi_read_binary(&E, input_E->x, input_E->len) == 0);
Paul Bakker9dcc3222011-03-08 14:16:06 +0000214
Gilles Peskine449bd832023-01-11 14:50:10 +0100215 TEST_ASSERT(mbedtls_rsa_import(&ctx, &N, NULL, NULL, NULL, &E) == 0);
216 TEST_ASSERT(mbedtls_rsa_get_len(&ctx) == (size_t) ((mod + 7) / 8));
217 TEST_ASSERT(mbedtls_rsa_check_pubkey(&ctx) == 0);
Paul Bakker9dcc3222011-03-08 14:16:06 +0000218
Paul Bakker9dcc3222011-03-08 14:16:06 +0000219
Gilles Peskine449bd832023-01-11 14:50:10 +0100220 TEST_ASSERT(mbedtls_rsa_pkcs1_verify(&ctx, digest, hash_digest->len, hash_digest->x,
221 result_str->x) == result);
Paul Bakker58ef6ec2013-01-03 11:33:48 +0100222
Paul Bakkerbd51b262014-07-10 15:26:12 +0200223exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100224 mbedtls_mpi_free(&N); mbedtls_mpi_free(&E);
225 mbedtls_rsa_free(&ctx);
Manuel Pégourié-Gonnardfb8d90a2023-03-16 10:47:59 +0100226 MD_PSA_DONE();
Paul Bakker9dcc3222011-03-08 14:16:06 +0000227}
Paul Bakker33b43f12013-08-20 11:48:36 +0200228/* END_CASE */
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200229
230/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100231void pkcs1_rsassa_pss_verify_ext(int mod, data_t *input_N, data_t *input_E,
232 int msg_digest_id, int ctx_hash,
233 int mgf_hash, int salt_len,
234 data_t *hash_digest,
235 data_t *result_str, int result_simple,
236 int result_full)
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200237{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200238 mbedtls_rsa_context ctx;
Hanno Becker6326a6d2017-08-23 06:38:22 +0100239 mbedtls_mpi N, E;
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200240
Manuel Pégourié-Gonnardfb8d90a2023-03-16 10:47:59 +0100241 MD_PSA_INIT();
242
Gilles Peskine449bd832023-01-11 14:50:10 +0100243 mbedtls_mpi_init(&N); mbedtls_mpi_init(&E);
244 mbedtls_rsa_init(&ctx);
245 TEST_ASSERT(mbedtls_rsa_set_padding(&ctx,
246 MBEDTLS_RSA_PKCS_V21, ctx_hash) == 0);
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200247
Yanray Wang69bc8402023-03-17 20:33:03 +0800248 TEST_EQUAL(mbedtls_rsa_get_padding_mode(&ctx), MBEDTLS_RSA_PKCS_V21);
249 TEST_EQUAL(mbedtls_rsa_get_md_alg(&ctx), ctx_hash);
Yanray Wang15d3df72023-03-17 19:34:01 +0800250
Gilles Peskine449bd832023-01-11 14:50:10 +0100251 TEST_ASSERT(mbedtls_mpi_read_binary(&N, input_N->x, input_N->len) == 0);
252 TEST_ASSERT(mbedtls_mpi_read_binary(&E, input_E->x, input_E->len) == 0);
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200253
Gilles Peskine449bd832023-01-11 14:50:10 +0100254 TEST_ASSERT(mbedtls_rsa_import(&ctx, &N, NULL, NULL, NULL, &E) == 0);
255 TEST_ASSERT(mbedtls_rsa_get_len(&ctx) == (size_t) ((mod + 7) / 8));
256 TEST_ASSERT(mbedtls_rsa_check_pubkey(&ctx) == 0);
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200257
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200258
Gilles Peskine449bd832023-01-11 14:50:10 +0100259 TEST_ASSERT(mbedtls_rsa_pkcs1_verify(&ctx, msg_digest_id,
260 hash_digest->len, hash_digest->x,
261 result_str->x) == result_simple);
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200262
Gilles Peskine449bd832023-01-11 14:50:10 +0100263 TEST_ASSERT(mbedtls_rsa_rsassa_pss_verify_ext(&ctx, msg_digest_id, hash_digest->len,
264 hash_digest->x, mgf_hash, salt_len,
265 result_str->x) == result_full);
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200266
Paul Bakkerbd51b262014-07-10 15:26:12 +0200267exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100268 mbedtls_mpi_free(&N); mbedtls_mpi_free(&E);
269 mbedtls_rsa_free(&ctx);
Manuel Pégourié-Gonnardfb8d90a2023-03-16 10:47:59 +0100270 MD_PSA_DONE();
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200271}
272/* END_CASE */