diff options
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 | } |
