Skip to content

Commit 5b5f0ff

Browse files
authored
Merge pull request #7194 from anhu/CerManUnExtCb
Adding unknown extension callback to CertManager
2 parents 9147a72 + 2714621 commit 5b5f0ff

5 files changed

Lines changed: 67 additions & 4 deletions

File tree

src/ssl_certman.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,19 @@ void wolfSSL_CertManagerSetVerify(WOLFSSL_CERT_MANAGER* cm, VerifyCallback vc)
575575
}
576576
#endif /* NO_WOLFSSL_CM_VERIFY */
577577

578+
#if defined(WOLFSSL_CUSTOM_OID) && defined(WOLFSSL_ASN_TEMPLATE) \
579+
&& defined(HAVE_OID_DECODING)
580+
void wolfSSL_CertManagerSetUnknownExtCallback(WOLFSSL_CERT_MANAGER* cm,
581+
wc_UnknownExtCallback cb)
582+
{
583+
WOLFSSL_ENTER("wolfSSL_CertManagerSetUnknownExtCallback");
584+
if (cm != NULL) {
585+
cm->unknownExtCallback = cb;
586+
}
587+
588+
}
589+
#endif /* WOLFSSL_CUSTOM_OID && WOLFSSL_ASN_TEMPLATE && HAVE_OID_DECODING */
590+
578591
#if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)
579592
/* Verify the certificate.
580593
*
@@ -643,6 +656,12 @@ int CM_VerifyBuffer_ex(WOLFSSL_CERT_MANAGER* cm, const unsigned char* buff,
643656
/* Create a decoded certificate with DER buffer. */
644657
InitDecodedCert(cert, buff, (word32)sz, cm->heap);
645658

659+
#if defined(WOLFSSL_CUSTOM_OID) && defined(WOLFSSL_ASN_TEMPLATE) \
660+
&& defined(HAVE_OID_DECODING)
661+
if (cm->unknownExtCallback != NULL)
662+
wc_SetUnknownExtCallback(cert, cm->unknownExtCallback);
663+
#endif
664+
646665
/* Parse DER into decoded certificate fields and verify signature
647666
* against a known CA. */
648667
ret = ParseCertRelative(cert, CERT_TYPE, VERIFY, cm);

tests/api.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1084,6 +1084,21 @@ static int do_dual_alg_tls13_connection(byte *caCert, word32 caCertSz,
10841084
return EXPECT_RESULT();
10851085
}
10861086

1087+
static int extCount = 0;
1088+
static int myUnknownExtCallback(const word16* oid, word32 oidSz, int crit,
1089+
const unsigned char* der, word32 derSz)
1090+
{
1091+
(void) oid;
1092+
(void) oidSz;
1093+
(void) crit;
1094+
(void) der;
1095+
(void) derSz;
1096+
extCount ++;
1097+
/* Accept all extensions. This is only a test. Normally we would be much more
1098+
* careful about critical extensions. */
1099+
return 1;
1100+
}
1101+
10871102
static int test_dual_alg_support(void)
10881103
{
10891104
EXPECT_DECLS;
@@ -1099,6 +1114,7 @@ static int test_dual_alg_support(void)
10991114
int rootSz = 0;
11001115
byte *server = NULL;
11011116
int serverSz = 0;
1117+
WOLFSSL_CERT_MANAGER* cm = NULL;
11021118

11031119
ExpectIntEQ(load_file(keyFile, &serverKey, &serverKeySz), 0);
11041120

@@ -1130,6 +1146,20 @@ static int test_dual_alg_support(void)
11301146
ExpectIntEQ(do_dual_alg_tls13_connection(root, rootSz,
11311147
server, serverSz, serverKey, (word32)serverKeySz, 1),
11321148
TEST_SUCCESS);
1149+
1150+
/* Lets see if CertManager can find the new extensions */
1151+
extCount = 0;
1152+
ExpectNotNull(cm = wolfSSL_CertManagerNew());
1153+
wolfSSL_CertManagerSetUnknownExtCallback(cm, myUnknownExtCallback);
1154+
ExpectIntEQ(wolfSSL_CertManagerLoadCABuffer(cm, root, rootSz,
1155+
SSL_FILETYPE_ASN1), WOLFSSL_SUCCESS);
1156+
ExpectIntEQ(wolfSSL_CertManagerVerifyBuffer(cm, server, serverSz,
1157+
SSL_FILETYPE_ASN1), WOLFSSL_SUCCESS);
1158+
/* There is only 1 unknown exension (1.2.3.4.5). The other ones are known
1159+
* because they are for the dual alg extensions. */
1160+
ExpectIntEQ(extCount, 1);
1161+
wolfSSL_CertManagerFree(cm);
1162+
11331163
XFREE(root, NULL, DYNAMIC_TYPE_TMP_BUFFER);
11341164
XFREE(server, NULL, DYNAMIC_TYPE_TMP_BUFFER);
11351165

wolfssl/internal.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2629,10 +2629,13 @@ struct WOLFSSL_CERT_MANAGER {
26292629
#endif
26302630
wolfSSL_Ref ref;
26312631
#ifdef HAVE_PQC
2632-
short minFalconKeySz; /* minimum allowed Falcon key size */
2633-
short minDilithiumKeySz; /* minimum allowed Dilithium key size */
2632+
short minFalconKeySz; /* minimum allowed Falcon key size */
2633+
short minDilithiumKeySz; /* minimum allowed Dilithium key size */
2634+
#endif
2635+
#if defined(WOLFSSL_CUSTOM_OID) && defined(WOLFSSL_ASN_TEMPLATE) \
2636+
&& defined(HAVE_OID_DECODING)
2637+
wc_UnknownExtCallback unknownExtCallback;
26342638
#endif
2635-
26362639
};
26372640

26382641
WOLFSSL_LOCAL int CM_SaveCertCache(WOLFSSL_CERT_MANAGER* cm,

wolfssl/ssl.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1536,7 +1536,8 @@ WOLFSSL_API int wolfSSL_sk_push_node(WOLFSSL_STACK** stack, WOLFSSL_STACK* in);
15361536
WOLFSSL_API WOLFSSL_STACK* wolfSSL_sk_get_node(WOLFSSL_STACK* sk, int idx);
15371537
WOLFSSL_API int wolfSSL_sk_push(WOLFSSL_STACK *st, const void *data);
15381538

1539-
#if defined(HAVE_OCSP) || defined(HAVE_CRL)
1539+
#if defined(HAVE_OCSP) || defined(HAVE_CRL) || (defined(WOLFSSL_CUSTOM_OID) && \
1540+
defined(WOLFSSL_ASN_TEMPLATE) && defined(HAVE_OID_DECODING))
15401541
#include "wolfssl/wolfcrypt/asn.h"
15411542
#endif
15421543

@@ -3594,6 +3595,13 @@ WOLFSSL_API void wolfSSL_CTX_SetPerformTlsRecordProcessingCb(WOLFSSL_CTX* ctx,
35943595
WOLFSSL_API void wolfSSL_CertManagerFree(WOLFSSL_CERT_MANAGER* cm);
35953596
WOLFSSL_API int wolfSSL_CertManager_up_ref(WOLFSSL_CERT_MANAGER* cm);
35963597

3598+
#if defined(WOLFSSL_CUSTOM_OID) && defined(WOLFSSL_ASN_TEMPLATE) \
3599+
&& defined(HAVE_OID_DECODING)
3600+
WOLFSSL_API void wolfSSL_CertManagerSetUnknownExtCallback(
3601+
WOLFSSL_CERT_MANAGER* cm,
3602+
wc_UnknownExtCallback cb);
3603+
#endif
3604+
35973605
WOLFSSL_API int wolfSSL_CertManagerLoadCA(WOLFSSL_CERT_MANAGER* cm,
35983606
const char* f, const char* d);
35993607
WOLFSSL_API int wolfSSL_CertManagerLoadCABuffer_ex(WOLFSSL_CERT_MANAGER* cm,

wolfssl/wolfcrypt/settings.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,9 @@
348348

349349
#undef OPENSSL_EXTRA
350350
#define OPENSSL_EXTRA
351+
352+
#undef HAVE_OID_DECODING
353+
#define HAVE_OID_DECODING
351354
#endif /* WOLFSSL_DUAL_ALG_CERTS */
352355

353356
/* ---------------------------------------------------------------------------

0 commit comments

Comments
 (0)