diff options
author | tb <> | 2024-10-12 16:15:28 +0000 |
---|---|---|
committer | tb <> | 2024-10-12 16:15:28 +0000 |
commit | 636e27e56e13e39b21e8983ea8d0cdcba267872e (patch) | |
tree | f4a5ec6ccd022d0d437a9201d00150d063e40337 /src | |
parent | 0ee3a3c0348f733e2ad2e1bb1c2169f13fb380f9 (diff) | |
download | openbsd-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.c | 104 |
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 | ||
197 | static int | ||
198 | ec_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 | |||
241 | static int | ||
242 | ec_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 | |||
278 | static int | ||
279 | ec_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 | |||
197 | int | 298 | int |
198 | main(int argc, char **argv) | 299 | main(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 | } |