blob: a15d5d7a505f38dadd55cabfed2df7df838a04fb [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;
Gilles Peskine8369b4a2024-11-04 18:21:57 +010017 mbedtls_rsa_init(&ctx);
Ronald Cron351f0ee2020-06-10 12:12:18 +020018 mbedtls_test_rnd_buf_info info;
Hanno Becker6326a6d2017-08-23 06:38:22 +010019 mbedtls_mpi N, E;
Gilles Peskine8369b4a2024-11-04 18:21:57 +010020 mbedtls_mpi_init(&N); mbedtls_mpi_init(&E);
Manuel Pégourié-Gonnardfb8d90a2023-03-16 10:47:59 +010021
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 Peskine8369b4a2024-11-04 18:21:57 +010027 MD_PSA_INIT();
28
Gilles Peskine449bd832023-01-11 14:50:10 +010029 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;
Gilles Peskine8369b4a2024-11-04 18:21:57 +010069 mbedtls_rsa_init(&ctx);
Paul Bakkerf4a3f302011-04-24 15:53:29 +000070 size_t output_len;
Ronald Cron351f0ee2020-06-10 12:12:18 +020071 mbedtls_test_rnd_pseudo_info rnd_info;
Hanno Becker6326a6d2017-08-23 06:38:22 +010072 mbedtls_mpi N, P, Q, E;
Gilles Peskine8369b4a2024-11-04 18:21:57 +010073 mbedtls_mpi_init(&N); mbedtls_mpi_init(&P);
74 mbedtls_mpi_init(&Q); mbedtls_mpi_init(&E);
Paul Bakkerdbd443d2013-08-16 13:38:47 +020075 ((void) seed);
Paul Bakker9dcc3222011-03-08 14:16:06 +000076
Manuel Pégourié-Gonnardfb8d90a2023-03-16 10:47:59 +010077 MD_PSA_INIT();
78
Gilles Peskine449bd832023-01-11 14:50:10 +010079 TEST_ASSERT(mbedtls_rsa_set_padding(&ctx,
80 MBEDTLS_RSA_PKCS_V21, hash) == 0);
Paul Bakker9dcc3222011-03-08 14:16:06 +000081
Yanray Wang69bc8402023-03-17 20:33:03 +080082 TEST_EQUAL(mbedtls_rsa_get_padding_mode(&ctx), MBEDTLS_RSA_PKCS_V21);
83 TEST_EQUAL(mbedtls_rsa_get_md_alg(&ctx), hash);
Yanray Wang15d3df72023-03-17 19:34:01 +080084
Gilles Peskine449bd832023-01-11 14:50:10 +010085 memset(output, 0x00, sizeof(output));
86 memset(&rnd_info, 0, sizeof(mbedtls_test_rnd_pseudo_info));
Paul Bakker9dcc3222011-03-08 14:16:06 +000087
Gilles Peskine449bd832023-01-11 14:50:10 +010088 TEST_ASSERT(mbedtls_mpi_read_binary(&P, input_P->x, input_P->len) == 0);
89 TEST_ASSERT(mbedtls_mpi_read_binary(&Q, input_Q->x, input_Q->len) == 0);
90 TEST_ASSERT(mbedtls_mpi_read_binary(&N, input_N->x, input_N->len) == 0);
91 TEST_ASSERT(mbedtls_mpi_read_binary(&E, input_E->x, input_E->len) == 0);
Paul Bakker548957d2013-08-30 10:30:02 +020092
Gilles Peskine449bd832023-01-11 14:50:10 +010093 TEST_ASSERT(mbedtls_rsa_import(&ctx, &N, &P, &Q, NULL, &E) == 0);
94 TEST_ASSERT(mbedtls_rsa_get_len(&ctx) == (size_t) ((mod + 7) / 8));
95 TEST_ASSERT(mbedtls_rsa_complete(&ctx) == 0);
96 TEST_ASSERT(mbedtls_rsa_check_privkey(&ctx) == 0);
Paul Bakker9dcc3222011-03-08 14:16:06 +000097
Gilles Peskine449bd832023-01-11 14:50:10 +010098 if (result_str->len == 0) {
99 TEST_ASSERT(mbedtls_rsa_pkcs1_decrypt(&ctx,
100 &mbedtls_test_rnd_pseudo_rand,
101 &rnd_info,
102 &output_len, message_str->x,
103 NULL, 0) == result);
104 } else {
105 TEST_ASSERT(mbedtls_rsa_pkcs1_decrypt(&ctx,
106 &mbedtls_test_rnd_pseudo_rand,
107 &rnd_info,
108 &output_len, message_str->x,
109 output,
110 sizeof(output)) == result);
111 if (result == 0) {
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100112 TEST_MEMORY_COMPARE(output, output_len, result_str->x, result_str->len);
Gilles Peskine85a6dd42018-10-15 16:32:42 +0200113 }
Paul Bakker9dcc3222011-03-08 14:16:06 +0000114 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000115
Paul Bakkerbd51b262014-07-10 15:26:12 +0200116exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100117 mbedtls_mpi_free(&N); mbedtls_mpi_free(&P);
118 mbedtls_mpi_free(&Q); mbedtls_mpi_free(&E);
119 mbedtls_rsa_free(&ctx);
Manuel Pégourié-Gonnardfb8d90a2023-03-16 10:47:59 +0100120 MD_PSA_DONE();
Paul Bakker9dcc3222011-03-08 14:16:06 +0000121}
Paul Bakker33b43f12013-08-20 11:48:36 +0200122/* END_CASE */
Paul Bakker9dcc3222011-03-08 14:16:06 +0000123
Paul Bakker33b43f12013-08-20 11:48:36 +0200124/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100125void pkcs1_rsassa_pss_sign(int mod, data_t *input_P, data_t *input_Q,
126 data_t *input_N, data_t *input_E, int digest,
127 int hash, data_t *hash_digest, data_t *rnd_buf,
128 data_t *result_str, int fixed_salt_length,
129 int result)
Cédric Meuter668a78d2020-04-30 11:57:04 +0200130{
Cédric Meuter668a78d2020-04-30 11:57:04 +0200131 unsigned char output[512];
132 mbedtls_rsa_context ctx;
Gilles Peskine8369b4a2024-11-04 18:21:57 +0100133 mbedtls_rsa_init(&ctx);
Cédric Meuter668a78d2020-04-30 11:57:04 +0200134 mbedtls_test_rnd_buf_info info;
135 mbedtls_mpi N, P, Q, E;
Gilles Peskine8369b4a2024-11-04 18:21:57 +0100136 mbedtls_mpi_init(&N); mbedtls_mpi_init(&P);
137 mbedtls_mpi_init(&Q); mbedtls_mpi_init(&E);
Manuel Pégourié-Gonnardfb8d90a2023-03-16 10:47:59 +0100138
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 Peskine8369b4a2024-11-04 18:21:57 +0100144 MD_PSA_INIT();
145
Gilles Peskine449bd832023-01-11 14:50:10 +0100146 TEST_ASSERT(mbedtls_rsa_set_padding(&ctx,
147 MBEDTLS_RSA_PKCS_V21, hash) == 0);
Cédric Meuter668a78d2020-04-30 11:57:04 +0200148
Yanray Wang69bc8402023-03-17 20:33:03 +0800149 TEST_EQUAL(mbedtls_rsa_get_padding_mode(&ctx), MBEDTLS_RSA_PKCS_V21);
150 TEST_EQUAL(mbedtls_rsa_get_md_alg(&ctx), hash);
Yanray Wang15d3df72023-03-17 19:34:01 +0800151
Gilles Peskine449bd832023-01-11 14:50:10 +0100152 memset(output, 0x00, sizeof(output));
Cédric Meuter668a78d2020-04-30 11:57:04 +0200153
Gilles Peskine449bd832023-01-11 14:50:10 +0100154 TEST_ASSERT(mbedtls_mpi_read_binary(&P, input_P->x, input_P->len) == 0);
155 TEST_ASSERT(mbedtls_mpi_read_binary(&Q, input_Q->x, input_Q->len) == 0);
156 TEST_ASSERT(mbedtls_mpi_read_binary(&N, input_N->x, input_N->len) == 0);
157 TEST_ASSERT(mbedtls_mpi_read_binary(&E, input_E->x, input_E->len) == 0);
Cédric Meuter668a78d2020-04-30 11:57:04 +0200158
Gilles Peskine449bd832023-01-11 14:50:10 +0100159 TEST_ASSERT(mbedtls_rsa_import(&ctx, &N, &P, &Q, NULL, &E) == 0);
160 TEST_ASSERT(mbedtls_rsa_get_len(&ctx) == (size_t) ((mod + 7) / 8));
161 TEST_ASSERT(mbedtls_rsa_complete(&ctx) == 0);
162 TEST_ASSERT(mbedtls_rsa_check_privkey(&ctx) == 0);
Cédric Meuter668a78d2020-04-30 11:57:04 +0200163
Gilles Peskine449bd832023-01-11 14:50:10 +0100164 if (fixed_salt_length == MBEDTLS_RSA_SALT_LEN_ANY) {
165 TEST_ASSERT(mbedtls_rsa_pkcs1_sign(
166 &ctx, &mbedtls_test_rnd_buffer_rand, &info,
167 digest, hash_digest->len, hash_digest->x, output) == result);
168 if (result == 0) {
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100169 TEST_MEMORY_COMPARE(output, ctx.len, result_str->x, result_str->len);
Cédric Meuter61adfd62021-01-10 11:52:39 +0100170 }
171
172 info.buf = rnd_buf->x;
173 info.length = rnd_buf->len;
174 }
175
Gilles Peskine449bd832023-01-11 14:50:10 +0100176 TEST_ASSERT(mbedtls_rsa_rsassa_pss_sign_ext(
177 &ctx, &mbedtls_test_rnd_buffer_rand, &info,
178 digest, hash_digest->len, hash_digest->x,
179 fixed_salt_length, output) == result);
180 if (result == 0) {
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100181 TEST_MEMORY_COMPARE(output, ctx.len, result_str->x, result_str->len);
Cédric Meuter668a78d2020-04-30 11:57:04 +0200182 }
183
184exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100185 mbedtls_mpi_free(&N); mbedtls_mpi_free(&P);
186 mbedtls_mpi_free(&Q); mbedtls_mpi_free(&E);
187 mbedtls_rsa_free(&ctx);
Manuel Pégourié-Gonnardfb8d90a2023-03-16 10:47:59 +0100188 MD_PSA_DONE();
Cédric Meuter668a78d2020-04-30 11:57:04 +0200189}
190/* END_CASE */
191
192/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100193void pkcs1_rsassa_pss_verify(int mod, data_t *input_N, data_t *input_E,
194 int digest, int hash, data_t *hash_digest,
195 char *salt, data_t *result_str, int result)
Paul Bakker9dcc3222011-03-08 14:16:06 +0000196{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200197 mbedtls_rsa_context ctx;
Gilles Peskine8369b4a2024-11-04 18:21:57 +0100198 mbedtls_rsa_init(&ctx);
Hanno Becker6326a6d2017-08-23 06:38:22 +0100199 mbedtls_mpi N, E;
Gilles Peskine8369b4a2024-11-04 18:21:57 +0100200 mbedtls_mpi_init(&N); mbedtls_mpi_init(&E);
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200201 ((void) salt);
Paul Bakker9dcc3222011-03-08 14:16:06 +0000202
Manuel Pégourié-Gonnardfb8d90a2023-03-16 10:47:59 +0100203 MD_PSA_INIT();
204
Gilles Peskine449bd832023-01-11 14:50:10 +0100205 TEST_ASSERT(mbedtls_rsa_set_padding(&ctx,
206 MBEDTLS_RSA_PKCS_V21, hash) == 0);
Paul Bakker9dcc3222011-03-08 14:16:06 +0000207
Yanray Wang69bc8402023-03-17 20:33:03 +0800208 TEST_EQUAL(mbedtls_rsa_get_padding_mode(&ctx), MBEDTLS_RSA_PKCS_V21);
209 TEST_EQUAL(mbedtls_rsa_get_md_alg(&ctx), hash);
Yanray Wang15d3df72023-03-17 19:34:01 +0800210
Gilles Peskine449bd832023-01-11 14:50:10 +0100211 TEST_ASSERT(mbedtls_mpi_read_binary(&N, input_N->x, input_N->len) == 0);
212 TEST_ASSERT(mbedtls_mpi_read_binary(&E, input_E->x, input_E->len) == 0);
Paul Bakker9dcc3222011-03-08 14:16:06 +0000213
Gilles Peskine449bd832023-01-11 14:50:10 +0100214 TEST_ASSERT(mbedtls_rsa_import(&ctx, &N, NULL, NULL, NULL, &E) == 0);
215 TEST_ASSERT(mbedtls_rsa_get_len(&ctx) == (size_t) ((mod + 7) / 8));
216 TEST_ASSERT(mbedtls_rsa_check_pubkey(&ctx) == 0);
Paul Bakker9dcc3222011-03-08 14:16:06 +0000217
Paul Bakker9dcc3222011-03-08 14:16:06 +0000218
Gilles Peskine449bd832023-01-11 14:50:10 +0100219 TEST_ASSERT(mbedtls_rsa_pkcs1_verify(&ctx, digest, hash_digest->len, hash_digest->x,
220 result_str->x) == result);
Paul Bakker58ef6ec2013-01-03 11:33:48 +0100221
Paul Bakkerbd51b262014-07-10 15:26:12 +0200222exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100223 mbedtls_mpi_free(&N); mbedtls_mpi_free(&E);
224 mbedtls_rsa_free(&ctx);
Manuel Pégourié-Gonnardfb8d90a2023-03-16 10:47:59 +0100225 MD_PSA_DONE();
Paul Bakker9dcc3222011-03-08 14:16:06 +0000226}
Paul Bakker33b43f12013-08-20 11:48:36 +0200227/* END_CASE */
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200228
229/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100230void pkcs1_rsassa_pss_verify_ext(int mod, data_t *input_N, data_t *input_E,
231 int msg_digest_id, int ctx_hash,
232 int mgf_hash, int salt_len,
233 data_t *hash_digest,
234 data_t *result_str, int result_simple,
235 int result_full)
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200236{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200237 mbedtls_rsa_context ctx;
Gilles Peskine8369b4a2024-11-04 18:21:57 +0100238 mbedtls_rsa_init(&ctx);
Hanno Becker6326a6d2017-08-23 06:38:22 +0100239 mbedtls_mpi N, E;
Gilles Peskine8369b4a2024-11-04 18:21:57 +0100240 mbedtls_mpi_init(&N); mbedtls_mpi_init(&E);
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200241
Manuel Pégourié-Gonnardfb8d90a2023-03-16 10:47:59 +0100242 MD_PSA_INIT();
243
Gilles Peskine449bd832023-01-11 14:50:10 +0100244 TEST_ASSERT(mbedtls_rsa_set_padding(&ctx,
245 MBEDTLS_RSA_PKCS_V21, ctx_hash) == 0);
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200246
Yanray Wang69bc8402023-03-17 20:33:03 +0800247 TEST_EQUAL(mbedtls_rsa_get_padding_mode(&ctx), MBEDTLS_RSA_PKCS_V21);
248 TEST_EQUAL(mbedtls_rsa_get_md_alg(&ctx), ctx_hash);
Yanray Wang15d3df72023-03-17 19:34:01 +0800249
Gilles Peskine449bd832023-01-11 14:50:10 +0100250 TEST_ASSERT(mbedtls_mpi_read_binary(&N, input_N->x, input_N->len) == 0);
251 TEST_ASSERT(mbedtls_mpi_read_binary(&E, input_E->x, input_E->len) == 0);
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200252
Gilles Peskine449bd832023-01-11 14:50:10 +0100253 TEST_ASSERT(mbedtls_rsa_import(&ctx, &N, NULL, NULL, NULL, &E) == 0);
254 TEST_ASSERT(mbedtls_rsa_get_len(&ctx) == (size_t) ((mod + 7) / 8));
255 TEST_ASSERT(mbedtls_rsa_check_pubkey(&ctx) == 0);
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200256
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200257
Gilles Peskine449bd832023-01-11 14:50:10 +0100258 TEST_ASSERT(mbedtls_rsa_pkcs1_verify(&ctx, msg_digest_id,
259 hash_digest->len, hash_digest->x,
260 result_str->x) == result_simple);
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200261
Gilles Peskine449bd832023-01-11 14:50:10 +0100262 TEST_ASSERT(mbedtls_rsa_rsassa_pss_verify_ext(&ctx, msg_digest_id, hash_digest->len,
263 hash_digest->x, mgf_hash, salt_len,
264 result_str->x) == result_full);
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200265
Paul Bakkerbd51b262014-07-10 15:26:12 +0200266exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100267 mbedtls_mpi_free(&N); mbedtls_mpi_free(&E);
268 mbedtls_rsa_free(&ctx);
Manuel Pégourié-Gonnardfb8d90a2023-03-16 10:47:59 +0100269 MD_PSA_DONE();
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200270}
271/* END_CASE */