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