1e1051a39Sopenharmony_ci/*
2e1051a39Sopenharmony_ci * Copyright 2016-2022 The OpenSSL Project Authors. All Rights Reserved.
3e1051a39Sopenharmony_ci *
4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License").  You may not use
5e1051a39Sopenharmony_ci * this file except in compliance with the License.  You can obtain a copy
6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at
7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html
8e1051a39Sopenharmony_ci */
9e1051a39Sopenharmony_ci
10e1051a39Sopenharmony_ci#include <stdio.h>
11e1051a39Sopenharmony_ci#include <string.h>
12e1051a39Sopenharmony_ci#include <openssl/x509.h>
13e1051a39Sopenharmony_ci#include <openssl/x509v3.h>
14e1051a39Sopenharmony_ci#include <openssl/pem.h>
15e1051a39Sopenharmony_ci#include <openssl/err.h>
16e1051a39Sopenharmony_ci#include "internal/nelem.h"
17e1051a39Sopenharmony_ci
18e1051a39Sopenharmony_ci#include "testutil.h"
19e1051a39Sopenharmony_ci
20e1051a39Sopenharmony_cistatic const char *infile;
21e1051a39Sopenharmony_ci
22e1051a39Sopenharmony_cistatic int test_pathlen(void)
23e1051a39Sopenharmony_ci{
24e1051a39Sopenharmony_ci    X509 *x = NULL;
25e1051a39Sopenharmony_ci    BIO *b = NULL;
26e1051a39Sopenharmony_ci    long pathlen;
27e1051a39Sopenharmony_ci    int ret = 0;
28e1051a39Sopenharmony_ci
29e1051a39Sopenharmony_ci    if (!TEST_ptr(b = BIO_new_file(infile, "r"))
30e1051a39Sopenharmony_ci            || !TEST_ptr(x = PEM_read_bio_X509(b, NULL, NULL, NULL))
31e1051a39Sopenharmony_ci            || !TEST_int_eq(pathlen = X509_get_pathlen(x), 6))
32e1051a39Sopenharmony_ci        goto end;
33e1051a39Sopenharmony_ci
34e1051a39Sopenharmony_ci    ret = 1;
35e1051a39Sopenharmony_ci
36e1051a39Sopenharmony_ciend:
37e1051a39Sopenharmony_ci    BIO_free(b);
38e1051a39Sopenharmony_ci    X509_free(x);
39e1051a39Sopenharmony_ci    return ret;
40e1051a39Sopenharmony_ci}
41e1051a39Sopenharmony_ci
42e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_RFC3779
43e1051a39Sopenharmony_cistatic int test_asid(void)
44e1051a39Sopenharmony_ci{
45e1051a39Sopenharmony_ci    ASN1_INTEGER *val1 = NULL, *val2 = NULL;
46e1051a39Sopenharmony_ci    ASIdentifiers *asid1 = ASIdentifiers_new(), *asid2 = ASIdentifiers_new(),
47e1051a39Sopenharmony_ci                  *asid3 = ASIdentifiers_new(), *asid4 = ASIdentifiers_new();
48e1051a39Sopenharmony_ci    int testresult = 0;
49e1051a39Sopenharmony_ci
50e1051a39Sopenharmony_ci    if (!TEST_ptr(asid1)
51e1051a39Sopenharmony_ci            || !TEST_ptr(asid2)
52e1051a39Sopenharmony_ci            || !TEST_ptr(asid3))
53e1051a39Sopenharmony_ci        goto err;
54e1051a39Sopenharmony_ci
55e1051a39Sopenharmony_ci    if (!TEST_ptr(val1 = ASN1_INTEGER_new())
56e1051a39Sopenharmony_ci            || !TEST_true(ASN1_INTEGER_set_int64(val1, 64496)))
57e1051a39Sopenharmony_ci        goto err;
58e1051a39Sopenharmony_ci
59e1051a39Sopenharmony_ci    if (!TEST_true(X509v3_asid_add_id_or_range(asid1, V3_ASID_ASNUM, val1, NULL)))
60e1051a39Sopenharmony_ci        goto err;
61e1051a39Sopenharmony_ci
62e1051a39Sopenharmony_ci    val1 = NULL;
63e1051a39Sopenharmony_ci    if (!TEST_ptr(val2 = ASN1_INTEGER_new())
64e1051a39Sopenharmony_ci            || !TEST_true(ASN1_INTEGER_set_int64(val2, 64497)))
65e1051a39Sopenharmony_ci        goto err;
66e1051a39Sopenharmony_ci
67e1051a39Sopenharmony_ci    if (!TEST_true(X509v3_asid_add_id_or_range(asid2, V3_ASID_ASNUM, val2, NULL)))
68e1051a39Sopenharmony_ci        goto err;
69e1051a39Sopenharmony_ci
70e1051a39Sopenharmony_ci    val2 = NULL;
71e1051a39Sopenharmony_ci    if (!TEST_ptr(val1 = ASN1_INTEGER_new())
72e1051a39Sopenharmony_ci            || !TEST_true(ASN1_INTEGER_set_int64(val1, 64496))
73e1051a39Sopenharmony_ci            || !TEST_ptr(val2 = ASN1_INTEGER_new())
74e1051a39Sopenharmony_ci            || !TEST_true(ASN1_INTEGER_set_int64(val2, 64497)))
75e1051a39Sopenharmony_ci        goto err;
76e1051a39Sopenharmony_ci
77e1051a39Sopenharmony_ci    /*
78e1051a39Sopenharmony_ci     * Just tests V3_ASID_ASNUM for now. Could be extended at some point to also
79e1051a39Sopenharmony_ci     * test V3_ASID_RDI if we think it is worth it.
80e1051a39Sopenharmony_ci     */
81e1051a39Sopenharmony_ci    if (!TEST_true(X509v3_asid_add_id_or_range(asid3, V3_ASID_ASNUM, val1, val2)))
82e1051a39Sopenharmony_ci        goto err;
83e1051a39Sopenharmony_ci    val1 = val2 = NULL;
84e1051a39Sopenharmony_ci
85e1051a39Sopenharmony_ci    /* Actual subsets */
86e1051a39Sopenharmony_ci    if (!TEST_true(X509v3_asid_subset(NULL, NULL))
87e1051a39Sopenharmony_ci            || !TEST_true(X509v3_asid_subset(NULL, asid1))
88e1051a39Sopenharmony_ci            || !TEST_true(X509v3_asid_subset(asid1, asid1))
89e1051a39Sopenharmony_ci            || !TEST_true(X509v3_asid_subset(asid2, asid2))
90e1051a39Sopenharmony_ci            || !TEST_true(X509v3_asid_subset(asid1, asid3))
91e1051a39Sopenharmony_ci            || !TEST_true(X509v3_asid_subset(asid2, asid3))
92e1051a39Sopenharmony_ci            || !TEST_true(X509v3_asid_subset(asid3, asid3))
93e1051a39Sopenharmony_ci            || !TEST_true(X509v3_asid_subset(asid4, asid1))
94e1051a39Sopenharmony_ci            || !TEST_true(X509v3_asid_subset(asid4, asid2))
95e1051a39Sopenharmony_ci            || !TEST_true(X509v3_asid_subset(asid4, asid3)))
96e1051a39Sopenharmony_ci        goto err;
97e1051a39Sopenharmony_ci
98e1051a39Sopenharmony_ci    /* Not subsets */
99e1051a39Sopenharmony_ci    if (!TEST_false(X509v3_asid_subset(asid1, NULL))
100e1051a39Sopenharmony_ci            || !TEST_false(X509v3_asid_subset(asid1, asid2))
101e1051a39Sopenharmony_ci            || !TEST_false(X509v3_asid_subset(asid2, asid1))
102e1051a39Sopenharmony_ci            || !TEST_false(X509v3_asid_subset(asid3, asid1))
103e1051a39Sopenharmony_ci            || !TEST_false(X509v3_asid_subset(asid3, asid2))
104e1051a39Sopenharmony_ci            || !TEST_false(X509v3_asid_subset(asid1, asid4))
105e1051a39Sopenharmony_ci            || !TEST_false(X509v3_asid_subset(asid2, asid4))
106e1051a39Sopenharmony_ci            || !TEST_false(X509v3_asid_subset(asid3, asid4)))
107e1051a39Sopenharmony_ci        goto err;
108e1051a39Sopenharmony_ci
109e1051a39Sopenharmony_ci    testresult = 1;
110e1051a39Sopenharmony_ci err:
111e1051a39Sopenharmony_ci    ASN1_INTEGER_free(val1);
112e1051a39Sopenharmony_ci    ASN1_INTEGER_free(val2);
113e1051a39Sopenharmony_ci    ASIdentifiers_free(asid1);
114e1051a39Sopenharmony_ci    ASIdentifiers_free(asid2);
115e1051a39Sopenharmony_ci    ASIdentifiers_free(asid3);
116e1051a39Sopenharmony_ci    ASIdentifiers_free(asid4);
117e1051a39Sopenharmony_ci    return testresult;
118e1051a39Sopenharmony_ci}
119e1051a39Sopenharmony_ci
120e1051a39Sopenharmony_cistatic struct ip_ranges_st {
121e1051a39Sopenharmony_ci    const unsigned int afi;
122e1051a39Sopenharmony_ci    const char *ip1;
123e1051a39Sopenharmony_ci    const char *ip2;
124e1051a39Sopenharmony_ci    int rorp;
125e1051a39Sopenharmony_ci} ranges[] = {
126e1051a39Sopenharmony_ci    { IANA_AFI_IPV4, "192.168.0.0", "192.168.0.1", IPAddressOrRange_addressPrefix},
127e1051a39Sopenharmony_ci    { IANA_AFI_IPV4, "192.168.0.0", "192.168.0.2", IPAddressOrRange_addressRange},
128e1051a39Sopenharmony_ci    { IANA_AFI_IPV4, "192.168.0.0", "192.168.0.3", IPAddressOrRange_addressPrefix},
129e1051a39Sopenharmony_ci    { IANA_AFI_IPV4, "192.168.0.0", "192.168.0.254", IPAddressOrRange_addressRange},
130e1051a39Sopenharmony_ci    { IANA_AFI_IPV4, "192.168.0.0", "192.168.0.255", IPAddressOrRange_addressPrefix},
131e1051a39Sopenharmony_ci    { IANA_AFI_IPV4, "192.168.0.1", "192.168.0.255", IPAddressOrRange_addressRange},
132e1051a39Sopenharmony_ci    { IANA_AFI_IPV4, "192.168.0.1", "192.168.0.1", IPAddressOrRange_addressPrefix},
133e1051a39Sopenharmony_ci    { IANA_AFI_IPV4, "192.168.0.0", "192.168.255.255", IPAddressOrRange_addressPrefix},
134e1051a39Sopenharmony_ci    { IANA_AFI_IPV4, "192.168.1.0", "192.168.255.255", IPAddressOrRange_addressRange},
135e1051a39Sopenharmony_ci    { IANA_AFI_IPV6, "2001:0db8::0", "2001:0db8::1", IPAddressOrRange_addressPrefix},
136e1051a39Sopenharmony_ci    { IANA_AFI_IPV6, "2001:0db8::0", "2001:0db8::2", IPAddressOrRange_addressRange},
137e1051a39Sopenharmony_ci    { IANA_AFI_IPV6, "2001:0db8::0", "2001:0db8::3", IPAddressOrRange_addressPrefix},
138e1051a39Sopenharmony_ci    { IANA_AFI_IPV6, "2001:0db8::0", "2001:0db8::fffe", IPAddressOrRange_addressRange},
139e1051a39Sopenharmony_ci    { IANA_AFI_IPV6, "2001:0db8::0", "2001:0db8::ffff", IPAddressOrRange_addressPrefix},
140e1051a39Sopenharmony_ci    { IANA_AFI_IPV6, "2001:0db8::1", "2001:0db8::ffff", IPAddressOrRange_addressRange},
141e1051a39Sopenharmony_ci    { IANA_AFI_IPV6, "2001:0db8::1", "2001:0db8::1", IPAddressOrRange_addressPrefix},
142e1051a39Sopenharmony_ci    { IANA_AFI_IPV6, "2001:0db8::0:0", "2001:0db8::ffff:ffff", IPAddressOrRange_addressPrefix},
143e1051a39Sopenharmony_ci    { IANA_AFI_IPV6, "2001:0db8::1:0", "2001:0db8::ffff:ffff", IPAddressOrRange_addressRange}
144e1051a39Sopenharmony_ci};
145e1051a39Sopenharmony_ci
146e1051a39Sopenharmony_cistatic int check_addr(IPAddrBlocks *addr, int type)
147e1051a39Sopenharmony_ci{
148e1051a39Sopenharmony_ci    IPAddressFamily *fam;
149e1051a39Sopenharmony_ci    IPAddressOrRange *aorr;
150e1051a39Sopenharmony_ci
151e1051a39Sopenharmony_ci    if (!TEST_int_eq(sk_IPAddressFamily_num(addr), 1))
152e1051a39Sopenharmony_ci        return 0;
153e1051a39Sopenharmony_ci
154e1051a39Sopenharmony_ci    fam = sk_IPAddressFamily_value(addr, 0);
155e1051a39Sopenharmony_ci    if (!TEST_ptr(fam))
156e1051a39Sopenharmony_ci        return 0;
157e1051a39Sopenharmony_ci
158e1051a39Sopenharmony_ci    if (!TEST_int_eq(fam->ipAddressChoice->type, IPAddressChoice_addressesOrRanges))
159e1051a39Sopenharmony_ci        return 0;
160e1051a39Sopenharmony_ci
161e1051a39Sopenharmony_ci    if (!TEST_int_eq(sk_IPAddressOrRange_num(fam->ipAddressChoice->u.addressesOrRanges), 1))
162e1051a39Sopenharmony_ci        return 0;
163e1051a39Sopenharmony_ci
164e1051a39Sopenharmony_ci    aorr = sk_IPAddressOrRange_value(fam->ipAddressChoice->u.addressesOrRanges, 0);
165e1051a39Sopenharmony_ci    if (!TEST_ptr(aorr))
166e1051a39Sopenharmony_ci        return 0;
167e1051a39Sopenharmony_ci
168e1051a39Sopenharmony_ci    if (!TEST_int_eq(aorr->type, type))
169e1051a39Sopenharmony_ci        return 0;
170e1051a39Sopenharmony_ci
171e1051a39Sopenharmony_ci    return 1;
172e1051a39Sopenharmony_ci}
173e1051a39Sopenharmony_ci
174e1051a39Sopenharmony_cistatic int test_addr_ranges(void)
175e1051a39Sopenharmony_ci{
176e1051a39Sopenharmony_ci    IPAddrBlocks *addr = NULL;
177e1051a39Sopenharmony_ci    ASN1_OCTET_STRING *ip1 = NULL, *ip2 = NULL;
178e1051a39Sopenharmony_ci    size_t i;
179e1051a39Sopenharmony_ci    int testresult = 0;
180e1051a39Sopenharmony_ci
181e1051a39Sopenharmony_ci    for (i = 0; i < OSSL_NELEM(ranges); i++) {
182e1051a39Sopenharmony_ci        addr = sk_IPAddressFamily_new_null();
183e1051a39Sopenharmony_ci        if (!TEST_ptr(addr))
184e1051a39Sopenharmony_ci            goto end;
185e1051a39Sopenharmony_ci        /*
186e1051a39Sopenharmony_ci         * Has the side effect of installing the comparison function onto the
187e1051a39Sopenharmony_ci         * stack.
188e1051a39Sopenharmony_ci         */
189e1051a39Sopenharmony_ci        if (!TEST_true(X509v3_addr_canonize(addr)))
190e1051a39Sopenharmony_ci            goto end;
191e1051a39Sopenharmony_ci
192e1051a39Sopenharmony_ci        ip1 = a2i_IPADDRESS(ranges[i].ip1);
193e1051a39Sopenharmony_ci        if (!TEST_ptr(ip1))
194e1051a39Sopenharmony_ci            goto end;
195e1051a39Sopenharmony_ci        if (!TEST_true(ip1->length == 4 || ip1->length == 16))
196e1051a39Sopenharmony_ci            goto end;
197e1051a39Sopenharmony_ci        ip2 = a2i_IPADDRESS(ranges[i].ip2);
198e1051a39Sopenharmony_ci        if (!TEST_ptr(ip2))
199e1051a39Sopenharmony_ci            goto end;
200e1051a39Sopenharmony_ci        if (!TEST_int_eq(ip2->length, ip1->length))
201e1051a39Sopenharmony_ci            goto end;
202e1051a39Sopenharmony_ci        if (!TEST_true(memcmp(ip1->data, ip2->data, ip1->length) <= 0))
203e1051a39Sopenharmony_ci            goto end;
204e1051a39Sopenharmony_ci
205e1051a39Sopenharmony_ci        if (!TEST_true(X509v3_addr_add_range(addr, ranges[i].afi, NULL, ip1->data, ip2->data)))
206e1051a39Sopenharmony_ci            goto end;
207e1051a39Sopenharmony_ci
208e1051a39Sopenharmony_ci        if (!TEST_true(X509v3_addr_is_canonical(addr)))
209e1051a39Sopenharmony_ci            goto end;
210e1051a39Sopenharmony_ci
211e1051a39Sopenharmony_ci        if (!check_addr(addr, ranges[i].rorp))
212e1051a39Sopenharmony_ci            goto end;
213e1051a39Sopenharmony_ci
214e1051a39Sopenharmony_ci        sk_IPAddressFamily_pop_free(addr, IPAddressFamily_free);
215e1051a39Sopenharmony_ci        addr = NULL;
216e1051a39Sopenharmony_ci        ASN1_OCTET_STRING_free(ip1);
217e1051a39Sopenharmony_ci        ASN1_OCTET_STRING_free(ip2);
218e1051a39Sopenharmony_ci        ip1 = ip2 = NULL;
219e1051a39Sopenharmony_ci    }
220e1051a39Sopenharmony_ci
221e1051a39Sopenharmony_ci    testresult = 1;
222e1051a39Sopenharmony_ci end:
223e1051a39Sopenharmony_ci    sk_IPAddressFamily_pop_free(addr, IPAddressFamily_free);
224e1051a39Sopenharmony_ci    ASN1_OCTET_STRING_free(ip1);
225e1051a39Sopenharmony_ci    ASN1_OCTET_STRING_free(ip2);
226e1051a39Sopenharmony_ci    return testresult;
227e1051a39Sopenharmony_ci}
228e1051a39Sopenharmony_ci
229e1051a39Sopenharmony_cistatic int test_addr_fam_len(void)
230e1051a39Sopenharmony_ci{
231e1051a39Sopenharmony_ci    int testresult = 0;
232e1051a39Sopenharmony_ci    IPAddrBlocks *addr = NULL;
233e1051a39Sopenharmony_ci    IPAddressFamily *f1 = NULL;
234e1051a39Sopenharmony_ci    ASN1_OCTET_STRING *ip1 = NULL, *ip2 = NULL;
235e1051a39Sopenharmony_ci    unsigned char key[6];
236e1051a39Sopenharmony_ci    unsigned int keylen;
237e1051a39Sopenharmony_ci    unsigned afi = IANA_AFI_IPV4;
238e1051a39Sopenharmony_ci
239e1051a39Sopenharmony_ci    /* Create the IPAddrBlocks with a good IPAddressFamily */
240e1051a39Sopenharmony_ci    addr = sk_IPAddressFamily_new_null();
241e1051a39Sopenharmony_ci    if (!TEST_ptr(addr))
242e1051a39Sopenharmony_ci        goto end;
243e1051a39Sopenharmony_ci    ip1 = a2i_IPADDRESS(ranges[0].ip1);
244e1051a39Sopenharmony_ci    if (!TEST_ptr(ip1))
245e1051a39Sopenharmony_ci        goto end;
246e1051a39Sopenharmony_ci    ip2 = a2i_IPADDRESS(ranges[0].ip2);
247e1051a39Sopenharmony_ci    if (!TEST_ptr(ip2))
248e1051a39Sopenharmony_ci        goto end;
249e1051a39Sopenharmony_ci    if (!TEST_true(X509v3_addr_add_range(addr, ranges[0].afi, NULL, ip1->data, ip2->data)))
250e1051a39Sopenharmony_ci        goto end;
251e1051a39Sopenharmony_ci    if (!TEST_true(X509v3_addr_is_canonical(addr)))
252e1051a39Sopenharmony_ci        goto end;
253e1051a39Sopenharmony_ci
254e1051a39Sopenharmony_ci    /* Create our malformed IPAddressFamily */
255e1051a39Sopenharmony_ci    key[0] = (afi >> 8) & 0xFF;
256e1051a39Sopenharmony_ci    key[1] = afi & 0xFF;
257e1051a39Sopenharmony_ci    key[2] = 0xD;
258e1051a39Sopenharmony_ci    key[3] = 0xE;
259e1051a39Sopenharmony_ci    key[4] = 0xA;
260e1051a39Sopenharmony_ci    key[5] = 0xD;
261e1051a39Sopenharmony_ci    keylen = 6;
262e1051a39Sopenharmony_ci    if ((f1 = IPAddressFamily_new()) == NULL)
263e1051a39Sopenharmony_ci        goto end;
264e1051a39Sopenharmony_ci    if (f1->ipAddressChoice == NULL &&
265e1051a39Sopenharmony_ci        (f1->ipAddressChoice = IPAddressChoice_new()) == NULL)
266e1051a39Sopenharmony_ci        goto end;
267e1051a39Sopenharmony_ci    if (f1->addressFamily == NULL &&
268e1051a39Sopenharmony_ci        (f1->addressFamily = ASN1_OCTET_STRING_new()) == NULL)
269e1051a39Sopenharmony_ci        goto end;
270e1051a39Sopenharmony_ci    if (!ASN1_OCTET_STRING_set(f1->addressFamily, key, keylen))
271e1051a39Sopenharmony_ci        goto end;
272e1051a39Sopenharmony_ci    if (!sk_IPAddressFamily_push(addr, f1))
273e1051a39Sopenharmony_ci        goto end;
274e1051a39Sopenharmony_ci
275e1051a39Sopenharmony_ci    /* Shouldn't be able to canonize this as the len is > 3*/
276e1051a39Sopenharmony_ci    if (!TEST_false(X509v3_addr_canonize(addr)))
277e1051a39Sopenharmony_ci        goto end;
278e1051a39Sopenharmony_ci
279e1051a39Sopenharmony_ci    /* Create a well formed IPAddressFamily */
280e1051a39Sopenharmony_ci    f1 = sk_IPAddressFamily_pop(addr);
281e1051a39Sopenharmony_ci    IPAddressFamily_free(f1);
282e1051a39Sopenharmony_ci
283e1051a39Sopenharmony_ci    key[0] = (afi >> 8) & 0xFF;
284e1051a39Sopenharmony_ci    key[1] = afi & 0xFF;
285e1051a39Sopenharmony_ci    key[2] = 0x1;
286e1051a39Sopenharmony_ci    keylen = 3;
287e1051a39Sopenharmony_ci    if ((f1 = IPAddressFamily_new()) == NULL)
288e1051a39Sopenharmony_ci        goto end;
289e1051a39Sopenharmony_ci    if (f1->ipAddressChoice == NULL &&
290e1051a39Sopenharmony_ci        (f1->ipAddressChoice = IPAddressChoice_new()) == NULL)
291e1051a39Sopenharmony_ci        goto end;
292e1051a39Sopenharmony_ci    if (f1->addressFamily == NULL &&
293e1051a39Sopenharmony_ci        (f1->addressFamily = ASN1_OCTET_STRING_new()) == NULL)
294e1051a39Sopenharmony_ci        goto end;
295e1051a39Sopenharmony_ci    if (!ASN1_OCTET_STRING_set(f1->addressFamily, key, keylen))
296e1051a39Sopenharmony_ci        goto end;
297e1051a39Sopenharmony_ci
298e1051a39Sopenharmony_ci    /* Mark this as inheritance so we skip some of the is_canonize checks */
299e1051a39Sopenharmony_ci    f1->ipAddressChoice->type = IPAddressChoice_inherit;
300e1051a39Sopenharmony_ci    if (!sk_IPAddressFamily_push(addr, f1))
301e1051a39Sopenharmony_ci        goto end;
302e1051a39Sopenharmony_ci
303e1051a39Sopenharmony_ci    /* Should be able to canonize now */
304e1051a39Sopenharmony_ci    if (!TEST_true(X509v3_addr_canonize(addr)))
305e1051a39Sopenharmony_ci        goto end;
306e1051a39Sopenharmony_ci
307e1051a39Sopenharmony_ci    testresult = 1;
308e1051a39Sopenharmony_ci  end:
309e1051a39Sopenharmony_ci    sk_IPAddressFamily_pop_free(addr, IPAddressFamily_free);
310e1051a39Sopenharmony_ci    ASN1_OCTET_STRING_free(ip1);
311e1051a39Sopenharmony_ci    ASN1_OCTET_STRING_free(ip2);
312e1051a39Sopenharmony_ci    return testresult;
313e1051a39Sopenharmony_ci}
314e1051a39Sopenharmony_ci
315e1051a39Sopenharmony_cistatic struct extvalues_st {
316e1051a39Sopenharmony_ci    const char *value;
317e1051a39Sopenharmony_ci    int pass;
318e1051a39Sopenharmony_ci} extvalues[] = {
319e1051a39Sopenharmony_ci    /* No prefix is ok */
320e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv4:192.0.0.1\n", 1 },
321e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv4:192.0.0.0/0\n", 1 },
322e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv4:192.0.0.0/1\n", 1 },
323e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv4:192.0.0.0/32\n", 1 },
324e1051a39Sopenharmony_ci    /* Prefix is too long */
325e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv4:192.0.0.0/33\n", 0 },
326e1051a39Sopenharmony_ci    /* Unreasonably large prefix */
327e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv4:192.0.0.0/12341234\n", 0 },
328e1051a39Sopenharmony_ci    /* Invalid IP addresses */
329e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv4:192.0.0\n", 0 },
330e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv4:256.0.0.0\n", 0 },
331e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv4:-1.0.0.0\n", 0 },
332e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv4:192.0.0.0.0\n", 0 },
333e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv3:192.0.0.0\n", 0 },
334e1051a39Sopenharmony_ci
335e1051a39Sopenharmony_ci    /* IPv6 */
336e1051a39Sopenharmony_ci    /* No prefix is ok */
337e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv6:2001:db8::\n", 1 },
338e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv6:2001::db8\n", 1 },
339e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv6:2001:0db8:0000:0000:0000:0000:0000:0000\n", 1 },
340e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv6:2001:db8::/0\n", 1 },
341e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv6:2001:db8::/1\n", 1 },
342e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv6:2001:db8::/32\n", 1 },
343e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv6:2001:0db8:0000:0000:0000:0000:0000:0000/32\n", 1 },
344e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv6:2001:db8::/128\n", 1 },
345e1051a39Sopenharmony_ci    /* Prefix is too long */
346e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv6:2001:db8::/129\n", 0 },
347e1051a39Sopenharmony_ci    /* Unreasonably large prefix */
348e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv6:2001:db8::/12341234\n", 0 },
349e1051a39Sopenharmony_ci    /* Invalid IP addresses */
350e1051a39Sopenharmony_ci    /* Not enough blocks of numbers */
351e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv6:2001:0db8:0000:0000:0000:0000:0000\n", 0 },
352e1051a39Sopenharmony_ci    /* Too many blocks of numbers */
353e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv6:2001:0db8:0000:0000:0000:0000:0000:0000:0000\n", 0 },
354e1051a39Sopenharmony_ci    /* First value too large */
355e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv6:1ffff:0db8:0000:0000:0000:0000:0000:0000\n", 0 },
356e1051a39Sopenharmony_ci    /* First value with invalid characters */
357e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv6:fffg:0db8:0000:0000:0000:0000:0000:0000\n", 0 },
358e1051a39Sopenharmony_ci    /* First value is negative */
359e1051a39Sopenharmony_ci    { "sbgp-ipAddrBlock = IPv6:-1:0db8:0000:0000:0000:0000:0000:0000\n", 0 }
360e1051a39Sopenharmony_ci};
361e1051a39Sopenharmony_ci
362e1051a39Sopenharmony_cistatic int test_ext_syntax(void)
363e1051a39Sopenharmony_ci{
364e1051a39Sopenharmony_ci    size_t i;
365e1051a39Sopenharmony_ci    int testresult = 1;
366e1051a39Sopenharmony_ci
367e1051a39Sopenharmony_ci    for (i = 0; i < OSSL_NELEM(extvalues); i++) {
368e1051a39Sopenharmony_ci        X509V3_CTX ctx;
369e1051a39Sopenharmony_ci        BIO *extbio = BIO_new_mem_buf(extvalues[i].value,
370e1051a39Sopenharmony_ci                                      strlen(extvalues[i].value));
371e1051a39Sopenharmony_ci        CONF *conf;
372e1051a39Sopenharmony_ci        long eline;
373e1051a39Sopenharmony_ci
374e1051a39Sopenharmony_ci        if (!TEST_ptr(extbio))
375e1051a39Sopenharmony_ci            return 0 ;
376e1051a39Sopenharmony_ci
377e1051a39Sopenharmony_ci        conf = NCONF_new_ex(NULL, NULL);
378e1051a39Sopenharmony_ci        if (!TEST_ptr(conf)) {
379e1051a39Sopenharmony_ci            BIO_free(extbio);
380e1051a39Sopenharmony_ci            return 0;
381e1051a39Sopenharmony_ci        }
382e1051a39Sopenharmony_ci        if (!TEST_long_gt(NCONF_load_bio(conf, extbio, &eline), 0)) {
383e1051a39Sopenharmony_ci            testresult = 0;
384e1051a39Sopenharmony_ci        } else {
385e1051a39Sopenharmony_ci            X509V3_set_ctx_test(&ctx);
386e1051a39Sopenharmony_ci            X509V3_set_nconf(&ctx, conf);
387e1051a39Sopenharmony_ci
388e1051a39Sopenharmony_ci            if (extvalues[i].pass) {
389e1051a39Sopenharmony_ci                if (!TEST_true(X509V3_EXT_add_nconf(conf, &ctx, "default",
390e1051a39Sopenharmony_ci                                                    NULL))) {
391e1051a39Sopenharmony_ci                    TEST_info("Value: %s", extvalues[i].value);
392e1051a39Sopenharmony_ci                    testresult = 0;
393e1051a39Sopenharmony_ci                }
394e1051a39Sopenharmony_ci            } else {
395e1051a39Sopenharmony_ci                ERR_set_mark();
396e1051a39Sopenharmony_ci                if (!TEST_false(X509V3_EXT_add_nconf(conf, &ctx, "default",
397e1051a39Sopenharmony_ci                                                     NULL))) {
398e1051a39Sopenharmony_ci                    testresult = 0;
399e1051a39Sopenharmony_ci                    TEST_info("Value: %s", extvalues[i].value);
400e1051a39Sopenharmony_ci                    ERR_clear_last_mark();
401e1051a39Sopenharmony_ci                } else {
402e1051a39Sopenharmony_ci                    ERR_pop_to_mark();
403e1051a39Sopenharmony_ci                }
404e1051a39Sopenharmony_ci            }
405e1051a39Sopenharmony_ci        }
406e1051a39Sopenharmony_ci        BIO_free(extbio);
407e1051a39Sopenharmony_ci        NCONF_free(conf);
408e1051a39Sopenharmony_ci    }
409e1051a39Sopenharmony_ci
410e1051a39Sopenharmony_ci    return testresult;
411e1051a39Sopenharmony_ci}
412e1051a39Sopenharmony_ci
413e1051a39Sopenharmony_cistatic int test_addr_subset(void)
414e1051a39Sopenharmony_ci{
415e1051a39Sopenharmony_ci    int i;
416e1051a39Sopenharmony_ci    int ret = 0;
417e1051a39Sopenharmony_ci    IPAddrBlocks *addrEmpty = NULL;
418e1051a39Sopenharmony_ci    IPAddrBlocks *addr[3] = { NULL, NULL };
419e1051a39Sopenharmony_ci    ASN1_OCTET_STRING *ip1[3] = { NULL, NULL };
420e1051a39Sopenharmony_ci    ASN1_OCTET_STRING *ip2[3] = { NULL, NULL };
421e1051a39Sopenharmony_ci    int sz = OSSL_NELEM(addr);
422e1051a39Sopenharmony_ci
423e1051a39Sopenharmony_ci    for (i = 0; i < sz; ++i) {
424e1051a39Sopenharmony_ci        /* Create the IPAddrBlocks with a good IPAddressFamily */
425e1051a39Sopenharmony_ci        if (!TEST_ptr(addr[i] = sk_IPAddressFamily_new_null())
426e1051a39Sopenharmony_ci            || !TEST_ptr(ip1[i] = a2i_IPADDRESS(ranges[i].ip1))
427e1051a39Sopenharmony_ci            || !TEST_ptr(ip2[i] = a2i_IPADDRESS(ranges[i].ip2))
428e1051a39Sopenharmony_ci            || !TEST_true(X509v3_addr_add_range(addr[i], ranges[i].afi, NULL,
429e1051a39Sopenharmony_ci                                                ip1[i]->data, ip2[i]->data)))
430e1051a39Sopenharmony_ci            goto end;
431e1051a39Sopenharmony_ci    }
432e1051a39Sopenharmony_ci
433e1051a39Sopenharmony_ci    ret = TEST_ptr(addrEmpty = sk_IPAddressFamily_new_null())
434e1051a39Sopenharmony_ci          && TEST_true(X509v3_addr_subset(NULL, NULL))
435e1051a39Sopenharmony_ci          && TEST_true(X509v3_addr_subset(NULL, addr[0]))
436e1051a39Sopenharmony_ci          && TEST_true(X509v3_addr_subset(addrEmpty, addr[0]))
437e1051a39Sopenharmony_ci          && TEST_true(X509v3_addr_subset(addr[0], addr[0]))
438e1051a39Sopenharmony_ci          && TEST_true(X509v3_addr_subset(addr[0], addr[1]))
439e1051a39Sopenharmony_ci          && TEST_true(X509v3_addr_subset(addr[0], addr[2]))
440e1051a39Sopenharmony_ci          && TEST_true(X509v3_addr_subset(addr[1], addr[2]))
441e1051a39Sopenharmony_ci          && TEST_false(X509v3_addr_subset(addr[0], NULL))
442e1051a39Sopenharmony_ci          && TEST_false(X509v3_addr_subset(addr[1], addr[0]))
443e1051a39Sopenharmony_ci          && TEST_false(X509v3_addr_subset(addr[2], addr[1]))
444e1051a39Sopenharmony_ci          && TEST_false(X509v3_addr_subset(addr[0], addrEmpty));
445e1051a39Sopenharmony_ciend:
446e1051a39Sopenharmony_ci    sk_IPAddressFamily_pop_free(addrEmpty, IPAddressFamily_free);
447e1051a39Sopenharmony_ci    for (i = 0; i < sz; ++i) {
448e1051a39Sopenharmony_ci        sk_IPAddressFamily_pop_free(addr[i], IPAddressFamily_free);
449e1051a39Sopenharmony_ci        ASN1_OCTET_STRING_free(ip1[i]);
450e1051a39Sopenharmony_ci        ASN1_OCTET_STRING_free(ip2[i]);
451e1051a39Sopenharmony_ci    }
452e1051a39Sopenharmony_ci    return ret;
453e1051a39Sopenharmony_ci}
454e1051a39Sopenharmony_ci
455e1051a39Sopenharmony_ci#endif /* OPENSSL_NO_RFC3779 */
456e1051a39Sopenharmony_ci
457e1051a39Sopenharmony_ciOPT_TEST_DECLARE_USAGE("cert.pem\n")
458e1051a39Sopenharmony_ci
459e1051a39Sopenharmony_ciint setup_tests(void)
460e1051a39Sopenharmony_ci{
461e1051a39Sopenharmony_ci    if (!test_skip_common_options()) {
462e1051a39Sopenharmony_ci        TEST_error("Error parsing test options\n");
463e1051a39Sopenharmony_ci        return 0;
464e1051a39Sopenharmony_ci    }
465e1051a39Sopenharmony_ci
466e1051a39Sopenharmony_ci    if (!TEST_ptr(infile = test_get_argument(0)))
467e1051a39Sopenharmony_ci        return 0;
468e1051a39Sopenharmony_ci
469e1051a39Sopenharmony_ci    ADD_TEST(test_pathlen);
470e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_RFC3779
471e1051a39Sopenharmony_ci    ADD_TEST(test_asid);
472e1051a39Sopenharmony_ci    ADD_TEST(test_addr_ranges);
473e1051a39Sopenharmony_ci    ADD_TEST(test_ext_syntax);
474e1051a39Sopenharmony_ci    ADD_TEST(test_addr_fam_len);
475e1051a39Sopenharmony_ci    ADD_TEST(test_addr_subset);
476e1051a39Sopenharmony_ci#endif /* OPENSSL_NO_RFC3779 */
477e1051a39Sopenharmony_ci    return 1;
478e1051a39Sopenharmony_ci}
479