Skip to content

Commit 87dc45b

Browse files
Merge pull request #7986 from julek-wolfssl/crl-cb
Add crl error override callback
2 parents 46f2b21 + ae6c872 commit 87dc45b

6 files changed

Lines changed: 93 additions & 0 deletions

File tree

src/crl.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,13 @@ int CheckCertCRL_ex(WOLFSSL_CRL* crl, byte* issuerHash, byte* serial,
536536

537537
crl->cm->cbMissingCRL(url);
538538
}
539+
540+
if (crl->cm != NULL && crl->cm->crlCb &&
541+
crl->cm->crlCb(ret, crl, crl->cm, crl->cm->crlCbCtx)) {
542+
if (ret != 0)
543+
WOLFSSL_MSG("Overriding CRL error");
544+
ret = 0;
545+
}
539546
}
540547

541548
return ret;

src/ssl.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6007,6 +6007,17 @@ int wolfSSL_SetCRL_Cb(WOLFSSL* ssl, CbMissingCRL cb)
60076007
return BAD_FUNC_ARG;
60086008
}
60096009

6010+
int wolfSSL_SetCRL_ErrorCb(WOLFSSL* ssl, crlErrorCb cb, void* ctx)
6011+
{
6012+
WOLFSSL_ENTER("wolfSSL_SetCRL_Cb");
6013+
if (ssl) {
6014+
SSL_CM_WARNING(ssl);
6015+
return wolfSSL_CertManagerSetCRL_ErrorCb(SSL_CM(ssl), cb, ctx);
6016+
}
6017+
else
6018+
return BAD_FUNC_ARG;
6019+
}
6020+
60106021
#ifdef HAVE_CRL_IO
60116022
int wolfSSL_SetCRL_IOCb(WOLFSSL* ssl, CbCrlIO cb)
60126023
{
@@ -6072,6 +6083,15 @@ int wolfSSL_CTX_SetCRL_Cb(WOLFSSL_CTX* ctx, CbMissingCRL cb)
60726083
return BAD_FUNC_ARG;
60736084
}
60746085

6086+
int wolfSSL_CTX_SetCRL_ErrorCb(WOLFSSL_CTX* ctx, crlErrorCb cb, void* cbCtx)
6087+
{
6088+
WOLFSSL_ENTER("wolfSSL_CTX_SetCRL_ErrorCb");
6089+
if (ctx)
6090+
return wolfSSL_CertManagerSetCRL_ErrorCb(ctx->cm, cb, cbCtx);
6091+
else
6092+
return BAD_FUNC_ARG;
6093+
}
6094+
60756095
#ifdef HAVE_CRL_IO
60766096
int wolfSSL_CTX_SetCRL_IOCb(WOLFSSL_CTX* ctx, CbCrlIO cb)
60776097
{

src/ssl_certman.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1858,6 +1858,26 @@ int wolfSSL_CertManagerSetCRL_Cb(WOLFSSL_CERT_MANAGER* cm, CbMissingCRL cb)
18581858
return ret;
18591859
}
18601860

1861+
int wolfSSL_CertManagerSetCRL_ErrorCb(WOLFSSL_CERT_MANAGER* cm, crlErrorCb cb,
1862+
void* ctx)
1863+
{
1864+
int ret = WOLFSSL_SUCCESS;
1865+
1866+
WOLFSSL_ENTER("wolfSSL_CertManagerSetCRL_Cb");
1867+
1868+
/* Validate parameters. */
1869+
if (cm == NULL) {
1870+
ret = BAD_FUNC_ARG;
1871+
}
1872+
if (ret == WOLFSSL_SUCCESS) {
1873+
/* Store callback. */
1874+
cm->crlCb = cb;
1875+
cm->crlCbCtx = ctx;
1876+
}
1877+
1878+
return ret;
1879+
}
1880+
18611881
#ifdef HAVE_CRL_IO
18621882
/* Set the CRL I/O callback.
18631883
*

tests/api.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93692,6 +93692,40 @@ static int test_revoked_loaded_int_cert_ctx_ready2(WOLFSSL_CTX* ctx)
9369293692
WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS);
9369393693
return EXPECT_RESULT();
9369493694
}
93695+
93696+
static int test_revoked_loaded_int_cert_ctx_ready3_crl_missing_cb(int ret,
93697+
WOLFSSL_CRL* crl, WOLFSSL_CERT_MANAGER* cm, void* ctx)
93698+
{
93699+
(void)crl;
93700+
(void)cm;
93701+
(void)ctx;
93702+
if (ret == WC_NO_ERR_TRACE(CRL_MISSING))
93703+
return 1;
93704+
return 0;
93705+
}
93706+
93707+
/* Here we are allowing missing CRL's but want to error out when its revoked */
93708+
static int test_revoked_loaded_int_cert_ctx_ready3(WOLFSSL_CTX* ctx)
93709+
{
93710+
EXPECT_DECLS;
93711+
wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_PEER, myVerify);
93712+
myVerifyAction = VERIFY_USE_PREVERFIY;
93713+
ExpectIntEQ(wolfSSL_CTX_load_verify_locations_ex(ctx,
93714+
"./certs/ca-cert.pem", NULL, 0), WOLFSSL_SUCCESS);
93715+
ExpectIntEQ(wolfSSL_CTX_load_verify_locations_ex(ctx,
93716+
"./certs/intermediate/ca-int-cert.pem", NULL, 0), WOLFSSL_SUCCESS);
93717+
ExpectIntEQ(wolfSSL_CTX_load_verify_locations_ex(ctx,
93718+
"./certs/intermediate/ca-int2-cert.pem", NULL, 0), WOLFSSL_SUCCESS);
93719+
ExpectIntEQ(wolfSSL_CTX_EnableCRL(ctx, WOLFSSL_CRL_CHECKALL),
93720+
WOLFSSL_SUCCESS);
93721+
ExpectIntEQ(wolfSSL_CTX_LoadCRLFile(ctx,
93722+
"./certs/crl/extra-crls/ca-int-cert-revoked.pem",
93723+
WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS);
93724+
ExpectIntEQ(wolfSSL_CTX_SetCRL_ErrorCb(ctx,
93725+
test_revoked_loaded_int_cert_ctx_ready3_crl_missing_cb, NULL),
93726+
WOLFSSL_SUCCESS);
93727+
return EXPECT_RESULT();
93728+
}
9369593729
#endif
9369693730

9369793731
static int test_revoked_loaded_int_cert(void)
@@ -93713,6 +93747,8 @@ static int test_revoked_loaded_int_cert(void)
9371393747
"./certs/server-key.pem", test_revoked_loaded_int_cert_ctx_ready2},
9371493748
{"./certs/intermediate/server-chain-short.pem",
9371593749
"./certs/server-key.pem", test_revoked_loaded_int_cert_ctx_ready2},
93750+
{"./certs/intermediate/server-chain-short.pem",
93751+
"./certs/server-key.pem", test_revoked_loaded_int_cert_ctx_ready3},
9371693752
};
9371793753
size_t i;
9371893754

wolfssl/internal.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2617,6 +2617,8 @@ struct WOLFSSL_CERT_MANAGER {
26172617
#endif
26182618
CallbackCACache caCacheCallback; /* CA cache addition callback */
26192619
CbMissingCRL cbMissingCRL; /* notify thru cb of missing crl */
2620+
crlErrorCb crlCb; /* Allow user to override error */
2621+
void* crlCbCtx;
26202622
CbOCSPIO ocspIOCb; /* I/O callback for OCSP lookup */
26212623
CbOCSPRespFree ocspRespFreeCb; /* Frees OCSP Response from IO Cb */
26222624
wolfSSL_Mutex caLock; /* CA list lock */

wolfssl/ssl.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3314,6 +3314,8 @@ WOLFSSL_API int wolfSSL_SetVersion(WOLFSSL* ssl, int version);
33143314

33153315
typedef void (*CallbackCACache)(unsigned char* der, int sz, int type);
33163316
typedef void (*CbMissingCRL)(const char* url);
3317+
typedef int (*crlErrorCb)(int ret, WOLFSSL_CRL* crl, WOLFSSL_CERT_MANAGER* cm,
3318+
void* ctx);
33173319
typedef int (*CbOCSPIO)(void*, const char*, int,
33183320
unsigned char*, int, unsigned char**);
33193321
typedef void (*CbOCSPRespFree)(void*,unsigned char*);
@@ -3762,6 +3764,8 @@ WOLFSSL_API void wolfSSL_CTX_SetPerformTlsRecordProcessingCb(WOLFSSL_CTX* ctx,
37623764
const unsigned char* buff, long sz, int type);
37633765
WOLFSSL_API int wolfSSL_CertManagerSetCRL_Cb(WOLFSSL_CERT_MANAGER* cm,
37643766
CbMissingCRL cb);
3767+
WOLFSSL_API int wolfSSL_CertManagerSetCRL_ErrorCb(WOLFSSL_CERT_MANAGER* cm,
3768+
crlErrorCb cb, void* ctx);
37653769
WOLFSSL_API int wolfSSL_CertManagerFreeCRL(WOLFSSL_CERT_MANAGER* cm);
37663770
#ifdef HAVE_CRL_IO
37673771
WOLFSSL_API int wolfSSL_CertManagerSetCRL_IOCb(WOLFSSL_CERT_MANAGER* cm,
@@ -3805,6 +3809,8 @@ WOLFSSL_API WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_X509_STORE_get1_certs(
38053809
WOLFSSL_API int wolfSSL_LoadCRLBuffer(WOLFSSL* ssl,
38063810
const unsigned char* buff, long sz, int type);
38073811
WOLFSSL_API int wolfSSL_SetCRL_Cb(WOLFSSL* ssl, CbMissingCRL cb);
3812+
WOLFSSL_API int wolfSSL_SetCRL_ErrorCb(WOLFSSL* ssl, crlErrorCb cb,
3813+
void* ctx);
38083814
#ifdef HAVE_CRL_IO
38093815
WOLFSSL_API int wolfSSL_SetCRL_IOCb(WOLFSSL* ssl, CbCrlIO cb);
38103816
#endif
@@ -3822,6 +3828,8 @@ WOLFSSL_API WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_X509_STORE_get1_certs(
38223828
WOLFSSL_API int wolfSSL_CTX_LoadCRLBuffer(WOLFSSL_CTX* ctx,
38233829
const unsigned char* buff, long sz, int type);
38243830
WOLFSSL_API int wolfSSL_CTX_SetCRL_Cb(WOLFSSL_CTX* ctx, CbMissingCRL cb);
3831+
WOLFSSL_API int wolfSSL_CTX_SetCRL_ErrorCb(WOLFSSL_CTX* ctx, crlErrorCb cb,
3832+
void* cbCtx);
38253833
#ifdef HAVE_CRL_IO
38263834
WOLFSSL_API int wolfSSL_CTX_SetCRL_IOCb(WOLFSSL_CTX* ctx, CbCrlIO cb);
38273835
#endif

0 commit comments

Comments
 (0)