@@ -93,6 +93,9 @@ int InitCRL(WOLFSSL_CRL* crl, WOLFSSL_CERT_MANAGER* cm)
9393 (void )ret ;
9494 }
9595#endif
96+ #if defined(OPENSSL_EXTRA )
97+ crl -> revokedStack = NULL ;
98+ #endif
9699
97100 return 0 ;
98101}
@@ -250,6 +253,14 @@ static void CRL_Entry_free(CRL_Entry* crle, void* heap)
250253 return ;
251254 }
252255#ifdef CRL_STATIC_REVOKED_LIST
256+ #if defined(OPENSSL_EXTRA )
257+ {
258+ int i ;
259+ for (i = 0 ; i < CRL_MAX_REVOKED_CERTS ; i ++ ) {
260+ XFREE (crle -> certs [i ].extensions , heap , DYNAMIC_TYPE_REVOKED );
261+ }
262+ }
263+ #endif
253264 XMEMSET (crle -> certs , 0 , CRL_MAX_REVOKED_CERTS * sizeof (RevokedCert ));
254265#else
255266 {
@@ -258,6 +269,9 @@ static void CRL_Entry_free(CRL_Entry* crle, void* heap)
258269
259270 for (tmp = crle -> certs ; tmp != NULL ; tmp = next ) {
260271 next = tmp -> next ;
272+ #if defined(OPENSSL_EXTRA )
273+ XFREE (tmp -> extensions , heap , DYNAMIC_TYPE_REVOKED );
274+ #endif
261275 XFREE (tmp , heap , DYNAMIC_TYPE_REVOKED );
262276 }
263277
@@ -312,6 +326,12 @@ void FreeCRL(WOLFSSL_CRL* crl, int dynamic)
312326 XFREE (crl -> monitors [1 ].path , crl -> heap , DYNAMIC_TYPE_CRL_MONITOR );
313327#endif
314328
329+ #if defined(OPENSSL_EXTRA )
330+ if (crl -> revokedStack != NULL ) {
331+ wolfSSL_sk_pop_free (crl -> revokedStack , NULL );
332+ crl -> revokedStack = NULL ;
333+ }
334+ #endif
315335 XFREE (crl -> currentEntry , crl -> heap , DYNAMIC_TYPE_CRL_ENTRY );
316336 crl -> currentEntry = NULL ;
317337 while (tmp ) {
@@ -1231,6 +1251,20 @@ static RevokedCert *DupRevokedCertList(RevokedCert* in, void* heap)
12311251 XMEMCPY (tmp -> revDate , current -> revDate ,
12321252 MAX_DATE_SIZE );
12331253 tmp -> revDateFormat = current -> revDateFormat ;
1254+ tmp -> reasonCode = current -> reasonCode ;
1255+ #if defined(OPENSSL_EXTRA )
1256+ tmp -> extensions = NULL ;
1257+ tmp -> extensionsSz = 0 ;
1258+ if (current -> extensions != NULL && current -> extensionsSz > 0 ) {
1259+ tmp -> extensions = (byte * )XMALLOC (current -> extensionsSz , heap ,
1260+ DYNAMIC_TYPE_REVOKED );
1261+ if (tmp -> extensions != NULL ) {
1262+ XMEMCPY (tmp -> extensions , current -> extensions ,
1263+ current -> extensionsSz );
1264+ tmp -> extensionsSz = current -> extensionsSz ;
1265+ }
1266+ }
1267+ #endif
12341268 tmp -> next = NULL ;
12351269 if (prev != NULL )
12361270 prev -> next = tmp ;
@@ -1244,6 +1278,9 @@ static RevokedCert *DupRevokedCertList(RevokedCert* in, void* heap)
12441278 while (head != NULL ) {
12451279 current = head ;
12461280 head = head -> next ;
1281+ #if defined(OPENSSL_EXTRA )
1282+ XFREE (current -> extensions , heap , DYNAMIC_TYPE_REVOKED );
1283+ #endif
12471284 XFREE (current , heap , DYNAMIC_TYPE_REVOKED );
12481285 }
12491286 return NULL ;
@@ -2360,35 +2397,30 @@ WOLFSSL_X509_CRL* wolfSSL_X509_CRL_new(void)
23602397#ifdef WOLFSSL_CERT_GEN
23612398/* Add a revoked certificate entry to CRL.
23622399 * crl: target CRL
2363- * rev: serial number of revoked certificate
2400+ * rev: revoked certificate entry (serial, date, reason, etc.)
23642401 * Returns WOLFSSL_SUCCESS on success.
2365- * TODO: support other fields for OpenSSL compatibility: revocationDate,
2366- * extensions, issuer, etc.
23672402 */
23682403int wolfSSL_X509_CRL_add_revoked (WOLFSSL_X509_CRL * crl ,
23692404 WOLFSSL_X509_REVOKED * rev )
23702405{
23712406 CRL_Entry * entry ;
23722407 RevokedCert * rc ;
23732408 RevokedCert * curr ;
2374- WOLFSSL_ASN1_TIME revDate ;
23752409
23762410 WOLFSSL_ENTER ("wolfSSL_X509_CRL_add_revoked" );
23772411
23782412 if (crl == NULL || rev == NULL || rev -> serialNumber == NULL ) {
23792413 return BAD_FUNC_ARG ;
23802414 }
23812415
2382- entry = crl -> crlList ;
2383- if ( entry == NULL ) {
2416+ if ( rev -> revocationDate != NULL && ( rev -> revocationDate -> length <= 0 ||
2417+ ( unsigned ) rev -> revocationDate -> length > sizeof ( rc -> revDate )) ) {
23842418 return BAD_FUNC_ARG ;
23852419 }
23862420
2387- /* Set the revocation date to the current time */
2388- XMEMSET (& revDate , 0 , sizeof (revDate ));
2389- if (wolfSSL_ASN1_TIME_adj (& revDate , XTIME (NULL ), 0 , 0 ) == NULL ) {
2390- WOLFSSL_MSG ("Failed to get current time" );
2391- return BAD_STATE_E ;
2421+ entry = crl -> crlList ;
2422+ if (entry == NULL ) {
2423+ return BAD_FUNC_ARG ;
23922424 }
23932425
23942426 {
@@ -2427,8 +2459,25 @@ int wolfSSL_X509_CRL_add_revoked(WOLFSSL_X509_CRL* crl,
24272459 rc -> serialSz = serialSz ;
24282460 }
24292461
2430- XMEMCPY (rc -> revDate , revDate .data , revDate .length );
2431- rc -> revDateFormat = (byte )revDate .type ;
2462+ /* Use caller-provided revocation date, or fall back to current time */
2463+ if (rev -> revocationDate != NULL && rev -> revocationDate -> length > 0 ) {
2464+ XMEMCPY (rc -> revDate , rev -> revocationDate -> data ,
2465+ (size_t )rev -> revocationDate -> length );
2466+ rc -> revDateFormat = (byte )rev -> revocationDate -> type ;
2467+ }
2468+ else {
2469+ WOLFSSL_ASN1_TIME revDate ;
2470+ XMEMSET (& revDate , 0 , sizeof (revDate ));
2471+ if (wolfSSL_ASN1_TIME_adj (& revDate , XTIME (NULL ), 0 , 0 ) == NULL ) {
2472+ WOLFSSL_MSG ("Failed to get current time" );
2473+ XFREE (rc , crl -> heap , DYNAMIC_TYPE_REVOKED );
2474+ return BAD_STATE_E ;
2475+ }
2476+ XMEMCPY (rc -> revDate , revDate .data , revDate .length );
2477+ rc -> revDateFormat = (byte )revDate .type ;
2478+ }
2479+
2480+ rc -> reasonCode = rev -> reason ;
24322481 rc -> next = NULL ;
24332482
24342483 /* Add to end of list */
@@ -2442,6 +2491,14 @@ int wolfSSL_X509_CRL_add_revoked(WOLFSSL_X509_CRL* crl,
24422491 }
24432492 entry -> totalCerts ++ ;
24442493
2494+ #if defined(OPENSSL_EXTRA )
2495+ /* Invalidate cached STACK_OF(X509_REVOKED) since list changed */
2496+ if (crl -> revokedStack != NULL ) {
2497+ wolfSSL_sk_pop_free (crl -> revokedStack , NULL );
2498+ crl -> revokedStack = NULL ;
2499+ }
2500+ #endif
2501+
24452502 WOLFSSL_LEAVE ("wolfSSL_X509_CRL_add_revoked" , WOLFSSL_SUCCESS );
24462503 return WOLFSSL_SUCCESS ;
24472504}
@@ -2513,7 +2570,9 @@ int wolfSSL_X509_CRL_add_revoked_cert(WOLFSSL_X509_CRL* crl,
25132570 XMEMCPY (serialInt -> data , cert -> serial , cert -> serialSz );
25142571 serialInt -> length = cert -> serialSz ;
25152572
2573+ XMEMSET (& revoked , 0 , sizeof (revoked ));
25162574 revoked .serialNumber = serialInt ;
2575+ revoked .reason = -1 ; /* CRL_REASON_NONE */
25172576
25182577 /* Add the revoked certificate entry */
25192578 ret = wolfSSL_X509_CRL_add_revoked (crl , & revoked );
0 commit comments