Skip to content

Commit 3351eb4

Browse files
authored
Merge pull request #10354 from embhorn/zd21725
Fix IPSAN and registeredID handling
2 parents f1fff73 + 9802b35 commit 3351eb4

11 files changed

Lines changed: 740 additions & 53 deletions

File tree

certs/test/cert-ext-ncrid.der

1.06 KB
Binary file not shown.

certs/test/cert-ext-ncrid.pem

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIEOjCCAyKgAwIBAgIUBD6sBdFHNsQ5qoW3MIkJ/BKsB/4wDQYJKoZIhvcNAQEL
3+
BQAwezELMAkGA1UEBhMCQVUxEzARBgNVBAgMClF1ZWVuc2xhbmQxETAPBgNVBAcM
4+
CEJyaXNiYW5lMRQwEgYDVQQKDAt3b2xmU1NMIEluYzEUMBIGA1UECwwLRW5naW5l
5+
ZXJpbmcxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTAeFw0yNjA0MjkyMTAzMTZa
6+
Fw0yOTAxMjMyMTAzMTZaMHsxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApRdWVlbnNs
7+
YW5kMREwDwYDVQQHDAhCcmlzYmFuZTEUMBIGA1UECgwLd29sZlNTTCBJbmMxFDAS
8+
BgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20wggEi
9+
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAlQjhV0HycW230kVBJwFlxkWu
10+
8rwkMLiVzi9O1vYciLx8n/uoZ3/+XJxRdfeKygfnNS+P4b17wC98q2SoF/zKXXu6
11+
4CHlci5vLobYlXParBtTuV8/1xkNJU/hY2NRiwtkP61DuKUcXDSzrgCgY8X2fwtZ
12+
aHhzpowYqQJtr8MZAS64EOPGzEC0aaNGM2mHbsS7F6bz6N2tc7x7LyG1/WZRDL1U
13+
s+FtXxy8I3PRCQOJFNIQuWTDKtChlkq84dQaW8egwMFjeA9ENzAyloAyI5Whd7oT
14+
0pdz4l0lyWoNwzlgpLSwaUJCCenYCLwzILNYIqeq68Th5mGDxdKW39nQT63XAgMB
15+
AAGjgbUwgbIwHQYDVR0OBBYEFLMRMsmSmITiyfjQO24DQsofDo48MB8GA1UdIwQY
16+
MBaAFLMRMsmSmITiyfjQO24DQsofDo48MBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYD
17+
VR0PAQH/BAQDAgGGMBYGA1UdHgEB/wQMMAqgCDAGiAQqAwQFMDQGCWCGSAGG+EIB
18+
DQQnFiVUZXN0aW5nIHJlZ2lzdGVyZWRJRCBuYW1lIGNvbnN0cmFpbnRzMA0GCSqG
19+
SIb3DQEBCwUAA4IBAQARs/sdZs71KWRoyWuTevfnS5h5PH9S07xl+hFcfSXpI6sx
20+
gQoBMzEv8BBN3vLL4HOoNCwnqmFbwG5ogt/HuohAT6bXtdIkK1jNEP50t1pdDOmi
21+
/3fYKDvjvtX2DDQe2K8o/qVsu63MtKkOuc1ZURtsVrlrFFW7D7FsuNxa1dS8fbGl
22+
qrEnIXKemPmco5EIFDygXFIFkL/CP/LxHjTOuib68hBUDOqhMpMruSp7OfAt9Kfe
23+
rsEVY5mv82DfaCjo9bw17dSHUFo4vC+wzB5E8Wg33Pxbn0v8aRTvAsPz22Mlkd9b
24+
mxdLFh0mqPBj/UvWOK1xH0kXGsblNNAz5KeDceAZ
25+
-----END CERTIFICATE-----

certs/test/gen-ext-certs.sh

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,35 @@ EOF
196196
gen_cert
197197
rm -f ./certs/test/cert-ext-ncip.cfg
198198

199+
OUT=certs/test/cert-ext-ncrid
200+
KEYFILE=certs/test/cert-ext-ncrid-key.der
201+
CONFIG=certs/test/cert-ext-ncrid.cfg
202+
tee >$CONFIG <<EOF
203+
[ req ]
204+
distinguished_name = req_distinguished_name
205+
prompt = no
206+
x509_extensions = v3_ca
207+
208+
[ req_distinguished_name ]
209+
C = AU
210+
ST = Queensland
211+
L = Brisbane
212+
O = wolfSSL Inc
213+
OU = Engineering
214+
CN = www.wolfssl.com
215+
216+
[ v3_ca ]
217+
subjectKeyIdentifier = hash
218+
authorityKeyIdentifier = keyid:always,issuer
219+
basicConstraints = critical, CA:true, pathlen:0
220+
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
221+
nameConstraints = critical,permitted;RID:1.2.3.4.5
222+
nsComment = "Testing registeredID name constraints"
223+
224+
EOF
225+
gen_cert
226+
rm -f ./certs/test/cert-ext-ncrid.cfg
227+
199228
OUT=certs/test/cert-ext-ia
200229
KEYFILE=certs/test/cert-ext-ia-key.der
201230
CONFIG=certs/test/cert-ext-ia.cfg

certs/test/include.am

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ EXTRA_DIST += \
1313
certs/test/cert-ext-nc-combined.pem \
1414
certs/test/cert-ext-ncip.der \
1515
certs/test/cert-ext-ncip.pem \
16+
certs/test/cert-ext-ncrid.der \
17+
certs/test/cert-ext-ncrid.pem \
1618
certs/test/cert-ext-ncdns.der \
1719
certs/test/cert-ext-ncdns.pem \
1820
certs/test/cert-ext-ncmulti.der \

src/internal.c

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13575,8 +13575,29 @@ int CheckForAltNames(DecodedCert* dCert, const char* domain, word32 domainLen,
1357513575
if (dCert != NULL)
1357613576
altName = dCert->altNames;
1357713577

13578-
if (checkCN != NULL)
13579-
*checkCN = (altName == NULL) ? 1 : 0;
13578+
if (checkCN != NULL) {
13579+
/* CN fallback is suppressed when the cert presents any altName
13580+
* usable for hostname matching. Without WOLFSSL_IP_ALT_NAME the
13581+
* iPAddress branch below is compiled out, so iPAddress entries
13582+
* cannot match anything here; treat them as absent so a cert
13583+
* presenting only iPAddress SANs still falls back to CN as it
13584+
* did before iPAddress entries were unconditionally added to
13585+
* altNames for name-constraint enforcement. The same reasoning
13586+
* applies to registeredID entries: hostname matching against an
13587+
* OID is not meaningful, so they never count toward *checkCN. */
13588+
DNS_entry* a = altName;
13589+
*checkCN = 1;
13590+
for (; a != NULL; a = a->next) {
13591+
#ifndef WOLFSSL_IP_ALT_NAME
13592+
if (a->type == ASN_IP_TYPE)
13593+
continue;
13594+
#endif
13595+
if (a->type == ASN_RID_TYPE)
13596+
continue;
13597+
*checkCN = 0;
13598+
break;
13599+
}
13600+
}
1358013601

1358113602
for (; altName != NULL; altName = altName->next) {
1358213603
WOLFSSL_MSG("\tindividual AltName check");
@@ -13599,6 +13620,13 @@ int CheckForAltNames(DecodedCert* dCert, const char* domain, word32 domainLen,
1359913620
continue;
1360013621
}
1360113622

13623+
/* registeredID entries hold raw OID bytes; they are not eligible
13624+
* for hostname matching regardless of build flags. */
13625+
if (altName->type == ASN_RID_TYPE) {
13626+
WOLFSSL_MSG("\tAltName is registeredID, skipping for hostname");
13627+
continue;
13628+
}
13629+
1360213630
if (MatchDomainName(buf, (int)len, domain, domainLen, flags)) {
1360313631
match = 1;
1360413632
if (checkCN != NULL) {

src/x509.c

Lines changed: 66 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -650,8 +650,14 @@ static int DNS_to_GENERAL_NAME(WOLFSSL_GENERAL_NAME* gn, DNS_entry* dns)
650650
/* @TODO extract dir name info from DNS_entry */
651651
break;
652652

653-
#ifdef WOLFSSL_RID_ALT_NAME
654653
case WOLFSSL_GEN_RID:
654+
/* registeredID is parsed into altNames unconditionally so
655+
* ConfirmNameConstraints can enforce RID name constraints
656+
* (RFC 5280 Sec. 4.2.1.10). The body uses only the raw OID
657+
* bytes carried in dns->name/dns->len and constructs a
658+
* proper ASN1_OBJECT, so this case is independent of
659+
* WOLFSSL_RID_ALT_NAME (which only gates the human-readable
660+
* ridString form). */
655661
gn->type = dns->type;
656662
/* wolfSSL_GENERAL_NAME_new() mallocs this by default */
657663
wolfSSL_ASN1_STRING_free(gn->d.ia5);
@@ -681,7 +687,6 @@ static int DNS_to_GENERAL_NAME(WOLFSSL_GENERAL_NAME* gn, DNS_entry* dns)
681687
gn->d.registeredID->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA;
682688
gn->d.registeredID->grp = oidCertExtType;
683689
break;
684-
#endif
685690

686691
case WOLFSSL_GEN_X400:
687692
/* Unsupported: fall through */
@@ -2533,8 +2538,12 @@ void* wolfSSL_X509_get_ext_d2i(const WOLFSSL_X509* x509, int nid, int* c,
25332538
gn->d.iPAddress->type = WOLFSSL_V_ASN1_OCTET_STRING;
25342539
break;
25352540

2536-
#ifdef WOLFSSL_RID_ALT_NAME
25372541
case ASN_RID_TYPE:
2542+
/* Always handle registeredID: the union
2543+
* member d.registeredID is populated from
2544+
* raw OID body bytes. WOLFSSL_RID_ALT_NAME
2545+
* only gates the human-readable ridString,
2546+
* which this path does not need. */
25382547
gn->type = dns->type;
25392548
/* Free ia5 before using union for registeredID */
25402549
wolfSSL_ASN1_STRING_free(gn->d.ia5);
@@ -2567,7 +2576,6 @@ void* wolfSSL_X509_get_ext_d2i(const WOLFSSL_X509* x509, int nid, int* c,
25672576
WOLFSSL_ASN1_DYNAMIC_DATA;
25682577
gn->d.registeredID->grp = oidCertExtType;
25692578
break;
2570-
#endif /* WOLFSSL_RID_ALT_NAME */
25712579

25722580
default:
25732581
gn->type = dns->type;
@@ -4272,13 +4280,49 @@ char* wolfSSL_X509_get_next_altname(WOLFSSL_X509* cert)
42724280
return NULL;
42734281
}
42744282

4283+
/* In default builds iPAddress entries hold raw 4/16 octet payloads
4284+
* and registeredID entries hold raw OID body bytes (no human-readable
4285+
* ipString/ridString), so returning them as a C string would truncate
4286+
* at any embedded NUL byte. Such entries are still parsed into
4287+
* altNames for name-constraint enforcement; skip them here so
4288+
* string-iteration callers see the same set of entries as before.
4289+
*
4290+
* With WOLFSSL_MULTICIRCULATE_ALTNAMELIST, a list consisting only of
4291+
* skipped entries collapses to "no entries" on the first pass and
4292+
* resets to head on the next call; the cycle shape matches the
4293+
* pre-fix behavior where such entries were never parsed. */
4294+
#if !defined(WOLFSSL_IP_ALT_NAME) || !defined(WOLFSSL_RID_ALT_NAME)
4295+
while (cert->altNamesNext != NULL) {
4296+
int skip = 0;
4297+
#ifndef WOLFSSL_IP_ALT_NAME
4298+
if (cert->altNamesNext->type == ASN_IP_TYPE)
4299+
skip = 1;
4300+
#endif
4301+
#ifndef WOLFSSL_RID_ALT_NAME
4302+
if (cert->altNamesNext->type == ASN_RID_TYPE)
4303+
skip = 1;
4304+
#endif
4305+
if (!skip)
4306+
break;
4307+
cert->altNamesNext = cert->altNamesNext->next;
4308+
}
4309+
if (cert->altNamesNext == NULL)
4310+
return NULL;
4311+
#endif /* !WOLFSSL_IP_ALT_NAME || !WOLFSSL_RID_ALT_NAME */
4312+
42754313
/* unsafe cast required for ABI compatibility. */
42764314
ret = (char *)(wc_ptr_t)cert->altNamesNext->name;
42774315
#ifdef WOLFSSL_IP_ALT_NAME
42784316
/* return the IP address as a string */
42794317
if (cert->altNamesNext->type == ASN_IP_TYPE) {
42804318
ret = cert->altNamesNext->ipString;
42814319
}
4320+
#endif
4321+
#ifdef WOLFSSL_RID_ALT_NAME
4322+
/* return the registeredID as a string */
4323+
if (cert->altNamesNext->type == ASN_RID_TYPE) {
4324+
ret = cert->altNamesNext->ridString;
4325+
}
42824326
#endif
42834327
cert->altNamesNext = cert->altNamesNext->next;
42844328

@@ -6909,6 +6953,14 @@ static int X509_print_name_entry(WOLFSSL_BIO* bio,
69096953
len = XSNPRINTF(scratch, MAX_WIDTH, "IP Address:%s",
69106954
entry->ipString);
69116955
}
6956+
#else
6957+
else if (entry->type == ASN_IP_TYPE) {
6958+
/* iPAddress entries are now always parsed into altNames so
6959+
* name constraints can be enforced. Without the
6960+
* human-readable ipString field, emit a fixed label so this
6961+
* print path does not fail. */
6962+
len = XSNPRINTF(scratch, MAX_WIDTH, "IP Address:<unavailable>");
6963+
}
69126964
#endif /* OPENSSL_ALL || WOLFSSL_IP_ALT_NAME */
69136965
else if (entry->type == ASN_RFC822_TYPE) {
69146966
len = XSNPRINTF(scratch, MAX_WIDTH, "email:%s",
@@ -6921,12 +6973,20 @@ static int X509_print_name_entry(WOLFSSL_BIO* bio,
69216973
len = XSNPRINTF(scratch, MAX_WIDTH, "URI:%s",
69226974
entry->name);
69236975
}
6924-
#if defined(OPENSSL_ALL)
6976+
#ifdef WOLFSSL_RID_ALT_NAME
69256977
else if (entry->type == ASN_RID_TYPE) {
69266978
len = XSNPRINTF(scratch, MAX_WIDTH, "Registered ID:%s",
69276979
entry->ridString);
69286980
}
6929-
#endif
6981+
#else
6982+
else if (entry->type == ASN_RID_TYPE) {
6983+
/* registeredID entries are now always parsed into altNames
6984+
* so name constraints can be enforced. Without the
6985+
* human-readable ridString field, emit a fixed label so
6986+
* this print path does not fail. */
6987+
len = XSNPRINTF(scratch, MAX_WIDTH, "Registered ID:<unavailable>");
6988+
}
6989+
#endif /* WOLFSSL_RID_ALT_NAME */
69306990
else if (entry->type == ASN_OTHER_TYPE) {
69316991
len = XSNPRINTF(scratch, MAX_WIDTH,
69326992
"othername <unsupported>");

tests/api.c

Lines changed: 61 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -24006,11 +24006,25 @@ static word32 build_otherName_san(byte* out, word32 outSz, const char* val7)
2400624006
return (word32)(sizeof(prefix) + 7);
2400724007
}
2400824008

24009+
/* Build a SubjectAltName extension value with a single registeredID
24010+
* GeneralName for OID 1.2.3.4, to use as the leaf SAN in RID tests. */
24011+
static word32 build_registeredID_san(byte* out, word32 outSz)
24012+
{
24013+
static const byte ridSan[] = {
24014+
0x30, 0x05, /* SEQUENCE, 5 */
24015+
0x88, 0x03, /* [8] regId, 3 */
24016+
0x2A, 0x03, 0x04 /* OID 1.2.3.4 */
24017+
};
24018+
if (outSz < sizeof(ridSan))
24019+
return 0;
24020+
XMEMCPY(out, ridSan, sizeof(ridSan));
24021+
return (word32)sizeof(ridSan);
24022+
}
24023+
2400924024
/* Build a NameConstraints extension value with a single excludedSubtree
24010-
* carrying a registeredID GeneralName for OID 1.2.3.4. registeredID is a
24011-
* GeneralName form wolfSSL does not enforce, so DecodeSubtree() must
24012-
* record it as 'unsupported' and ConfirmNameConstraints() must fail
24013-
* closed when the extension is critical (RFC 5280 4.2.1.10). */
24025+
* carrying a registeredID GeneralName for OID 1.2.3.4. wolfSSL enforces
24026+
* registeredID name constraints by byte-comparing OID bodies, so a leaf
24027+
* whose registeredID SAN matches this exclusion must be rejected. */
2401424028
static word32 build_registeredID_nameConstraints(byte* out, word32 outSz)
2401524029
{
2401624030
static const byte ridNc[] = {
@@ -24187,10 +24201,12 @@ static int verify_with_otherName_chain(const byte* nameConstraintsDer,
2418724201
* (excluded is enforced regardless of criticality)
2418824202
* 4. Critical permitted subtree, leaf SAN matches -> accept
2418924203
* 5. Critical permitted subtree, leaf SAN does NOT match -> reject
24190-
* 6. Critical nameConstraints carrying an unsupported form
24191-
* (registeredID), leaf has no relevant SAN -> reject
24192-
* (RFC 5280 4.2.1.10 fail-closed for unprocessed forms)
24193-
* 7. Same as (6) but non-critical -> accept
24204+
* 6. Critical excluded registeredID subtree, leaf SAN matches -> reject
24205+
* (registeredID is enforced by byte-comparison of OID bodies)
24206+
* 7. Non-critical excluded registeredID subtree, leaf SAN matches -> reject
24207+
* (excluded subtrees are enforced regardless of criticality)
24208+
* 8. Critical excluded registeredID subtree, leaf has no RID SAN -> accept
24209+
* (no match in excluded list, constraint is satisfied)
2419424210
*/
2419524211
static int test_NameConstraints_OtherName(void)
2419624212
{
@@ -24203,16 +24219,19 @@ static int test_NameConstraints_OtherName(void)
2420324219
defined(HAVE_OID_ENCODING) && !defined(IGNORE_NAME_CONSTRAINTS)
2420424220
byte sanBlocked[64];
2420524221
byte sanAllowed[64];
24222+
byte sanRegisteredID[16];
2420624223
byte ncExcludedBlocked[64];
2420724224
byte ncPermittedAllowed[64];
2420824225
byte ncRegisteredID[16];
24209-
word32 sanBlockedSz, sanAllowedSz;
24226+
word32 sanBlockedSz, sanAllowedSz, sanRegisteredIDSz;
2421024227
word32 ncExcludedBlockedSz, ncPermittedAllowedSz, ncRegisteredIDSz;
2421124228

2421224229
sanBlockedSz =
2421324230
build_otherName_san(sanBlocked, sizeof(sanBlocked), "blocked");
2421424231
sanAllowedSz =
2421524232
build_otherName_san(sanAllowed, sizeof(sanAllowed), "allowed");
24233+
sanRegisteredIDSz =
24234+
build_registeredID_san(sanRegisteredID, sizeof(sanRegisteredID));
2421624235
ncExcludedBlockedSz = build_otherName_nameConstraints(
2421724236
ncExcludedBlocked, sizeof(ncExcludedBlocked), 1, "blocked");
2421824237
ncPermittedAllowedSz = build_otherName_nameConstraints(
@@ -24221,6 +24240,7 @@ static int test_NameConstraints_OtherName(void)
2422124240
ncRegisteredID, sizeof(ncRegisteredID));
2422224241
ExpectIntGT((int)sanBlockedSz, 0);
2422324242
ExpectIntGT((int)sanAllowedSz, 0);
24243+
ExpectIntGT((int)sanRegisteredIDSz, 0);
2422424244
ExpectIntGT((int)ncExcludedBlockedSz, 0);
2422524245
ExpectIntGT((int)ncPermittedAllowedSz, 0);
2422624246
ExpectIntGT((int)ncRegisteredIDSz, 0);
@@ -24263,20 +24283,25 @@ static int test_NameConstraints_OtherName(void)
2426324283
sanBlocked, sanBlockedSz),
2426424284
WC_NO_ERR_TRACE(ASN_NAME_INVALID_E));
2426524285

24266-
/* (6) Critical nameConstraints carrying a GeneralName form wolfSSL
24267-
* does not enforce (registeredID). RFC 5280 4.2.1.10 requires the
24268-
* verifier to either process the constraint or reject; we reject
24269-
* fail-closed. The leaf needs no SAN to exercise this path. */
24286+
/* (6) Critical excluded registeredID subtree, leaf SAN matches:
24287+
* registeredID is now enforced by byte-comparing OID bodies, so a
24288+
* matching excluded entry must be rejected. */
2427024289
ExpectIntEQ(verify_with_otherName_chain(
24271-
ncRegisteredID, ncRegisteredIDSz, 1, NULL, 0),
24290+
ncRegisteredID, ncRegisteredIDSz, 1,
24291+
sanRegisteredID, sanRegisteredIDSz),
24292+
WC_NO_ERR_TRACE(ASN_NAME_INVALID_E));
24293+
24294+
/* (7) Non-critical excluded registeredID subtree, leaf SAN matches:
24295+
* excluded subtrees are enforced regardless of criticality. */
24296+
ExpectIntEQ(verify_with_otherName_chain(
24297+
ncRegisteredID, ncRegisteredIDSz, 0,
24298+
sanRegisteredID, sanRegisteredIDSz),
2427224299
WC_NO_ERR_TRACE(ASN_NAME_INVALID_E));
2427324300

24274-
/* (7) Same as (6) but non-critical: RFC 5280 only mandates the
24275-
* fail-closed reject when the extension is critical, so a
24276-
* non-critical unsupported constraint form is silently ignored
24277-
* and verification succeeds. */
24301+
/* (8) Critical excluded registeredID subtree, leaf has no RID SAN:
24302+
* no excluded match, so verification succeeds. */
2427824303
ExpectIntEQ(verify_with_otherName_chain(
24279-
ncRegisteredID, ncRegisteredIDSz, 0, NULL, 0),
24304+
ncRegisteredID, ncRegisteredIDSz, 1, NULL, 0),
2428024305
0);
2428124306
#endif
2428224307
return EXPECT_RESULT();
@@ -26733,11 +26758,25 @@ static int test_wolfSSL_X509_print(void)
2673326758
/* Will print IP address subject alt name. */
2673426759
ExpectIntEQ(BIO_get_mem_data(bio, NULL), 3350);
2673526760
#endif
26736-
#elif defined(NO_ASN_TIME)
26737-
/* With NO_ASN_TIME defined, X509_print skips printing Validity. */
26761+
#elif defined(IGNORE_NAME_CONSTRAINTS)
26762+
/* DecodeGeneralName skips iPAddress entries when name constraints
26763+
* are disabled, so the IP SAN never reaches the print path. */
26764+
#if defined(NO_ASN_TIME)
2673826765
ExpectIntEQ(BIO_get_mem_data(bio, NULL), 3213);
26739-
#else
26766+
#else
2674026767
ExpectIntEQ(BIO_get_mem_data(bio, NULL), 3328);
26768+
#endif
26769+
#elif defined(NO_ASN_TIME)
26770+
/* With NO_ASN_TIME defined, X509_print skips printing Validity.
26771+
* iPAddress SAN now always parsed; prints as
26772+
* "IP Address:<unavailable>" (+26 bytes) without
26773+
* WOLFSSL_IP_ALT_NAME. */
26774+
ExpectIntEQ(BIO_get_mem_data(bio, NULL), 3239);
26775+
#else
26776+
/* iPAddress SAN now always parsed; prints as
26777+
* "IP Address:<unavailable>" (+26 bytes) without
26778+
* WOLFSSL_IP_ALT_NAME. */
26779+
ExpectIntEQ(BIO_get_mem_data(bio, NULL), 3354);
2674126780
#endif
2674226781
BIO_free(bio);
2674326782
bio = NULL;

0 commit comments

Comments
 (0)