We should not use CRLs if now isn't between thisUpdate and nextUpdate.
This also ensures that thisUpdate <= nextUpdate. While the verifier will
catch all this, doing this early will often remove one of the two
possible choices of a CRL to use for a MFT since these are typically
short-lived. While there, let's simplify the exit of crl_parse().

I was pondering whether we should mark such CRLs stale and add them to
the statistics as we do for MFTs, but I think it's not super
interesting.

Index: crl.c
===================================================================
RCS file: /cvs/src/usr.sbin/rpki-client/crl.c,v
retrieving revision 1.13
diff -u -p -r1.13 crl.c
--- crl.c       8 Feb 2022 14:53:03 -0000       1.13
+++ crl.c       9 Feb 2022 06:23:30 -0000
@@ -34,7 +34,7 @@ crl_parse(const char *fn, const unsigned
        struct crl      *crl;
        const ASN1_TIME *at;
        struct tm        issued_tm, expires_tm;
-       int              rc = 0;
+       time_t           now;
 
        /* just fail for empty buffers, the warning was printed elsewhere */
        if (der == NULL)
@@ -66,7 +66,6 @@ crl_parse(const char *fn, const unsigned
        if ((crl->issued = mktime(&issued_tm)) == -1)
                errx(1, "%s: mktime failed", fn);
 
-       /* extract expire time for later use */
        at = X509_CRL_get0_nextUpdate(crl->x509_crl);
        if (at == NULL) {
                warnx("%s: X509_CRL_get0_nextUpdate failed", fn);
@@ -80,13 +79,25 @@ crl_parse(const char *fn, const unsigned
        if ((crl->expires = mktime(&expires_tm)) == -1)
                errx(1, "%s: mktime failed", fn);
 
-       rc = 1;
- out:
-       if (rc == 0) {
-               crl_free(crl);
-               crl = NULL;
+       now = time(NULL);
+       if (now < crl->issued) {
+               if (verbose > 1)
+                       warnx("%s: crl not yet valid %s", fn,
+                           time2str(crl->issued));
+               goto out;
+       }
+       if (now > crl->expires) {
+               if (verbose > 1)
+                       warnx("%s: crl expired on %s", fn,
+                           time2str(crl->expires));
+               goto out;
        }
+
        return crl;
+
+ out:
+       crl_free(crl);
+       return NULL;
 }
 
 static inline int
Index: extern.h
===================================================================
RCS file: /cvs/src/usr.sbin/rpki-client/extern.h,v
retrieving revision 1.118
diff -u -p -r1.118 extern.h
--- extern.h    8 Feb 2022 14:53:03 -0000       1.118
+++ extern.h    9 Feb 2022 06:21:49 -0000
@@ -502,6 +502,7 @@ void                 entity_free(struct entity *);
 void            entity_read_req(struct ibuf *, struct entity *);
 void            entityq_flush(struct entityq *, struct repo *);
 void            proc_parser(int) __attribute__((noreturn));
+char           *time2str(time_t);
 
 /* Rsync-specific. */
 
Index: parser.c
===================================================================
RCS file: /cvs/src/usr.sbin/rpki-client/parser.c,v
retrieving revision 1.63
diff -u -p -r1.63 parser.c
--- parser.c    8 Feb 2022 14:53:03 -0000       1.63
+++ parser.c    9 Feb 2022 06:19:40 -0000
@@ -94,7 +94,7 @@ repo_add(unsigned int id, char *path, ch
                errx(1, "repository already added: id %d, %s", id, path);
 }
 
-static char *
+char *
 time2str(time_t t)
 {
        static char buf[64];

Reply via email to