blob: c8be4e581b0dd6584c399f88db61db1bbbd34b58 [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/ecp.h"
Minos Galanakis9a1d02d2023-02-03 19:14:56 +00003#include "ecp_invasive.h"
Werner Lewise54046c2022-08-15 11:43:56 +01004#include "mbedtls/ecdsa.h"
5#include "mbedtls/ecdh.h"
Paul Bakkerdbd443d2013-08-16 13:38:47 +02006
Gabor Mezei23d4b8b2023-02-13 14:13:33 +01007#include "bignum_core.h"
Gilles Peskine618be2e2021-04-03 21:47:53 +02008#include "ecp_invasive.h"
Gabor Mezeid8f67b92023-02-06 15:49:42 +01009#include "bignum_mod_raw_invasive.h"
Xiaokang Qianb8cf6222023-05-24 08:55:59 +000010#include "constant_time_internal.h"
Gilles Peskine618be2e2021-04-03 21:47:53 +020011
Manuel Pégourié-Gonnard6c7af4c2015-04-03 16:41:52 +020012#define ECP_PF_UNKNOWN -1
Manuel Pégourié-Gonnard7a28e992018-10-16 11:22:45 +020013
Gilles Peskine449bd832023-01-11 14:50:10 +010014#define ECP_PT_RESET(x) \
15 mbedtls_ecp_point_free(x); \
16 mbedtls_ecp_point_init(x);
Gilles Peskine78880732021-03-29 21:32:16 +020017
Przemek Stekiel4b30feb2022-03-18 13:58:26 +010018/* Auxiliary function to compare two mbedtls_ecp_group objects. */
Gilles Peskine449bd832023-01-11 14:50:10 +010019inline static int mbedtls_ecp_group_cmp(mbedtls_ecp_group *grp1,
20 mbedtls_ecp_group *grp2)
Przemek Stekiel4b30feb2022-03-18 13:58:26 +010021{
Gilles Peskine449bd832023-01-11 14:50:10 +010022 if (mbedtls_mpi_cmp_mpi(&grp1->P, &grp2->P) != 0) {
Przemek Stekiel4b30feb2022-03-18 13:58:26 +010023 return 1;
Gilles Peskine449bd832023-01-11 14:50:10 +010024 }
25 if (mbedtls_mpi_cmp_mpi(&grp1->A, &grp2->A) != 0) {
Przemek Stekiel4b30feb2022-03-18 13:58:26 +010026 return 1;
Gilles Peskine449bd832023-01-11 14:50:10 +010027 }
28 if (mbedtls_mpi_cmp_mpi(&grp1->B, &grp2->B) != 0) {
Przemek Stekiel4b30feb2022-03-18 13:58:26 +010029 return 1;
Gilles Peskine449bd832023-01-11 14:50:10 +010030 }
31 if (mbedtls_mpi_cmp_mpi(&grp1->N, &grp2->N) != 0) {
Przemek Stekiel4b30feb2022-03-18 13:58:26 +010032 return 1;
Gilles Peskine449bd832023-01-11 14:50:10 +010033 }
34 if (mbedtls_ecp_point_cmp(&grp1->G, &grp2->G) != 0) {
Przemek Stekiel4b30feb2022-03-18 13:58:26 +010035 return 1;
Gilles Peskine449bd832023-01-11 14:50:10 +010036 }
37 if (grp1->id != grp2->id) {
Przemek Stekiel4b30feb2022-03-18 13:58:26 +010038 return 1;
Gilles Peskine449bd832023-01-11 14:50:10 +010039 }
40 if (grp1->pbits != grp2->pbits) {
Przemek Stekiel4b30feb2022-03-18 13:58:26 +010041 return 1;
Gilles Peskine449bd832023-01-11 14:50:10 +010042 }
43 if (grp1->nbits != grp2->nbits) {
Przemek Stekiel4b30feb2022-03-18 13:58:26 +010044 return 1;
Gilles Peskine449bd832023-01-11 14:50:10 +010045 }
46 if (grp1->h != grp2->h) {
Przemek Stekiel4b30feb2022-03-18 13:58:26 +010047 return 1;
Gilles Peskine449bd832023-01-11 14:50:10 +010048 }
49 if (grp1->modp != grp2->modp) {
Przemek Stekiel4b30feb2022-03-18 13:58:26 +010050 return 1;
Gilles Peskine449bd832023-01-11 14:50:10 +010051 }
52 if (grp1->t_pre != grp2->t_pre) {
Przemek Stekiel4b30feb2022-03-18 13:58:26 +010053 return 1;
Gilles Peskine449bd832023-01-11 14:50:10 +010054 }
55 if (grp1->t_post != grp2->t_post) {
Przemek Stekiel4b30feb2022-03-18 13:58:26 +010056 return 1;
Gilles Peskine449bd832023-01-11 14:50:10 +010057 }
58 if (grp1->t_data != grp2->t_data) {
Przemek Stekiel4b30feb2022-03-18 13:58:26 +010059 return 1;
Gilles Peskine449bd832023-01-11 14:50:10 +010060 }
61 if (grp1->T_size != grp2->T_size) {
Przemek Stekiel4b30feb2022-03-18 13:58:26 +010062 return 1;
Gilles Peskine449bd832023-01-11 14:50:10 +010063 }
64 if (grp1->T != grp2->T) {
Przemek Stekiel4b30feb2022-03-18 13:58:26 +010065 return 1;
Gilles Peskine449bd832023-01-11 14:50:10 +010066 }
Przemek Stekiel4b30feb2022-03-18 13:58:26 +010067
68 return 0;
69}
70
Paul Bakker33b43f12013-08-20 11:48:36 +020071/* END_HEADER */
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +010072
Paul Bakker33b43f12013-08-20 11:48:36 +020073/* BEGIN_DEPENDENCIES
Valerio Setti0c477d32023-04-07 15:54:20 +020074 * depends_on:MBEDTLS_ECP_LIGHT
Paul Bakker33b43f12013-08-20 11:48:36 +020075 * END_DEPENDENCIES
76 */
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +010077
Tuvshinzaya Erdenekhuufb389dd2022-07-27 15:23:02 +010078/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010079void ecp_invalid_param()
Hanno Becker12dff032018-12-14 15:08:13 +000080{
81 mbedtls_ecp_group grp;
Hanno Becker12dff032018-12-14 15:08:13 +000082 mbedtls_ecp_point P;
Hanno Becker12dff032018-12-14 15:08:13 +000083 int invalid_fmt = 42;
84 size_t olen;
85 unsigned char buf[42] = { 0 };
Hanno Becker12dff032018-12-14 15:08:13 +000086
Gilles Peskine449bd832023-01-11 14:50:10 +010087 mbedtls_ecp_group_init(&grp);
88 mbedtls_ecp_point_init(&P);
Gabor Mezeif29c2a52022-09-23 15:25:27 +020089
Gilles Peskine449bd832023-01-11 14:50:10 +010090 TEST_EQUAL(MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
91 mbedtls_ecp_point_write_binary(&grp, &P,
92 invalid_fmt,
93 &olen,
94 buf, sizeof(buf)));
95 TEST_EQUAL(MBEDTLS_ERR_ECP_BAD_INPUT_DATA,
96 mbedtls_ecp_tls_write_point(&grp, &P,
97 invalid_fmt,
98 &olen,
99 buf,
100 sizeof(buf)));
Hanno Becker12dff032018-12-14 15:08:13 +0000101
102exit:
103 return;
104}
105/* END_CASE */
106
Paul Bakker33b43f12013-08-20 11:48:36 +0200107/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100108void mbedtls_ecp_curve_info(int id, int tls_id, int size, char *name)
Manuel Pégourié-Gonnard0267e3d2013-11-30 15:10:14 +0100109{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200110 const mbedtls_ecp_curve_info *by_id, *by_tls, *by_name;
Manuel Pégourié-Gonnard0267e3d2013-11-30 15:10:14 +0100111
Gilles Peskine449bd832023-01-11 14:50:10 +0100112 by_id = mbedtls_ecp_curve_info_from_grp_id(id);
113 by_tls = mbedtls_ecp_curve_info_from_tls_id(tls_id);
114 by_name = mbedtls_ecp_curve_info_from_name(name);
115 TEST_ASSERT(by_id != NULL);
116 TEST_ASSERT(by_tls != NULL);
117 TEST_ASSERT(by_name != NULL);
Manuel Pégourié-Gonnard0267e3d2013-11-30 15:10:14 +0100118
Gilles Peskine449bd832023-01-11 14:50:10 +0100119 TEST_ASSERT(by_id == by_tls);
120 TEST_ASSERT(by_id == by_name);
Manuel Pégourié-Gonnard0267e3d2013-11-30 15:10:14 +0100121
Gilles Peskine449bd832023-01-11 14:50:10 +0100122 TEST_ASSERT(by_id->bit_size == size);
123 TEST_ASSERT(size <= MBEDTLS_ECP_MAX_BITS);
124 TEST_ASSERT(size <= MBEDTLS_ECP_MAX_BYTES * 8);
Manuel Pégourié-Gonnard0267e3d2013-11-30 15:10:14 +0100125}
126/* END_CASE */
127
128/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100129void ecp_check_pub(int grp_id, char *x_hex, char *y_hex, char *z_hex,
130 int ret)
Manuel Pégourié-Gonnard312d2e82013-12-04 11:08:01 +0100131{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200132 mbedtls_ecp_group grp;
133 mbedtls_ecp_point P;
Manuel Pégourié-Gonnard312d2e82013-12-04 11:08:01 +0100134
Gilles Peskine449bd832023-01-11 14:50:10 +0100135 mbedtls_ecp_group_init(&grp);
136 mbedtls_ecp_point_init(&P);
Manuel Pégourié-Gonnard312d2e82013-12-04 11:08:01 +0100137
Gilles Peskine449bd832023-01-11 14:50:10 +0100138 TEST_ASSERT(mbedtls_ecp_group_load(&grp, grp_id) == 0);
Manuel Pégourié-Gonnard312d2e82013-12-04 11:08:01 +0100139
Gilles Peskine449bd832023-01-11 14:50:10 +0100140 TEST_ASSERT(mbedtls_test_read_mpi(&P.X, x_hex) == 0);
141 TEST_ASSERT(mbedtls_test_read_mpi(&P.Y, y_hex) == 0);
142 TEST_ASSERT(mbedtls_test_read_mpi(&P.Z, z_hex) == 0);
Manuel Pégourié-Gonnard312d2e82013-12-04 11:08:01 +0100143
Gilles Peskine449bd832023-01-11 14:50:10 +0100144 TEST_ASSERT(mbedtls_ecp_check_pubkey(&grp, &P) == ret);
Manuel Pégourié-Gonnard312d2e82013-12-04 11:08:01 +0100145
Paul Bakkerbd51b262014-07-10 15:26:12 +0200146exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100147 mbedtls_ecp_group_free(&grp);
148 mbedtls_ecp_point_free(&P);
Manuel Pégourié-Gonnard312d2e82013-12-04 11:08:01 +0100149}
150/* END_CASE */
151
Manuel Pégourié-Gonnard4b9c51e2017-04-20 15:50:26 +0200152/* BEGIN_CASE depends_on:MBEDTLS_ECP_RESTARTABLE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100153void ecp_test_vect_restart(int id,
154 char *dA_str, char *xA_str, char *yA_str,
155 char *dB_str, char *xZ_str, char *yZ_str,
156 int max_ops, int min_restarts, int max_restarts)
Manuel Pégourié-Gonnard510d5ca2017-03-08 11:41:47 +0100157{
158 /*
159 * Test for early restart. Based on test vectors like ecp_test_vect(),
160 * but for the sake of simplicity only does half of each side. It's
161 * important to test both base point and random point, though, as memory
162 * management is different in each case.
163 *
164 * Don't try using too precise bounds for restarts as the exact number
165 * will depend on settings such as MBEDTLS_ECP_FIXED_POINT_OPTIM and
166 * MBEDTLS_ECP_WINDOW_SIZE, as well as implementation details that may
167 * change in the future. A factor 2 is a minimum safety margin.
168 *
Gilles Peskinee820c0a2023-08-03 17:45:20 +0200169 * For reference, with Mbed TLS 2.4 and default settings, for P-256:
Manuel Pégourié-Gonnard9c5c78f2017-03-20 14:13:07 +0100170 * - Random point mult: ~3250M
171 * - Cold base point mult: ~3300M
172 * - Hot base point mult: ~1100M
Manuel Pégourié-Gonnard510d5ca2017-03-08 11:41:47 +0100173 * With MBEDTLS_ECP_WINDOW_SIZE set to 2 (minimum):
Manuel Pégourié-Gonnard9c5c78f2017-03-20 14:13:07 +0100174 * - Random point mult: ~3850M
Manuel Pégourié-Gonnard510d5ca2017-03-08 11:41:47 +0100175 */
Manuel Pégourié-Gonnardb739a712017-04-19 10:11:56 +0200176 mbedtls_ecp_restart_ctx ctx;
Manuel Pégourié-Gonnard510d5ca2017-03-08 11:41:47 +0100177 mbedtls_ecp_group grp;
Manuel Pégourié-Gonnard7a28e992018-10-16 11:22:45 +0200178 mbedtls_ecp_point R, P;
Manuel Pégourié-Gonnard510d5ca2017-03-08 11:41:47 +0100179 mbedtls_mpi dA, xA, yA, dB, xZ, yZ;
180 int cnt_restarts;
181 int ret;
Manuel Pégourié-Gonnardaa3ed6f2021-06-15 11:29:26 +0200182 mbedtls_test_rnd_pseudo_info rnd_info;
Manuel Pégourié-Gonnard510d5ca2017-03-08 11:41:47 +0100183
Gilles Peskine449bd832023-01-11 14:50:10 +0100184 mbedtls_ecp_restart_init(&ctx);
185 mbedtls_ecp_group_init(&grp);
186 mbedtls_ecp_point_init(&R); mbedtls_ecp_point_init(&P);
187 mbedtls_mpi_init(&dA); mbedtls_mpi_init(&xA); mbedtls_mpi_init(&yA);
188 mbedtls_mpi_init(&dB); mbedtls_mpi_init(&xZ); mbedtls_mpi_init(&yZ);
189 memset(&rnd_info, 0x00, sizeof(mbedtls_test_rnd_pseudo_info));
Manuel Pégourié-Gonnard510d5ca2017-03-08 11:41:47 +0100190
Gilles Peskine449bd832023-01-11 14:50:10 +0100191 TEST_ASSERT(mbedtls_ecp_group_load(&grp, id) == 0);
Manuel Pégourié-Gonnard510d5ca2017-03-08 11:41:47 +0100192
Gilles Peskine449bd832023-01-11 14:50:10 +0100193 TEST_ASSERT(mbedtls_test_read_mpi(&dA, dA_str) == 0);
194 TEST_ASSERT(mbedtls_test_read_mpi(&xA, xA_str) == 0);
195 TEST_ASSERT(mbedtls_test_read_mpi(&yA, yA_str) == 0);
Manuel Pégourié-Gonnard510d5ca2017-03-08 11:41:47 +0100196
Gilles Peskine449bd832023-01-11 14:50:10 +0100197 TEST_ASSERT(mbedtls_test_read_mpi(&dB, dB_str) == 0);
198 TEST_ASSERT(mbedtls_test_read_mpi(&xZ, xZ_str) == 0);
199 TEST_ASSERT(mbedtls_test_read_mpi(&yZ, yZ_str) == 0);
Manuel Pégourié-Gonnard510d5ca2017-03-08 11:41:47 +0100200
Gilles Peskine449bd832023-01-11 14:50:10 +0100201 mbedtls_ecp_set_max_ops((unsigned) max_ops);
Manuel Pégourié-Gonnard510d5ca2017-03-08 11:41:47 +0100202
203 /* Base point case */
204 cnt_restarts = 0;
205 do {
Gilles Peskine449bd832023-01-11 14:50:10 +0100206 ECP_PT_RESET(&R);
207 ret = mbedtls_ecp_mul_restartable(&grp, &R, &dA, &grp.G,
208 &mbedtls_test_rnd_pseudo_rand, &rnd_info, &ctx);
209 } while (ret == MBEDTLS_ERR_ECP_IN_PROGRESS && ++cnt_restarts);
Manuel Pégourié-Gonnard510d5ca2017-03-08 11:41:47 +0100210
Gilles Peskine449bd832023-01-11 14:50:10 +0100211 TEST_ASSERT(ret == 0);
212 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&R.X, &xA) == 0);
213 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&R.Y, &yA) == 0);
Manuel Pégourié-Gonnard510d5ca2017-03-08 11:41:47 +0100214
Gilles Peskine449bd832023-01-11 14:50:10 +0100215 TEST_ASSERT(cnt_restarts >= min_restarts);
216 TEST_ASSERT(cnt_restarts <= max_restarts);
Manuel Pégourié-Gonnard510d5ca2017-03-08 11:41:47 +0100217
Manuel Pégourié-Gonnard510d5ca2017-03-08 11:41:47 +0100218 /* Non-base point case */
Gilles Peskine449bd832023-01-11 14:50:10 +0100219 mbedtls_ecp_copy(&P, &R);
Manuel Pégourié-Gonnard510d5ca2017-03-08 11:41:47 +0100220 cnt_restarts = 0;
221 do {
Gilles Peskine449bd832023-01-11 14:50:10 +0100222 ECP_PT_RESET(&R);
223 ret = mbedtls_ecp_mul_restartable(&grp, &R, &dB, &P,
224 &mbedtls_test_rnd_pseudo_rand, &rnd_info, &ctx);
225 } while (ret == MBEDTLS_ERR_ECP_IN_PROGRESS && ++cnt_restarts);
Manuel Pégourié-Gonnard510d5ca2017-03-08 11:41:47 +0100226
Gilles Peskine449bd832023-01-11 14:50:10 +0100227 TEST_ASSERT(ret == 0);
228 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&R.X, &xZ) == 0);
229 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&R.Y, &yZ) == 0);
Manuel Pégourié-Gonnard510d5ca2017-03-08 11:41:47 +0100230
Gilles Peskine449bd832023-01-11 14:50:10 +0100231 TEST_ASSERT(cnt_restarts >= min_restarts);
232 TEST_ASSERT(cnt_restarts <= max_restarts);
Manuel Pégourié-Gonnard510d5ca2017-03-08 11:41:47 +0100233
Manuel Pégourié-Gonnard46ba7f32017-08-28 12:20:39 +0200234 /* Do we leak memory when aborting an operation?
235 * This test only makes sense when we actually restart */
Gilles Peskine449bd832023-01-11 14:50:10 +0100236 if (min_restarts > 0) {
237 ret = mbedtls_ecp_mul_restartable(&grp, &R, &dB, &P,
238 &mbedtls_test_rnd_pseudo_rand, &rnd_info, &ctx);
239 TEST_ASSERT(ret == MBEDTLS_ERR_ECP_IN_PROGRESS);
Manuel Pégourié-Gonnard46ba7f32017-08-28 12:20:39 +0200240 }
Manuel Pégourié-Gonnard77af79a2017-03-14 10:58:00 +0100241
Manuel Pégourié-Gonnard510d5ca2017-03-08 11:41:47 +0100242exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100243 mbedtls_ecp_restart_free(&ctx);
244 mbedtls_ecp_group_free(&grp);
245 mbedtls_ecp_point_free(&R); mbedtls_ecp_point_free(&P);
246 mbedtls_mpi_free(&dA); mbedtls_mpi_free(&xA); mbedtls_mpi_free(&yA);
247 mbedtls_mpi_free(&dB); mbedtls_mpi_free(&xZ); mbedtls_mpi_free(&yZ);
Manuel Pégourié-Gonnard510d5ca2017-03-08 11:41:47 +0100248}
249/* END_CASE */
250
Manuel Pégourié-Gonnard57866462022-12-06 12:14:49 +0100251/* BEGIN_CASE depends_on:MBEDTLS_ECP_RESTARTABLE:MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED */
Gilles Peskine449bd832023-01-11 14:50:10 +0100252void ecp_muladd_restart(int id, char *xR_str, char *yR_str,
253 char *u1_str, char *u2_str,
254 char *xQ_str, char *yQ_str,
255 int max_ops, int min_restarts, int max_restarts)
Manuel Pégourié-Gonnard54dd6522017-04-20 13:36:18 +0200256{
257 /*
258 * Compute R = u1 * G + u2 * Q
259 * (test vectors mostly taken from ECDSA intermediate results)
260 *
261 * See comments at the top of ecp_test_vect_restart()
262 */
263 mbedtls_ecp_restart_ctx ctx;
264 mbedtls_ecp_group grp;
265 mbedtls_ecp_point R, Q;
266 mbedtls_mpi u1, u2, xR, yR;
267 int cnt_restarts;
268 int ret;
269
Gilles Peskine449bd832023-01-11 14:50:10 +0100270 mbedtls_ecp_restart_init(&ctx);
271 mbedtls_ecp_group_init(&grp);
272 mbedtls_ecp_point_init(&R);
273 mbedtls_ecp_point_init(&Q);
274 mbedtls_mpi_init(&u1); mbedtls_mpi_init(&u2);
275 mbedtls_mpi_init(&xR); mbedtls_mpi_init(&yR);
Manuel Pégourié-Gonnard54dd6522017-04-20 13:36:18 +0200276
Gilles Peskine449bd832023-01-11 14:50:10 +0100277 TEST_ASSERT(mbedtls_ecp_group_load(&grp, id) == 0);
Manuel Pégourié-Gonnard54dd6522017-04-20 13:36:18 +0200278
Gilles Peskine449bd832023-01-11 14:50:10 +0100279 TEST_ASSERT(mbedtls_test_read_mpi(&u1, u1_str) == 0);
280 TEST_ASSERT(mbedtls_test_read_mpi(&u2, u2_str) == 0);
281 TEST_ASSERT(mbedtls_test_read_mpi(&xR, xR_str) == 0);
282 TEST_ASSERT(mbedtls_test_read_mpi(&yR, yR_str) == 0);
Manuel Pégourié-Gonnard54dd6522017-04-20 13:36:18 +0200283
Gilles Peskine449bd832023-01-11 14:50:10 +0100284 TEST_ASSERT(mbedtls_test_read_mpi(&Q.X, xQ_str) == 0);
285 TEST_ASSERT(mbedtls_test_read_mpi(&Q.Y, yQ_str) == 0);
286 TEST_ASSERT(mbedtls_mpi_lset(&Q.Z, 1) == 0);
Manuel Pégourié-Gonnard54dd6522017-04-20 13:36:18 +0200287
Gilles Peskine449bd832023-01-11 14:50:10 +0100288 mbedtls_ecp_set_max_ops((unsigned) max_ops);
Manuel Pégourié-Gonnard54dd6522017-04-20 13:36:18 +0200289
290 cnt_restarts = 0;
291 do {
Gilles Peskine449bd832023-01-11 14:50:10 +0100292 ECP_PT_RESET(&R);
293 ret = mbedtls_ecp_muladd_restartable(&grp, &R,
294 &u1, &grp.G, &u2, &Q, &ctx);
295 } while (ret == MBEDTLS_ERR_ECP_IN_PROGRESS && ++cnt_restarts);
Manuel Pégourié-Gonnard54dd6522017-04-20 13:36:18 +0200296
Gilles Peskine449bd832023-01-11 14:50:10 +0100297 TEST_ASSERT(ret == 0);
298 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&R.X, &xR) == 0);
299 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&R.Y, &yR) == 0);
Manuel Pégourié-Gonnard54dd6522017-04-20 13:36:18 +0200300
Gilles Peskine449bd832023-01-11 14:50:10 +0100301 TEST_ASSERT(cnt_restarts >= min_restarts);
302 TEST_ASSERT(cnt_restarts <= max_restarts);
Manuel Pégourié-Gonnard54dd6522017-04-20 13:36:18 +0200303
Manuel Pégourié-Gonnard46ba7f32017-08-28 12:20:39 +0200304 /* Do we leak memory when aborting an operation?
305 * This test only makes sense when we actually restart */
Gilles Peskine449bd832023-01-11 14:50:10 +0100306 if (min_restarts > 0) {
307 ret = mbedtls_ecp_muladd_restartable(&grp, &R,
308 &u1, &grp.G, &u2, &Q, &ctx);
309 TEST_ASSERT(ret == MBEDTLS_ERR_ECP_IN_PROGRESS);
Manuel Pégourié-Gonnard46ba7f32017-08-28 12:20:39 +0200310 }
Manuel Pégourié-Gonnard54dd6522017-04-20 13:36:18 +0200311
312exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100313 mbedtls_ecp_restart_free(&ctx);
314 mbedtls_ecp_group_free(&grp);
315 mbedtls_ecp_point_free(&R);
316 mbedtls_ecp_point_free(&Q);
317 mbedtls_mpi_free(&u1); mbedtls_mpi_free(&u2);
318 mbedtls_mpi_free(&xR); mbedtls_mpi_free(&yR);
Manuel Pégourié-Gonnard54dd6522017-04-20 13:36:18 +0200319}
320/* END_CASE */
321
Valerio Setti0c477d32023-04-07 15:54:20 +0200322/* BEGIN_CASE depends_on:MBEDTLS_ECP_C */
Gilles Peskine449bd832023-01-11 14:50:10 +0100323void ecp_test_vect(int id, char *dA_str, char *xA_str, char *yA_str,
324 char *dB_str, char *xB_str, char *yB_str,
325 char *xZ_str, char *yZ_str)
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +0100326{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200327 mbedtls_ecp_group grp;
328 mbedtls_ecp_point R;
329 mbedtls_mpi dA, xA, yA, dB, xB, yB, xZ, yZ;
Ronald Cron351f0ee2020-06-10 12:12:18 +0200330 mbedtls_test_rnd_pseudo_info rnd_info;
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +0100331
Gilles Peskine449bd832023-01-11 14:50:10 +0100332 mbedtls_ecp_group_init(&grp); mbedtls_ecp_point_init(&R);
333 mbedtls_mpi_init(&dA); mbedtls_mpi_init(&xA); mbedtls_mpi_init(&yA); mbedtls_mpi_init(&dB);
334 mbedtls_mpi_init(&xB); mbedtls_mpi_init(&yB); mbedtls_mpi_init(&xZ); mbedtls_mpi_init(&yZ);
335 memset(&rnd_info, 0x00, sizeof(mbedtls_test_rnd_pseudo_info));
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +0100336
Gilles Peskine449bd832023-01-11 14:50:10 +0100337 TEST_ASSERT(mbedtls_ecp_group_load(&grp, id) == 0);
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +0100338
Gilles Peskine449bd832023-01-11 14:50:10 +0100339 TEST_ASSERT(mbedtls_ecp_check_pubkey(&grp, &grp.G) == 0);
Manuel Pégourié-Gonnard1c330572012-11-24 12:05:44 +0100340
Gilles Peskine449bd832023-01-11 14:50:10 +0100341 TEST_ASSERT(mbedtls_test_read_mpi(&dA, dA_str) == 0);
342 TEST_ASSERT(mbedtls_test_read_mpi(&xA, xA_str) == 0);
343 TEST_ASSERT(mbedtls_test_read_mpi(&yA, yA_str) == 0);
344 TEST_ASSERT(mbedtls_test_read_mpi(&dB, dB_str) == 0);
345 TEST_ASSERT(mbedtls_test_read_mpi(&xB, xB_str) == 0);
346 TEST_ASSERT(mbedtls_test_read_mpi(&yB, yB_str) == 0);
347 TEST_ASSERT(mbedtls_test_read_mpi(&xZ, xZ_str) == 0);
348 TEST_ASSERT(mbedtls_test_read_mpi(&yZ, yZ_str) == 0);
Manuel Pégourié-Gonnarde739f012012-11-07 12:24:22 +0100349
Gilles Peskine449bd832023-01-11 14:50:10 +0100350 TEST_ASSERT(mbedtls_ecp_mul(&grp, &R, &dA, &grp.G,
351 &mbedtls_test_rnd_pseudo_rand, &rnd_info) == 0);
352 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&R.X, &xA) == 0);
353 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&R.Y, &yA) == 0);
354 TEST_ASSERT(mbedtls_ecp_check_pubkey(&grp, &R) == 0);
355 TEST_ASSERT(mbedtls_ecp_mul(&grp, &R, &dB, &R,
356 &mbedtls_test_rnd_pseudo_rand, &rnd_info) == 0);
357 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&R.X, &xZ) == 0);
358 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&R.Y, &yZ) == 0);
359 TEST_ASSERT(mbedtls_ecp_check_pubkey(&grp, &R) == 0);
Manuel Pégourié-Gonnarde739f012012-11-07 12:24:22 +0100360
Gilles Peskine449bd832023-01-11 14:50:10 +0100361 TEST_ASSERT(mbedtls_ecp_mul(&grp, &R, &dB, &grp.G,
362 &mbedtls_test_rnd_pseudo_rand, &rnd_info) == 0);
363 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&R.X, &xB) == 0);
364 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&R.Y, &yB) == 0);
365 TEST_ASSERT(mbedtls_ecp_check_pubkey(&grp, &R) == 0);
366 TEST_ASSERT(mbedtls_ecp_mul(&grp, &R, &dA, &R,
367 &mbedtls_test_rnd_pseudo_rand, &rnd_info) == 0);
368 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&R.X, &xZ) == 0);
369 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&R.Y, &yZ) == 0);
370 TEST_ASSERT(mbedtls_ecp_check_pubkey(&grp, &R) == 0);
Manuel Pégourié-Gonnarde739f012012-11-07 12:24:22 +0100371
Paul Bakkerbd51b262014-07-10 15:26:12 +0200372exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100373 mbedtls_ecp_group_free(&grp); mbedtls_ecp_point_free(&R);
374 mbedtls_mpi_free(&dA); mbedtls_mpi_free(&xA); mbedtls_mpi_free(&yA); mbedtls_mpi_free(&dB);
375 mbedtls_mpi_free(&xB); mbedtls_mpi_free(&yB); mbedtls_mpi_free(&xZ); mbedtls_mpi_free(&yZ);
Manuel Pégourié-Gonnard4b8c3f22012-11-07 21:39:45 +0100376}
Paul Bakker33b43f12013-08-20 11:48:36 +0200377/* END_CASE */
Manuel Pégourié-Gonnard84338242012-11-11 20:45:18 +0100378
Valerio Setti0c477d32023-04-07 15:54:20 +0200379/* BEGIN_CASE depends_on:MBEDTLS_ECP_C */
Gilles Peskine449bd832023-01-11 14:50:10 +0100380void ecp_test_vec_x(int id, char *dA_hex, char *xA_hex, char *dB_hex,
381 char *xB_hex, char *xS_hex)
Manuel Pégourié-Gonnarda0179b82013-12-04 11:49:20 +0100382{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200383 mbedtls_ecp_group grp;
384 mbedtls_ecp_point R;
385 mbedtls_mpi dA, xA, dB, xB, xS;
Ronald Cron351f0ee2020-06-10 12:12:18 +0200386 mbedtls_test_rnd_pseudo_info rnd_info;
Manuel Pégourié-Gonnarda0179b82013-12-04 11:49:20 +0100387
Gilles Peskine449bd832023-01-11 14:50:10 +0100388 mbedtls_ecp_group_init(&grp); mbedtls_ecp_point_init(&R);
389 mbedtls_mpi_init(&dA); mbedtls_mpi_init(&xA);
390 mbedtls_mpi_init(&dB); mbedtls_mpi_init(&xB);
391 mbedtls_mpi_init(&xS);
392 memset(&rnd_info, 0x00, sizeof(mbedtls_test_rnd_pseudo_info));
Manuel Pégourié-Gonnarda0179b82013-12-04 11:49:20 +0100393
Gilles Peskine449bd832023-01-11 14:50:10 +0100394 TEST_ASSERT(mbedtls_ecp_group_load(&grp, id) == 0);
Manuel Pégourié-Gonnarda0179b82013-12-04 11:49:20 +0100395
Gilles Peskine449bd832023-01-11 14:50:10 +0100396 TEST_ASSERT(mbedtls_ecp_check_pubkey(&grp, &grp.G) == 0);
Manuel Pégourié-Gonnarda0179b82013-12-04 11:49:20 +0100397
Gilles Peskine449bd832023-01-11 14:50:10 +0100398 TEST_ASSERT(mbedtls_test_read_mpi(&dA, dA_hex) == 0);
399 TEST_ASSERT(mbedtls_test_read_mpi(&dB, dB_hex) == 0);
400 TEST_ASSERT(mbedtls_test_read_mpi(&xA, xA_hex) == 0);
401 TEST_ASSERT(mbedtls_test_read_mpi(&xB, xB_hex) == 0);
402 TEST_ASSERT(mbedtls_test_read_mpi(&xS, xS_hex) == 0);
Manuel Pégourié-Gonnarda0179b82013-12-04 11:49:20 +0100403
Gilles Peskine449bd832023-01-11 14:50:10 +0100404 TEST_ASSERT(mbedtls_ecp_mul(&grp, &R, &dA, &grp.G,
405 &mbedtls_test_rnd_pseudo_rand, &rnd_info) == 0);
406 TEST_ASSERT(mbedtls_ecp_check_pubkey(&grp, &R) == 0);
407 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&R.X, &xA) == 0);
Manuel Pégourié-Gonnarda0179b82013-12-04 11:49:20 +0100408
Gilles Peskine449bd832023-01-11 14:50:10 +0100409 TEST_ASSERT(mbedtls_ecp_mul(&grp, &R, &dB, &R,
410 &mbedtls_test_rnd_pseudo_rand, &rnd_info) == 0);
411 TEST_ASSERT(mbedtls_ecp_check_pubkey(&grp, &R) == 0);
412 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&R.X, &xS) == 0);
Manuel Pégourié-Gonnarda0179b82013-12-04 11:49:20 +0100413
Gilles Peskine449bd832023-01-11 14:50:10 +0100414 TEST_ASSERT(mbedtls_ecp_mul(&grp, &R, &dB, &grp.G,
415 &mbedtls_test_rnd_pseudo_rand, &rnd_info) == 0);
416 TEST_ASSERT(mbedtls_ecp_check_pubkey(&grp, &R) == 0);
417 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&R.X, &xB) == 0);
Manuel Pégourié-Gonnarda0179b82013-12-04 11:49:20 +0100418
Gilles Peskine449bd832023-01-11 14:50:10 +0100419 TEST_ASSERT(mbedtls_ecp_mul(&grp, &R, &dA, &R,
420 &mbedtls_test_rnd_pseudo_rand, &rnd_info) == 0);
421 TEST_ASSERT(mbedtls_ecp_check_pubkey(&grp, &R) == 0);
422 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&R.X, &xS) == 0);
Manuel Pégourié-Gonnarda0179b82013-12-04 11:49:20 +0100423
Paul Bakkerbd51b262014-07-10 15:26:12 +0200424exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100425 mbedtls_ecp_group_free(&grp); mbedtls_ecp_point_free(&R);
426 mbedtls_mpi_free(&dA); mbedtls_mpi_free(&xA);
427 mbedtls_mpi_free(&dB); mbedtls_mpi_free(&xB);
428 mbedtls_mpi_free(&xS);
Manuel Pégourié-Gonnarda0179b82013-12-04 11:49:20 +0100429}
430/* END_CASE */
431
Valerio Setti0c477d32023-04-07 15:54:20 +0200432/* BEGIN_CASE depends_on:MBEDTLS_ECP_C */
Gilles Peskine449bd832023-01-11 14:50:10 +0100433void ecp_test_mul(int id, data_t *n_hex,
434 data_t *Px_hex, data_t *Py_hex, data_t *Pz_hex,
435 data_t *nPx_hex, data_t *nPy_hex, data_t *nPz_hex,
436 int expected_ret)
Janos Follath182b0b92019-04-26 14:28:19 +0100437{
438 mbedtls_ecp_group grp;
439 mbedtls_ecp_point P, nP, R;
440 mbedtls_mpi n;
Ronald Cron351f0ee2020-06-10 12:12:18 +0200441 mbedtls_test_rnd_pseudo_info rnd_info;
Janos Follath182b0b92019-04-26 14:28:19 +0100442
Gilles Peskine449bd832023-01-11 14:50:10 +0100443 mbedtls_ecp_group_init(&grp); mbedtls_ecp_point_init(&R);
444 mbedtls_ecp_point_init(&P); mbedtls_ecp_point_init(&nP);
445 mbedtls_mpi_init(&n);
446 memset(&rnd_info, 0x00, sizeof(mbedtls_test_rnd_pseudo_info));
Janos Follath182b0b92019-04-26 14:28:19 +0100447
Gilles Peskine449bd832023-01-11 14:50:10 +0100448 TEST_ASSERT(mbedtls_ecp_group_load(&grp, id) == 0);
Janos Follath182b0b92019-04-26 14:28:19 +0100449
Gilles Peskine449bd832023-01-11 14:50:10 +0100450 TEST_ASSERT(mbedtls_ecp_check_pubkey(&grp, &grp.G) == 0);
Janos Follath182b0b92019-04-26 14:28:19 +0100451
Gilles Peskine449bd832023-01-11 14:50:10 +0100452 TEST_ASSERT(mbedtls_mpi_read_binary(&n, n_hex->x, n_hex->len) == 0);
Janos Follath182b0b92019-04-26 14:28:19 +0100453
Gilles Peskine449bd832023-01-11 14:50:10 +0100454 TEST_ASSERT(mbedtls_mpi_read_binary(&P.X, Px_hex->x, Px_hex->len) == 0);
455 TEST_ASSERT(mbedtls_mpi_read_binary(&P.Y, Py_hex->x, Py_hex->len) == 0);
456 TEST_ASSERT(mbedtls_mpi_read_binary(&P.Z, Pz_hex->x, Pz_hex->len) == 0);
457 TEST_ASSERT(mbedtls_mpi_read_binary(&nP.X, nPx_hex->x, nPx_hex->len)
458 == 0);
459 TEST_ASSERT(mbedtls_mpi_read_binary(&nP.Y, nPy_hex->x, nPy_hex->len)
460 == 0);
461 TEST_ASSERT(mbedtls_mpi_read_binary(&nP.Z, nPz_hex->x, nPz_hex->len)
462 == 0);
Janos Follath182b0b92019-04-26 14:28:19 +0100463
Gilles Peskine449bd832023-01-11 14:50:10 +0100464 TEST_ASSERT(mbedtls_ecp_mul(&grp, &R, &n, &P,
465 &mbedtls_test_rnd_pseudo_rand, &rnd_info)
466 == expected_ret);
Janos Follath182b0b92019-04-26 14:28:19 +0100467
Gilles Peskine449bd832023-01-11 14:50:10 +0100468 if (expected_ret == 0) {
469 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&nP.X, &R.X) == 0);
470 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&nP.Y, &R.Y) == 0);
471 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&nP.Z, &R.Z) == 0);
Janos Follath182b0b92019-04-26 14:28:19 +0100472 }
473
474exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100475 mbedtls_ecp_group_free(&grp); mbedtls_ecp_point_free(&R);
476 mbedtls_ecp_point_free(&P); mbedtls_ecp_point_free(&nP);
477 mbedtls_mpi_free(&n);
Janos Follath182b0b92019-04-26 14:28:19 +0100478}
479/* END_CASE */
480
Valerio Setti0c477d32023-04-07 15:54:20 +0200481/* BEGIN_CASE depends_on:MBEDTLS_ECP_C */
Gilles Peskine449bd832023-01-11 14:50:10 +0100482void ecp_test_mul_rng(int id, data_t *d_hex)
Jonas923d5792020-05-13 14:22:45 +0900483{
484 mbedtls_ecp_group grp;
485 mbedtls_mpi d;
486 mbedtls_ecp_point Q;
487
Gilles Peskine449bd832023-01-11 14:50:10 +0100488 mbedtls_ecp_group_init(&grp); mbedtls_mpi_init(&d);
489 mbedtls_ecp_point_init(&Q);
Jonas923d5792020-05-13 14:22:45 +0900490
Gilles Peskine449bd832023-01-11 14:50:10 +0100491 TEST_ASSERT(mbedtls_ecp_group_load(&grp, id) == 0);
Jonas923d5792020-05-13 14:22:45 +0900492
Gilles Peskine449bd832023-01-11 14:50:10 +0100493 TEST_ASSERT(mbedtls_ecp_check_pubkey(&grp, &grp.G) == 0);
Jonas923d5792020-05-13 14:22:45 +0900494
Gilles Peskine449bd832023-01-11 14:50:10 +0100495 TEST_ASSERT(mbedtls_mpi_read_binary(&d, d_hex->x, d_hex->len) == 0);
Jonas923d5792020-05-13 14:22:45 +0900496
Gilles Peskine449bd832023-01-11 14:50:10 +0100497 TEST_ASSERT(mbedtls_ecp_mul(&grp, &Q, &d, &grp.G,
498 &mbedtls_test_rnd_zero_rand, NULL)
499 == MBEDTLS_ERR_ECP_RANDOM_FAILED);
Jonas923d5792020-05-13 14:22:45 +0900500
501exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100502 mbedtls_ecp_group_free(&grp); mbedtls_mpi_free(&d);
503 mbedtls_ecp_point_free(&Q);
Jonas923d5792020-05-13 14:22:45 +0900504}
505/* END_CASE */
506
Valerio Setti0c477d32023-04-07 15:54:20 +0200507/* BEGIN_CASE depends_on:MBEDTLS_ECP_SHORT_WEIERSTRASS_ENABLED:MBEDTLS_ECP_C */
Gilles Peskine449bd832023-01-11 14:50:10 +0100508void ecp_muladd(int id,
509 data_t *u1_bin, data_t *P1_bin,
510 data_t *u2_bin, data_t *P2_bin,
511 data_t *expected_result)
Gilles Peskineca91ee42021-04-03 18:31:01 +0200512{
513 /* Compute R = u1 * P1 + u2 * P2 */
514 mbedtls_ecp_group grp;
515 mbedtls_ecp_point P1, P2, R;
516 mbedtls_mpi u1, u2;
517 uint8_t actual_result[MBEDTLS_ECP_MAX_PT_LEN];
518 size_t len;
519
Gilles Peskine449bd832023-01-11 14:50:10 +0100520 mbedtls_ecp_group_init(&grp);
521 mbedtls_ecp_point_init(&P1);
522 mbedtls_ecp_point_init(&P2);
523 mbedtls_ecp_point_init(&R);
524 mbedtls_mpi_init(&u1);
525 mbedtls_mpi_init(&u2);
Gilles Peskineca91ee42021-04-03 18:31:01 +0200526
Gilles Peskine449bd832023-01-11 14:50:10 +0100527 TEST_EQUAL(0, mbedtls_ecp_group_load(&grp, id));
528 TEST_EQUAL(0, mbedtls_mpi_read_binary(&u1, u1_bin->x, u1_bin->len));
529 TEST_EQUAL(0, mbedtls_mpi_read_binary(&u2, u2_bin->x, u2_bin->len));
530 TEST_EQUAL(0, mbedtls_ecp_point_read_binary(&grp, &P1,
531 P1_bin->x, P1_bin->len));
532 TEST_EQUAL(0, mbedtls_ecp_point_read_binary(&grp, &P2,
533 P2_bin->x, P2_bin->len));
Gilles Peskineca91ee42021-04-03 18:31:01 +0200534
Gilles Peskine449bd832023-01-11 14:50:10 +0100535 TEST_EQUAL(0, mbedtls_ecp_muladd(&grp, &R, &u1, &P1, &u2, &P2));
536 TEST_EQUAL(0, mbedtls_ecp_point_write_binary(
537 &grp, &R, MBEDTLS_ECP_PF_UNCOMPRESSED,
538 &len, actual_result, sizeof(actual_result)));
539 TEST_ASSERT(len <= MBEDTLS_ECP_MAX_PT_LEN);
Gilles Peskineca91ee42021-04-03 18:31:01 +0200540
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +0100541 TEST_MEMORY_COMPARE(expected_result->x, expected_result->len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +0100542 actual_result, len);
Gilles Peskineca91ee42021-04-03 18:31:01 +0200543
544exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100545 mbedtls_ecp_group_free(&grp);
546 mbedtls_ecp_point_free(&P1);
547 mbedtls_ecp_point_free(&P2);
548 mbedtls_ecp_point_free(&R);
549 mbedtls_mpi_free(&u1);
550 mbedtls_mpi_free(&u2);
Gilles Peskineca91ee42021-04-03 18:31:01 +0200551}
552/* END_CASE */
553
Jonas923d5792020-05-13 14:22:45 +0900554/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100555void ecp_fast_mod(int id, char *N_str)
Manuel Pégourié-Gonnard84338242012-11-11 20:45:18 +0100556{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200557 mbedtls_ecp_group grp;
558 mbedtls_mpi N, R;
Manuel Pégourié-Gonnard84338242012-11-11 20:45:18 +0100559
Gilles Peskine449bd832023-01-11 14:50:10 +0100560 mbedtls_mpi_init(&N); mbedtls_mpi_init(&R);
561 mbedtls_ecp_group_init(&grp);
Manuel Pégourié-Gonnard84338242012-11-11 20:45:18 +0100562
Gilles Peskine449bd832023-01-11 14:50:10 +0100563 TEST_ASSERT(mbedtls_test_read_mpi(&N, N_str) == 0);
564 TEST_ASSERT(mbedtls_ecp_group_load(&grp, id) == 0);
565 TEST_ASSERT(grp.modp != NULL);
Manuel Pégourié-Gonnard84338242012-11-11 20:45:18 +0100566
567 /*
568 * Store correct result before we touch N
569 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100570 TEST_ASSERT(mbedtls_mpi_mod_mpi(&R, &N, &grp.P) == 0);
Manuel Pégourié-Gonnard84338242012-11-11 20:45:18 +0100571
Gilles Peskine449bd832023-01-11 14:50:10 +0100572 TEST_ASSERT(grp.modp(&N) == 0);
573 TEST_ASSERT(mbedtls_mpi_bitlen(&N) <= grp.pbits + 3);
Manuel Pégourié-Gonnard84338242012-11-11 20:45:18 +0100574
575 /*
Paul Bakkerd8b0c5e2014-04-11 15:31:33 +0200576 * Use mod rather than addition/subtraction in case previous test fails
Manuel Pégourié-Gonnard84338242012-11-11 20:45:18 +0100577 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100578 TEST_ASSERT(mbedtls_mpi_mod_mpi(&N, &N, &grp.P) == 0);
579 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&N, &R) == 0);
Manuel Pégourié-Gonnard84338242012-11-11 20:45:18 +0100580
Paul Bakkerbd51b262014-07-10 15:26:12 +0200581exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100582 mbedtls_mpi_free(&N); mbedtls_mpi_free(&R);
583 mbedtls_ecp_group_free(&grp);
Manuel Pégourié-Gonnard84338242012-11-11 20:45:18 +0100584}
Paul Bakker33b43f12013-08-20 11:48:36 +0200585/* END_CASE */
Manuel Pégourié-Gonnardb4a310b2012-11-13 20:57:00 +0100586
Paul Bakker33b43f12013-08-20 11:48:36 +0200587/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100588void ecp_write_binary(int id, char *x, char *y, char *z, int format,
589 data_t *out, int blen, int ret)
Manuel Pégourié-Gonnarde19feb52012-11-24 14:10:14 +0100590{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200591 mbedtls_ecp_group grp;
592 mbedtls_ecp_point P;
Gilles Peskine62e33bc2023-06-22 22:27:32 +0200593 mbedtls_ecp_keypair key;
Azim Khanf1aaec92017-05-30 14:23:15 +0100594 unsigned char buf[256];
Manuel Pégourié-Gonnard420f1eb2013-02-10 12:22:46 +0100595 size_t olen;
Manuel Pégourié-Gonnarde19feb52012-11-24 14:10:14 +0100596
Gilles Peskine449bd832023-01-11 14:50:10 +0100597 memset(buf, 0, sizeof(buf));
Manuel Pégourié-Gonnarde19feb52012-11-24 14:10:14 +0100598
Gilles Peskine449bd832023-01-11 14:50:10 +0100599 mbedtls_ecp_group_init(&grp); mbedtls_ecp_point_init(&P);
Gilles Peskine62e33bc2023-06-22 22:27:32 +0200600 mbedtls_ecp_keypair_init(&key);
Manuel Pégourié-Gonnarde19feb52012-11-24 14:10:14 +0100601
Gilles Peskine62e33bc2023-06-22 22:27:32 +0200602 TEST_EQUAL(mbedtls_ecp_group_load(&grp, id), 0);
Manuel Pégourié-Gonnarde19feb52012-11-24 14:10:14 +0100603
Gilles Peskine62e33bc2023-06-22 22:27:32 +0200604 TEST_EQUAL(mbedtls_test_read_mpi(&P.X, x), 0);
605 TEST_EQUAL(mbedtls_test_read_mpi(&P.Y, y), 0);
606 TEST_EQUAL(mbedtls_test_read_mpi(&P.Z, z), 0);
Manuel Pégourié-Gonnarde19feb52012-11-24 14:10:14 +0100607
Gilles Peskine62e33bc2023-06-22 22:27:32 +0200608 TEST_EQUAL(mbedtls_ecp_point_write_binary(&grp, &P, format,
609 &olen, buf, blen), ret);
Gilles Peskine449bd832023-01-11 14:50:10 +0100610 if (ret == 0) {
Gilles Peskine62e33bc2023-06-22 22:27:32 +0200611 TEST_LE_U(olen, MBEDTLS_ECP_MAX_PT_LEN);
612 ASSERT_COMPARE(buf, olen,
613 out->x, out->len);
614 }
615
616 memset(buf, 0, blen);
617 TEST_EQUAL(mbedtls_ecp_set_public_key(grp.id, &key, &P), 0);
618 TEST_EQUAL(mbedtls_ecp_write_public_key(&key, format,
619 &olen, buf, blen), ret);
620 if (ret == 0) {
621 ASSERT_COMPARE(buf, olen,
622 out->x, out->len);
Manuel Pégourié-Gonnarde19feb52012-11-24 14:10:14 +0100623 }
624
Paul Bakkerbd51b262014-07-10 15:26:12 +0200625exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100626 mbedtls_ecp_group_free(&grp); mbedtls_ecp_point_free(&P);
Gilles Peskine62e33bc2023-06-22 22:27:32 +0200627 mbedtls_ecp_keypair_free(&key);
Manuel Pégourié-Gonnarde19feb52012-11-24 14:10:14 +0100628}
Paul Bakker33b43f12013-08-20 11:48:36 +0200629/* END_CASE */
Manuel Pégourié-Gonnarde19feb52012-11-24 14:10:14 +0100630
Paul Bakker33b43f12013-08-20 11:48:36 +0200631/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100632void ecp_read_binary(int id, data_t *buf, char *x, char *y, char *z,
633 int ret)
Manuel Pégourié-Gonnard5e402d82012-11-24 16:19:42 +0100634{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200635 mbedtls_ecp_group grp;
636 mbedtls_ecp_point P;
637 mbedtls_mpi X, Y, Z;
Manuel Pégourié-Gonnard5e402d82012-11-24 16:19:42 +0100638
Manuel Pégourié-Gonnard5e402d82012-11-24 16:19:42 +0100639
Gilles Peskine449bd832023-01-11 14:50:10 +0100640 mbedtls_ecp_group_init(&grp); mbedtls_ecp_point_init(&P);
641 mbedtls_mpi_init(&X); mbedtls_mpi_init(&Y); mbedtls_mpi_init(&Z);
Manuel Pégourié-Gonnard5e402d82012-11-24 16:19:42 +0100642
Gilles Peskine449bd832023-01-11 14:50:10 +0100643 TEST_ASSERT(mbedtls_ecp_group_load(&grp, id) == 0);
Manuel Pégourié-Gonnard5e402d82012-11-24 16:19:42 +0100644
Gilles Peskine449bd832023-01-11 14:50:10 +0100645 TEST_ASSERT(mbedtls_test_read_mpi(&X, x) == 0);
646 TEST_ASSERT(mbedtls_test_read_mpi(&Y, y) == 0);
647 TEST_ASSERT(mbedtls_test_read_mpi(&Z, z) == 0);
Manuel Pégourié-Gonnard5e402d82012-11-24 16:19:42 +0100648
Gilles Peskine449bd832023-01-11 14:50:10 +0100649 TEST_ASSERT(mbedtls_ecp_point_read_binary(&grp, &P, buf->x, buf->len) == ret);
Manuel Pégourié-Gonnard5e402d82012-11-24 16:19:42 +0100650
Gilles Peskine449bd832023-01-11 14:50:10 +0100651 if (ret == 0) {
652 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&P.X, &X) == 0);
653 if (mbedtls_ecp_get_type(&grp) == MBEDTLS_ECP_TYPE_MONTGOMERY) {
654 TEST_ASSERT(mbedtls_mpi_cmp_int(&Y, 0) == 0);
655 TEST_ASSERT(P.Y.p == NULL);
656 TEST_ASSERT(mbedtls_mpi_cmp_int(&Z, 1) == 0);
657 TEST_ASSERT(mbedtls_mpi_cmp_int(&P.Z, 1) == 0);
658 } else {
659 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&P.Y, &Y) == 0);
660 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&P.Z, &Z) == 0);
Glenn Strauss2ff77112022-09-14 23:27:50 -0400661
Gilles Peskine449bd832023-01-11 14:50:10 +0100662 if (buf->x[0] == 0x04 &&
Glenn Strauss2ff77112022-09-14 23:27:50 -0400663 /* (reading compressed format supported only for
664 * Short Weierstrass curves with prime p where p = 3 mod 4) */
665 id != MBEDTLS_ECP_DP_SECP224R1 &&
Gilles Peskine449bd832023-01-11 14:50:10 +0100666 id != MBEDTLS_ECP_DP_SECP224K1) {
Glenn Strauss2ff77112022-09-14 23:27:50 -0400667 /* re-encode in compressed format and test read again */
Gilles Peskine449bd832023-01-11 14:50:10 +0100668 mbedtls_mpi_free(&P.Y);
669 buf->x[0] = 0x02 + mbedtls_mpi_get_bit(&Y, 0);
670 TEST_ASSERT(mbedtls_ecp_point_read_binary(&grp, &P, buf->x, buf->len/2+1) == 0);
671 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&P.Y, &Y) == 0);
Glenn Strauss2ff77112022-09-14 23:27:50 -0400672 }
Janos Follath59b813c2019-02-13 10:44:06 +0000673 }
Manuel Pégourié-Gonnard5e402d82012-11-24 16:19:42 +0100674 }
675
Paul Bakkerbd51b262014-07-10 15:26:12 +0200676exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100677 mbedtls_ecp_group_free(&grp); mbedtls_ecp_point_free(&P);
678 mbedtls_mpi_free(&X); mbedtls_mpi_free(&Y); mbedtls_mpi_free(&Z);
Manuel Pégourié-Gonnard5e402d82012-11-24 16:19:42 +0100679}
Paul Bakker33b43f12013-08-20 11:48:36 +0200680/* END_CASE */
Manuel Pégourié-Gonnard5e402d82012-11-24 16:19:42 +0100681
Paul Bakker33b43f12013-08-20 11:48:36 +0200682/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100683void mbedtls_ecp_tls_read_point(int id, data_t *buf, char *x, char *y,
684 char *z, int ret)
Manuel Pégourié-Gonnard8c16f962013-02-10 13:00:20 +0100685{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200686 mbedtls_ecp_group grp;
687 mbedtls_ecp_point P;
688 mbedtls_mpi X, Y, Z;
Azim Khand30ca132017-06-09 04:32:58 +0100689 const unsigned char *vbuf = buf->x;
Manuel Pégourié-Gonnard8c16f962013-02-10 13:00:20 +0100690
Manuel Pégourié-Gonnard8c16f962013-02-10 13:00:20 +0100691
Gilles Peskine449bd832023-01-11 14:50:10 +0100692 mbedtls_ecp_group_init(&grp); mbedtls_ecp_point_init(&P);
693 mbedtls_mpi_init(&X); mbedtls_mpi_init(&Y); mbedtls_mpi_init(&Z);
Manuel Pégourié-Gonnard8c16f962013-02-10 13:00:20 +0100694
Gilles Peskine449bd832023-01-11 14:50:10 +0100695 TEST_ASSERT(mbedtls_ecp_group_load(&grp, id) == 0);
Manuel Pégourié-Gonnard8c16f962013-02-10 13:00:20 +0100696
Gilles Peskine449bd832023-01-11 14:50:10 +0100697 TEST_ASSERT(mbedtls_test_read_mpi(&X, x) == 0);
698 TEST_ASSERT(mbedtls_test_read_mpi(&Y, y) == 0);
699 TEST_ASSERT(mbedtls_test_read_mpi(&Z, z) == 0);
Manuel Pégourié-Gonnard8c16f962013-02-10 13:00:20 +0100700
Gilles Peskine449bd832023-01-11 14:50:10 +0100701 TEST_ASSERT(mbedtls_ecp_tls_read_point(&grp, &P, &vbuf, buf->len) == ret);
Manuel Pégourié-Gonnard8c16f962013-02-10 13:00:20 +0100702
Gilles Peskine449bd832023-01-11 14:50:10 +0100703 if (ret == 0) {
704 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&P.X, &X) == 0);
705 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&P.Y, &Y) == 0);
706 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&P.Z, &Z) == 0);
707 TEST_ASSERT((uint32_t) (vbuf - buf->x) == buf->len);
Manuel Pégourié-Gonnard8c16f962013-02-10 13:00:20 +0100708 }
709
Paul Bakkerbd51b262014-07-10 15:26:12 +0200710exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100711 mbedtls_ecp_group_free(&grp); mbedtls_ecp_point_free(&P);
712 mbedtls_mpi_free(&X); mbedtls_mpi_free(&Y); mbedtls_mpi_free(&Z);
Manuel Pégourié-Gonnard8c16f962013-02-10 13:00:20 +0100713}
Paul Bakker33b43f12013-08-20 11:48:36 +0200714/* END_CASE */
Manuel Pégourié-Gonnard8c16f962013-02-10 13:00:20 +0100715
Paul Bakker33b43f12013-08-20 11:48:36 +0200716/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100717void ecp_tls_write_read_point(int id)
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100718{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200719 mbedtls_ecp_group grp;
720 mbedtls_ecp_point pt;
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100721 unsigned char buf[256];
Manuel Pégourié-Gonnard98f51812013-02-10 13:38:29 +0100722 const unsigned char *vbuf;
Manuel Pégourié-Gonnard420f1eb2013-02-10 12:22:46 +0100723 size_t olen;
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100724
Gilles Peskine449bd832023-01-11 14:50:10 +0100725 mbedtls_ecp_group_init(&grp);
726 mbedtls_ecp_point_init(&pt);
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100727
Gilles Peskine449bd832023-01-11 14:50:10 +0100728 TEST_ASSERT(mbedtls_ecp_group_load(&grp, id) == 0);
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100729
Gilles Peskine449bd832023-01-11 14:50:10 +0100730 memset(buf, 0x00, sizeof(buf)); vbuf = buf;
731 TEST_ASSERT(mbedtls_ecp_tls_write_point(&grp, &grp.G,
732 MBEDTLS_ECP_PF_COMPRESSED, &olen, buf, 256) == 0);
733 TEST_ASSERT(mbedtls_ecp_tls_read_point(&grp, &pt, &vbuf, olen) == 0);
734 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&grp.G.X, &pt.X) == 0);
735 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&grp.G.Y, &pt.Y) == 0);
736 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&grp.G.Z, &pt.Z) == 0);
737 TEST_ASSERT(vbuf == buf + olen);
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100738
Gilles Peskine449bd832023-01-11 14:50:10 +0100739 memset(buf, 0x00, sizeof(buf)); vbuf = buf;
740 TEST_ASSERT(mbedtls_ecp_tls_write_point(&grp, &grp.G,
741 MBEDTLS_ECP_PF_UNCOMPRESSED, &olen, buf, 256) == 0);
742 TEST_ASSERT(mbedtls_ecp_tls_read_point(&grp, &pt, &vbuf, olen) == 0);
743 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&grp.G.X, &pt.X) == 0);
744 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&grp.G.Y, &pt.Y) == 0);
745 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&grp.G.Z, &pt.Z) == 0);
746 TEST_ASSERT(vbuf == buf + olen);
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100747
Gilles Peskine449bd832023-01-11 14:50:10 +0100748 memset(buf, 0x00, sizeof(buf)); vbuf = buf;
749 TEST_ASSERT(mbedtls_ecp_set_zero(&pt) == 0);
750 TEST_ASSERT(mbedtls_ecp_tls_write_point(&grp, &pt,
751 MBEDTLS_ECP_PF_COMPRESSED, &olen, buf, 256) == 0);
752 TEST_ASSERT(mbedtls_ecp_tls_read_point(&grp, &pt, &vbuf, olen) == 0);
753 TEST_ASSERT(mbedtls_ecp_is_zero(&pt));
754 TEST_ASSERT(vbuf == buf + olen);
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100755
Gilles Peskine449bd832023-01-11 14:50:10 +0100756 memset(buf, 0x00, sizeof(buf)); vbuf = buf;
757 TEST_ASSERT(mbedtls_ecp_set_zero(&pt) == 0);
758 TEST_ASSERT(mbedtls_ecp_tls_write_point(&grp, &pt,
759 MBEDTLS_ECP_PF_UNCOMPRESSED, &olen, buf, 256) == 0);
760 TEST_ASSERT(mbedtls_ecp_tls_read_point(&grp, &pt, &vbuf, olen) == 0);
761 TEST_ASSERT(mbedtls_ecp_is_zero(&pt));
762 TEST_ASSERT(vbuf == buf + olen);
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100763
Paul Bakkerbd51b262014-07-10 15:26:12 +0200764exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100765 mbedtls_ecp_group_free(&grp);
766 mbedtls_ecp_point_free(&pt);
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100767}
Paul Bakker33b43f12013-08-20 11:48:36 +0200768/* END_CASE */
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100769
Paul Bakker33b43f12013-08-20 11:48:36 +0200770/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100771void mbedtls_ecp_tls_read_group(data_t *buf, int result, int bits,
772 int record_len)
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100773{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200774 mbedtls_ecp_group grp;
Azim Khand30ca132017-06-09 04:32:58 +0100775 const unsigned char *vbuf = buf->x;
Azim Khanf1aaec92017-05-30 14:23:15 +0100776 int ret;
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100777
Gilles Peskine449bd832023-01-11 14:50:10 +0100778 mbedtls_ecp_group_init(&grp);
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100779
Gilles Peskine449bd832023-01-11 14:50:10 +0100780 ret = mbedtls_ecp_tls_read_group(&grp, &vbuf, buf->len);
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100781
Gilles Peskine449bd832023-01-11 14:50:10 +0100782 TEST_ASSERT(ret == result);
783 if (ret == 0) {
784 TEST_ASSERT(mbedtls_mpi_bitlen(&grp.P) == (size_t) bits);
785 TEST_ASSERT(vbuf - buf->x == record_len);
Manuel Pégourié-Gonnard7c145c62013-02-10 13:20:52 +0100786 }
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100787
Paul Bakkerbd51b262014-07-10 15:26:12 +0200788exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100789 mbedtls_ecp_group_free(&grp);
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100790}
Paul Bakker33b43f12013-08-20 11:48:36 +0200791/* END_CASE */
Manuel Pégourié-Gonnard6282aca2013-02-10 11:15:11 +0100792
Paul Bakker33b43f12013-08-20 11:48:36 +0200793/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100794void ecp_tls_write_read_group(int id)
Manuel Pégourié-Gonnard46106a92013-02-10 12:51:17 +0100795{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200796 mbedtls_ecp_group grp1, grp2;
Manuel Pégourié-Gonnard46106a92013-02-10 12:51:17 +0100797 unsigned char buf[10];
Manuel Pégourié-Gonnard7c145c62013-02-10 13:20:52 +0100798 const unsigned char *vbuf = buf;
Manuel Pégourié-Gonnard46106a92013-02-10 12:51:17 +0100799 size_t len;
800 int ret;
801
Gilles Peskine449bd832023-01-11 14:50:10 +0100802 mbedtls_ecp_group_init(&grp1);
803 mbedtls_ecp_group_init(&grp2);
804 memset(buf, 0x00, sizeof(buf));
Manuel Pégourié-Gonnard46106a92013-02-10 12:51:17 +0100805
Gilles Peskine449bd832023-01-11 14:50:10 +0100806 TEST_ASSERT(mbedtls_ecp_group_load(&grp1, id) == 0);
Manuel Pégourié-Gonnard46106a92013-02-10 12:51:17 +0100807
Gilles Peskine449bd832023-01-11 14:50:10 +0100808 TEST_ASSERT(mbedtls_ecp_tls_write_group(&grp1, &len, buf, 10) == 0);
809 ret = mbedtls_ecp_tls_read_group(&grp2, &vbuf, len);
810 TEST_ASSERT(ret == 0);
Manuel Pégourié-Gonnard46106a92013-02-10 12:51:17 +0100811
Gilles Peskine449bd832023-01-11 14:50:10 +0100812 if (ret == 0) {
813 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&grp1.N, &grp2.N) == 0);
814 TEST_ASSERT(grp1.id == grp2.id);
Manuel Pégourié-Gonnard46106a92013-02-10 12:51:17 +0100815 }
816
Paul Bakkerbd51b262014-07-10 15:26:12 +0200817exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100818 mbedtls_ecp_group_free(&grp1);
819 mbedtls_ecp_group_free(&grp2);
Manuel Pégourié-Gonnard46106a92013-02-10 12:51:17 +0100820}
Paul Bakker33b43f12013-08-20 11:48:36 +0200821/* END_CASE */
Manuel Pégourié-Gonnard46106a92013-02-10 12:51:17 +0100822
Valerio Setti46829482023-01-18 13:59:30 +0100823/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100824void mbedtls_ecp_group_metadata(int id, int bit_size, int crv_type,
825 char *P, char *A, char *B,
826 char *G_x, char *G_y, char *N,
827 int tls_id)
Werner Lewise54046c2022-08-15 11:43:56 +0100828{
829 mbedtls_ecp_group grp, grp_read, grp_cpy;
830 const mbedtls_ecp_group_id *g_id;
Werner Lewisccae25b2022-09-20 10:00:07 +0100831 mbedtls_ecp_group_id read_g_id;
Werner Lewise54046c2022-08-15 11:43:56 +0100832 const mbedtls_ecp_curve_info *crv, *crv_tls_id, *crv_name;
833
834 mbedtls_mpi exp_P, exp_A, exp_B, exp_G_x, exp_G_y, exp_N;
835
836 unsigned char buf[3], ecparameters[3] = { 3, 0, tls_id };
837 const unsigned char *vbuf = buf;
838 size_t olen;
839
Gilles Peskine449bd832023-01-11 14:50:10 +0100840 mbedtls_ecp_group_init(&grp);
841 mbedtls_ecp_group_init(&grp_read);
842 mbedtls_ecp_group_init(&grp_cpy);
Werner Lewise54046c2022-08-15 11:43:56 +0100843
Gilles Peskine449bd832023-01-11 14:50:10 +0100844 mbedtls_mpi_init(&exp_P);
845 mbedtls_mpi_init(&exp_A);
846 mbedtls_mpi_init(&exp_B);
847 mbedtls_mpi_init(&exp_G_x);
848 mbedtls_mpi_init(&exp_G_y);
849 mbedtls_mpi_init(&exp_N);
Werner Lewise54046c2022-08-15 11:43:56 +0100850
851 // Read expected parameters
Gilles Peskine449bd832023-01-11 14:50:10 +0100852 TEST_EQUAL(mbedtls_test_read_mpi(&exp_P, P), 0);
853 TEST_EQUAL(mbedtls_test_read_mpi(&exp_A, A), 0);
854 TEST_EQUAL(mbedtls_test_read_mpi(&exp_G_x, G_x), 0);
855 TEST_EQUAL(mbedtls_test_read_mpi(&exp_N, N), 0);
856 TEST_EQUAL(mbedtls_test_read_mpi(&exp_B, B), 0);
857 TEST_EQUAL(mbedtls_test_read_mpi(&exp_G_y, G_y), 0);
Werner Lewise54046c2022-08-15 11:43:56 +0100858
Werner Lewisc4afef72022-08-25 10:29:19 +0100859 // Convert exp_A to internal representation (A+2)/4
Gilles Peskine449bd832023-01-11 14:50:10 +0100860 if (crv_type == MBEDTLS_ECP_TYPE_MONTGOMERY) {
861 TEST_EQUAL(mbedtls_mpi_add_int(&exp_A, &exp_A, 2), 0);
862 TEST_EQUAL(mbedtls_mpi_div_int(&exp_A, NULL, &exp_A, 4), 0);
Werner Lewisc4afef72022-08-25 10:29:19 +0100863 }
864
Werner Lewise54046c2022-08-15 11:43:56 +0100865 // Load group
Gilles Peskine449bd832023-01-11 14:50:10 +0100866 TEST_EQUAL(mbedtls_ecp_group_load(&grp, id), 0);
Werner Lewise54046c2022-08-15 11:43:56 +0100867
868 // Compare group with expected parameters
869 // A is NULL for SECPxxxR1 curves
870 // B and G_y are NULL for curve25519 and curve448
Gilles Peskine449bd832023-01-11 14:50:10 +0100871 TEST_EQUAL(mbedtls_mpi_cmp_mpi(&exp_P, &grp.P), 0);
872 if (*A != 0) {
873 TEST_EQUAL(mbedtls_mpi_cmp_mpi(&exp_A, &grp.A), 0);
874 }
875 if (*B != 0) {
876 TEST_EQUAL(mbedtls_mpi_cmp_mpi(&exp_B, &grp.B), 0);
877 }
878 TEST_EQUAL(mbedtls_mpi_cmp_mpi(&exp_G_x, &grp.G.X), 0);
879 if (*G_y != 0) {
880 TEST_EQUAL(mbedtls_mpi_cmp_mpi(&exp_G_y, &grp.G.Y), 0);
881 }
882 TEST_EQUAL(mbedtls_mpi_cmp_mpi(&exp_N, &grp.N), 0);
Werner Lewise54046c2022-08-15 11:43:56 +0100883
884 // Load curve info and compare with known values
Gilles Peskine449bd832023-01-11 14:50:10 +0100885 crv = mbedtls_ecp_curve_info_from_grp_id(id);
886 TEST_EQUAL(crv->grp_id, id);
887 TEST_EQUAL(crv->bit_size, bit_size);
888 TEST_EQUAL(crv->tls_id, tls_id);
Werner Lewise54046c2022-08-15 11:43:56 +0100889
890 // Load curve from TLS ID and name, and compare IDs
Gilles Peskine449bd832023-01-11 14:50:10 +0100891 crv_tls_id = mbedtls_ecp_curve_info_from_tls_id(crv->tls_id);
892 crv_name = mbedtls_ecp_curve_info_from_name(crv->name);
893 TEST_EQUAL(crv_tls_id->grp_id, id);
894 TEST_EQUAL(crv_name->grp_id, id);
Werner Lewise54046c2022-08-15 11:43:56 +0100895
Werner Lewisccae25b2022-09-20 10:00:07 +0100896 // Validate write_group against test data
Gilles Peskine449bd832023-01-11 14:50:10 +0100897 TEST_EQUAL(mbedtls_ecp_tls_write_group(&grp, &olen,
898 buf, sizeof(buf)),
899 0);
900 TEST_EQUAL(mbedtls_test_hexcmp(buf, ecparameters, olen,
901 sizeof(ecparameters)),
902 0);
Werner Lewisccae25b2022-09-20 10:00:07 +0100903
904 // Read group from buffer and compare with expected ID
Gilles Peskine449bd832023-01-11 14:50:10 +0100905 TEST_EQUAL(mbedtls_ecp_tls_read_group_id(&read_g_id, &vbuf, olen),
906 0);
907 TEST_EQUAL(read_g_id, id);
Werner Lewis05feee12022-09-20 12:05:00 +0100908 vbuf = buf;
Gilles Peskine449bd832023-01-11 14:50:10 +0100909 TEST_EQUAL(mbedtls_ecp_tls_read_group(&grp_read, &vbuf, olen),
910 0);
911 TEST_EQUAL(grp_read.id, id);
Werner Lewise54046c2022-08-15 11:43:56 +0100912
913 // Check curve type, and if it can be used for ECDH/ECDSA
Gilles Peskine449bd832023-01-11 14:50:10 +0100914 TEST_EQUAL(mbedtls_ecp_get_type(&grp), crv_type);
Valerio Setti46829482023-01-18 13:59:30 +0100915#if defined(MBEDTLS_ECDH_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100916 TEST_EQUAL(mbedtls_ecdh_can_do(id), 1);
Valerio Setti46829482023-01-18 13:59:30 +0100917#endif
918#if defined(MBEDTLS_ECDSA_C)
Gilles Peskine449bd832023-01-11 14:50:10 +0100919 TEST_EQUAL(mbedtls_ecdsa_can_do(id),
920 crv_type == MBEDTLS_ECP_TYPE_SHORT_WEIERSTRASS);
Valerio Setti46829482023-01-18 13:59:30 +0100921#endif
Werner Lewise54046c2022-08-15 11:43:56 +0100922
923 // Copy group and compare with original
Gilles Peskine449bd832023-01-11 14:50:10 +0100924 TEST_EQUAL(mbedtls_ecp_group_copy(&grp_cpy, &grp), 0);
925 TEST_EQUAL(mbedtls_ecp_group_cmp(&grp, &grp_cpy), 0);
Werner Lewise54046c2022-08-15 11:43:56 +0100926
927 // Check curve is in curve list and group ID list
Gilles Peskine449bd832023-01-11 14:50:10 +0100928 for (crv = mbedtls_ecp_curve_list();
929 crv->grp_id != MBEDTLS_ECP_DP_NONE &&
930 crv->grp_id != (unsigned) id;
931 crv++) {
932 ;
933 }
934 TEST_EQUAL(crv->grp_id, id);
935 for (g_id = mbedtls_ecp_grp_id_list();
Werner Lewise54046c2022-08-15 11:43:56 +0100936 *g_id != MBEDTLS_ECP_DP_NONE && *g_id != (unsigned) id;
Gilles Peskine449bd832023-01-11 14:50:10 +0100937 g_id++) {
938 ;
939 }
940 TEST_EQUAL(*g_id, (unsigned) id);
Werner Lewise54046c2022-08-15 11:43:56 +0100941
942exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100943 mbedtls_ecp_group_free(&grp); mbedtls_ecp_group_free(&grp_cpy);
944 mbedtls_ecp_group_free(&grp_read);
945 mbedtls_mpi_free(&exp_P); mbedtls_mpi_free(&exp_A);
946 mbedtls_mpi_free(&exp_B); mbedtls_mpi_free(&exp_G_x);
947 mbedtls_mpi_free(&exp_G_y); mbedtls_mpi_free(&exp_N);
Werner Lewise54046c2022-08-15 11:43:56 +0100948}
949/* END_CASE */
950
Paul Bakker33b43f12013-08-20 11:48:36 +0200951/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100952void mbedtls_ecp_check_privkey(int id, char *key_hex, int ret)
Manuel Pégourié-Gonnardc8dc2952013-07-01 14:06:13 +0200953{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200954 mbedtls_ecp_group grp;
955 mbedtls_mpi d;
Manuel Pégourié-Gonnardc8dc2952013-07-01 14:06:13 +0200956
Gilles Peskine449bd832023-01-11 14:50:10 +0100957 mbedtls_ecp_group_init(&grp);
958 mbedtls_mpi_init(&d);
Manuel Pégourié-Gonnardc8dc2952013-07-01 14:06:13 +0200959
Gilles Peskine449bd832023-01-11 14:50:10 +0100960 TEST_ASSERT(mbedtls_ecp_group_load(&grp, id) == 0);
961 TEST_ASSERT(mbedtls_test_read_mpi(&d, key_hex) == 0);
Manuel Pégourié-Gonnardc8dc2952013-07-01 14:06:13 +0200962
Gilles Peskine449bd832023-01-11 14:50:10 +0100963 TEST_ASSERT(mbedtls_ecp_check_privkey(&grp, &d) == ret);
Manuel Pégourié-Gonnardc8dc2952013-07-01 14:06:13 +0200964
Paul Bakkerbd51b262014-07-10 15:26:12 +0200965exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100966 mbedtls_ecp_group_free(&grp);
967 mbedtls_mpi_free(&d);
Manuel Pégourié-Gonnardc8dc2952013-07-01 14:06:13 +0200968}
Paul Bakker33b43f12013-08-20 11:48:36 +0200969/* END_CASE */
Manuel Pégourié-Gonnardc8dc2952013-07-01 14:06:13 +0200970
Valerio Setti0c477d32023-04-07 15:54:20 +0200971/* BEGIN_CASE depends_on:MBEDTLS_ECP_C */
Gilles Peskine449bd832023-01-11 14:50:10 +0100972void mbedtls_ecp_check_pub_priv(int id_pub, char *Qx_pub, char *Qy_pub,
973 int id, char *d, char *Qx, char *Qy,
974 int ret)
Manuel Pégourié-Gonnard30668d62014-11-06 15:25:32 +0100975{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200976 mbedtls_ecp_keypair pub, prv;
Manuel Pégourié-Gonnardf8c24bf2021-06-15 11:29:26 +0200977 mbedtls_test_rnd_pseudo_info rnd_info;
Manuel Pégourié-Gonnard30668d62014-11-06 15:25:32 +0100978
Gilles Peskine449bd832023-01-11 14:50:10 +0100979 mbedtls_ecp_keypair_init(&pub);
980 mbedtls_ecp_keypair_init(&prv);
981 memset(&rnd_info, 0x00, sizeof(mbedtls_test_rnd_pseudo_info));
Manuel Pégourié-Gonnard30668d62014-11-06 15:25:32 +0100982
Gilles Peskine449bd832023-01-11 14:50:10 +0100983 if (id_pub != MBEDTLS_ECP_DP_NONE) {
984 TEST_ASSERT(mbedtls_ecp_group_load(&pub.grp, id_pub) == 0);
985 }
986 TEST_ASSERT(mbedtls_ecp_point_read_string(&pub.Q, 16, Qx_pub, Qy_pub) == 0);
Manuel Pégourié-Gonnard30668d62014-11-06 15:25:32 +0100987
Gilles Peskine449bd832023-01-11 14:50:10 +0100988 if (id != MBEDTLS_ECP_DP_NONE) {
989 TEST_ASSERT(mbedtls_ecp_group_load(&prv.grp, id) == 0);
990 }
991 TEST_ASSERT(mbedtls_ecp_point_read_string(&prv.Q, 16, Qx, Qy) == 0);
992 TEST_ASSERT(mbedtls_test_read_mpi(&prv.d, d) == 0);
Manuel Pégourié-Gonnard30668d62014-11-06 15:25:32 +0100993
Gilles Peskine449bd832023-01-11 14:50:10 +0100994 TEST_ASSERT(mbedtls_ecp_check_pub_priv(&pub, &prv,
995 &mbedtls_test_rnd_pseudo_rand, &rnd_info) == ret);
Manuel Pégourié-Gonnard30668d62014-11-06 15:25:32 +0100996
997exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100998 mbedtls_ecp_keypair_free(&pub);
999 mbedtls_ecp_keypair_free(&prv);
Manuel Pégourié-Gonnard30668d62014-11-06 15:25:32 +01001000}
1001/* END_CASE */
1002
Valerio Setti0c477d32023-04-07 15:54:20 +02001003/* BEGIN_CASE depends_on:MBEDTLS_ECP_C */
Gilles Peskine6dd87382023-06-22 20:27:19 +02001004void ecp_calc_public(int grp_id, data_t *private_data,
Gilles Peskine7ea72022023-06-21 20:39:08 +02001005 int expected_ret, data_t *expected_public)
1006{
1007 mbedtls_ecp_keypair key;
1008 mbedtls_ecp_keypair_init(&key);
1009 mbedtls_test_rnd_pseudo_info rnd_info;
1010 memset(&rnd_info, 0x00, sizeof(mbedtls_test_rnd_pseudo_info));
1011
1012 TEST_EQUAL(mbedtls_ecp_group_load(&key.grp, grp_id), 0);
Gilles Peskine6dd87382023-06-22 20:27:19 +02001013 TEST_EQUAL(mbedtls_mpi_read_binary(&key.d,
1014 private_data->x, private_data->len), 0);
Gilles Peskine7ea72022023-06-21 20:39:08 +02001015
1016 TEST_EQUAL(mbedtls_ecp_keypair_calc_public(&key,
1017 &mbedtls_test_rnd_pseudo_rand, &rnd_info),
1018 expected_ret);
1019
1020 if (expected_ret == 0) {
1021 TEST_EQUAL(mbedtls_ecp_check_pub_priv(&key, &key,
1022 &mbedtls_test_rnd_pseudo_rand, &rnd_info),
1023 0);
1024 unsigned char buf[MBEDTLS_ECP_MAX_PT_LEN];
1025 size_t length;
1026 TEST_EQUAL(mbedtls_ecp_point_write_binary(&key.grp, &key.Q,
1027 MBEDTLS_ECP_PF_UNCOMPRESSED,
1028 &length, buf, sizeof(buf)),
1029 0);
1030 ASSERT_COMPARE(expected_public->x, expected_public->len, buf, length);
1031 }
1032
1033exit:
1034 mbedtls_ecp_keypair_free(&key);
1035}
1036/* END_CASE */
1037
1038/* BEGIN_CASE depends_on:MBEDTLS_ECP_C */
Gilles Peskine449bd832023-01-11 14:50:10 +01001039void mbedtls_ecp_gen_keypair(int id)
Manuel Pégourié-Gonnard45a035a2013-01-26 14:42:45 +01001040{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001041 mbedtls_ecp_group grp;
1042 mbedtls_ecp_point Q;
1043 mbedtls_mpi d;
Ronald Cron351f0ee2020-06-10 12:12:18 +02001044 mbedtls_test_rnd_pseudo_info rnd_info;
Manuel Pégourié-Gonnard45a035a2013-01-26 14:42:45 +01001045
Gilles Peskine449bd832023-01-11 14:50:10 +01001046 mbedtls_ecp_group_init(&grp);
1047 mbedtls_ecp_point_init(&Q);
1048 mbedtls_mpi_init(&d);
1049 memset(&rnd_info, 0x00, sizeof(mbedtls_test_rnd_pseudo_info));
Manuel Pégourié-Gonnard45a035a2013-01-26 14:42:45 +01001050
Gilles Peskine449bd832023-01-11 14:50:10 +01001051 TEST_ASSERT(mbedtls_ecp_group_load(&grp, id) == 0);
Manuel Pégourié-Gonnard45a035a2013-01-26 14:42:45 +01001052
Gilles Peskine449bd832023-01-11 14:50:10 +01001053 TEST_ASSERT(mbedtls_ecp_gen_keypair(&grp, &d, &Q,
1054 &mbedtls_test_rnd_pseudo_rand,
1055 &rnd_info) == 0);
Manuel Pégourié-Gonnard45a035a2013-01-26 14:42:45 +01001056
Gilles Peskine449bd832023-01-11 14:50:10 +01001057 TEST_ASSERT(mbedtls_ecp_check_pubkey(&grp, &Q) == 0);
1058 TEST_ASSERT(mbedtls_ecp_check_privkey(&grp, &d) == 0);
Manuel Pégourié-Gonnard45a035a2013-01-26 14:42:45 +01001059
Paul Bakkerbd51b262014-07-10 15:26:12 +02001060exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001061 mbedtls_ecp_group_free(&grp);
1062 mbedtls_ecp_point_free(&Q);
1063 mbedtls_mpi_free(&d);
Manuel Pégourié-Gonnard45a035a2013-01-26 14:42:45 +01001064}
Paul Bakker33b43f12013-08-20 11:48:36 +02001065/* END_CASE */
Manuel Pégourié-Gonnard45a035a2013-01-26 14:42:45 +01001066
Valerio Setti0c477d32023-04-07 15:54:20 +02001067/* BEGIN_CASE depends_on:MBEDTLS_ECP_C */
Gilles Peskine449bd832023-01-11 14:50:10 +01001068void mbedtls_ecp_gen_key(int id)
Manuel Pégourié-Gonnard104ee1d2013-11-30 14:13:16 +01001069{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001070 mbedtls_ecp_keypair key;
Ronald Cron351f0ee2020-06-10 12:12:18 +02001071 mbedtls_test_rnd_pseudo_info rnd_info;
Manuel Pégourié-Gonnard104ee1d2013-11-30 14:13:16 +01001072
Gilles Peskine449bd832023-01-11 14:50:10 +01001073 mbedtls_ecp_keypair_init(&key);
1074 memset(&rnd_info, 0x00, sizeof(mbedtls_test_rnd_pseudo_info));
Manuel Pégourié-Gonnard104ee1d2013-11-30 14:13:16 +01001075
Gilles Peskine449bd832023-01-11 14:50:10 +01001076 TEST_ASSERT(mbedtls_ecp_gen_key(id, &key,
1077 &mbedtls_test_rnd_pseudo_rand,
1078 &rnd_info) == 0);
Manuel Pégourié-Gonnard104ee1d2013-11-30 14:13:16 +01001079
Gilles Peskinee6886102023-06-21 18:22:06 +02001080 TEST_EQUAL(mbedtls_ecp_keypair_get_group_id(&key), id);
Gilles Peskine449bd832023-01-11 14:50:10 +01001081 TEST_ASSERT(mbedtls_ecp_check_pubkey(&key.grp, &key.Q) == 0);
1082 TEST_ASSERT(mbedtls_ecp_check_privkey(&key.grp, &key.d) == 0);
Manuel Pégourié-Gonnard104ee1d2013-11-30 14:13:16 +01001083
Paul Bakkerbd51b262014-07-10 15:26:12 +02001084exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001085 mbedtls_ecp_keypair_free(&key);
Manuel Pégourié-Gonnard104ee1d2013-11-30 14:13:16 +01001086}
1087/* END_CASE */
1088
Janos Follath171a7ef2019-02-15 16:17:45 +00001089/* BEGIN_CASE */
Gilles Peskine28240322023-06-21 19:52:11 +02001090void ecp_set_public_key_group_check(int grp_id, int expected_ret)
1091{
1092 mbedtls_ecp_keypair key;
1093 mbedtls_ecp_keypair_init(&key);
1094 mbedtls_ecp_point Q;
1095 mbedtls_ecp_point_init(&Q);
1096
1097 TEST_EQUAL(mbedtls_ecp_set_public_key(grp_id, &key, &Q),
1098 expected_ret);
1099
1100exit:
1101 mbedtls_ecp_keypair_free(&key);
1102 mbedtls_ecp_point_free(&Q);
1103}
1104/* END_CASE */
1105
1106/* BEGIN_CASE */
1107void ecp_set_public_key_good(int grp_id, data_t *public_data)
1108{
1109 mbedtls_ecp_keypair key;
1110 mbedtls_ecp_keypair_init(&key);
1111 mbedtls_ecp_group grp;
1112 mbedtls_ecp_group_init(&grp);
1113 mbedtls_ecp_point Q;
1114 mbedtls_ecp_point_init(&Q);
1115
1116 TEST_EQUAL(mbedtls_ecp_group_load(&grp, grp_id), 0);
1117 TEST_EQUAL(mbedtls_ecp_point_read_binary(&grp, &Q,
1118 public_data->x, public_data->len),
1119 0);
1120
1121 /* Freshly initialized key */
1122 TEST_EQUAL(mbedtls_ecp_set_public_key(grp_id, &key, &Q), 0);
1123 TEST_EQUAL(key.grp.id, grp_id);
1124 TEST_EQUAL(mbedtls_ecp_point_cmp(&key.Q, &Q), 0);
1125
1126#if defined(MBEDTLS_BIGNUM_C)
1127 /* Key with a public key already set to a different value */
1128 TEST_EQUAL(mbedtls_mpi_add_int(&key.Q.X, &key.Q.X, 1), 0);
1129 TEST_EQUAL(mbedtls_mpi_add_int(&key.Q.Y, &key.Q.Y, 1), 0);
1130 TEST_EQUAL(mbedtls_mpi_add_int(&key.Q.Z, &key.Q.Z, 1), 0);
1131 TEST_EQUAL(mbedtls_ecp_set_public_key(grp_id, &key, &Q), 0);
1132 TEST_EQUAL(key.grp.id, grp_id);
1133 TEST_EQUAL(mbedtls_ecp_point_cmp(&key.Q, &Q), 0);
1134#endif
1135
1136exit:
1137 mbedtls_ecp_keypair_free(&key);
1138 mbedtls_ecp_group_free(&grp);
1139 mbedtls_ecp_point_free(&Q);
1140}
1141/* END_CASE */
1142
1143/* BEGIN_CASE */
1144void ecp_set_public_key_after_private(int private_grp_id, data_t *private_data,
1145 int public_grp_id, data_t *public_data)
1146{
1147 mbedtls_ecp_keypair key;
1148 mbedtls_ecp_keypair_init(&key);
1149 mbedtls_ecp_group grp;
1150 mbedtls_ecp_group_init(&grp);
1151 mbedtls_ecp_point Q;
1152 mbedtls_ecp_point_init(&Q);
1153#if defined(MBEDTLS_BIGNUM_C)
1154 mbedtls_mpi d;
1155 mbedtls_mpi_init(&d);
1156#endif
1157
1158 TEST_EQUAL(mbedtls_ecp_group_load(&grp, public_grp_id), 0);
1159 TEST_EQUAL(mbedtls_ecp_point_read_binary(&grp, &Q,
1160 public_data->x, public_data->len),
1161 0);
1162 TEST_EQUAL(mbedtls_ecp_read_key(private_grp_id, &key,
1163 private_data->x, private_data->len),
1164 0);
1165#if defined(MBEDTLS_BIGNUM_C)
1166 TEST_EQUAL(mbedtls_mpi_copy(&d, &key.d), 0);
1167#endif
1168
1169 int ret = mbedtls_ecp_set_public_key(public_grp_id, &key, &Q);
1170
1171 if (private_grp_id == public_grp_id) {
1172 TEST_EQUAL(ret, 0);
1173 TEST_EQUAL(key.grp.id, public_grp_id);
1174 TEST_EQUAL(mbedtls_ecp_point_cmp(&key.Q, &Q), 0);
1175#if defined(MBEDTLS_BIGNUM_C)
1176 TEST_EQUAL(mbedtls_mpi_cmp_mpi(&d, &key.d), 0);
1177#endif
1178 } else {
1179 TEST_EQUAL(ret, MBEDTLS_ERR_ECP_BAD_INPUT_DATA);
1180 }
1181
1182exit:
1183 mbedtls_ecp_keypair_free(&key);
1184 mbedtls_ecp_group_free(&grp);
1185 mbedtls_ecp_point_free(&Q);
1186#if defined(MBEDTLS_BIGNUM_C)
1187 mbedtls_mpi_free(&d);
1188#endif
1189}
1190/* END_CASE */
1191
1192/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01001193void mbedtls_ecp_read_key(int grp_id, data_t *in_key, int expected, int canonical)
Janos Follath171a7ef2019-02-15 16:17:45 +00001194{
1195 int ret = 0;
1196 mbedtls_ecp_keypair key;
Gilles Peskine449bd832023-01-11 14:50:10 +01001197 mbedtls_ecp_keypair_init(&key);
Gilles Peskine091a85a2023-06-21 19:51:28 +02001198 mbedtls_ecp_keypair key2;
Gilles Peskine449bd832023-01-11 14:50:10 +01001199 mbedtls_ecp_keypair_init(&key2);
Janos Follath171a7ef2019-02-15 16:17:45 +00001200
Gilles Peskine091a85a2023-06-21 19:51:28 +02001201#if defined(MBEDTLS_BIGNUM_C)
1202 TEST_EQUAL(mbedtls_mpi_lset(&key.Q.X, 1), 0);
1203 TEST_EQUAL(mbedtls_mpi_lset(&key.Q.Y, 2), 0);
1204 TEST_EQUAL(mbedtls_mpi_lset(&key.Q.Z, 3), 0);
1205#endif
1206
Gilles Peskine449bd832023-01-11 14:50:10 +01001207 ret = mbedtls_ecp_read_key(grp_id, &key, in_key->x, in_key->len);
1208 TEST_ASSERT(ret == expected);
Janos Follath171a7ef2019-02-15 16:17:45 +00001209
Gilles Peskine449bd832023-01-11 14:50:10 +01001210 if (expected == 0) {
Gilles Peskinee6886102023-06-21 18:22:06 +02001211 TEST_EQUAL(mbedtls_ecp_keypair_get_group_id(&key), grp_id);
Gilles Peskine449bd832023-01-11 14:50:10 +01001212 ret = mbedtls_ecp_check_privkey(&key.grp, &key.d);
1213 TEST_ASSERT(ret == 0);
Steven Cooremande8593f2020-06-09 19:55:26 +02001214
Gilles Peskine091a85a2023-06-21 19:51:28 +02001215#if defined(MBEDTLS_BIGNUM_C)
1216 TEST_EQUAL(mbedtls_mpi_cmp_int(&key.Q.X, 1), 0);
1217 TEST_EQUAL(mbedtls_mpi_cmp_int(&key.Q.Y, 2), 0);
1218 TEST_EQUAL(mbedtls_mpi_cmp_int(&key.Q.Z, 3), 0);
1219#endif
1220
Gilles Peskine449bd832023-01-11 14:50:10 +01001221 if (canonical) {
Steven Cooremande8593f2020-06-09 19:55:26 +02001222 unsigned char buf[MBEDTLS_ECP_MAX_BYTES];
Steven Cooremande8593f2020-06-09 19:55:26 +02001223
Gilles Peskine449bd832023-01-11 14:50:10 +01001224 ret = mbedtls_ecp_write_key(&key, buf, in_key->len);
1225 TEST_ASSERT(ret == 0);
Steven Cooremande8593f2020-06-09 19:55:26 +02001226
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001227 TEST_MEMORY_COMPARE(in_key->x, in_key->len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001228 buf, in_key->len);
Gilles Peskine449bd832023-01-11 14:50:10 +01001229 } else {
Steven Cooremande8593f2020-06-09 19:55:26 +02001230 unsigned char export1[MBEDTLS_ECP_MAX_BYTES];
Steven Cooremande8593f2020-06-09 19:55:26 +02001231 unsigned char export2[MBEDTLS_ECP_MAX_BYTES];
Steven Cooremande8593f2020-06-09 19:55:26 +02001232
Gilles Peskine449bd832023-01-11 14:50:10 +01001233 ret = mbedtls_ecp_write_key(&key, export1, in_key->len);
1234 TEST_ASSERT(ret == 0);
Steven Cooremande8593f2020-06-09 19:55:26 +02001235
Gilles Peskine449bd832023-01-11 14:50:10 +01001236 ret = mbedtls_ecp_read_key(grp_id, &key2, export1, in_key->len);
1237 TEST_ASSERT(ret == expected);
Steven Cooremande8593f2020-06-09 19:55:26 +02001238
Gilles Peskine449bd832023-01-11 14:50:10 +01001239 ret = mbedtls_ecp_write_key(&key2, export2, in_key->len);
1240 TEST_ASSERT(ret == 0);
Steven Cooremande8593f2020-06-09 19:55:26 +02001241
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001242 TEST_MEMORY_COMPARE(export1, in_key->len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001243 export2, in_key->len);
Steven Cooremande8593f2020-06-09 19:55:26 +02001244 }
Janos Follath171a7ef2019-02-15 16:17:45 +00001245 }
1246
1247exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001248 mbedtls_ecp_keypair_free(&key);
1249 mbedtls_ecp_keypair_free(&key2);
Janos Follath171a7ef2019-02-15 16:17:45 +00001250}
1251/* END_CASE */
1252
Valerio Settie50a75f2023-05-19 17:43:06 +02001253/* BEGIN_CASE depends_on:MBEDTLS_TEST_HOOKS:MBEDTLS_ECP_MONTGOMERY_ENABLED:MBEDTLS_ECP_LIGHT */
Gilles Peskine449bd832023-01-11 14:50:10 +01001254void genkey_mx_known_answer(int bits, data_t *seed, data_t *expected)
Gilles Peskine6ff8a012021-03-24 12:01:02 +01001255{
1256 mbedtls_test_rnd_buf_info rnd_info;
1257 mbedtls_mpi d;
1258 int ret;
1259 uint8_t *actual = NULL;
1260
Gilles Peskine449bd832023-01-11 14:50:10 +01001261 mbedtls_mpi_init(&d);
Gilles Peskine6ff8a012021-03-24 12:01:02 +01001262 rnd_info.buf = seed->x;
1263 rnd_info.length = seed->len;
1264 rnd_info.fallback_f_rng = NULL;
1265 rnd_info.fallback_p_rng = NULL;
1266
Tom Cosgrove05b2a872023-07-21 11:31:13 +01001267 TEST_CALLOC(actual, expected->len);
Gilles Peskine6ff8a012021-03-24 12:01:02 +01001268
Gilles Peskine449bd832023-01-11 14:50:10 +01001269 ret = mbedtls_ecp_gen_privkey_mx(bits, &d,
1270 mbedtls_test_rnd_buffer_rand, &rnd_info);
Gilles Peskine6ff8a012021-03-24 12:01:02 +01001271
Gilles Peskine449bd832023-01-11 14:50:10 +01001272 if (expected->len == 0) {
Gilles Peskine6ff8a012021-03-24 12:01:02 +01001273 /* Expecting an error (happens if there isn't enough randomness) */
Gilles Peskine449bd832023-01-11 14:50:10 +01001274 TEST_ASSERT(ret != 0);
1275 } else {
1276 TEST_EQUAL(ret, 0);
1277 TEST_EQUAL((size_t) bits + 1, mbedtls_mpi_bitlen(&d));
1278 TEST_EQUAL(0, mbedtls_mpi_write_binary(&d, actual, expected->len));
Gilles Peskine6ff8a012021-03-24 12:01:02 +01001279 /* Test the exact result. This assumes that the output of the
1280 * RNG is used in a specific way, which is overly constraining.
1281 * The advantage is that it's easier to test the expected properties
1282 * of the generated key:
1283 * - The most significant bit must be at a specific positions
1284 * (can be enforced by checking the bit-length).
1285 * - The least significant bits must have specific values
1286 * (can be enforced by checking these bits).
1287 * - Other bits must be random (by testing with different RNG outputs,
1288 * we validate that those bits are indeed influenced by the RNG). */
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001289 TEST_MEMORY_COMPARE(expected->x, expected->len,
Tom Cosgrove0540fe72023-07-27 14:17:27 +01001290 actual, expected->len);
Gilles Peskine6ff8a012021-03-24 12:01:02 +01001291 }
1292
1293exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001294 mbedtls_free(actual);
1295 mbedtls_mpi_free(&d);
Gilles Peskine6ff8a012021-03-24 12:01:02 +01001296}
1297/* END_CASE */
1298
Werner Lewis3b097392022-08-08 11:53:45 +01001299/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01001300void ecp_set_zero(int id, data_t *P_bin)
Werner Lewis3b097392022-08-08 11:53:45 +01001301{
1302 mbedtls_ecp_group grp;
1303 mbedtls_ecp_point pt, zero_pt, nonzero_pt;
1304
Gilles Peskine449bd832023-01-11 14:50:10 +01001305 mbedtls_ecp_group_init(&grp);
1306 mbedtls_ecp_point_init(&pt);
1307 mbedtls_ecp_point_init(&zero_pt);
1308 mbedtls_ecp_point_init(&nonzero_pt);
Werner Lewis3b097392022-08-08 11:53:45 +01001309
1310 // Set zero and non-zero points for comparison
Gilles Peskine449bd832023-01-11 14:50:10 +01001311 TEST_EQUAL(mbedtls_ecp_set_zero(&zero_pt), 0);
1312 TEST_EQUAL(mbedtls_ecp_group_load(&grp, id), 0);
1313 TEST_EQUAL(mbedtls_ecp_point_read_binary(&grp, &nonzero_pt,
1314 P_bin->x, P_bin->len), 0);
1315 TEST_EQUAL(mbedtls_ecp_is_zero(&zero_pt), 1);
1316 TEST_EQUAL(mbedtls_ecp_is_zero(&nonzero_pt), 0);
Werner Lewis3b097392022-08-08 11:53:45 +01001317
1318 // Test initialized point
Gilles Peskine449bd832023-01-11 14:50:10 +01001319 TEST_EQUAL(mbedtls_ecp_set_zero(&pt), 0);
1320 TEST_EQUAL(mbedtls_ecp_is_zero(&pt), 1);
1321 TEST_EQUAL(mbedtls_ecp_point_cmp(&zero_pt, &pt), 0);
1322 TEST_EQUAL(mbedtls_ecp_point_cmp(&nonzero_pt, &zero_pt),
1323 MBEDTLS_ERR_ECP_BAD_INPUT_DATA);
Werner Lewis3b097392022-08-08 11:53:45 +01001324
1325 // Test zeroed point
Gilles Peskine449bd832023-01-11 14:50:10 +01001326 TEST_EQUAL(mbedtls_ecp_set_zero(&pt), 0);
1327 TEST_EQUAL(mbedtls_ecp_is_zero(&pt), 1);
1328 TEST_EQUAL(mbedtls_ecp_point_cmp(&zero_pt, &pt), 0);
1329 TEST_EQUAL(mbedtls_ecp_point_cmp(&nonzero_pt, &pt),
1330 MBEDTLS_ERR_ECP_BAD_INPUT_DATA);
Werner Lewis3b097392022-08-08 11:53:45 +01001331
1332 // Set point to non-zero value
Gilles Peskine449bd832023-01-11 14:50:10 +01001333 TEST_EQUAL(mbedtls_ecp_point_read_binary(&grp, &pt,
1334 P_bin->x, P_bin->len), 0);
1335 TEST_EQUAL(mbedtls_ecp_is_zero(&pt), 0);
1336 TEST_EQUAL(mbedtls_ecp_point_cmp(&zero_pt, &pt),
1337 MBEDTLS_ERR_ECP_BAD_INPUT_DATA);
1338 TEST_EQUAL(mbedtls_ecp_point_cmp(&nonzero_pt, &pt), 0);
Werner Lewis3b097392022-08-08 11:53:45 +01001339
1340 // Test non-zero point
Gilles Peskine449bd832023-01-11 14:50:10 +01001341 TEST_EQUAL(mbedtls_ecp_set_zero(&pt), 0);
1342 TEST_EQUAL(mbedtls_ecp_is_zero(&pt), 1);
1343 TEST_EQUAL(mbedtls_ecp_point_cmp(&zero_pt, &pt), 0);
1344 TEST_EQUAL(mbedtls_ecp_point_cmp(&nonzero_pt, &pt),
1345 MBEDTLS_ERR_ECP_BAD_INPUT_DATA);
Werner Lewis3b097392022-08-08 11:53:45 +01001346
1347 // Test freed non-zero point
Gilles Peskine449bd832023-01-11 14:50:10 +01001348 TEST_EQUAL(mbedtls_ecp_point_read_binary(&grp, &pt,
1349 P_bin->x, P_bin->len), 0);
1350 mbedtls_ecp_point_free(&pt);
1351 TEST_EQUAL(mbedtls_ecp_set_zero(&pt), 0);
1352 TEST_EQUAL(mbedtls_ecp_is_zero(&pt), 1);
1353 TEST_EQUAL(mbedtls_ecp_point_cmp(&zero_pt, &pt), 0);
1354 TEST_EQUAL(mbedtls_ecp_point_cmp(&nonzero_pt, &pt),
1355 MBEDTLS_ERR_ECP_BAD_INPUT_DATA);
Werner Lewis3b097392022-08-08 11:53:45 +01001356
1357exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001358 mbedtls_ecp_group_free(&grp);
1359 mbedtls_ecp_point_free(&pt);
1360 mbedtls_ecp_point_free(&zero_pt);
1361 mbedtls_ecp_point_free(&nonzero_pt);
Werner Lewis3b097392022-08-08 11:53:45 +01001362}
1363/* END_CASE */
1364
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001365/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Gilles Peskine449bd832023-01-11 14:50:10 +01001366void ecp_selftest()
Manuel Pégourié-Gonnardb4a310b2012-11-13 20:57:00 +01001367{
Gilles Peskine449bd832023-01-11 14:50:10 +01001368 TEST_ASSERT(mbedtls_ecp_self_test(1) == 0);
Manuel Pégourié-Gonnardb4a310b2012-11-13 20:57:00 +01001369}
Paul Bakker33b43f12013-08-20 11:48:36 +02001370/* END_CASE */
Przemek Stekiel4b30feb2022-03-18 13:58:26 +01001371
1372/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01001373void ecp_export(int id, char *Qx, char *Qy, char *d, int expected_ret, int invalid_grp)
Przemek Stekiel4b30feb2022-03-18 13:58:26 +01001374{
1375 mbedtls_ecp_keypair key;
1376 mbedtls_ecp_group export_grp;
1377 mbedtls_mpi export_d;
1378 mbedtls_ecp_point export_Q;
1379
Gilles Peskine449bd832023-01-11 14:50:10 +01001380 mbedtls_ecp_group_init(&export_grp);
1381 mbedtls_ecp_group_init(&key.grp);
1382 mbedtls_mpi_init(&export_d);
1383 mbedtls_ecp_point_init(&export_Q);
Przemek Stekiel4b30feb2022-03-18 13:58:26 +01001384
Gilles Peskine449bd832023-01-11 14:50:10 +01001385 mbedtls_ecp_keypair_init(&key);
1386 if (invalid_grp == 0) {
1387 TEST_ASSERT(mbedtls_ecp_group_load(&key.grp, id) == 0);
1388 }
1389 TEST_ASSERT(mbedtls_ecp_point_read_string(&key.Q, 16, Qx, Qy) == 0);
1390 TEST_ASSERT(mbedtls_test_read_mpi(&key.d, d) == 0);
Przemek Stekiel4b30feb2022-03-18 13:58:26 +01001391
Gilles Peskine449bd832023-01-11 14:50:10 +01001392 TEST_EQUAL(mbedtls_ecp_export(&key, &export_grp,
1393 &export_d, &export_Q), expected_ret);
Przemek Stekiel4b30feb2022-03-18 13:58:26 +01001394
Gilles Peskine449bd832023-01-11 14:50:10 +01001395 if (expected_ret == 0) {
1396 TEST_EQUAL(mbedtls_ecp_point_cmp(&key.Q, &export_Q), 0);
1397 TEST_EQUAL(mbedtls_mpi_cmp_mpi(&key.d, &export_d), 0);
1398 TEST_EQUAL(mbedtls_ecp_group_cmp(&key.grp, &export_grp), 0);
Gilles Peskinee6886102023-06-21 18:22:06 +02001399
1400 /* Check consistency with the group id */
1401 TEST_EQUAL(export_grp.id,
1402 mbedtls_ecp_keypair_get_group_id(&key));
Gilles Peskineba5b5d62023-06-21 18:24:04 +02001403
Gilles Peskine5d867872024-01-02 17:57:51 +01001404 /* Test null arguments: grp only */
Gilles Peskineba5b5d62023-06-21 18:24:04 +02001405 mbedtls_ecp_group_free(&export_grp);
Gilles Peskineba5b5d62023-06-21 18:24:04 +02001406 mbedtls_ecp_group_init(&export_grp);
Gilles Peskineba5b5d62023-06-21 18:24:04 +02001407 TEST_EQUAL(mbedtls_ecp_export(&key, &export_grp, NULL, NULL), 0);
1408 TEST_EQUAL(mbedtls_ecp_group_cmp(&key.grp, &export_grp), 0);
Gilles Peskine5d867872024-01-02 17:57:51 +01001409
1410 /* Test null arguments: d only */
1411 mbedtls_mpi_free(&export_d);
1412 mbedtls_mpi_init(&export_d);
Gilles Peskineba5b5d62023-06-21 18:24:04 +02001413 TEST_EQUAL(mbedtls_ecp_export(&key, NULL, &export_d, NULL), 0);
1414 TEST_EQUAL(mbedtls_mpi_cmp_mpi(&key.d, &export_d), 0);
Gilles Peskine5d867872024-01-02 17:57:51 +01001415
1416 /* Test null arguments: Q only */
1417 mbedtls_ecp_point_free(&export_Q);
1418 mbedtls_ecp_point_init(&export_Q);
Gilles Peskineba5b5d62023-06-21 18:24:04 +02001419 TEST_EQUAL(mbedtls_ecp_export(&key, NULL, NULL, &export_Q), 0);
1420 TEST_EQUAL(mbedtls_ecp_point_cmp(&key.Q, &export_Q), 0);
Przemek Stekiel4b30feb2022-03-18 13:58:26 +01001421 }
1422
1423exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001424 mbedtls_ecp_keypair_free(&key);
1425 mbedtls_ecp_group_free(&export_grp);
1426 mbedtls_mpi_free(&export_d);
1427 mbedtls_ecp_point_free(&export_Q);
Przemek Stekiel4b30feb2022-03-18 13:58:26 +01001428}
1429/* END_CASE */
Dave Rodgman57080462022-06-17 13:41:18 +01001430
1431/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +01001432void ecp_check_order(int id, char *expected_order_hex)
Dave Rodgman57080462022-06-17 13:41:18 +01001433{
1434 mbedtls_ecp_group grp;
1435 mbedtls_mpi expected_n;
1436
Gilles Peskine449bd832023-01-11 14:50:10 +01001437 mbedtls_ecp_group_init(&grp);
1438 mbedtls_mpi_init(&expected_n);
Dave Rodgman57080462022-06-17 13:41:18 +01001439
Gilles Peskine449bd832023-01-11 14:50:10 +01001440 TEST_ASSERT(mbedtls_ecp_group_load(&grp, id) == 0);
1441 TEST_ASSERT(mbedtls_test_read_mpi(&expected_n, expected_order_hex) == 0);
Dave Rodgman57080462022-06-17 13:41:18 +01001442
1443 // check sign bits are well-formed (i.e. 1 or -1) - see #5810
Gilles Peskine449bd832023-01-11 14:50:10 +01001444 TEST_ASSERT(grp.N.s == -1 || grp.N.s == 1);
1445 TEST_ASSERT(expected_n.s == -1 || expected_n.s == 1);
Dave Rodgman5cab9da2022-06-17 13:48:29 +01001446
Gilles Peskine449bd832023-01-11 14:50:10 +01001447 TEST_ASSERT(mbedtls_mpi_cmp_mpi(&grp.N, &expected_n) == 0);
Dave Rodgman57080462022-06-17 13:41:18 +01001448
1449exit:
Gilles Peskine449bd832023-01-11 14:50:10 +01001450 mbedtls_ecp_group_free(&grp);
1451 mbedtls_mpi_free(&expected_n);
Dave Rodgman57080462022-06-17 13:41:18 +01001452}
Dave Rodgmaneb8570f2022-06-17 14:59:36 +01001453/* END_CASE */
Gabor Mezei51ec06a2023-01-25 18:05:44 +01001454
Xiaokang Qiane25597d2023-06-15 07:00:20 +00001455/* BEGIN_CASE depends_on:MBEDTLS_TEST_HOOKS:MBEDTLS_ECP_WITH_MPI_UINT */
Minos Galanakis13586482023-03-21 12:08:37 +00001456void ecp_mod_p_generic_raw(int curve_id,
1457 char *input_N,
1458 char *input_X,
1459 char *result)
Gabor Mezei51ec06a2023-01-25 18:05:44 +01001460{
1461 mbedtls_mpi_uint *X = NULL;
1462 mbedtls_mpi_uint *N = NULL;
1463 mbedtls_mpi_uint *res = NULL;
1464 size_t limbs_X;
1465 size_t limbs_N;
1466 size_t limbs_res;
1467
Minos Galanakis13586482023-03-21 12:08:37 +00001468 size_t bytes;
1469 size_t limbs;
1470 size_t curve_bits;
1471 int (*curve_func)(mbedtls_mpi_uint *X, size_t X_limbs);
Gabor Mezeif65a0592023-02-14 18:26:36 +01001472
1473 mbedtls_mpi_mod_modulus m;
1474 mbedtls_mpi_mod_modulus_init(&m);
1475
1476 TEST_EQUAL(mbedtls_test_read_mpi_core(&X, &limbs_X, input_X), 0);
1477 TEST_EQUAL(mbedtls_test_read_mpi_core(&N, &limbs_N, input_N), 0);
1478 TEST_EQUAL(mbedtls_test_read_mpi_core(&res, &limbs_res, result), 0);
Minos Galanakis13586482023-03-21 12:08:37 +00001479 bytes = limbs_N * sizeof(mbedtls_mpi_uint);
Gabor Mezeif65a0592023-02-14 18:26:36 +01001480
Minos Galanakis13586482023-03-21 12:08:37 +00001481 switch (curve_id) {
Minos Galanakis450abfd2023-06-09 14:23:55 +01001482#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) && defined(MBEDTLS_ECP_NIST_OPTIM)
Minos Galanakis13586482023-03-21 12:08:37 +00001483 case MBEDTLS_ECP_DP_SECP192R1:
Minos Galanakis163d3462023-06-27 21:34:42 +01001484 limbs = BITS_TO_LIMBS(192) * 2;
Minos Galanakis13586482023-03-21 12:08:37 +00001485 curve_bits = 192;
1486 curve_func = &mbedtls_ecp_mod_p192_raw;
1487 break;
1488#endif
Minos Galanakis450abfd2023-06-09 14:23:55 +01001489#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) && defined(MBEDTLS_ECP_NIST_OPTIM)
Minos Galanakis13586482023-03-21 12:08:37 +00001490 case MBEDTLS_ECP_DP_SECP224R1:
Minos Galanakis163d3462023-06-27 21:34:42 +01001491 limbs = BITS_TO_LIMBS(224) * 2;
Minos Galanakis13586482023-03-21 12:08:37 +00001492 curve_bits = 224;
1493 curve_func = &mbedtls_ecp_mod_p224_raw;
1494 break;
1495#endif
Minos Galanakis450abfd2023-06-09 14:23:55 +01001496#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) && defined(MBEDTLS_ECP_NIST_OPTIM)
Minos Galanakis13586482023-03-21 12:08:37 +00001497 case MBEDTLS_ECP_DP_SECP256R1:
Minos Galanakis163d3462023-06-27 21:34:42 +01001498 limbs = BITS_TO_LIMBS(256) * 2;
Minos Galanakis13586482023-03-21 12:08:37 +00001499 curve_bits = 256;
1500 curve_func = &mbedtls_ecp_mod_p256_raw;
1501 break;
1502#endif
Minos Galanakis450abfd2023-06-09 14:23:55 +01001503#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) && defined(MBEDTLS_ECP_NIST_OPTIM)
Minos Galanakis13586482023-03-21 12:08:37 +00001504 case MBEDTLS_ECP_DP_SECP384R1:
Minos Galanakis163d3462023-06-27 21:34:42 +01001505 limbs = BITS_TO_LIMBS(384) * 2;
Minos Galanakis13586482023-03-21 12:08:37 +00001506 curve_bits = 384;
1507 curve_func = &mbedtls_ecp_mod_p384_raw;
1508 break;
1509#endif
Minos Galanakis450abfd2023-06-09 14:23:55 +01001510#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) && defined(MBEDTLS_ECP_NIST_OPTIM)
Minos Galanakis13586482023-03-21 12:08:37 +00001511 case MBEDTLS_ECP_DP_SECP521R1:
Minos Galanakis831a2e62023-06-29 12:03:24 +01001512 limbs = BITS_TO_LIMBS(521) * 2;
1513 curve_bits = 521;
Minos Galanakis13586482023-03-21 12:08:37 +00001514 curve_func = &mbedtls_ecp_mod_p521_raw;
1515 break;
1516#endif
Gabor Mezeidacfe562023-05-02 14:05:13 +02001517#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED)
1518 case MBEDTLS_ECP_DP_SECP192K1:
Minos Galanakis163d3462023-06-27 21:34:42 +01001519 limbs = BITS_TO_LIMBS(192) * 2;
Gabor Mezeidacfe562023-05-02 14:05:13 +02001520 curve_bits = 192;
1521 curve_func = &mbedtls_ecp_mod_p192k1_raw;
1522 break;
1523#endif
Gabor Mezeie42bb622023-05-02 14:10:57 +02001524#if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED)
1525 case MBEDTLS_ECP_DP_SECP224K1:
Minos Galanakis163d3462023-06-27 21:34:42 +01001526 limbs = BITS_TO_LIMBS(224) * 2;
Gabor Mezeie42bb622023-05-02 14:10:57 +02001527 curve_bits = 224;
1528 curve_func = &mbedtls_ecp_mod_p224k1_raw;
1529 break;
1530#endif
Gabor Mezei03558b82023-05-02 14:12:25 +02001531#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED)
1532 case MBEDTLS_ECP_DP_SECP256K1:
Minos Galanakis163d3462023-06-27 21:34:42 +01001533 limbs = BITS_TO_LIMBS(256) * 2;
Gabor Mezei03558b82023-05-02 14:12:25 +02001534 curve_bits = 256;
1535 curve_func = &mbedtls_ecp_mod_p256k1_raw;
1536 break;
1537#endif
Minos Galanakisc2c967b2023-05-11 09:59:05 +01001538#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)
1539 case MBEDTLS_ECP_DP_CURVE25519:
Minos Galanakis163d3462023-06-27 21:34:42 +01001540 limbs = BITS_TO_LIMBS(255) * 2;
Minos Galanakisc2c967b2023-05-11 09:59:05 +01001541 curve_bits = 255;
1542 curve_func = &mbedtls_ecp_mod_p255_raw;
1543 break;
1544#endif
Paul Elliotta2e48f72023-06-02 16:00:05 +01001545#if defined(MBEDTLS_ECP_DP_CURVE448_ENABLED)
1546 case MBEDTLS_ECP_DP_CURVE448:
Minos Galanakis163d3462023-06-27 21:34:42 +01001547 limbs = BITS_TO_LIMBS(448) * 2;
Paul Elliotta2e48f72023-06-02 16:00:05 +01001548 curve_bits = 448;
1549 curve_func = &mbedtls_ecp_mod_p448_raw;
1550 break;
1551#endif
Minos Galanakis13586482023-03-21 12:08:37 +00001552 default:
1553 mbedtls_test_fail("Unsupported curve_id", __LINE__, __FILE__);
1554 goto exit;
1555 }
Gabor Mezeif65a0592023-02-14 18:26:36 +01001556
Minos Galanakis13586482023-03-21 12:08:37 +00001557 TEST_EQUAL(limbs_X, limbs);
1558 TEST_EQUAL(limbs_res, limbs_N);
Gabor Mezeif65a0592023-02-14 18:26:36 +01001559
1560 TEST_EQUAL(mbedtls_mpi_mod_modulus_setup(
Minos Galanakis88e16df2023-05-09 14:11:43 +01001561 &m, N, limbs_N), 0);
Gabor Mezeif65a0592023-02-14 18:26:36 +01001562
Minos Galanakis13586482023-03-21 12:08:37 +00001563 TEST_EQUAL((*curve_func)(X, limbs_X), 0);
Gabor Mezeif65a0592023-02-14 18:26:36 +01001564
Gabor Mezeid8f67b92023-02-06 15:49:42 +01001565 mbedtls_mpi_mod_raw_fix_quasi_reduction(X, &m);
Minos Galanakis2cae9362023-07-03 11:51:35 +01001566 TEST_LE_U(mbedtls_mpi_core_bitlen(X, limbs_X), curve_bits);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001567 TEST_MEMORY_COMPARE(X, bytes, res, bytes);
Gabor Mezeid8f67b92023-02-06 15:49:42 +01001568
1569exit:
1570 mbedtls_free(X);
1571 mbedtls_free(res);
1572
1573 mbedtls_mpi_mod_modulus_free(&m);
1574 mbedtls_free(N);
1575}
1576/* END_CASE */
Minos Galanakis9a1d02d2023-02-03 19:14:56 +00001577
Xiaokang Qiane25597d2023-06-15 07:00:20 +00001578/* BEGIN_CASE depends_on:MBEDTLS_TEST_HOOKS:MBEDTLS_ECP_WITH_MPI_UINT */
Minos Galanakis9a1d02d2023-02-03 19:14:56 +00001579void ecp_mod_setup(char *input_A, int id, int ctype, int iret)
1580{
1581 int ret;
1582 mbedtls_mpi_mod_modulus m;
1583 mbedtls_mpi_mod_modulus_init(&m);
1584 mbedtls_mpi_uint *p = NULL;
1585 size_t p_limbs;
1586 size_t bytes;
1587
1588 TEST_EQUAL(mbedtls_test_read_mpi_core(&p, &p_limbs, input_A), 0);
1589
1590 ret = mbedtls_ecp_modulus_setup(&m, id, ctype);
1591 TEST_EQUAL(ret, iret);
1592
1593 if (ret == 0) {
Minos Galanakiseffff762023-06-09 15:11:41 +01001594 TEST_ASSERT(m.int_rep != MBEDTLS_MPI_MOD_REP_INVALID);
Minos Galanakis9a1d02d2023-02-03 19:14:56 +00001595 /* Test for limb sizes */
1596 TEST_EQUAL(m.limbs, p_limbs);
1597 bytes = p_limbs * sizeof(mbedtls_mpi_uint);
1598
Minos Galanakiseffff762023-06-09 15:11:41 +01001599 if (m.int_rep == MBEDTLS_MPI_MOD_REP_MONTGOMERY) {
1600 /* Test for validity of moduli by the presence of Montgomery consts */
1601 TEST_ASSERT(m.rep.mont.mm != 0);
1602 TEST_ASSERT(m.rep.mont.rr != NULL);
1603 } else {
1604 TEST_ASSERT(m.rep.ored.modp != NULL);
1605 }
Minos Galanakis9a1d02d2023-02-03 19:14:56 +00001606
1607 /* Compare output byte-by-byte */
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001608 TEST_MEMORY_COMPARE(p, bytes, m.p, bytes);
Minos Galanakis9a1d02d2023-02-03 19:14:56 +00001609
1610 /* Test for user free-ing allocated memory */
1611 mbedtls_mpi_mod_modulus_free(&m);
1612 }
1613
1614exit:
1615 mbedtls_mpi_mod_modulus_free(&m);
1616 mbedtls_free(p);
1617}
1618/* END_CASE */
Xiaokang Qian5e25f802023-04-21 09:45:16 +00001619
Xiaokang Qiane25597d2023-06-15 07:00:20 +00001620/* BEGIN_CASE depends_on:MBEDTLS_TEST_HOOKS:MBEDTLS_ECP_WITH_MPI_UINT */
Xiaokang Qianc1f5e542023-05-18 02:02:48 +00001621void ecp_mod_mul_inv(char *input_A, int id, int ctype)
Xiaokang Qian5e25f802023-04-21 09:45:16 +00001622{
Xiaokang Qian78b93b12023-05-17 06:41:21 +00001623 size_t limbs;
Xiaokang Qian5e25f802023-04-21 09:45:16 +00001624 mbedtls_mpi_mod_modulus m;
Xiaokang Qian1ae7ca42023-05-17 09:09:40 +00001625 mbedtls_mpi_mod_residue rA; // For input
1626 mbedtls_mpi_mod_residue rA_inverse; // For inverse input
1627 mbedtls_mpi_mod_residue rX; // For result
Xiaokang Qian5e25f802023-04-21 09:45:16 +00001628 mbedtls_mpi_uint *rX_raw = NULL;
Xiaokang Qian1ae7ca42023-05-17 09:09:40 +00001629 mbedtls_mpi_uint *A_inverse = NULL;
1630 mbedtls_mpi_uint *A = NULL;
Xiaokang Qian5e25f802023-04-21 09:45:16 +00001631 mbedtls_mpi_uint *bufx = NULL;
Xiaokang Qianc8f677d2023-05-18 03:04:26 +00001632 const mbedtls_mpi_uint one[1] = { 1 };
Xiaokang Qian5e25f802023-04-21 09:45:16 +00001633
Xiaokang Qian1ae7ca42023-05-17 09:09:40 +00001634 mbedtls_mpi_mod_modulus_init(&m);
1635
Xiaokang Qian78b93b12023-05-17 06:41:21 +00001636 TEST_ASSERT(mbedtls_ecp_modulus_setup(&m, id, ctype) == 0);
Xiaokang Qian5e25f802023-04-21 09:45:16 +00001637
Xiaokang Qian1ae7ca42023-05-17 09:09:40 +00001638 TEST_EQUAL(mbedtls_test_read_mpi_core(&A, &limbs, input_A), 0);
1639 TEST_EQUAL(0, mbedtls_mpi_mod_residue_setup(&rA, &m, A, limbs));
Xiaokang Qian8ca64372023-04-26 10:56:22 +00001640
Xiaokang Qian78b93b12023-05-17 06:41:21 +00001641 /* Test for limb sizes */
1642 TEST_EQUAL(m.limbs, limbs);
Xiaokang Qian8ca64372023-04-26 10:56:22 +00001643
Tom Cosgrove05b2a872023-07-21 11:31:13 +01001644 TEST_CALLOC(A_inverse, limbs);
Xiaokang Qian1ae7ca42023-05-17 09:09:40 +00001645 TEST_EQUAL(0, mbedtls_mpi_mod_residue_setup(&rA_inverse, &m, A_inverse, limbs));
Xiaokang Qian5e25f802023-04-21 09:45:16 +00001646
Tom Cosgrove05b2a872023-07-21 11:31:13 +01001647 TEST_CALLOC(rX_raw, limbs);
Xiaokang Qian78b93b12023-05-17 06:41:21 +00001648 TEST_EQUAL(0, mbedtls_mpi_mod_residue_setup(&rX, &m, rX_raw, limbs));
Xiaokang Qian5e25f802023-04-21 09:45:16 +00001649
Xiaokang Qian78b93b12023-05-17 06:41:21 +00001650 /* Get inverse of A mode m, and multiply it with itself,
Xiaokang Qianc8f677d2023-05-18 03:04:26 +00001651 * to see whether the result equal to '1' */
Xiaokang Qian1ae7ca42023-05-17 09:09:40 +00001652 TEST_EQUAL(0, mbedtls_mpi_mod_inv(&rA_inverse, &rA, &m));
1653 TEST_EQUAL(mbedtls_mpi_mod_mul(&rX, &rA, &rA_inverse, &m), 0);
Xiaokang Qian5e25f802023-04-21 09:45:16 +00001654
Tom Cosgrove05b2a872023-07-21 11:31:13 +01001655 TEST_CALLOC(bufx, limbs);
Xiaokang Qian78b93b12023-05-17 06:41:21 +00001656 TEST_EQUAL(mbedtls_mpi_mod_write(&rX, &m, (unsigned char *) bufx,
Xiaokang Qianc8f677d2023-05-18 03:04:26 +00001657 limbs * ciL,
1658 MBEDTLS_MPI_MOD_EXT_REP_LE), 0);
1659
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001660 TEST_MEMORY_COMPARE(bufx, ciL, one, ciL);
Xiaokang Qianc8f677d2023-05-18 03:04:26 +00001661 /*Borrow the buffer of A to compare the left lims with 0 */
1662 memset(A, 0, limbs * ciL);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001663 TEST_MEMORY_COMPARE(&bufx[1], (limbs - 1) * ciL, A, (limbs - 1) * ciL);
Xiaokang Qian5e25f802023-04-21 09:45:16 +00001664
Xiaokang Qian5e25f802023-04-21 09:45:16 +00001665exit:
1666 mbedtls_mpi_mod_modulus_free(&m);
Xiaokang Qian1ae7ca42023-05-17 09:09:40 +00001667 mbedtls_mpi_mod_residue_release(&rA);
1668 mbedtls_mpi_mod_residue_release(&rA_inverse);
Xiaokang Qian5e25f802023-04-21 09:45:16 +00001669 mbedtls_mpi_mod_residue_release(&rX);
Xiaokang Qian1ae7ca42023-05-17 09:09:40 +00001670 mbedtls_free(A);
1671 mbedtls_free(A_inverse);
Xiaokang Qian5e25f802023-04-21 09:45:16 +00001672 mbedtls_free(rX_raw);
1673 mbedtls_free(bufx);
1674}
1675/* END_CASE */
Xiaokang Qian5fc78462023-04-27 13:16:55 +00001676
Xiaokang Qiane25597d2023-06-15 07:00:20 +00001677/* BEGIN_CASE depends_on:MBEDTLS_TEST_HOOKS:MBEDTLS_ECP_WITH_MPI_UINT */
Xiaokang Qianc304e532023-05-18 07:46:59 +00001678void ecp_mod_add_sub(char *input_A, char *input_B, int id, int ctype)
Xiaokang Qian5fc78462023-04-27 13:16:55 +00001679{
Xiaokang Qian6d02c2f2023-05-18 09:35:25 +00001680 size_t p_A_limbs;
1681 size_t p_B_limbs;
Xiaokang Qian61b0c1c2023-05-17 09:57:57 +00001682 size_t bytes;
Xiaokang Qian5fc78462023-04-27 13:16:55 +00001683 mbedtls_mpi_mod_modulus m;
Xiaokang Qian61b0c1c2023-05-17 09:57:57 +00001684 mbedtls_mpi_mod_residue rA;
1685 mbedtls_mpi_mod_residue rB;
1686 mbedtls_mpi_mod_residue rS;
Xiaokang Qian5fc78462023-04-27 13:16:55 +00001687 mbedtls_mpi_uint *p_A = NULL;
1688 mbedtls_mpi_uint *p_B = NULL;
1689 mbedtls_mpi_uint *p_S = NULL;
Xiaokang Qian61b0c1c2023-05-17 09:57:57 +00001690
Xiaokang Qian61b0c1c2023-05-17 09:57:57 +00001691 mbedtls_mpi_mod_modulus_init(&m);
Xiaokang Qian5fc78462023-04-27 13:16:55 +00001692
Xiaokang Qian6d02c2f2023-05-18 09:35:25 +00001693 TEST_EQUAL(mbedtls_test_read_mpi_core(&p_A, &p_A_limbs, input_A), 0);
1694 TEST_EQUAL(mbedtls_test_read_mpi_core(&p_B, &p_B_limbs, input_B), 0);
Xiaokang Qian5fc78462023-04-27 13:16:55 +00001695
Xiaokang Qianb5844e42023-05-24 02:11:06 +00001696 TEST_EQUAL(0, mbedtls_ecp_modulus_setup(&m, id, ctype));
Xiaokang Qian5fc78462023-04-27 13:16:55 +00001697
Xiaokang Qian6d02c2f2023-05-18 09:35:25 +00001698 /* Test for limb sizes for two input value and modulus */
1699 TEST_EQUAL(p_A_limbs, p_B_limbs);
1700 TEST_EQUAL(m.limbs, p_A_limbs);
1701 bytes = p_A_limbs * ciL;
Xiaokang Qian5fc78462023-04-27 13:16:55 +00001702
Tom Cosgrove05b2a872023-07-21 11:31:13 +01001703 TEST_CALLOC(p_S, p_A_limbs);
Xiaokang Qian5fc78462023-04-27 13:16:55 +00001704
Xiaokang Qian6d02c2f2023-05-18 09:35:25 +00001705 TEST_EQUAL(mbedtls_mpi_mod_residue_setup(&rA, &m, p_A, p_A_limbs), 0);
1706 TEST_EQUAL(mbedtls_mpi_mod_residue_setup(&rB, &m, p_B, p_B_limbs), 0);
1707 TEST_EQUAL(mbedtls_mpi_mod_residue_setup(&rS, &m, p_S, p_A_limbs), 0);
Xiaokang Qian5fc78462023-04-27 13:16:55 +00001708
Xiaokang Qian10b6daf2023-05-22 02:28:06 +00001709 /* Firstly add A and B to get the sum S, then subtract B,
Xiaokang Qian6d02c2f2023-05-18 09:35:25 +00001710 * the difference should be equal to A*/
Xiaokang Qian61b0c1c2023-05-17 09:57:57 +00001711 TEST_EQUAL(0, mbedtls_mpi_mod_add(&rS, &rA, &rB, &m));
1712 TEST_EQUAL(0, mbedtls_mpi_mod_sub(&rS, &rS, &rB, &m));
Xiaokang Qian5fc78462023-04-27 13:16:55 +00001713
Xiaokang Qian6d02c2f2023-05-18 09:35:25 +00001714 /* Compare difference with rA byte-by-byte */
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001715 TEST_MEMORY_COMPARE(rA.p, bytes, rS.p, bytes);
Xiaokang Qian5fc78462023-04-27 13:16:55 +00001716
1717exit:
1718 mbedtls_mpi_mod_modulus_free(&m);
1719 mbedtls_mpi_mod_residue_release(&rA);
1720 mbedtls_mpi_mod_residue_release(&rB);
1721 mbedtls_mpi_mod_residue_release(&rS);
1722 mbedtls_free(p_A);
1723 mbedtls_free(p_B);
1724 mbedtls_free(p_S);
1725}
1726/* END_CASE */
Xiaokang Qian16a36e62023-05-22 10:05:11 +00001727
Xiaokang Qiane25597d2023-06-15 07:00:20 +00001728/* BEGIN_CASE depends_on:MBEDTLS_TEST_HOOKS:MBEDTLS_ECP_WITH_MPI_UINT */
Xiaokang Qian16a36e62023-05-22 10:05:11 +00001729void ecp_mod_read_write(char *input_A, int id, int ctype)
1730{
1731 size_t limbs;
Xiaokang Qianda5cf482023-05-29 07:13:50 +00001732 size_t bytes;
Xiaokang Qian16a36e62023-05-22 10:05:11 +00001733 mbedtls_mpi_mod_modulus m;
1734 mbedtls_mpi_mod_residue rA; // For input
1735 mbedtls_mpi_mod_residue rX; // For read back
1736 mbedtls_mpi_uint *rX_raw = NULL;
1737 mbedtls_mpi_uint *A = NULL;
1738 mbedtls_mpi_uint *bufx = NULL;
1739
1740 mbedtls_mpi_mod_modulus_init(&m);
1741
1742 TEST_EQUAL(0, mbedtls_ecp_modulus_setup(&m, id, ctype));
1743
Xiaokang Qianebc24782023-05-25 06:22:29 +00001744 TEST_EQUAL(0, mbedtls_test_read_mpi_core(&A, &limbs, input_A));
Xiaokang Qian16a36e62023-05-22 10:05:11 +00001745 TEST_EQUAL(0, mbedtls_mpi_mod_residue_setup(&rA, &m, A, limbs));
1746
1747 /* Test for limb sizes */
1748 TEST_EQUAL(m.limbs, limbs);
1749
Tom Cosgrove05b2a872023-07-21 11:31:13 +01001750 TEST_CALLOC(rX_raw, limbs);
Xiaokang Qian16a36e62023-05-22 10:05:11 +00001751 TEST_EQUAL(0, mbedtls_mpi_mod_residue_setup(&rX, &m, rX_raw, limbs));
1752
Xiaokang Qianda5cf482023-05-29 07:13:50 +00001753 bytes = limbs * ciL;
Tom Cosgrove05b2a872023-07-21 11:31:13 +01001754 TEST_CALLOC(bufx, limbs);
Xiaokang Qian254f94b2023-05-29 07:46:40 +00001755 /* Write source mod residue to a buffer, then read it back to
1756 * the destination mod residue, compare the two mod residues.
1757 * Firstly test little endian write and read */
Xiaokang Qianebc24782023-05-25 06:22:29 +00001758 TEST_EQUAL(0, mbedtls_mpi_mod_write(&rA, &m, (unsigned char *) bufx,
Xiaokang Qian6824bad2023-05-31 02:19:47 +00001759 bytes, MBEDTLS_MPI_MOD_EXT_REP_LE));
Xiaokang Qian16a36e62023-05-22 10:05:11 +00001760
Xiaokang Qianebc24782023-05-25 06:22:29 +00001761 TEST_EQUAL(0, mbedtls_mpi_mod_read(&rX, &m, (unsigned char *) bufx,
Xiaokang Qian6824bad2023-05-31 02:19:47 +00001762 bytes, MBEDTLS_MPI_MOD_EXT_REP_LE));
Xiaokang Qian16a36e62023-05-22 10:05:11 +00001763
Xiaokang Qianda5cf482023-05-29 07:13:50 +00001764 TEST_EQUAL(limbs, rX.limbs);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001765 TEST_MEMORY_COMPARE(rA.p, bytes, rX.p, bytes);
Xiaokang Qian16a36e62023-05-22 10:05:11 +00001766
Xiaokang Qian254f94b2023-05-29 07:46:40 +00001767 memset(bufx, 0x00, bytes);
1768 memset(rX_raw, 0x00, bytes);
1769 /* Then test big endian write and read */
1770 TEST_EQUAL(0, mbedtls_mpi_mod_write(&rA, &m, (unsigned char *) bufx,
1771 bytes,
1772 MBEDTLS_MPI_MOD_EXT_REP_BE));
1773
1774 TEST_EQUAL(0, mbedtls_mpi_mod_read(&rX, &m, (unsigned char *) bufx,
1775 bytes,
1776 MBEDTLS_MPI_MOD_EXT_REP_BE));
1777
1778 TEST_EQUAL(limbs, rX.limbs);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +01001779 TEST_MEMORY_COMPARE(rA.p, bytes, rX.p, bytes);
Xiaokang Qian254f94b2023-05-29 07:46:40 +00001780
Xiaokang Qian16a36e62023-05-22 10:05:11 +00001781exit:
1782 mbedtls_mpi_mod_modulus_free(&m);
1783 mbedtls_mpi_mod_residue_release(&rA);
1784 mbedtls_mpi_mod_residue_release(&rX);
1785 mbedtls_free(A);
1786 mbedtls_free(rX_raw);
1787 mbedtls_free(bufx);
1788}
1789/* END_CASE */
Xiaokang Qianb8cf6222023-05-24 08:55:59 +00001790
Xiaokang Qiane25597d2023-06-15 07:00:20 +00001791/* BEGIN_CASE depends_on:MBEDTLS_TEST_HOOKS:MBEDTLS_ECP_WITH_MPI_UINT */
Xiaokang Qianb8cf6222023-05-24 08:55:59 +00001792void ecp_mod_random(int id, int ctype)
1793{
1794 size_t limbs;
1795 mbedtls_mpi_mod_modulus m;
1796 mbedtls_mpi_mod_residue rX; // For random data
1797 mbedtls_mpi_uint *rX_raw = NULL;
1798
1799 mbedtls_mpi_mod_modulus_init(&m);
1800 TEST_EQUAL(0, mbedtls_ecp_modulus_setup(&m, id, ctype));
1801
1802 limbs = m.limbs;
1803
Tom Cosgrove05b2a872023-07-21 11:31:13 +01001804 TEST_CALLOC(rX_raw, limbs);
Xiaokang Qianb8cf6222023-05-24 08:55:59 +00001805 TEST_EQUAL(0, mbedtls_mpi_mod_residue_setup(&rX, &m, rX_raw, limbs));
1806
Xiaokang Qianebc24782023-05-25 06:22:29 +00001807 TEST_EQUAL(0, mbedtls_mpi_mod_random(&rX, 1, &m,
1808 mbedtls_test_rnd_std_rand, NULL));
Xiaokang Qianb8cf6222023-05-24 08:55:59 +00001809
Dave Rodgman855f72b2023-06-13 10:36:06 +01001810 TEST_ASSERT(mbedtls_mpi_core_lt_ct(rX.p, m.p, limbs) == MBEDTLS_CT_TRUE);
Xiaokang Qianb8cf6222023-05-24 08:55:59 +00001811
1812exit:
1813 mbedtls_mpi_mod_modulus_free(&m);
1814 mbedtls_mpi_mod_residue_release(&rX);
1815 mbedtls_free(rX_raw);
1816}
1817/* END_CASE */
Gabor Mezeic8107072023-06-06 17:24:35 +02001818
Gabor Mezeif0021d42023-07-12 13:54:20 +02001819/* BEGIN_CASE depends_on:MBEDTLS_TEST_HOOKS:MBEDTLS_ECP_LIGHT */
Gabor Mezeic8107072023-06-06 17:24:35 +02001820void check_variant()
1821{
1822 mbedtls_ecp_variant variant = mbedtls_ecp_get_variant();
1823
Gabor Mezei92ce4c22023-07-12 13:53:49 +02001824#if defined(MBEDTLS_ECP_WITH_MPI_UINT)
Gabor Mezeic8107072023-06-06 17:24:35 +02001825 TEST_EQUAL(variant, MBEDTLS_ECP_VARIANT_WITH_MPI_UINT);
1826#else
Gabor Mezei2a7bcaf2023-07-06 10:37:51 +02001827 TEST_EQUAL(variant, MBEDTLS_ECP_VARIANT_WITH_MPI_STRUCT);
Gabor Mezeic8107072023-06-06 17:24:35 +02001828#endif
1829}
1830/* END_CASE */