Subject: RE: delta CRLs

From: "David A. Cooper" <[email-masked]>
Date: Mon, 07 May 2001 15:03:30 -0400

At 01:41 PM 5/7/01 -0400, Housley, Russ wrote:
>I have read section 9 of X.509-2000 (4th Edition v7) three times today.  I cannot find the requirement there.  Where is it hidden?

Russ,

There used to be a requirement in X.509 that whenever a full CRL is issued a delta-CRL must also be issued (if delta-CRLs are being used) and that the full and the delta must have the same CRL number. I don't know why that text was removed. However, there is the requirement that the CRL numbers for a sequence of CRLs issued for a given scope must increase monotonically. The fact that some of the CRLs in the sequence contain the deltaCRLIndicator extension and some do not is irrelevant (just as the presence or absence of the orderedList extension or the authorityKeyIdentifier extension has no affect on the CRL number). There is also the following text in X.509 (2000):

         A CRL that is complete for a given scope, at the current time, can be constructed
         locally in either of the following ways:

                 by retrieving the current dCRL for that scope, and combining it with an issued
                 CRL that is complete for that scope and that has a cRLNumber greater than or
                 equal to the cRLNumber of the base CRL referenced in the dCRL; or

                 by retrieving the current dCRL for that scope and combining it with a locally
                 constructed CRL that is complete for that scope and that was constructed with
                 a dCRL that has a cRLNumber greater than or equal to the cRLNumber of the
                 base CRLreferenced in the current dCRL.

If full CRLs and delta-CRLs were independently numbered, then one could not apply delta-CRLs to locally constructed delta-CRLs as described above.

To demonstrate the problem, I will the example that you provided (see below). In this example, 144 hours (48 x 3) after delta-CRL number 49 was issued, delta-CRL number 193 will be issued. Delta-CRL number 193 will have a BaseCRLNumber of 49. The intention of this would be to specify that delta-CRL number 193 may be combined with full CRL number 49 (which was issued 143 hours after delta-CRL number 49 was issued). 

Suppose, however, that a relying party constructed a CRL locally using full CRL number 1 and delta-CRL number 49. According to the above text from X.509, that relying party could combine delta-CRL number 193 with the CRL locally generated using delta-CRL number 49. The results of combining delta-CRL number 193 with the locally generated CRL would clearly be incorrect. Worse, it would not be obvious to the relying party that the CRL numbers in the delta-CRLs were incorrect and so it would be very difficult for the relying party to determine that the constructed CRL was incorrect.

The only way that one can safely combine a delta-CRL with a locally generated CRL as specified above is if full CRLs and delta-CRLs are numbered consistently. So, while one may argue that the requirement has not been stated with sufficient clarity, it is there.

Dave

>>current   revoked
>>time       certificates full CRL                                delta CRL
>>------------------------------------------------------------------------------------------------------------------
>>12:00   {14}            cRLNumber = 1                   cRLNumber = 48
>>                                 thisUpdate = 12:00              thisUpdate = 12:00
>>                                 nextUpdate = 15:00              nextUpdate = 13:00
>>                                                                 BaseCRLNumber = 1
>>                                 CertificateList = {14}          CertificateList = {}
>>
>>
>>13:00   {14, 124}                                       cRLNumber = 49
>>                                                                 thisUpdate = 13:00
>>                                                                 nextUpdate = 14:00
>>                                                                 BaseCRLNumber = 1
>>                                                                 CertificateList = {124}
>>
>>
>>14:00   {14, 124}                                       cRLNumber = 50
>>                                                                 thisUpdate = 14:00
>>                                                                 nextUpdate = 15:00
>>                                                                 BaseCRLNumber = 1
>>                                                                 CertificateList = {124}
>>
>>
>>15:00   {14, 124, 39}   cRLNumber = 2                   cRLNumber = 51
>>                                 thisUpdate = 15:00              thisUpdate = 15:00
>>                                 nextUpdate = 18:00              nextUpdate = 16:00
>>                                                                 BaseCRLNumber = 1
>>                                 CertificateList = {14, 124, 39} CertificateList = {124, 39}
>>
>>
>>16:00   {14, 124, 39,                                   cRLNumber = 52
>>                 67}                                             thisUpdate = 16:00
>>                                                                 nextUpdate = 17:00
>>                                                                 BaseCRLNumber = 2
>>                                                                 CertificateList = {67}
>>
>>
>>17:00   {14, 124, 39,                                   cRLNumber = 53
>>                  67}                                            thisUpdate = 17:00
>>                                                                 nextUpdate = 18:00
>>                                                                 BaseCRLNumber = 2
>>                                                                 CertificateList = {67}
>>
>>
>>18:00   {14, 124, 39,   cRLNumber = 3                   cRLNumber = 54
>>                  67}            thisUpdate = 18:00              thisUpdate = 18:00
>>                                 nextUpdate = 21:00              nextUpdate = 19:00
>>                                                                 BaseCRLNumber = 2
>>                                 CertificateList = {14, 124, 39, CertificateList = {67}
>>                                                  21}
>>
>>
>>19:00   {14, 124, 39,                                   cRLNumber = 55
>>                  67}                                            thisUpdate = 19:00
>>                                                                 nextUpdate = 20:00
>>                                                                 BaseCRLNumber = 3
>>                                                                 CertificateList = {}

---

From: "Housley, Russ" <[email-masked]>
Date: Mon, 07 May 2001 19:41:32 -0400

David:

>>I have read section 9 of X.509-2000 (4th Edition v7) three times 
>>today.  I cannot find the requirement there.  Where is it hidden?
>
>There used to be a requirement in X.509 that whenever a full CRL is issued 
>a delta-CRL must also be issued (if delta-CRLs are being used) and that 
>the full and the delta must have the same CRL number. I don't know why 
>that text was removed. However, there is the requirement that the CRL 
>numbers for a sequence of CRLs issued for a given scope must increase 
>monotonically. The fact that some of the CRLs in the sequence contain the 
>deltaCRLIndicator extension and some do not is irrelevant (just as the 
>presence or absence of the orderedList extension or the 
>authorityKeyIdentifier extension has no affect on the CRL number).

Two independent sequence number streams can meet the remaining 
requirements.  Sounds like the revisions have removed the only sentence 
that was crystal clear on this point.

>There is also the following text in X.509 (2000):
>
>If full CRLs and delta-CRLs were independently numbered, then one could 
>not apply delta-CRLs to locally constructed delta-CRLs as described above.

I agree that it could not be done in all cases.  Perhaps this is where 
Denis gets the idea that there are circumstances where the full CRL must be 
fetched periodically.

>To demonstrate the problem, I will the example that you provided (see 
>below). In this example, 144 hours (48 x 3) after delta-CRL number 49 was 
>issued, delta-CRL number 193 will be issued. Delta-CRL number 193 will 
>have a BaseCRLNumber of 49. The intention of this would be to specify that 
>delta-CRL number 193 may be combined with full CRL number 49 (which was 
>issued 143 hours after delta-CRL number 49 was issued).
>
>Suppose, however, that a relying party constructed a CRL locally using 
>full CRL number 1 and delta-CRL number 49. According to the above text 
>from X.509, that relying party could combine delta-CRL number 193 with the 
>CRL locally generated using delta-CRL number 49. The results of combining 
>delta-CRL number 193 with the locally generated CRL would clearly be 
>incorrect. Worse, it would not be obvious to the relying party that the 
>CRL numbers in the delta-CRLs were incorrect and so it would be very 
>difficult for the relying party to determine that the constructed CRL was 
>incorrect.
>
>The only way that one can safely combine a delta-CRL with a locally 
>generated CRL as specified above is if full CRLs and delta-CRLs are 
>numbered consistently. So, while one may argue that the requirement has 
>not been stated with sufficient clarity, it is there.

As I have said, I am quite comfortable with imposing a single sequence 
number stream as a PKIX profile requirement.  And, so far, I have not heard 
anyone argue that we should not have a single sequence number stream.

Russ