summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortb <>2024-10-12 16:15:28 +0000
committertb <>2024-10-12 16:15:28 +0000
commit636e27e56e13e39b21e8983ea8d0cdcba267872e (patch)
treef4a5ec6ccd022d0d437a9201d00150d063e40337 /src
parent0ee3a3c0348f733e2ad2e1bb1c2169f13fb380f9 (diff)
downloadopenbsd-636e27e56e13e39b21e8983ea8d0cdcba267872e.tar.gz
openbsd-636e27e56e13e39b21e8983ea8d0cdcba267872e.tar.bz2
openbsd-636e27e56e13e39b21e8983ea8d0cdcba267872e.zip
Exercise the EC parameters code a bit more
Ensure all builtin curves can be roundtripped through DER as named curves, via explicit parameterization, using uncompressed, compressed and hybrid point formats.
Diffstat (limited to 'src')
-rw-r--r--src/regress/lib/libcrypto/ec/ec_asn1_test.c104
1 files changed, 103 insertions, 1 deletions
diff --git a/src/regress/lib/libcrypto/ec/ec_asn1_test.c b/src/regress/lib/libcrypto/ec/ec_asn1_test.c
index 512f5c5250..321ee5c657 100644
--- a/src/regress/lib/libcrypto/ec/ec_asn1_test.c
+++ b/src/regress/lib/libcrypto/ec/ec_asn1_test.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ec_asn1_test.c,v 1.2 2021/12/04 17:03:43 tb Exp $ */ 1/* $OpenBSD: ec_asn1_test.c,v 1.3 2024/10/12 16:15:28 tb Exp $ */
2/* 2/*
3 * Copyright (c) 2017, 2021 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2017, 2021 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -194,6 +194,107 @@ ec_group_pkparameters_parameters_test(void)
194 sizeof(ec_secp256r1_pkparameters_parameters)); 194 sizeof(ec_secp256r1_pkparameters_parameters));
195} 195}
196 196
197static int
198ec_group_roundtrip_curve(const EC_GROUP *group, const char *descr, int nid)
199{
200 EC_GROUP *new_group = NULL;
201 unsigned char *der = NULL;
202 int der_len;
203 const unsigned char *p;
204 int failed = 1;
205
206 der = NULL;
207 if ((der_len = i2d_ECPKParameters(group, &der)) <= 0)
208 errx(1, "failed to serialize %s %d", descr, nid);
209
210 p = der;
211 if ((new_group = d2i_ECPKParameters(NULL, &p, der_len)) == NULL)
212 errx(1, "failed to deserialize %s %d", descr, nid);
213
214 if (EC_GROUP_cmp(group, new_group, NULL) != 0) {
215 fprintf(stderr, "FAIL: %s %d groups mismatch\n", descr, nid);
216 goto err;
217 }
218 if (EC_GROUP_get_asn1_flag(group) != EC_GROUP_get_asn1_flag(new_group)) {
219 fprintf(stderr, "FAIL: %s %d asn1_flag %x != %x\n", descr, nid,
220 EC_GROUP_get_asn1_flag(group),
221 EC_GROUP_get_asn1_flag(new_group));
222 goto err;
223 }
224 if (EC_GROUP_get_point_conversion_form(group) !=
225 EC_GROUP_get_point_conversion_form(new_group)) {
226 fprintf(stderr, "FAIL: %s %d form %02x != %02x\n", descr, nid,
227 EC_GROUP_get_point_conversion_form(group),
228 EC_GROUP_get_point_conversion_form(new_group));
229 goto err;
230 }
231
232 failed = 0;
233
234 err:
235 EC_GROUP_free(new_group);
236 free(der);
237
238 return failed;
239}
240
241static int
242ec_group_roundtrip_builtin_curve(const EC_builtin_curve *curve)
243{
244 EC_GROUP *group = NULL;
245 int failed = 0;
246
247 if ((group = EC_GROUP_new_by_curve_name(curve->nid)) == NULL)
248 errx(1, "failed to instantiate curve %d", curve->nid);
249
250 if (EC_GROUP_get_asn1_flag(group) != OPENSSL_EC_NAMED_CURVE) {
251 fprintf(stderr, "FAIL: ASN.1 flag not set for %d\n", curve->nid);
252 goto err;
253 }
254 if (EC_GROUP_get_point_conversion_form(group) !=
255 POINT_CONVERSION_UNCOMPRESSED) {
256 fprintf(stderr, "FAIL: %d has point conversion form %02x\n",
257 curve->nid, EC_GROUP_get_point_conversion_form(group));
258 goto err;
259 }
260
261 failed |= ec_group_roundtrip_curve(group, "named", curve->nid);
262
263 EC_GROUP_set_asn1_flag(group, 0);
264 failed |= ec_group_roundtrip_curve(group, "explicit", curve->nid);
265
266 EC_GROUP_set_point_conversion_form(group, POINT_CONVERSION_COMPRESSED);
267 failed |= ec_group_roundtrip_curve(group, "compressed", curve->nid);
268
269 EC_GROUP_set_point_conversion_form(group, POINT_CONVERSION_HYBRID);
270 failed |= ec_group_roundtrip_curve(group, "hybrid", curve->nid);
271
272 err:
273 EC_GROUP_free(group);
274
275 return failed;
276}
277
278static int
279ec_group_roundtrip_builtin_curves(void)
280{
281 EC_builtin_curve *all_curves = NULL;
282 size_t curve_id, ncurves;
283 int failed = 0;
284
285 ncurves = EC_get_builtin_curves(NULL, 0);
286 if ((all_curves = calloc(ncurves, sizeof(*all_curves))) == NULL)
287 err(1, "calloc builtin curves");
288 EC_get_builtin_curves(all_curves, ncurves);
289
290 for (curve_id = 0; curve_id < ncurves; curve_id++)
291 failed |= ec_group_roundtrip_builtin_curve(&all_curves[curve_id]);
292
293 free(all_curves);
294
295 return failed;
296}
297
197int 298int
198main(int argc, char **argv) 299main(int argc, char **argv)
199{ 300{
@@ -201,6 +302,7 @@ main(int argc, char **argv)
201 302
202 failed |= ec_group_pkparameters_named_curve_test(); 303 failed |= ec_group_pkparameters_named_curve_test();
203 failed |= ec_group_pkparameters_parameters_test(); 304 failed |= ec_group_pkparameters_parameters_test();
305 failed |= ec_group_roundtrip_builtin_curves();
204 306
205 return (failed); 307 return (failed);
206} 308}