diff options
author | Richard Levitte <levitte@openssl.org> | 2022-12-09 16:57:28 +0100 |
---|---|---|
committer | Richard Levitte <levitte@openssl.org> | 2022-12-13 15:40:16 +0100 |
commit | b79da97cf8751d7b196a87cc8bced0bb3334a0d3 (patch) | |
tree | 3e74383d27e4d29e7091f911a4d087c2ff73606d /test/asn1_internal_test.c | |
parent | 97b8db1af2f71059ecea986e4d12fc6a23699a74 (diff) |
Allow OBJ_create() to create an OBJ and NID with a NULL OID
We already permit this in crypto/objects/objects.txt, but not programatically,
although being able to do so programatically would be beneficial.
Reviewed-by: Dmitry Belyavskiy <beldmit@gmail.com>
Reviewed-by: Paul Dale <pauli@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/19876)
Diffstat (limited to 'test/asn1_internal_test.c')
-rw-r--r-- | test/asn1_internal_test.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/test/asn1_internal_test.c b/test/asn1_internal_test.c index 61e4265c8b..d97ca92129 100644 --- a/test/asn1_internal_test.c +++ b/test/asn1_internal_test.c @@ -190,11 +190,76 @@ 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; +} + 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); return 1; } |