@@ -359,6 +359,30 @@ WOLFSSL_LOCAL word32 SetASNLength(word32 length, byte* output)
359359 return i;
360360}
361361
362+ #ifdef WC_ASN_RUNTIME_DATE_CHECK_CONTROL
363+ static int AsnSkipDateCheck = 0;
364+ int wc_AsnSetSkipDateCheck(int skip_p)
365+ {
366+ AsnSkipDateCheck = (skip_p != 0);
367+ return 0;
368+ }
369+ int wc_AsnGetSkipDateCheck(void)
370+ {
371+ return AsnSkipDateCheck;
372+ }
373+ #else
374+ #define AsnSkipDateCheck 0
375+ int wc_AsnSetSkipDateCheck(int skip_p)
376+ {
377+ (void)skip_p;
378+ return NOT_COMPILED_IN;
379+ }
380+ int wc_AsnGetSkipDateCheck(void)
381+ {
382+ return 0;
383+ }
384+ #endif
385+
362386#ifdef WOLFSSL_ASN_TEMPLATE
363387/* Calculate the size of a DER encoded length value.
364388 *
@@ -16848,6 +16872,7 @@ static int GetDate(DecodedCert* cert, int dateType, int verify, int maxIdx)
1684816872
1684916873#ifndef NO_ASN_TIME_CHECK
1685016874 if (verify != NO_VERIFY && verify != VERIFY_SKIP_DATE &&
16875+ (! AsnSkipDateCheck) &&
1685116876 !XVALIDATE_DATE(date, format, dateType)) {
1685216877 if (dateType == ASN_BEFORE) {
1685316878 WOLFSSL_ERROR_VERBOSE(ASN_BEFORE_DATE_E);
@@ -23301,7 +23326,7 @@ static int CheckDate(ASNGetData *dataASN, int dateType)
2330123326
2330223327#ifndef NO_ASN_TIME_CHECK
2330323328 /* Check date is a valid string and ASN_BEFORE or ASN_AFTER now. */
23304- if (ret == 0) {
23329+ if (( ret == 0) && (! AsnSkipDateCheck) ) {
2330523330 if (!XVALIDATE_DATE(dataASN->data.ref.data, dataASN->tag, dateType)) {
2330623331 if (dateType == ASN_BEFORE) {
2330723332 ret = ASN_BEFORE_DATE_E;
@@ -23480,7 +23505,7 @@ static int DecodeCertInternal(DecodedCert* cert, int verify, int* criticalExt,
2348023505 ? X509CERTASN_IDX_TBS_VALIDITY_NOTB_UTC
2348123506 : X509CERTASN_IDX_TBS_VALIDITY_NOTB_GT;
2348223507 if ((CheckDate(&dataASN[i], ASN_BEFORE) < 0) && (verify != NO_VERIFY) &&
23483- (verify != VERIFY_SKIP_DATE)) {
23508+ (verify != VERIFY_SKIP_DATE) && (! AsnSkipDateCheck) ) {
2348423509 badDate = ASN_BEFORE_DATE_E;
2348523510 }
2348623511 /* Store reference to ASN_BEFORE date. */
@@ -23492,7 +23517,7 @@ static int DecodeCertInternal(DecodedCert* cert, int verify, int* criticalExt,
2349223517 ? X509CERTASN_IDX_TBS_VALIDITY_NOTA_UTC
2349323518 : X509CERTASN_IDX_TBS_VALIDITY_NOTA_GT;
2349423519 if ((CheckDate(&dataASN[i], ASN_AFTER) < 0) && (verify != NO_VERIFY) &&
23495- (verify != VERIFY_SKIP_DATE)) {
23520+ (verify != VERIFY_SKIP_DATE) && (! AsnSkipDateCheck) ) {
2349623521 badDate = ASN_AFTER_DATE_E;
2349723522 }
2349823523 /* Store reference to ASN_AFTER date. */
@@ -25117,7 +25142,7 @@ int ParseCertRelative(DecodedCert* cert, int type, int verify, void* cm,
2511725142 if (ret == WC_NO_ERR_TRACE(ASN_BEFORE_DATE_E) ||
2511825143 ret == WC_NO_ERR_TRACE(ASN_AFTER_DATE_E)) {
2511925144 cert->badDate = ret;
25120- if (verify == VERIFY_SKIP_DATE)
25145+ if (( verify == VERIFY_SKIP_DATE) || AsnSkipDateCheck )
2512125146 ret = 0;
2512225147 }
2512325148 else
@@ -25368,7 +25393,7 @@ int ParseCertRelative(DecodedCert* cert, int type, int verify, void* cm,
2536825393 if (ret == WC_NO_ERR_TRACE(ASN_BEFORE_DATE_E) ||
2536925394 ret == WC_NO_ERR_TRACE(ASN_AFTER_DATE_E)) {
2537025395 cert->badDate = ret;
25371- if (verify == VERIFY_SKIP_DATE)
25396+ if (( verify == VERIFY_SKIP_DATE) || AsnSkipDateCheck )
2537225397 ret = 0;
2537325398 }
2537425399 else if (ret < 0) {
@@ -38154,7 +38179,7 @@ static int DecodeSingleResponse(byte* source, word32* ioIndex, word32 size,
3815438179
3815538180#ifndef NO_ASN_TIME_CHECK
3815638181#ifndef WOLFSSL_NO_OCSP_DATE_CHECK
38157- if (!XVALIDATE_DATE(single->status->thisDate,
38182+ if ((! AsnSkipDateCheck) && !XVALIDATE_DATE(single->status->thisDate,
3815838183 single->status->thisDateFormat, ASN_BEFORE))
3815938184 return ASN_BEFORE_DATE_E;
3816038185#endif
@@ -38191,7 +38216,9 @@ static int DecodeSingleResponse(byte* source, word32* ioIndex, word32 size,
3819138216
3819238217#ifndef NO_ASN_TIME_CHECK
3819338218#ifndef WOLFSSL_NO_OCSP_DATE_CHECK
38194- if (!XVALIDATE_DATE(single->status->nextDate, single->status->nextDateFormat, ASN_AFTER))
38219+ if ((! AsnSkipDateCheck) &&
38220+ !XVALIDATE_DATE(single->status->nextDate,
38221+ single->status->nextDateFormat, ASN_AFTER))
3819538222 return ASN_AFTER_DATE_E;
3819638223#endif
3819738224#endif
@@ -38264,7 +38291,9 @@ static int DecodeSingleResponse(byte* source, word32* ioIndex, word32 size,
3826438291 cs->thisDateFormat = ASN_GENERALIZED_TIME;
3826538292 #if !defined(NO_ASN_TIME_CHECK) && !defined(WOLFSSL_NO_OCSP_DATE_CHECK)
3826638293 /* Check date is a valid string and ASN_BEFORE now. */
38267- if (!XVALIDATE_DATE(cs->thisDate, ASN_GENERALIZED_TIME, ASN_BEFORE)) {
38294+ if ((! AsnSkipDateCheck) &&
38295+ !XVALIDATE_DATE(cs->thisDate, ASN_GENERALIZED_TIME, ASN_BEFORE))
38296+ {
3826838297 ret = ASN_BEFORE_DATE_E;
3826938298 }
3827038299 #endif /* !NO_ASN_TIME_CHECK && !WOLFSSL_NO_OCSP_DATE_CHECK */
@@ -38287,7 +38316,9 @@ static int DecodeSingleResponse(byte* source, word32* ioIndex, word32 size,
3828738316 cs->nextDateFormat = ASN_GENERALIZED_TIME;
3828838317 #if !defined(NO_ASN_TIME_CHECK) && !defined(WOLFSSL_NO_OCSP_DATE_CHECK)
3828938318 /* Check date is a valid string and ASN_AFTER now. */
38290- if (!XVALIDATE_DATE(cs->nextDate, ASN_GENERALIZED_TIME, ASN_AFTER)) {
38319+ if ((! AsnSkipDateCheck) &&
38320+ !XVALIDATE_DATE(cs->nextDate, ASN_GENERALIZED_TIME, ASN_AFTER))
38321+ {
3829138322 ret = ASN_AFTER_DATE_E;
3829238323 }
3829338324 #endif /* !NO_ASN_TIME_CHECK && !WOLFSSL_NO_OCSP_DATE_CHECK */
@@ -40373,6 +40404,7 @@ static int ParseCRL_CertList(RevokedCert* rcert, DecodedCRL* dcrl,
4037340404 {
4037440405#if !defined(NO_ASN_TIME) && !defined(WOLFSSL_NO_CRL_DATE_CHECK)
4037540406 if (verify != NO_VERIFY &&
40407+ (! AsnSkipDateCheck) &&
4037640408 !XVALIDATE_DATE(dcrl->nextDate, dcrl->nextDateFormat, ASN_AFTER)) {
4037740409 WOLFSSL_MSG("CRL after date is no longer valid");
4037840410 WOLFSSL_ERROR_VERBOSE(CRL_CERT_DATE_ERR);
@@ -41034,6 +41066,7 @@ int ParseCRL(RevokedCert* rcert, DecodedCRL* dcrl, const byte* buff, word32 sz,
4103441066 if (dcrl->nextDateFormat != 0) {
4103541067 /* Next date was set, so validate it. */
4103641068 if (verify != NO_VERIFY &&
41069+ (! AsnSkipDateCheck) &&
4103741070 !XVALIDATE_DATE(dcrl->nextDate, dcrl->nextDateFormat, ASN_AFTER)) {
4103841071 WOLFSSL_MSG("CRL after date is no longer valid");
4103941072 ret = CRL_CERT_DATE_ERR;
@@ -43247,7 +43280,9 @@ int ParseX509Acert(DecodedAcert* acert, int verify)
4324743280 /* check BEFORE date. */
4324843281 idx = ACERT_IDX_ACINFO_VALIDITY_NOTB_GT;
4324943282 if (CheckDate(&dataASN[idx], BEFORE) < 0) {
43250- if ((verify != NO_VERIFY) && (verify != VERIFY_SKIP_DATE)) {
43283+ if ((verify != NO_VERIFY) && (verify != VERIFY_SKIP_DATE) &&
43284+ (! AsnSkipDateCheck))
43285+ {
4325143286 badDate = ASN_BEFORE_DATE_E;
4325243287 }
4325343288 }
@@ -43259,7 +43294,9 @@ int ParseX509Acert(DecodedAcert* acert, int verify)
4325943294 /* check AFTER date. */
4326043295 idx = ACERT_IDX_ACINFO_VALIDITY_NOTA_GT;
4326143296 if (CheckDate(&dataASN[idx], AFTER) < 0) {
43262- if ((verify != NO_VERIFY) && (verify != VERIFY_SKIP_DATE)) {
43297+ if ((verify != NO_VERIFY) && (verify != VERIFY_SKIP_DATE) &&
43298+ (! AsnSkipDateCheck))
43299+ {
4326343300 badDate = ASN_BEFORE_DATE_E;
4326443301 }
4326543302 }
0 commit comments