diff options
Diffstat (limited to 'test/asn1_internal_test.c')
-rw-r--r-- | test/asn1_internal_test.c | 78 |
1 files changed, 77 insertions, 1 deletions
diff --git a/test/asn1_internal_test.c b/test/asn1_internal_test.c index 61e4265c8b71..3c2222d988df 100644 --- a/test/asn1_internal_test.c +++ b/test/asn1_internal_test.c @@ -1,5 +1,5 @@ /* - * Copyright 1999-2021 The OpenSSL Project Authors. All Rights Reserved. + * Copyright 1999-2023 The OpenSSL Project Authors. All Rights Reserved. * * Licensed under the Apache License 2.0 (the "License"). You may not use * this file except in compliance with the License. You can obtain a copy @@ -190,11 +190,87 @@ static int test_unicode_range(void) return ok; } +/********************************************************************** + * + * Tests of object creation + * + ***/ + +static int test_obj_create_once(const char *oid, const char *sn, const char *ln) +{ + int nid; + + ERR_set_mark(); + + nid = OBJ_create(oid, sn, ln); + + if (nid == NID_undef) { + unsigned long err = ERR_peek_last_error(); + int l = ERR_GET_LIB(err); + int r = ERR_GET_REASON(err); + + /* If it exists, that's fine, otherwise not */ + if (l != ERR_LIB_OBJ || r != OBJ_R_OID_EXISTS) { + ERR_clear_last_mark(); + return 0; + } + } + ERR_pop_to_mark(); + return 1; +} + +static int test_obj_create(void) +{ +/* Stolen from evp_extra_test.c */ +#define arc "1.3.6.1.4.1.16604.998866." +#define broken_arc "25." +#define sn_prefix "custom" +#define ln_prefix "custom" + + /* Try different combinations of correct object creation */ + if (!TEST_true(test_obj_create_once(NULL, sn_prefix "1", NULL)) + || !TEST_int_ne(OBJ_sn2nid(sn_prefix "1"), NID_undef) + || !TEST_true(test_obj_create_once(NULL, NULL, ln_prefix "2")) + || !TEST_int_ne(OBJ_ln2nid(ln_prefix "2"), NID_undef) + || !TEST_true(test_obj_create_once(NULL, sn_prefix "3", ln_prefix "3")) + || !TEST_int_ne(OBJ_sn2nid(sn_prefix "3"), NID_undef) + || !TEST_int_ne(OBJ_ln2nid(ln_prefix "3"), NID_undef) + || !TEST_true(test_obj_create_once(arc "4", NULL, NULL)) + || !TEST_true(test_obj_create_once(arc "5", sn_prefix "5", NULL)) + || !TEST_int_ne(OBJ_sn2nid(sn_prefix "5"), NID_undef) + || !TEST_true(test_obj_create_once(arc "6", NULL, ln_prefix "6")) + || !TEST_int_ne(OBJ_ln2nid(ln_prefix "6"), NID_undef) + || !TEST_true(test_obj_create_once(arc "7", + sn_prefix "7", ln_prefix "7")) + || !TEST_int_ne(OBJ_sn2nid(sn_prefix "7"), NID_undef) + || !TEST_int_ne(OBJ_ln2nid(ln_prefix "7"), NID_undef)) + return 0; + + if (!TEST_false(test_obj_create_once(NULL, NULL, NULL)) + || !TEST_false(test_obj_create_once(broken_arc "8", + sn_prefix "8", ln_prefix "8"))) + return 0; + + return 1; +} + +static int test_obj_nid_undef(void) +{ + if (!TEST_ptr(OBJ_nid2obj(NID_undef)) + || !TEST_ptr(OBJ_nid2sn(NID_undef)) + || !TEST_ptr(OBJ_nid2ln(NID_undef))) + return 0; + + return 1; +} + int setup_tests(void) { ADD_TEST(test_tbl_standard); ADD_TEST(test_standard_methods); ADD_TEST(test_empty_nonoptional_content); ADD_TEST(test_unicode_range); + ADD_TEST(test_obj_create); + ADD_TEST(test_obj_nid_undef); return 1; } |