diff --git a/src/ssl_certman.c b/src/ssl_certman.c index 149b1bd56..4c0eafa8b 100644 --- a/src/ssl_certman.c +++ b/src/ssl_certman.c @@ -575,6 +575,19 @@ void wolfSSL_CertManagerSetVerify(WOLFSSL_CERT_MANAGER* cm, VerifyCallback vc) } #endif /* NO_WOLFSSL_CM_VERIFY */ +#if defined(WOLFSSL_CUSTOM_OID) && defined(WOLFSSL_ASN_TEMPLATE) \ + && defined(HAVE_OID_DECODING) +void wolfSSL_CertManagerSetUnknownExtCallback(WOLFSSL_CERT_MANAGER* cm, + wc_UnknownExtCallback cb) +{ + WOLFSSL_ENTER("wolfSSL_CertManagerSetUnknownExtCallback"); + if (cm != NULL) { + cm->unknownExtCallback = cb; + } + +} +#endif /* WOLFSSL_CUSTOM_OID && WOLFSSL_ASN_TEMPLATE && HAVE_OID_DECODING */ + #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH) /* Verify the certificate. * @@ -643,6 +656,12 @@ int CM_VerifyBuffer_ex(WOLFSSL_CERT_MANAGER* cm, const unsigned char* buff, /* Create a decoded certificate with DER buffer. */ InitDecodedCert(cert, buff, (word32)sz, cm->heap); +#if defined(WOLFSSL_CUSTOM_OID) && defined(WOLFSSL_ASN_TEMPLATE) \ + && defined(HAVE_OID_DECODING) + if (cm->unknownExtCallback != NULL) + wc_SetUnknownExtCallback(cert, cm->unknownExtCallback); +#endif + /* Parse DER into decoded certificate fields and verify signature * against a known CA. */ ret = ParseCertRelative(cert, CERT_TYPE, VERIFY, cm); diff --git a/wolfssl/internal.h b/wolfssl/internal.h index 5baeb93b0..353db14aa 100644 --- a/wolfssl/internal.h +++ b/wolfssl/internal.h @@ -2632,6 +2632,7 @@ struct WOLFSSL_CERT_MANAGER { short minFalconKeySz; /* minimum allowed Falcon key size */ short minDilithiumKeySz; /* minimum allowed Dilithium key size */ #endif + wc_UnknownExtCallback unknownExtCallback; }; diff --git a/wolfssl/ssl.h b/wolfssl/ssl.h index b760e27a2..4e86b0da4 100644 --- a/wolfssl/ssl.h +++ b/wolfssl/ssl.h @@ -1536,7 +1536,8 @@ WOLFSSL_API int wolfSSL_sk_push_node(WOLFSSL_STACK** stack, WOLFSSL_STACK* in); WOLFSSL_API WOLFSSL_STACK* wolfSSL_sk_get_node(WOLFSSL_STACK* sk, int idx); WOLFSSL_API int wolfSSL_sk_push(WOLFSSL_STACK *st, const void *data); -#if defined(HAVE_OCSP) || defined(HAVE_CRL) +#if defined(HAVE_OCSP) || defined(HAVE_CRL) || (defined(WOLFSSL_CUSTOM_OID) && \ + defined(WOLFSSL_ASN_TEMPLATE) && defined(HAVE_OID_DECODING)) #include "wolfssl/wolfcrypt/asn.h" #endif @@ -3594,6 +3595,13 @@ WOLFSSL_API void wolfSSL_CTX_SetPerformTlsRecordProcessingCb(WOLFSSL_CTX* ctx, WOLFSSL_API void wolfSSL_CertManagerFree(WOLFSSL_CERT_MANAGER* cm); WOLFSSL_API int wolfSSL_CertManager_up_ref(WOLFSSL_CERT_MANAGER* cm); +#if defined(WOLFSSL_CUSTOM_OID) && defined(WOLFSSL_ASN_TEMPLATE) \ + && defined(HAVE_OID_DECODING) + WOLFSSL_API void wolfSSL_CertManagerSetUnknownExtCallback( + WOLFSSL_CERT_MANAGER* cm, + wc_UnknownExtCallback cb); +#endif + WOLFSSL_API int wolfSSL_CertManagerLoadCA(WOLFSSL_CERT_MANAGER* cm, const char* f, const char* d); WOLFSSL_API int wolfSSL_CertManagerLoadCABuffer_ex(WOLFSSL_CERT_MANAGER* cm,