xref: /netbsd-src/crypto/external/bsd/openssl.old/dist/test/asn1_internal_test.c (revision 4724848cf0da353df257f730694b7882798e5daf)
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