@@ -230,6 +230,18 @@ int wolfSSL_X509_STORE_CTX_init(WOLFSSL_X509_STORE_CTX* ctx,
230230 XMEMSET (ctx -> param , 0 , sizeof (* ctx -> param ));
231231 }
232232
233+ /* Copy check_time from store parameters if available */
234+ if (store != NULL && store -> param != NULL ) {
235+ if ((store -> param -> flags & WOLFSSL_USE_CHECK_TIME ) != 0 &&
236+ store -> param -> check_time != 0 ) {
237+ ctx -> param -> check_time = store -> param -> check_time ;
238+ ctx -> param -> flags |= WOLFSSL_USE_CHECK_TIME ;
239+ }
240+ if ((store -> param -> flags & WOLFSSL_NO_CHECK_TIME ) != 0 ) {
241+ ctx -> param -> flags |= WOLFSSL_NO_CHECK_TIME ;
242+ }
243+ }
244+
233245 return WOLFSSL_SUCCESS ;
234246 }
235247 return WOLFSSL_FAILURE ;
@@ -321,6 +333,74 @@ static void SetupStoreCtxError(WOLFSSL_X509_STORE_CTX* ctx, int ret)
321333 SetupStoreCtxError_ex (ctx , ret , depth );
322334}
323335
336+ #ifndef NO_ASN_TIME
337+ /* Post certificate validation date handling. This function is called after the
338+ * certificate has been verified by the certificate manager. It then checks if
339+ * X509 store parameters are set for date validation override.
340+ * @param ctx The certificate store context
341+ * @param ret The return value from the certificate manager verify
342+ * @return The return value for the certificate date validation after override
343+ */
344+ static int X509StoreVerifyCertDate (WOLFSSL_X509_STORE_CTX * ctx , int ret )
345+ {
346+ byte * afterDate = ctx -> current_cert -> notAfter .data ;
347+ byte * beforeDate = ctx -> current_cert -> notBefore .data ;
348+
349+ /* Only override existing date errors or WOLFSSL_SUCCESS. */
350+ if (ret == WC_NO_ERR_TRACE (ASN_BEFORE_DATE_E ) ||
351+ ret == WC_NO_ERR_TRACE (ASN_AFTER_DATE_E ) ||
352+ ret == WC_NO_ERR_TRACE (WOLFSSL_SUCCESS )) {
353+ #ifdef USE_WOLF_VALIDDATE
354+ WOLFSSL_X509_VERIFY_PARAM * param = NULL ;
355+
356+ /* If no external XVALIDATE_DATE was defined then use param for date
357+ validation overrides. */
358+ if (ctx -> param != NULL ) {
359+ param = ctx -> param ;
360+ }
361+ else if (ctx -> store != NULL && ctx -> store -> param != NULL ) {
362+ param = ctx -> store -> param ;
363+ }
364+
365+ if (param != NULL ) {
366+ if ((param -> flags & WOLFSSL_NO_CHECK_TIME ) != 0 ) {
367+ WOLFSSL_MSG ("Overriding date validation WOLFSSL_NO_CHECK_TIME" );
368+ ret = WOLFSSL_SUCCESS ;
369+ }
370+ else if ((param -> flags & WOLFSSL_USE_CHECK_TIME ) != 0 &&
371+ (param -> check_time != 0 )) {
372+ time_t checkTime = param -> check_time ;
373+ ret = WOLFSSL_SUCCESS ; /* override date error and use custom set
374+ time for validating certificate dates */
375+ WOLFSSL_MSG ("Override date validation, WOLFSSL_USE_CHECK_TIME" );
376+ if (wc_ValidateDateWithTime (afterDate ,
377+ (byte )ctx -> current_cert -> notAfter .type , ASN_AFTER ,
378+ checkTime ) < 1 ) {
379+ ret = ASN_AFTER_DATE_E ;
380+ }
381+ else if (wc_ValidateDateWithTime (beforeDate ,
382+ (byte )ctx -> current_cert -> notBefore .type , ASN_BEFORE ,
383+ checkTime ) < 1 ) {
384+ ret = ASN_BEFORE_DATE_E ;
385+ }
386+ }
387+ }
388+ #else
389+ if (XVALIDATE_DATE (afterDate ,
390+ (byte )ctx -> current_cert -> notAfter .type , ASN_AFTER ) < 1 ) {
391+ ret = ASN_AFTER_DATE_E ;
392+ }
393+ else if (XVALIDATE_DATE (beforeDate ,
394+ (byte )ctx -> current_cert -> notBefore .type , ASN_BEFORE ) < 1 ) {
395+ ret = ASN_BEFORE_DATE_E ;
396+ }
397+ #endif /* USE_WOLF_VALIDDATE */
398+ }
399+
400+ return ret ;
401+ }
402+ #endif /* NO_ASN_TIME */
403+
324404static int X509StoreVerifyCert (WOLFSSL_X509_STORE_CTX * ctx )
325405{
326406 int ret = WC_NO_ERR_TRACE (WOLFSSL_FAILURE );
@@ -331,39 +411,16 @@ static int X509StoreVerifyCert(WOLFSSL_X509_STORE_CTX* ctx)
331411 ctx -> current_cert -> derCert -> buffer ,
332412 ctx -> current_cert -> derCert -> length ,
333413 WOLFSSL_FILETYPE_ASN1 );
414+ #ifndef NO_ASN_TIME
415+ /* update return value with any date validation overrides */
416+ ret = X509StoreVerifyCertDate (ctx , ret );
417+ #endif
334418 SetupStoreCtxError (ctx , ret );
335419 #if defined(OPENSSL_ALL ) || defined(WOLFSSL_QT )
336420 if (ctx -> store -> verify_cb )
337421 ret = ctx -> store -> verify_cb (ret >= 0 ? 1 : 0 , ctx ) == 1 ?
338422 WOLFSSL_SUCCESS : ret ;
339423 #endif
340-
341- #ifndef NO_ASN_TIME
342- if (ret != WC_NO_ERR_TRACE (ASN_BEFORE_DATE_E ) &&
343- ret != WC_NO_ERR_TRACE (ASN_AFTER_DATE_E )) {
344- /* wolfSSL_CertManagerVerifyBuffer only returns ASN_AFTER_DATE_E or
345- * ASN_BEFORE_DATE_E if there are no additional errors found in the
346- * cert. Therefore, check if the cert is expired or not yet valid
347- * in order to return the correct expected error. */
348- byte * afterDate = ctx -> current_cert -> notAfter .data ;
349- byte * beforeDate = ctx -> current_cert -> notBefore .data ;
350-
351- if (XVALIDATE_DATE (afterDate ,
352- (byte )ctx -> current_cert -> notAfter .type , ASN_AFTER ) < 1 ) {
353- ret = ASN_AFTER_DATE_E ;
354- }
355- else if (XVALIDATE_DATE (beforeDate ,
356- (byte )ctx -> current_cert -> notBefore .type , ASN_BEFORE ) < 1 ) {
357- ret = ASN_BEFORE_DATE_E ;
358- }
359- SetupStoreCtxError (ctx , ret );
360- #if defined(OPENSSL_ALL ) || defined(WOLFSSL_QT )
361- if (ctx -> store -> verify_cb )
362- ret = ctx -> store -> verify_cb (ret >= 0 ? 1 : 0 ,
363- ctx ) == 1 ? WOLFSSL_SUCCESS : -1 ;
364- #endif
365- }
366- #endif
367424 }
368425
369426 return ret ;
@@ -1445,16 +1502,22 @@ static int X509StoreAddCa(WOLFSSL_X509_STORE* store,
14451502{
14461503 int result = WC_NO_ERR_TRACE (WOLFSSL_FATAL_ERROR );
14471504 DerBuffer * derCert = NULL ;
1505+ int verify = VERIFY ;
14481506
14491507 WOLFSSL_ENTER ("X509StoreAddCa" );
14501508 if (store != NULL && x509 != NULL && x509 -> derCert != NULL ) {
1509+ /* Check if NO_CHECK_TIME flag is set - if so, skip date validation */
1510+ if (store -> param != NULL &&
1511+ (store -> param -> flags & WOLFSSL_NO_CHECK_TIME ) != 0 ) {
1512+ verify = VERIFY_SKIP_DATE ;
1513+ }
14511514 result = AllocDer (& derCert , x509 -> derCert -> length ,
14521515 x509 -> derCert -> type , NULL );
14531516 if (result == 0 ) {
14541517 /* AddCA() frees the buffer. */
14551518 XMEMCPY (derCert -> buffer ,
14561519 x509 -> derCert -> buffer , x509 -> derCert -> length );
1457- result = AddCA (store -> cm , & derCert , type , VERIFY );
1520+ result = AddCA (store -> cm , & derCert , type , verify );
14581521 }
14591522 }
14601523
0 commit comments