diff options
Diffstat (limited to 'src/regress/lib/libcrypto/x509/x509_name_test.c')
-rw-r--r-- | src/regress/lib/libcrypto/x509/x509_name_test.c | 123 |
1 files changed, 122 insertions, 1 deletions
diff --git a/src/regress/lib/libcrypto/x509/x509_name_test.c b/src/regress/lib/libcrypto/x509/x509_name_test.c index eaf7076d74..24e62cc766 100644 --- a/src/regress/lib/libcrypto/x509/x509_name_test.c +++ b/src/regress/lib/libcrypto/x509/x509_name_test.c | |||
@@ -1,7 +1,9 @@ | |||
1 | /* $OpenBSD: x509_name_test.c,v 1.2 2025/03/19 11:19:17 tb Exp $ */ | 1 | /* $OpenBSD: x509_name_test.c,v 1.3 2025/05/05 06:33:34 tb Exp $ */ |
2 | 2 | ||
3 | /* | 3 | /* |
4 | * Copyright (c) 2025 Theo Buehler <tb@openbsd.org> | 4 | * Copyright (c) 2025 Theo Buehler <tb@openbsd.org> |
5 | * Copyright (c) 2025 Kenjiro Nakayama <nakayamakenjiro@gmail.com> | ||
6 | * Copyright (c) 2018 Ingo Schwarze <schwarze@openbsd.org> | ||
5 | * | 7 | * |
6 | * Permission to use, copy, modify, and distribute this software for any | 8 | * Permission to use, copy, modify, and distribute this software for any |
7 | * purpose with or without fee is hereby granted, provided that the above | 9 | * purpose with or without fee is hereby granted, provided that the above |
@@ -288,12 +290,131 @@ x509_name_compat_test(void) | |||
288 | return failed; | 290 | return failed; |
289 | } | 291 | } |
290 | 292 | ||
293 | static const struct x509_name_entry_test { | ||
294 | const char *field; | ||
295 | const char *value; | ||
296 | int loc; | ||
297 | int set; | ||
298 | const char *expected_str; | ||
299 | const int expected_set[4]; | ||
300 | const int expected_count; | ||
301 | } entry_tests[] = { | ||
302 | { | ||
303 | .field = "ST", | ||
304 | .value = "BaWue", | ||
305 | .loc = -1, | ||
306 | .set = 0, | ||
307 | .expected_str = "ST=BaWue", | ||
308 | .expected_set = { 0 }, | ||
309 | .expected_count = 1, | ||
310 | }, | ||
311 | { | ||
312 | .field = "O", | ||
313 | .value = "KIT", | ||
314 | .loc = -1, | ||
315 | .set = 0, | ||
316 | .expected_str = "ST=BaWue, O=KIT", | ||
317 | .expected_set = { 0, 1 }, | ||
318 | .expected_count = 2, | ||
319 | }, | ||
320 | { | ||
321 | .field = "L", | ||
322 | .value = "Karlsruhe", | ||
323 | .loc = 1, | ||
324 | .set = 0, | ||
325 | .expected_str = "ST=BaWue, L=Karlsruhe, O=KIT", | ||
326 | .expected_set = { 0, 1, 2 }, | ||
327 | .expected_count = 3, | ||
328 | }, | ||
329 | { | ||
330 | .field = "C", | ||
331 | .value = "DE", | ||
332 | .loc = 0, | ||
333 | .set = 1, | ||
334 | .expected_str = "C=DE + ST=BaWue, L=Karlsruhe, O=KIT", | ||
335 | .expected_set = { 0, 0, 1, 2 }, | ||
336 | .expected_count = 4, | ||
337 | }, | ||
338 | }; | ||
339 | |||
340 | #define N_ENTRY_TESTS (sizeof(entry_tests) / sizeof(entry_tests[0])) | ||
341 | |||
342 | static int | ||
343 | verify_x509_name_output(X509_NAME *name, const struct x509_name_entry_test *tc) | ||
344 | { | ||
345 | BIO *bio; | ||
346 | char *got; | ||
347 | long got_len; | ||
348 | int loc, ret; | ||
349 | int failed = 1; | ||
350 | |||
351 | if ((bio = BIO_new(BIO_s_mem())) == NULL) | ||
352 | goto fail; | ||
353 | |||
354 | if ((ret = X509_NAME_print_ex(bio, name, 0, XN_FLAG_SEP_CPLUS_SPC)) == -1) | ||
355 | goto fail; | ||
356 | |||
357 | if ((got_len = BIO_get_mem_data(bio, &got)) < 0) | ||
358 | goto fail; | ||
359 | |||
360 | if (ret != got_len || strlen(tc->expected_str) != (size_t)ret) | ||
361 | goto fail; | ||
362 | |||
363 | if (strncmp(tc->expected_str, got, got_len) != 0) | ||
364 | goto fail; | ||
365 | |||
366 | if (X509_NAME_entry_count(name) != tc->expected_count) | ||
367 | goto fail; | ||
368 | |||
369 | for (loc = 0; loc < X509_NAME_entry_count(name); loc++) { | ||
370 | X509_NAME_ENTRY *e = X509_NAME_get_entry(name, loc); | ||
371 | if (e == NULL || X509_NAME_ENTRY_set(e) != tc->expected_set[loc]) | ||
372 | goto fail; | ||
373 | } | ||
374 | |||
375 | failed = 0; | ||
376 | |||
377 | fail: | ||
378 | BIO_free(bio); | ||
379 | |||
380 | return failed; | ||
381 | } | ||
382 | |||
383 | static int | ||
384 | x509_name_add_entry_test(void) | ||
385 | { | ||
386 | X509_NAME *name; | ||
387 | int failed = 1; | ||
388 | |||
389 | if ((name = X509_NAME_new()) == NULL) | ||
390 | goto done; | ||
391 | |||
392 | for (size_t i = 0; i < N_ENTRY_TESTS; i++) { | ||
393 | const struct x509_name_entry_test *t = &entry_tests[i]; | ||
394 | |||
395 | if (!X509_NAME_add_entry_by_txt(name, t->field, MBSTRING_ASC, | ||
396 | (const unsigned char *)t->value, -1, t->loc, t->set)) | ||
397 | goto done; | ||
398 | |||
399 | if (verify_x509_name_output(name, t)) | ||
400 | goto done; | ||
401 | } | ||
402 | |||
403 | failed = 0; | ||
404 | |||
405 | done: | ||
406 | X509_NAME_free(name); | ||
407 | |||
408 | return failed; | ||
409 | } | ||
410 | |||
291 | int | 411 | int |
292 | main(void) | 412 | main(void) |
293 | { | 413 | { |
294 | int failed = 0; | 414 | int failed = 0; |
295 | 415 | ||
296 | failed |= x509_name_compat_test(); | 416 | failed |= x509_name_compat_test(); |
417 | failed |= x509_name_add_entry_test(); | ||
297 | 418 | ||
298 | return failed; | 419 | return failed; |
299 | } | 420 | } |