blob: b0a26620f645a3dea159144c41f5d7a400b010a7 [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"
Manuel Pégourié-Gonnard07018f92022-09-15 11:29:35 +02003#include "mbedtls/legacy_or_psa.h"
Paul Bakker33b43f12013-08-20 11:48:36 +02004/* END_HEADER */
Paul Bakker9dcc3222011-03-08 14:16:06 +00005
Paul Bakker33b43f12013-08-20 11:48:36 +02006/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnarde741c612022-07-27 13:13:55 +02007 * depends_on:MBEDTLS_PKCS1_V21:MBEDTLS_RSA_C
Paul Bakker33b43f12013-08-20 11:48:36 +02008 * END_DEPENDENCIES
9 */
Paul Bakker5690efc2011-05-26 13:16:06 +000010
Paul Bakker33b43f12013-08-20 11:48:36 +020011/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010012void pkcs1_rsaes_oaep_encrypt(int mod, data_t *input_N, data_t *input_E,
13 int hash, data_t *message_str, data_t *rnd_buf,
14 data_t *result_str, int result)
Paul Bakker9dcc3222011-03-08 14:16:06 +000015{
Ron Eldor5b8f1202018-11-22 15:49:49 +020016 unsigned char output[256];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020017 mbedtls_rsa_context 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;
Paul Bakker9dcc3222011-03-08 14:16:06 +000020
Gilles Peskineecacc3c2021-03-24 00:48:57 +010021 info.fallback_f_rng = mbedtls_test_rnd_std_rand;
22 info.fallback_p_rng = NULL;
Azim Khand30ca132017-06-09 04:32:58 +010023 info.buf = rnd_buf->x;
24 info.length = rnd_buf->len;
Paul Bakker9dcc3222011-03-08 14:16:06 +000025
Gilles Peskine449bd832023-01-11 14:50:10 +010026 mbedtls_mpi_init(&N); mbedtls_mpi_init(&E);
27 mbedtls_rsa_init(&ctx);
28 TEST_ASSERT(mbedtls_rsa_set_padding(&ctx,
29 MBEDTLS_RSA_PKCS_V21, hash) == 0);
30 memset(output, 0x00, sizeof(output));
Paul Bakker9dcc3222011-03-08 14:16:06 +000031
Yanray Wang15d3df72023-03-17 19:34:01 +080032 TEST_ASSERT(mbedtls_rsa_get_padding_mode(&ctx) == MBEDTLS_RSA_PKCS_V21);
33 TEST_ASSERT(mbedtls_rsa_get_md_alg(&ctx) == hash);
34
Gilles Peskine449bd832023-01-11 14:50:10 +010035 TEST_ASSERT(mbedtls_mpi_read_binary(&N, input_N->x, input_N->len) == 0);
36 TEST_ASSERT(mbedtls_mpi_read_binary(&E, input_E->x, input_E->len) == 0);
37 TEST_ASSERT(mbedtls_rsa_import(&ctx, &N, NULL, NULL, NULL, &E) == 0);
38 TEST_ASSERT(mbedtls_rsa_get_len(&ctx) == (size_t) ((mod + 7) / 8));
39 TEST_ASSERT(mbedtls_rsa_check_pubkey(&ctx) == 0);
Paul Bakker9dcc3222011-03-08 14:16:06 +000040
Gilles Peskine449bd832023-01-11 14:50:10 +010041 if (message_str->len == 0) {
Gilles Peskine85a6dd42018-10-15 16:32:42 +020042 message_str->x = NULL;
Gilles Peskine449bd832023-01-11 14:50:10 +010043 }
44 TEST_ASSERT(mbedtls_rsa_pkcs1_encrypt(&ctx,
45 &mbedtls_test_rnd_buffer_rand,
46 &info, message_str->len,
47 message_str->x,
48 output) == result);
49 if (result == 0) {
50 ASSERT_COMPARE(output, ctx.len, result_str->x, result_str->len);
Paul Bakker9dcc3222011-03-08 14:16:06 +000051 }
Paul Bakker58ef6ec2013-01-03 11:33:48 +010052
Paul Bakkerbd51b262014-07-10 15:26:12 +020053exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010054 mbedtls_mpi_free(&N); mbedtls_mpi_free(&E);
55 mbedtls_rsa_free(&ctx);
Paul Bakker9dcc3222011-03-08 14:16:06 +000056}
Paul Bakker33b43f12013-08-20 11:48:36 +020057/* END_CASE */
Paul Bakker9dcc3222011-03-08 14:16:06 +000058
Paul Bakker33b43f12013-08-20 11:48:36 +020059/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010060void pkcs1_rsaes_oaep_decrypt(int mod, data_t *input_P, data_t *input_Q,
61 data_t *input_N, data_t *input_E, int hash,
62 data_t *result_str, char *seed, data_t *message_str,
63 int result)
Paul Bakker9dcc3222011-03-08 14:16:06 +000064{
Ron Eldor5b8f1202018-11-22 15:49:49 +020065 unsigned char output[64];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020066 mbedtls_rsa_context ctx;
Paul Bakkerf4a3f302011-04-24 15:53:29 +000067 size_t output_len;
Ronald Cron351f0ee2020-06-10 12:12:18 +020068 mbedtls_test_rnd_pseudo_info rnd_info;
Hanno Becker6326a6d2017-08-23 06:38:22 +010069 mbedtls_mpi N, P, Q, E;
Paul Bakkerdbd443d2013-08-16 13:38:47 +020070 ((void) seed);
Paul Bakker9dcc3222011-03-08 14:16:06 +000071
Gilles Peskine449bd832023-01-11 14:50:10 +010072 mbedtls_mpi_init(&N); mbedtls_mpi_init(&P);
73 mbedtls_mpi_init(&Q); mbedtls_mpi_init(&E);
Hanno Becker6326a6d2017-08-23 06:38:22 +010074
Gilles Peskine449bd832023-01-11 14:50:10 +010075 mbedtls_rsa_init(&ctx);
76 TEST_ASSERT(mbedtls_rsa_set_padding(&ctx,
77 MBEDTLS_RSA_PKCS_V21, hash) == 0);
Paul Bakker9dcc3222011-03-08 14:16:06 +000078
Yanray Wang15d3df72023-03-17 19:34:01 +080079 TEST_ASSERT(mbedtls_rsa_get_padding_mode(&ctx) == MBEDTLS_RSA_PKCS_V21);
80 TEST_ASSERT(mbedtls_rsa_get_md_alg(&ctx) == hash);
81
Gilles Peskine449bd832023-01-11 14:50:10 +010082 memset(output, 0x00, sizeof(output));
83 memset(&rnd_info, 0, sizeof(mbedtls_test_rnd_pseudo_info));
Paul Bakker9dcc3222011-03-08 14:16:06 +000084
Gilles Peskine449bd832023-01-11 14:50:10 +010085 TEST_ASSERT(mbedtls_mpi_read_binary(&P, input_P->x, input_P->len) == 0);
86 TEST_ASSERT(mbedtls_mpi_read_binary(&Q, input_Q->x, input_Q->len) == 0);
87 TEST_ASSERT(mbedtls_mpi_read_binary(&N, input_N->x, input_N->len) == 0);
88 TEST_ASSERT(mbedtls_mpi_read_binary(&E, input_E->x, input_E->len) == 0);
Paul Bakker548957d2013-08-30 10:30:02 +020089
Gilles Peskine449bd832023-01-11 14:50:10 +010090 TEST_ASSERT(mbedtls_rsa_import(&ctx, &N, &P, &Q, NULL, &E) == 0);
91 TEST_ASSERT(mbedtls_rsa_get_len(&ctx) == (size_t) ((mod + 7) / 8));
92 TEST_ASSERT(mbedtls_rsa_complete(&ctx) == 0);
93 TEST_ASSERT(mbedtls_rsa_check_privkey(&ctx) == 0);
Paul Bakker9dcc3222011-03-08 14:16:06 +000094
Gilles Peskine449bd832023-01-11 14:50:10 +010095 if (result_str->len == 0) {
96 TEST_ASSERT(mbedtls_rsa_pkcs1_decrypt(&ctx,
97 &mbedtls_test_rnd_pseudo_rand,
98 &rnd_info,
99 &output_len, message_str->x,
100 NULL, 0) == result);
101 } else {
102 TEST_ASSERT(mbedtls_rsa_pkcs1_decrypt(&ctx,
103 &mbedtls_test_rnd_pseudo_rand,
104 &rnd_info,
105 &output_len, message_str->x,
106 output,
107 sizeof(output)) == result);
108 if (result == 0) {
109 ASSERT_COMPARE(output, output_len, result_str->x, result_str->len);
Gilles Peskine85a6dd42018-10-15 16:32:42 +0200110 }
Paul Bakker9dcc3222011-03-08 14:16:06 +0000111 }
Paul Bakker6c591fa2011-05-05 11:49:20 +0000112
Paul Bakkerbd51b262014-07-10 15:26:12 +0200113exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100114 mbedtls_mpi_free(&N); mbedtls_mpi_free(&P);
115 mbedtls_mpi_free(&Q); mbedtls_mpi_free(&E);
116 mbedtls_rsa_free(&ctx);
Paul Bakker9dcc3222011-03-08 14:16:06 +0000117}
Paul Bakker33b43f12013-08-20 11:48:36 +0200118/* END_CASE */
Paul Bakker9dcc3222011-03-08 14:16:06 +0000119
Paul Bakker33b43f12013-08-20 11:48:36 +0200120/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100121void pkcs1_rsassa_pss_sign(int mod, data_t *input_P, data_t *input_Q,
122 data_t *input_N, data_t *input_E, int digest,
123 int hash, data_t *hash_digest, data_t *rnd_buf,
124 data_t *result_str, int fixed_salt_length,
125 int result)
Cédric Meuter668a78d2020-04-30 11:57:04 +0200126{
Cédric Meuter668a78d2020-04-30 11:57:04 +0200127 unsigned char output[512];
128 mbedtls_rsa_context ctx;
129 mbedtls_test_rnd_buf_info info;
130 mbedtls_mpi N, P, Q, E;
131
Gilles Peskineecacc3c2021-03-24 00:48:57 +0100132 info.fallback_f_rng = mbedtls_test_rnd_std_rand;
133 info.fallback_p_rng = NULL;
Cédric Meuter668a78d2020-04-30 11:57:04 +0200134 info.buf = rnd_buf->x;
135 info.length = rnd_buf->len;
136
Gilles Peskine449bd832023-01-11 14:50:10 +0100137 mbedtls_mpi_init(&N); mbedtls_mpi_init(&P);
138 mbedtls_mpi_init(&Q); mbedtls_mpi_init(&E);
139 mbedtls_rsa_init(&ctx);
140 TEST_ASSERT(mbedtls_rsa_set_padding(&ctx,
141 MBEDTLS_RSA_PKCS_V21, hash) == 0);
Cédric Meuter668a78d2020-04-30 11:57:04 +0200142
Yanray Wang15d3df72023-03-17 19:34:01 +0800143 TEST_ASSERT(mbedtls_rsa_get_padding_mode(&ctx) == MBEDTLS_RSA_PKCS_V21);
144 TEST_ASSERT(mbedtls_rsa_get_md_alg(&ctx) == hash);
145
Gilles Peskine449bd832023-01-11 14:50:10 +0100146 memset(output, 0x00, sizeof(output));
Cédric Meuter668a78d2020-04-30 11:57:04 +0200147
Gilles Peskine449bd832023-01-11 14:50:10 +0100148 TEST_ASSERT(mbedtls_mpi_read_binary(&P, input_P->x, input_P->len) == 0);
149 TEST_ASSERT(mbedtls_mpi_read_binary(&Q, input_Q->x, input_Q->len) == 0);
150 TEST_ASSERT(mbedtls_mpi_read_binary(&N, input_N->x, input_N->len) == 0);
151 TEST_ASSERT(mbedtls_mpi_read_binary(&E, input_E->x, input_E->len) == 0);
Cédric Meuter668a78d2020-04-30 11:57:04 +0200152
Gilles Peskine449bd832023-01-11 14:50:10 +0100153 TEST_ASSERT(mbedtls_rsa_import(&ctx, &N, &P, &Q, NULL, &E) == 0);
154 TEST_ASSERT(mbedtls_rsa_get_len(&ctx) == (size_t) ((mod + 7) / 8));
155 TEST_ASSERT(mbedtls_rsa_complete(&ctx) == 0);
156 TEST_ASSERT(mbedtls_rsa_check_privkey(&ctx) == 0);
Cédric Meuter668a78d2020-04-30 11:57:04 +0200157
Gilles Peskine449bd832023-01-11 14:50:10 +0100158 if (fixed_salt_length == MBEDTLS_RSA_SALT_LEN_ANY) {
159 TEST_ASSERT(mbedtls_rsa_pkcs1_sign(
160 &ctx, &mbedtls_test_rnd_buffer_rand, &info,
161 digest, hash_digest->len, hash_digest->x, output) == result);
162 if (result == 0) {
163 ASSERT_COMPARE(output, ctx.len, result_str->x, result_str->len);
Cédric Meuter61adfd62021-01-10 11:52:39 +0100164 }
165
166 info.buf = rnd_buf->x;
167 info.length = rnd_buf->len;
168 }
169
Gilles Peskine449bd832023-01-11 14:50:10 +0100170 TEST_ASSERT(mbedtls_rsa_rsassa_pss_sign_ext(
171 &ctx, &mbedtls_test_rnd_buffer_rand, &info,
172 digest, hash_digest->len, hash_digest->x,
173 fixed_salt_length, output) == result);
174 if (result == 0) {
175 ASSERT_COMPARE(output, ctx.len, result_str->x, result_str->len);
Cédric Meuter668a78d2020-04-30 11:57:04 +0200176 }
177
178exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100179 mbedtls_mpi_free(&N); mbedtls_mpi_free(&P);
180 mbedtls_mpi_free(&Q); mbedtls_mpi_free(&E);
181 mbedtls_rsa_free(&ctx);
Cédric Meuter668a78d2020-04-30 11:57:04 +0200182}
183/* END_CASE */
184
185/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100186void pkcs1_rsassa_pss_verify(int mod, data_t *input_N, data_t *input_E,
187 int digest, int hash, data_t *hash_digest,
188 char *salt, data_t *result_str, int result)
Paul Bakker9dcc3222011-03-08 14:16:06 +0000189{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200190 mbedtls_rsa_context ctx;
Hanno Becker6326a6d2017-08-23 06:38:22 +0100191 mbedtls_mpi N, E;
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200192 ((void) salt);
Paul Bakker9dcc3222011-03-08 14:16:06 +0000193
Gilles Peskine449bd832023-01-11 14:50:10 +0100194 mbedtls_mpi_init(&N); mbedtls_mpi_init(&E);
195 mbedtls_rsa_init(&ctx);
196 TEST_ASSERT(mbedtls_rsa_set_padding(&ctx,
197 MBEDTLS_RSA_PKCS_V21, hash) == 0);
Paul Bakker9dcc3222011-03-08 14:16:06 +0000198
Yanray Wang15d3df72023-03-17 19:34:01 +0800199 TEST_ASSERT(mbedtls_rsa_get_padding_mode(&ctx) == MBEDTLS_RSA_PKCS_V21);
200 TEST_ASSERT(mbedtls_rsa_get_md_alg(&ctx) == hash);
201
Gilles Peskine449bd832023-01-11 14:50:10 +0100202 TEST_ASSERT(mbedtls_mpi_read_binary(&N, input_N->x, input_N->len) == 0);
203 TEST_ASSERT(mbedtls_mpi_read_binary(&E, input_E->x, input_E->len) == 0);
Paul Bakker9dcc3222011-03-08 14:16:06 +0000204
Gilles Peskine449bd832023-01-11 14:50:10 +0100205 TEST_ASSERT(mbedtls_rsa_import(&ctx, &N, NULL, NULL, NULL, &E) == 0);
206 TEST_ASSERT(mbedtls_rsa_get_len(&ctx) == (size_t) ((mod + 7) / 8));
207 TEST_ASSERT(mbedtls_rsa_check_pubkey(&ctx) == 0);
Paul Bakker9dcc3222011-03-08 14:16:06 +0000208
Paul Bakker9dcc3222011-03-08 14:16:06 +0000209
Gilles Peskine449bd832023-01-11 14:50:10 +0100210 TEST_ASSERT(mbedtls_rsa_pkcs1_verify(&ctx, digest, hash_digest->len, hash_digest->x,
211 result_str->x) == result);
Paul Bakker58ef6ec2013-01-03 11:33:48 +0100212
Paul Bakkerbd51b262014-07-10 15:26:12 +0200213exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100214 mbedtls_mpi_free(&N); mbedtls_mpi_free(&E);
215 mbedtls_rsa_free(&ctx);
Paul Bakker9dcc3222011-03-08 14:16:06 +0000216}
Paul Bakker33b43f12013-08-20 11:48:36 +0200217/* END_CASE */
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200218
219/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100220void pkcs1_rsassa_pss_verify_ext(int mod, data_t *input_N, data_t *input_E,
221 int msg_digest_id, int ctx_hash,
222 int mgf_hash, int salt_len,
223 data_t *hash_digest,
224 data_t *result_str, int result_simple,
225 int result_full)
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200226{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200227 mbedtls_rsa_context ctx;
Hanno Becker6326a6d2017-08-23 06:38:22 +0100228 mbedtls_mpi N, E;
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200229
Gilles Peskine449bd832023-01-11 14:50:10 +0100230 mbedtls_mpi_init(&N); mbedtls_mpi_init(&E);
231 mbedtls_rsa_init(&ctx);
232 TEST_ASSERT(mbedtls_rsa_set_padding(&ctx,
233 MBEDTLS_RSA_PKCS_V21, ctx_hash) == 0);
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200234
Yanray Wang15d3df72023-03-17 19:34:01 +0800235 TEST_ASSERT(mbedtls_rsa_get_padding_mode(&ctx) == MBEDTLS_RSA_PKCS_V21);
236 TEST_ASSERT(mbedtls_rsa_get_md_alg(&ctx) == ctx_hash);
237
Gilles Peskine449bd832023-01-11 14:50:10 +0100238 TEST_ASSERT(mbedtls_mpi_read_binary(&N, input_N->x, input_N->len) == 0);
239 TEST_ASSERT(mbedtls_mpi_read_binary(&E, input_E->x, input_E->len) == 0);
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200240
Gilles Peskine449bd832023-01-11 14:50:10 +0100241 TEST_ASSERT(mbedtls_rsa_import(&ctx, &N, NULL, NULL, NULL, &E) == 0);
242 TEST_ASSERT(mbedtls_rsa_get_len(&ctx) == (size_t) ((mod + 7) / 8));
243 TEST_ASSERT(mbedtls_rsa_check_pubkey(&ctx) == 0);
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200244
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200245
Gilles Peskine449bd832023-01-11 14:50:10 +0100246 TEST_ASSERT(mbedtls_rsa_pkcs1_verify(&ctx, msg_digest_id,
247 hash_digest->len, hash_digest->x,
248 result_str->x) == result_simple);
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200249
Gilles Peskine449bd832023-01-11 14:50:10 +0100250 TEST_ASSERT(mbedtls_rsa_rsassa_pss_verify_ext(&ctx, msg_digest_id, hash_digest->len,
251 hash_digest->x, mgf_hash, salt_len,
252 result_str->x) == result_full);
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200253
Paul Bakkerbd51b262014-07-10 15:26:12 +0200254exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100255 mbedtls_mpi_free(&N); mbedtls_mpi_free(&E);
256 mbedtls_rsa_free(&ctx);
Manuel Pégourié-Gonnard5ec628a2014-06-03 11:44:06 +0200257}
258/* END_CASE */