@@ -2109,6 +2109,70 @@ int test_wolfSSL_X509_check_host_IP_only_SAN_CN_fallback(void)
21092109 return EXPECT_RESULT ();
21102110}
21112111
2112+ int test_wolfSSL_X509_check_host_URI_SAN_not_DNS_match (void )
2113+ {
2114+ EXPECT_DECLS ;
2115+ #if !defined(NO_FILESYSTEM ) && !defined(NO_CERTS ) && !defined(NO_RSA ) && \
2116+ defined(OPENSSL_EXTRA ) && defined(WOLFSSL_CERT_GEN ) && \
2117+ defined(WOLFSSL_CERT_EXT ) && defined(WOLFSSL_ALT_NAMES ) && \
2118+ !defined(NO_SHA256 )
2119+ /* RFC 6125 Sec. 6.4 / RFC 9525 Sec. 6.3: DNS-ID reference identifiers
2120+ * must be matched only against dNSName SANs, not uniformResourceIdentifier.
2121+ * wolfSSL_X509_add_altname() is used to attach a bare-hostname URI SAN
2122+ * (the misissue shape that can reach altNames when certificate parsing is
2123+ * built without strict URI checks). URI SAN presence still suppresses CN
2124+ * fallback per RFC 6125 Sec. 6.4.4. */
2125+ WOLFSSL_EVP_PKEY * priv = NULL ;
2126+ WOLFSSL_X509_NAME * name = NULL ;
2127+ const char * server_cert = "./certs/test/server-goodcn.pem" ;
2128+ const char hostName [] = "cnhost.local" ;
2129+ const char uriSan [] = "cnhost.local" ;
2130+ byte * pt ;
2131+ WOLFSSL_X509 * leafUri = NULL ;
2132+ WOLFSSL_X509 * leafUriDns = NULL ;
2133+
2134+ pt = (byte * )server_key_der_2048 ;
2135+ ExpectNotNull (priv = wolfSSL_d2i_PrivateKey (EVP_PKEY_RSA , NULL ,
2136+ (const unsigned char * * )& pt , sizeof_server_key_der_2048 ));
2137+
2138+ ExpectNotNull (leafUri = wolfSSL_X509_load_certificate_file (server_cert ,
2139+ WOLFSSL_FILETYPE_PEM ));
2140+ ExpectNotNull (name = X509_NAME_new ());
2141+ ExpectIntEQ (X509_NAME_add_entry_by_txt (name , "commonName" , MBSTRING_UTF8 ,
2142+ (byte * )hostName , (int )XSTRLEN (hostName ), -1 , 0 ), SSL_SUCCESS );
2143+ ExpectIntEQ (wolfSSL_X509_set_subject_name (leafUri , name ), WOLFSSL_SUCCESS );
2144+ X509_NAME_free (name );
2145+ name = NULL ;
2146+ ExpectIntEQ (wolfSSL_X509_add_altname (leafUri , uriSan , ASN_URI_TYPE ),
2147+ WOLFSSL_SUCCESS );
2148+ ExpectIntGT (wolfSSL_X509_sign (leafUri , priv , EVP_sha256 ()), 0 );
2149+ ExpectIntEQ (wolfSSL_X509_check_host (leafUri , hostName , XSTRLEN (hostName ),
2150+ 0 , NULL ), WC_NO_ERR_TRACE (WOLFSSL_FAILURE ));
2151+
2152+ ExpectNotNull (leafUriDns = wolfSSL_X509_load_certificate_file (server_cert ,
2153+ WOLFSSL_FILETYPE_PEM ));
2154+ ExpectNotNull (name = X509_NAME_new ());
2155+ ExpectIntEQ (X509_NAME_add_entry_by_txt (name , "commonName" , MBSTRING_UTF8 ,
2156+ (byte * )hostName , (int )XSTRLEN (hostName ), -1 , 0 ), SSL_SUCCESS );
2157+ ExpectIntEQ (wolfSSL_X509_set_subject_name (leafUriDns , name ),
2158+ WOLFSSL_SUCCESS );
2159+ X509_NAME_free (name );
2160+ name = NULL ;
2161+ ExpectIntEQ (wolfSSL_X509_add_altname (leafUriDns , uriSan , ASN_URI_TYPE ),
2162+ WOLFSSL_SUCCESS );
2163+ ExpectIntEQ (wolfSSL_X509_add_altname (leafUriDns , hostName , ASN_DNS_TYPE ),
2164+ WOLFSSL_SUCCESS );
2165+ ExpectIntGT (wolfSSL_X509_sign (leafUriDns , priv , EVP_sha256 ()), 0 );
2166+ ExpectIntEQ (wolfSSL_X509_check_host (leafUriDns , hostName ,
2167+ XSTRLEN (hostName ), 0 , NULL ), WOLFSSL_SUCCESS );
2168+
2169+ wolfSSL_X509_free (leafUri );
2170+ wolfSSL_X509_free (leafUriDns );
2171+ wolfSSL_EVP_PKEY_free (priv );
2172+ #endif
2173+ return EXPECT_RESULT ();
2174+ }
2175+
21122176int test_wolfSSL_CertManagerCRL (void )
21132177{
21142178 EXPECT_DECLS ;
0 commit comments