Skip to content

Commit ea2ead8

Browse files
committed
Implement code review feedback for hostname/IP verify
- Use WOLFSSL_-prefixed error constants (always available) instead of OPENSSL_COEXIST-guarded macros, fixing error code mismatch in coexist builds - Set ctx->current_cert = orig on hostname/IP mismatch so error reporting aligns with error_depth = 0 (leaf cert) - Add IP address verification test cases (match + mismatch)
1 parent a243f0b commit ea2ead8

5 files changed

Lines changed: 44 additions & 15 deletions

File tree

src/internal.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26975,6 +26975,12 @@ static const char* wolfSSL_ERR_reason_error_string_OpenSSL(unsigned long e)
2697526975
case WOLFSSL_X509_V_ERR_SUBJECT_ISSUER_MISMATCH:
2697626976
return "subject issuer mismatch";
2697726977

26978+
case WOLFSSL_X509_V_ERR_HOSTNAME_MISMATCH:
26979+
return "hostname mismatch";
26980+
26981+
case WOLFSSL_X509_V_ERR_IP_ADDRESS_MISMATCH:
26982+
return "IP address mismatch";
26983+
2697826984
default:
2697926985
return NULL;
2698026986
}

src/x509_str.c

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -749,25 +749,19 @@ int wolfSSL_X509_verify_cert(WOLFSSL_X509_STORE_CTX* ctx)
749749
ctx->param->hostName,
750750
XSTRLEN(ctx->param->hostName),
751751
ctx->param->hostFlags, NULL) != WOLFSSL_SUCCESS) {
752-
#ifndef OPENSSL_COEXIST
753-
ctx->error = X509_V_ERR_HOSTNAME_MISMATCH;
754-
#else
755-
ctx->error = 1; /* Return generic error */
756-
#endif
752+
ctx->error = WOLFSSL_X509_V_ERR_HOSTNAME_MISMATCH;
757753
ctx->error_depth = 0;
754+
ctx->current_cert = orig;
758755
ret = WOLFSSL_FAILURE;
759756
}
760757
}
761758
else if (ctx->param->ipasc[0] != '\0') {
762759
if (wolfSSL_X509_check_ip_asc(orig,
763760
ctx->param->ipasc,
764761
ctx->param->hostFlags) != WOLFSSL_SUCCESS) {
765-
#ifndef OPENSSL_COEXIST
766-
ctx->error = X509_V_ERR_IP_ADDRESS_MISMATCH;
767-
#else
768-
ctx->error = 1; /* Return generic error */
769-
#endif
762+
ctx->error = WOLFSSL_X509_V_ERR_IP_ADDRESS_MISMATCH;
770763
ctx->error_depth = 0;
764+
ctx->current_cert = orig;
771765
ret = WOLFSSL_FAILURE;
772766
}
773767
}

tests/api.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27057,6 +27057,8 @@ static int error_test(void)
2705727057
{17, 15},
2705827058
{19, 19},
2705927059
{27, 26 },
27060+
{61, 30},
27061+
{63, 63},
2706027062
#endif
2706127063
{ -9, WC_SPAN1_FIRST_E + 1 },
2706227064
{ -124, -124 },

tests/api/test_x509.c

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -300,10 +300,35 @@ int test_x509_verify_cert_hostname_check(void)
300300
ExpectIntEQ(wolfSSL_X509_VERIFY_PARAM_set1_host(param, "wrong.com",
301301
XSTRLEN("wrong.com")), WOLFSSL_SUCCESS);
302302
ExpectIntNE(wolfSSL_X509_verify_cert(ctx), WOLFSSL_SUCCESS);
303-
ExpectTrue(wolfSSL_X509_STORE_CTX_get_error(ctx) ==
304-
X509_V_ERR_HOSTNAME_MISMATCH ||
305-
/* This is the case for OPENSSL_COEXIST */
306-
wolfSSL_X509_STORE_CTX_get_error(ctx) == 1);
303+
ExpectIntEQ(wolfSSL_X509_STORE_CTX_get_error(ctx),
304+
X509_V_ERR_HOSTNAME_MISMATCH);
305+
ExpectIntEQ(wolfSSL_X509_STORE_CTX_get_error_depth(ctx), 0);
306+
wolfSSL_X509_STORE_CTX_free(ctx);
307+
ctx = NULL;
308+
309+
/* Case 4: IP matches a SAN IP entry - must succeed. */
310+
ExpectNotNull(ctx = wolfSSL_X509_STORE_CTX_new());
311+
ExpectIntEQ(wolfSSL_X509_STORE_CTX_init(ctx, store, leaf, NULL),
312+
WOLFSSL_SUCCESS);
313+
param = wolfSSL_X509_STORE_CTX_get0_param(ctx);
314+
ExpectNotNull(param);
315+
ExpectIntEQ(wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(param, "127.0.0.1"),
316+
WOLFSSL_SUCCESS);
317+
ExpectIntEQ(wolfSSL_X509_verify_cert(ctx), WOLFSSL_SUCCESS);
318+
wolfSSL_X509_STORE_CTX_free(ctx);
319+
ctx = NULL;
320+
321+
/* Case 5: IP does not match - must FAIL with the right error code. */
322+
ExpectNotNull(ctx = wolfSSL_X509_STORE_CTX_new());
323+
ExpectIntEQ(wolfSSL_X509_STORE_CTX_init(ctx, store, leaf, NULL),
324+
WOLFSSL_SUCCESS);
325+
param = wolfSSL_X509_STORE_CTX_get0_param(ctx);
326+
ExpectNotNull(param);
327+
ExpectIntEQ(wolfSSL_X509_VERIFY_PARAM_set1_ip_asc(param, "192.168.1.1"),
328+
WOLFSSL_SUCCESS);
329+
ExpectIntNE(wolfSSL_X509_verify_cert(ctx), WOLFSSL_SUCCESS);
330+
ExpectIntEQ(wolfSSL_X509_STORE_CTX_get_error(ctx),
331+
X509_V_ERR_IP_ADDRESS_MISMATCH);
307332
ExpectIntEQ(wolfSSL_X509_STORE_CTX_get_error_depth(ctx), 0);
308333
wolfSSL_X509_STORE_CTX_free(ctx);
309334
ctx = NULL;

wolfssl/ssl.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2685,7 +2685,9 @@ enum {
26852685
WOLFSSL_X509_V_ERR_PATH_LENGTH_EXCEEDED = 25,
26862686
WOLFSSL_X509_V_ERR_CERT_REJECTED = 28,
26872687
WOLFSSL_X509_V_ERR_SUBJECT_ISSUER_MISMATCH = 29,
2688-
WC_OSSL_V509_V_ERR_MAX = 30,
2688+
WOLFSSL_X509_V_ERR_HOSTNAME_MISMATCH = 62,
2689+
WOLFSSL_X509_V_ERR_IP_ADDRESS_MISMATCH = 64,
2690+
WC_OSSL_V509_V_ERR_MAX = 65,
26892691

26902692
#ifdef HAVE_OCSP
26912693
/* OCSP Flags */

0 commit comments

Comments
 (0)