1*e0c4386eSCy Schubert /*
2*e0c4386eSCy Schubert * Copyright 1999-2021 The OpenSSL Project Authors. All Rights Reserved.
3*e0c4386eSCy Schubert *
4*e0c4386eSCy Schubert * Licensed under the Apache License 2.0 (the "License"). You may not use
5*e0c4386eSCy Schubert * this file except in compliance with the License. You can obtain a copy
6*e0c4386eSCy Schubert * in the file LICENSE in the source distribution or at
7*e0c4386eSCy Schubert * https://www.openssl.org/source/license.html
8*e0c4386eSCy Schubert */
9*e0c4386eSCy Schubert
10*e0c4386eSCy Schubert /* Internal tests for the asn1 module */
11*e0c4386eSCy Schubert
12*e0c4386eSCy Schubert /*
13*e0c4386eSCy Schubert * RSA low level APIs are deprecated for public use, but still ok for
14*e0c4386eSCy Schubert * internal use.
15*e0c4386eSCy Schubert */
16*e0c4386eSCy Schubert #include "internal/deprecated.h"
17*e0c4386eSCy Schubert
18*e0c4386eSCy Schubert #include <stdio.h>
19*e0c4386eSCy Schubert #include <string.h>
20*e0c4386eSCy Schubert
21*e0c4386eSCy Schubert #include <openssl/asn1.h>
22*e0c4386eSCy Schubert #include <openssl/evp.h>
23*e0c4386eSCy Schubert #include <openssl/objects.h>
24*e0c4386eSCy Schubert #include "testutil.h"
25*e0c4386eSCy Schubert #include "internal/nelem.h"
26*e0c4386eSCy Schubert
27*e0c4386eSCy Schubert /**********************************************************************
28*e0c4386eSCy Schubert *
29*e0c4386eSCy Schubert * Test of a_strnid's tbl_standard
30*e0c4386eSCy Schubert *
31*e0c4386eSCy Schubert ***/
32*e0c4386eSCy Schubert
33*e0c4386eSCy Schubert #include "../crypto/asn1/tbl_standard.h"
34*e0c4386eSCy Schubert
test_tbl_standard(void)35*e0c4386eSCy Schubert static int test_tbl_standard(void)
36*e0c4386eSCy Schubert {
37*e0c4386eSCy Schubert const ASN1_STRING_TABLE *tmp;
38*e0c4386eSCy Schubert int last_nid = -1;
39*e0c4386eSCy Schubert size_t i;
40*e0c4386eSCy Schubert
41*e0c4386eSCy Schubert for (tmp = tbl_standard, i = 0; i < OSSL_NELEM(tbl_standard); i++, tmp++) {
42*e0c4386eSCy Schubert if (tmp->nid < last_nid) {
43*e0c4386eSCy Schubert last_nid = 0;
44*e0c4386eSCy Schubert break;
45*e0c4386eSCy Schubert }
46*e0c4386eSCy Schubert last_nid = tmp->nid;
47*e0c4386eSCy Schubert }
48*e0c4386eSCy Schubert
49*e0c4386eSCy Schubert if (TEST_int_ne(last_nid, 0)) {
50*e0c4386eSCy Schubert TEST_info("asn1 tbl_standard: Table order OK");
51*e0c4386eSCy Schubert return 1;
52*e0c4386eSCy Schubert }
53*e0c4386eSCy Schubert
54*e0c4386eSCy Schubert TEST_info("asn1 tbl_standard: out of order");
55*e0c4386eSCy Schubert for (tmp = tbl_standard, i = 0; i < OSSL_NELEM(tbl_standard); i++, tmp++)
56*e0c4386eSCy Schubert TEST_note("asn1 tbl_standard: Index %zu, NID %d, Name=%s",
57*e0c4386eSCy Schubert i, tmp->nid, OBJ_nid2ln(tmp->nid));
58*e0c4386eSCy Schubert
59*e0c4386eSCy Schubert return 0;
60*e0c4386eSCy Schubert }
61*e0c4386eSCy Schubert
62*e0c4386eSCy Schubert /**********************************************************************
63*e0c4386eSCy Schubert *
64*e0c4386eSCy Schubert * Test of ameth_lib's standard_methods
65*e0c4386eSCy Schubert *
66*e0c4386eSCy Schubert ***/
67*e0c4386eSCy Schubert
68*e0c4386eSCy Schubert #include "crypto/asn1.h"
69*e0c4386eSCy Schubert #include "../crypto/asn1/standard_methods.h"
70*e0c4386eSCy Schubert
test_standard_methods(void)71*e0c4386eSCy Schubert static int test_standard_methods(void)
72*e0c4386eSCy Schubert {
73*e0c4386eSCy Schubert const EVP_PKEY_ASN1_METHOD **tmp;
74*e0c4386eSCy Schubert int last_pkey_id = -1;
75*e0c4386eSCy Schubert size_t i;
76*e0c4386eSCy Schubert int ok = 1;
77*e0c4386eSCy Schubert
78*e0c4386eSCy Schubert for (tmp = standard_methods, i = 0; i < OSSL_NELEM(standard_methods);
79*e0c4386eSCy Schubert i++, tmp++) {
80*e0c4386eSCy Schubert if ((*tmp)->pkey_id < last_pkey_id) {
81*e0c4386eSCy Schubert last_pkey_id = 0;
82*e0c4386eSCy Schubert break;
83*e0c4386eSCy Schubert }
84*e0c4386eSCy Schubert last_pkey_id = (*tmp)->pkey_id;
85*e0c4386eSCy Schubert
86*e0c4386eSCy Schubert /*
87*e0c4386eSCy Schubert * One of the following must be true:
88*e0c4386eSCy Schubert *
89*e0c4386eSCy Schubert * pem_str == NULL AND ASN1_PKEY_ALIAS is set
90*e0c4386eSCy Schubert * pem_str != NULL AND ASN1_PKEY_ALIAS is clear
91*e0c4386eSCy Schubert *
92*e0c4386eSCy Schubert * Anything else is an error and may lead to a corrupt ASN1 method table
93*e0c4386eSCy Schubert */
94*e0c4386eSCy Schubert if (!TEST_true(((*tmp)->pem_str == NULL && ((*tmp)->pkey_flags & ASN1_PKEY_ALIAS) != 0)
95*e0c4386eSCy Schubert || ((*tmp)->pem_str != NULL && ((*tmp)->pkey_flags & ASN1_PKEY_ALIAS) == 0))) {
96*e0c4386eSCy Schubert TEST_note("asn1 standard methods: Index %zu, pkey ID %d, Name=%s",
97*e0c4386eSCy Schubert i, (*tmp)->pkey_id, OBJ_nid2sn((*tmp)->pkey_id));
98*e0c4386eSCy Schubert ok = 0;
99*e0c4386eSCy Schubert }
100*e0c4386eSCy Schubert }
101*e0c4386eSCy Schubert
102*e0c4386eSCy Schubert if (TEST_int_ne(last_pkey_id, 0)) {
103*e0c4386eSCy Schubert TEST_info("asn1 standard methods: Table order OK");
104*e0c4386eSCy Schubert return ok;
105*e0c4386eSCy Schubert }
106*e0c4386eSCy Schubert
107*e0c4386eSCy Schubert TEST_note("asn1 standard methods: out of order");
108*e0c4386eSCy Schubert for (tmp = standard_methods, i = 0; i < OSSL_NELEM(standard_methods);
109*e0c4386eSCy Schubert i++, tmp++)
110*e0c4386eSCy Schubert TEST_note("asn1 standard methods: Index %zu, pkey ID %d, Name=%s",
111*e0c4386eSCy Schubert i, (*tmp)->pkey_id, OBJ_nid2sn((*tmp)->pkey_id));
112*e0c4386eSCy Schubert
113*e0c4386eSCy Schubert return 0;
114*e0c4386eSCy Schubert }
115*e0c4386eSCy Schubert
116*e0c4386eSCy Schubert /**********************************************************************
117*e0c4386eSCy Schubert *
118*e0c4386eSCy Schubert * Test of that i2d fail on non-existing non-optional items
119*e0c4386eSCy Schubert *
120*e0c4386eSCy Schubert ***/
121*e0c4386eSCy Schubert
122*e0c4386eSCy Schubert #include <openssl/rsa.h>
123*e0c4386eSCy Schubert
test_empty_nonoptional_content(void)124*e0c4386eSCy Schubert static int test_empty_nonoptional_content(void)
125*e0c4386eSCy Schubert {
126*e0c4386eSCy Schubert RSA *rsa = NULL;
127*e0c4386eSCy Schubert BIGNUM *n = NULL;
128*e0c4386eSCy Schubert BIGNUM *e = NULL;
129*e0c4386eSCy Schubert int ok = 0;
130*e0c4386eSCy Schubert
131*e0c4386eSCy Schubert if (!TEST_ptr(rsa = RSA_new())
132*e0c4386eSCy Schubert || !TEST_ptr(n = BN_new())
133*e0c4386eSCy Schubert || !TEST_ptr(e = BN_new())
134*e0c4386eSCy Schubert || !TEST_true(RSA_set0_key(rsa, n, e, NULL)))
135*e0c4386eSCy Schubert goto end;
136*e0c4386eSCy Schubert
137*e0c4386eSCy Schubert n = e = NULL; /* They are now "owned" by |rsa| */
138*e0c4386eSCy Schubert
139*e0c4386eSCy Schubert /*
140*e0c4386eSCy Schubert * This SHOULD fail, as we're trying to encode a public key as a private
141*e0c4386eSCy Schubert * key. The private key bits MUST be present for a proper RSAPrivateKey.
142*e0c4386eSCy Schubert */
143*e0c4386eSCy Schubert if (TEST_int_le(i2d_RSAPrivateKey(rsa, NULL), 0))
144*e0c4386eSCy Schubert ok = 1;
145*e0c4386eSCy Schubert
146*e0c4386eSCy Schubert end:
147*e0c4386eSCy Schubert RSA_free(rsa);
148*e0c4386eSCy Schubert BN_free(n);
149*e0c4386eSCy Schubert BN_free(e);
150*e0c4386eSCy Schubert return ok;
151*e0c4386eSCy Schubert }
152*e0c4386eSCy Schubert
153*e0c4386eSCy Schubert /**********************************************************************
154*e0c4386eSCy Schubert *
155*e0c4386eSCy Schubert * Tests of the Unicode code point range
156*e0c4386eSCy Schubert *
157*e0c4386eSCy Schubert ***/
158*e0c4386eSCy Schubert
test_unicode(const unsigned char * univ,size_t len,int expected)159*e0c4386eSCy Schubert static int test_unicode(const unsigned char *univ, size_t len, int expected)
160*e0c4386eSCy Schubert {
161*e0c4386eSCy Schubert const unsigned char *end = univ + len;
162*e0c4386eSCy Schubert int ok = 1;
163*e0c4386eSCy Schubert
164*e0c4386eSCy Schubert for (; univ < end; univ += 4) {
165*e0c4386eSCy Schubert if (!TEST_int_eq(ASN1_mbstring_copy(NULL, univ, 4, MBSTRING_UNIV,
166*e0c4386eSCy Schubert B_ASN1_UTF8STRING),
167*e0c4386eSCy Schubert expected))
168*e0c4386eSCy Schubert ok = 0;
169*e0c4386eSCy Schubert }
170*e0c4386eSCy Schubert return ok;
171*e0c4386eSCy Schubert }
172*e0c4386eSCy Schubert
test_unicode_range(void)173*e0c4386eSCy Schubert static int test_unicode_range(void)
174*e0c4386eSCy Schubert {
175*e0c4386eSCy Schubert const unsigned char univ_ok[] = "\0\0\0\0"
176*e0c4386eSCy Schubert "\0\0\xd7\xff"
177*e0c4386eSCy Schubert "\0\0\xe0\x00"
178*e0c4386eSCy Schubert "\0\x10\xff\xff";
179*e0c4386eSCy Schubert const unsigned char univ_bad[] = "\0\0\xd8\x00"
180*e0c4386eSCy Schubert "\0\0\xdf\xff"
181*e0c4386eSCy Schubert "\0\x11\x00\x00"
182*e0c4386eSCy Schubert "\x80\x00\x00\x00"
183*e0c4386eSCy Schubert "\xff\xff\xff\xff";
184*e0c4386eSCy Schubert int ok = 1;
185*e0c4386eSCy Schubert
186*e0c4386eSCy Schubert if (!test_unicode(univ_ok, sizeof univ_ok - 1, V_ASN1_UTF8STRING))
187*e0c4386eSCy Schubert ok = 0;
188*e0c4386eSCy Schubert if (!test_unicode(univ_bad, sizeof univ_bad - 1, -1))
189*e0c4386eSCy Schubert ok = 0;
190*e0c4386eSCy Schubert return ok;
191*e0c4386eSCy Schubert }
192*e0c4386eSCy Schubert
setup_tests(void)193*e0c4386eSCy Schubert int setup_tests(void)
194*e0c4386eSCy Schubert {
195*e0c4386eSCy Schubert ADD_TEST(test_tbl_standard);
196*e0c4386eSCy Schubert ADD_TEST(test_standard_methods);
197*e0c4386eSCy Schubert ADD_TEST(test_empty_nonoptional_content);
198*e0c4386eSCy Schubert ADD_TEST(test_unicode_range);
199*e0c4386eSCy Schubert return 1;
200*e0c4386eSCy Schubert }
201