diff --git a/src/ssl.c b/src/ssl.c index 1ed7e1140..51256fde7 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -10632,6 +10632,11 @@ void wolfSSL_CTX_set_verify(WOLFSSL_CTX* ctx, int mode, VerifyCallback vc) if (ctx == NULL) return; + ctx->verifyPeer = 0; + ctx->verifyNone = 0; + ctx->failNoCert = 0; + ctx->failNoCertxPSK = 0; + if (mode & WOLFSSL_VERIFY_PEER) { ctx->verifyPeer = 1; ctx->verifyNone = 0; /* in case previously set */ @@ -10674,6 +10679,11 @@ void wolfSSL_set_verify(WOLFSSL* ssl, int mode, VerifyCallback vc) if (ssl == NULL) return; + ssl->options.verifyPeer = 0; + ssl->options.verifyNone = 0; + ssl->options.failNoCert = 0; + ssl->options.failNoCertxPSK = 0; + if (mode & WOLFSSL_VERIFY_PEER) { ssl->options.verifyPeer = 1; ssl->options.verifyNone = 0; /* in case previously set */ @@ -45678,11 +45688,25 @@ int wolfSSL_SESSION_print(WOLFSSL_BIO *bp, const WOLFSSL_SESSION *x) || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(WOLFSSL_NGINX) int wolfSSL_get_verify_mode(WOLFSSL* ssl) { - if(ssl == NULL) { - return BAD_FUNC_ARG; - } + int mode = 0; + WOLFSSL_ENTER("wolfSSL_get_verify_mode"); - return wolfSSL_CTX_get_verify_mode(ssl->ctx); + if(!ssl) + return WOLFSSL_FATAL_ERROR; + + if (ssl->options.verifyPeer) + mode |= WOLFSSL_VERIFY_PEER; + else if (ssl->options.verifyNone) + mode |= WOLFSSL_VERIFY_NONE; + + if (ssl->options.failNoCert) + mode |= WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT; + + if (ssl->options.failNoCertxPSK) + mode |= WOLFSSL_VERIFY_FAIL_EXCEPT_PSK; + + WOLFSSL_LEAVE("wolfSSL_get_verify_mode", mode); + return mode; } int wolfSSL_CTX_get_verify_mode(WOLFSSL_CTX* ctx) diff --git a/tests/api.c b/tests/api.c index e7fb058b5..4172dbf67 100644 --- a/tests/api.c +++ b/tests/api.c @@ -32095,6 +32095,11 @@ static void test_wolfSSL_verify_mode(void) AssertNotNull(ssl = SSL_new(ctx)); AssertIntEQ(SSL_get_verify_mode(ssl), SSL_CTX_get_verify_mode(ctx)); AssertIntEQ(SSL_get_verify_mode(ssl), SSL_VERIFY_PEER); + + wolfSSL_set_verify(ssl, SSL_VERIFY_NONE, 0); + AssertIntEQ(SSL_CTX_get_verify_mode(ctx), SSL_VERIFY_PEER); + AssertIntEQ(SSL_get_verify_mode(ssl), SSL_VERIFY_NONE); + SSL_free(ssl); wolfSSL_CTX_set_verify(ctx, @@ -32103,6 +32108,12 @@ static void test_wolfSSL_verify_mode(void) AssertIntEQ(SSL_get_verify_mode(ssl), SSL_CTX_get_verify_mode(ctx)); AssertIntEQ(SSL_get_verify_mode(ssl), WOLFSSL_VERIFY_PEER | WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT); + + wolfSSL_set_verify(ssl, SSL_VERIFY_PEER, 0); + AssertIntEQ(SSL_CTX_get_verify_mode(ctx), + WOLFSSL_VERIFY_PEER | WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT); + AssertIntEQ(SSL_get_verify_mode(ssl), SSL_VERIFY_PEER); + SSL_free(ssl); SSL_CTX_free(ctx);