diff --git a/src/ssl.c b/src/ssl.c index c348d1a1e..9a6e1fb64 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -6336,15 +6336,49 @@ int wolfSSL_CertManagerLoadCA(WOLFSSL_CERT_MANAGER* cm, const char* file, } -#ifndef NO_WOLFSSL_STUB -int wolfSSL_CTX_check_private_key(WOLFSSL_CTX* ctx) +/* Check private against public in certificate for match + * + * ctx WOLFSSL_CTX structure to check private key in + * + * Returns SSL_SUCCESS on good private key and SSL_FAILURE if miss matched. */ +int wolfSSL_CTX_check_private_key(const WOLFSSL_CTX* ctx) { - /* TODO: check private against public for RSA match */ - (void)ctx; - WOLFSSL_STUB("SSL_CTX_check_private_key"); - return SSL_SUCCESS; -} + DecodedCert der; + word32 size; + byte* buff; + int ret; + + WOLFSSL_ENTER("wolfSSL_CTX_check_private_key"); + + if (ctx == NULL) { + return SSL_FAILURE; + } + +#ifndef NO_CERTS + size = ctx->certificate->length; + buff = ctx->certificate->buffer; + InitDecodedCert(&der, buff, size, ctx->heap); + if (ParseCertRelative(&der, CERT_TYPE, NO_VERIFY, NULL) != 0) { + FreeDecodedCert(&der); + return SSL_FAILURE; + } + + size = ctx->privateKey->length; + buff = ctx->privateKey->buffer; + ret = wc_CheckPrivateKey(buff, size, &der); + FreeDecodedCert(&der); + + if (ret == 1) { + return SSL_SUCCESS; + } + else { + return SSL_FAILURE; + } +#else + WOLFSSL_MSG("NO_CERTS is defined, can not check private key"); + return SSL_FAILURE; #endif +} #ifdef HAVE_CRL diff --git a/tests/api.c b/tests/api.c index eb02afc99..e128d50ae 100644 --- a/tests/api.c +++ b/tests/api.c @@ -13563,8 +13563,14 @@ static void test_wolfSSL_certs(void) printf(testingFmt, "wolfSSL_certs()"); AssertNotNull(ctx = SSL_CTX_new(wolfSSLv23_server_method())); - AssertTrue(SSL_CTX_use_certificate_file(ctx, svrCertFile, WOLFSSL_FILETYPE_PEM)); - AssertTrue(SSL_CTX_use_PrivateKey_file(ctx, svrKeyFile, WOLFSSL_FILETYPE_PEM)); + AssertTrue(SSL_CTX_use_certificate_file(ctx, svrCertFile, SSL_FILETYPE_PEM)); + AssertTrue(SSL_CTX_use_PrivateKey_file(ctx, svrKeyFile, SSL_FILETYPE_PEM)); + #ifndef HAVE_USER_RSA + AssertTrue(SSL_CTX_use_PrivateKey_file(ctx, cliKeyFile, SSL_FILETYPE_PEM)); + AssertIntEQ(SSL_CTX_check_private_key(ctx), SSL_FAILURE); + AssertTrue(SSL_CTX_use_PrivateKey_file(ctx, svrKeyFile, SSL_FILETYPE_PEM)); + AssertIntEQ(SSL_CTX_check_private_key(ctx), SSL_SUCCESS); + #endif AssertNotNull(ssl = SSL_new(ctx)); AssertIntEQ(wolfSSL_check_private_key(ssl), WOLFSSL_SUCCESS); diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index b96f23e2d..bf30c147a 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -1369,7 +1369,7 @@ WOLFSSL_API long wolfSSL_CTX_get_options(WOLFSSL_CTX* ctx); WOLFSSL_API long wolfSSL_CTX_clear_options(WOLFSSL_CTX*, long); #ifndef NO_CERTS - WOLFSSL_API int wolfSSL_CTX_check_private_key(WOLFSSL_CTX*); + WOLFSSL_API int wolfSSL_CTX_check_private_key(const WOLFSSL_CTX*); #endif /* !NO_CERTS */ WOLFSSL_API void wolfSSL_ERR_free_strings(void);