1*4724848cSchristos /*
2*4724848cSchristos * Copyright 1999-2022 The OpenSSL Project Authors. All Rights Reserved.
3*4724848cSchristos *
4*4724848cSchristos * Licensed under the OpenSSL license (the "License"). You may not use
5*4724848cSchristos * this file except in compliance with the License. You can obtain a copy
6*4724848cSchristos * in the file LICENSE in the source distribution or at
7*4724848cSchristos * https://www.openssl.org/source/license.html
8*4724848cSchristos */
9*4724848cSchristos
10*4724848cSchristos /* Internal tests for the asn1 module */
11*4724848cSchristos
12*4724848cSchristos #include <stdio.h>
13*4724848cSchristos #include <string.h>
14*4724848cSchristos
15*4724848cSchristos #include <openssl/asn1.h>
16*4724848cSchristos #include <openssl/evp.h>
17*4724848cSchristos #include <openssl/objects.h>
18*4724848cSchristos #include "testutil.h"
19*4724848cSchristos #include "internal/nelem.h"
20*4724848cSchristos
21*4724848cSchristos /**********************************************************************
22*4724848cSchristos *
23*4724848cSchristos * Test of a_strnid's tbl_standard
24*4724848cSchristos *
25*4724848cSchristos ***/
26*4724848cSchristos
27*4724848cSchristos #include "../crypto/asn1/tbl_standard.h"
28*4724848cSchristos
test_tbl_standard(void)29*4724848cSchristos static int test_tbl_standard(void)
30*4724848cSchristos {
31*4724848cSchristos const ASN1_STRING_TABLE *tmp;
32*4724848cSchristos int last_nid = -1;
33*4724848cSchristos size_t i;
34*4724848cSchristos
35*4724848cSchristos for (tmp = tbl_standard, i = 0; i < OSSL_NELEM(tbl_standard); i++, tmp++) {
36*4724848cSchristos if (tmp->nid < last_nid) {
37*4724848cSchristos last_nid = 0;
38*4724848cSchristos break;
39*4724848cSchristos }
40*4724848cSchristos last_nid = tmp->nid;
41*4724848cSchristos }
42*4724848cSchristos
43*4724848cSchristos if (TEST_int_ne(last_nid, 0)) {
44*4724848cSchristos TEST_info("asn1 tbl_standard: Table order OK");
45*4724848cSchristos return 1;
46*4724848cSchristos }
47*4724848cSchristos
48*4724848cSchristos TEST_info("asn1 tbl_standard: out of order");
49*4724848cSchristos for (tmp = tbl_standard, i = 0; i < OSSL_NELEM(tbl_standard); i++, tmp++)
50*4724848cSchristos TEST_note("asn1 tbl_standard: Index %zu, NID %d, Name=%s",
51*4724848cSchristos i, tmp->nid, OBJ_nid2ln(tmp->nid));
52*4724848cSchristos
53*4724848cSchristos return 0;
54*4724848cSchristos }
55*4724848cSchristos
56*4724848cSchristos /**********************************************************************
57*4724848cSchristos *
58*4724848cSchristos * Test of ameth_lib's standard_methods
59*4724848cSchristos *
60*4724848cSchristos ***/
61*4724848cSchristos
62*4724848cSchristos #include "crypto/asn1.h"
63*4724848cSchristos #include "../crypto/asn1/standard_methods.h"
64*4724848cSchristos
test_standard_methods(void)65*4724848cSchristos static int test_standard_methods(void)
66*4724848cSchristos {
67*4724848cSchristos const EVP_PKEY_ASN1_METHOD **tmp;
68*4724848cSchristos int last_pkey_id = -1;
69*4724848cSchristos size_t i;
70*4724848cSchristos int ok = 1;
71*4724848cSchristos
72*4724848cSchristos for (tmp = standard_methods, i = 0; i < OSSL_NELEM(standard_methods);
73*4724848cSchristos i++, tmp++) {
74*4724848cSchristos if ((*tmp)->pkey_id < last_pkey_id) {
75*4724848cSchristos last_pkey_id = 0;
76*4724848cSchristos break;
77*4724848cSchristos }
78*4724848cSchristos last_pkey_id = (*tmp)->pkey_id;
79*4724848cSchristos
80*4724848cSchristos /*
81*4724848cSchristos * One of the following must be true:
82*4724848cSchristos *
83*4724848cSchristos * pem_str == NULL AND ASN1_PKEY_ALIAS is set
84*4724848cSchristos * pem_str != NULL AND ASN1_PKEY_ALIAS is clear
85*4724848cSchristos *
86*4724848cSchristos * Anything else is an error and may lead to a corrupt ASN1 method table
87*4724848cSchristos */
88*4724848cSchristos if (!TEST_true(((*tmp)->pem_str == NULL && ((*tmp)->pkey_flags & ASN1_PKEY_ALIAS) != 0)
89*4724848cSchristos || ((*tmp)->pem_str != NULL && ((*tmp)->pkey_flags & ASN1_PKEY_ALIAS) == 0))) {
90*4724848cSchristos TEST_note("asn1 standard methods: Index %zu, pkey ID %d, Name=%s",
91*4724848cSchristos i, (*tmp)->pkey_id, OBJ_nid2sn((*tmp)->pkey_id));
92*4724848cSchristos ok = 0;
93*4724848cSchristos }
94*4724848cSchristos }
95*4724848cSchristos
96*4724848cSchristos if (TEST_int_ne(last_pkey_id, 0)) {
97*4724848cSchristos TEST_info("asn1 standard methods: Table order OK");
98*4724848cSchristos return ok;
99*4724848cSchristos }
100*4724848cSchristos
101*4724848cSchristos TEST_note("asn1 standard methods: out of order");
102*4724848cSchristos for (tmp = standard_methods, i = 0; i < OSSL_NELEM(standard_methods);
103*4724848cSchristos i++, tmp++)
104*4724848cSchristos TEST_note("asn1 standard methods: Index %zu, pkey ID %d, Name=%s",
105*4724848cSchristos i, (*tmp)->pkey_id, OBJ_nid2sn((*tmp)->pkey_id));
106*4724848cSchristos
107*4724848cSchristos return 0;
108*4724848cSchristos }
109*4724848cSchristos
110*4724848cSchristos /**********************************************************************
111*4724848cSchristos *
112*4724848cSchristos * Regression test for issue where OBJ_nid2obj does not raise
113*4724848cSchristos * an error when a NID is not registered.
114*4724848cSchristos *
115*4724848cSchristos ***/
test_nid2obj_nonexist(void)116*4724848cSchristos static int test_nid2obj_nonexist(void)
117*4724848cSchristos {
118*4724848cSchristos ASN1_OBJECT *obj;
119*4724848cSchristos unsigned long err;
120*4724848cSchristos
121*4724848cSchristos obj = OBJ_nid2obj(INT_MAX);
122*4724848cSchristos if (!TEST_true(obj == NULL))
123*4724848cSchristos return 0;
124*4724848cSchristos
125*4724848cSchristos err = ERR_get_error();
126*4724848cSchristos
127*4724848cSchristos if (!TEST_int_eq(ERR_GET_FUNC(err), OBJ_F_OBJ_NID2OBJ))
128*4724848cSchristos return 0;
129*4724848cSchristos
130*4724848cSchristos if (!TEST_int_eq(ERR_GET_REASON(err), OBJ_R_UNKNOWN_NID))
131*4724848cSchristos return 0;
132*4724848cSchristos
133*4724848cSchristos return 1;
134*4724848cSchristos }
135*4724848cSchristos
setup_tests(void)136*4724848cSchristos int setup_tests(void)
137*4724848cSchristos {
138*4724848cSchristos ADD_TEST(test_tbl_standard);
139*4724848cSchristos ADD_TEST(test_standard_methods);
140*4724848cSchristos ADD_TEST(test_nid2obj_nonexist);
141*4724848cSchristos return 1;
142*4724848cSchristos }
143