untrusted comment: verify with openbsd-68-base.pub
RWQZj25CSG5R2he06Y58bLjbVsqEwPR+FJwGWcF4yg9zTlIXIx1BASfhmmmcGc+lkyb3tx+mS7N3wAurLfI7br1yAEkCZxCHUgc=

OpenBSD 6.8 errata 006, November 10, 2020:

rpki-client incorrectly checks the manifest validity interval.

Apply by doing:
   signify -Vep /etc/signify/openbsd-68-base.pub -x 006_rpki.patch.sig \
       -m - | (cd /usr/src && patch -p0)

And then rebuild and install rpki-client:
   cd /usr/src/usr.sbin/rpki-client
   make obj
   make
   make install

Index: usr.sbin/rpki-client/mft.c
===================================================================
RCS file: /cvs/src/usr.sbin/rpki-client/mft.c,v
retrieving revision 1.16
diff -u -p -r1.16 mft.c
--- usr.sbin/rpki-client/mft.c  12 Sep 2020 15:46:48 -0000      1.16
+++ usr.sbin/rpki-client/mft.c  4 Nov 2020 19:11:42 -0000
@@ -54,33 +54,59 @@ gentime2str(const ASN1_GENERALIZEDTIME *
}

/*
+ * Convert an ASN1_GENERALIZEDTIME to a struct tm.
+ * Returns 1 on success, 0 on failure.
+ */
+static int
+generalizedtime_to_tm(const ASN1_GENERALIZEDTIME *gtime, struct tm *tm)
+{
+       const char *data;
+       size_t len;
+
+       data = ASN1_STRING_get0_data(gtime);
+       len = ASN1_STRING_length(gtime);
+
+       return ASN1_time_parse(data, len, tm, V_ASN1_GENERALIZEDTIME) ==
+           V_ASN1_GENERALIZEDTIME;
+}
+
+/*
 * Validate and verify the time validity of the mft.
 * Returns 1 if all is good, 0 if mft is stale, any other case -1.
- * XXX should use ASN1_time_tm_cmp() once libressl is used.
 */
-static time_t
+static int
check_validity(const ASN1_GENERALIZEDTIME *from,
    const ASN1_GENERALIZEDTIME *until, const char *fn)
{
       time_t now = time(NULL);
+       struct tm tm_from, tm_until, tm_now;

-       if (!ASN1_GENERALIZEDTIME_check(from) ||
-           !ASN1_GENERALIZEDTIME_check(until)) {
-               warnx("%s: embedded time format invalid", fn);
+       if (gmtime_r(&now, &tm_now) == NULL) {
+               warnx("%s: could not get current time", fn);
               return -1;
       }
+
+       if (!generalizedtime_to_tm(from, &tm_from)) {
+               warnx("%s: embedded from time format invalid", fn);
+               return -1;
+       }
+       if (!generalizedtime_to_tm(until, &tm_until)) {
+               warnx("%s: embedded until time format invalid", fn);
+               return -1;
+       }
+
       /* check that until is not before from */
-       if (ASN1_STRING_cmp(until, from) < 0) {
+       if (ASN1_time_tm_cmp(&tm_until, &tm_from) < 0) {
               warnx("%s: bad update interval", fn);
               return -1;
       }
       /* check that now is not before from */
-       if (X509_cmp_time(from, &now) > 0) {
+       if (ASN1_time_tm_cmp(&tm_from, &tm_now) > 0) {
               warnx("%s: mft not yet valid %s", fn, gentime2str(from));
               return -1;
       }
       /* check that now is not after until */
-       if (X509_cmp_time(until, &now) < 0) {
+       if (ASN1_time_tm_cmp(&tm_until, &tm_now) < 0) {
               warnx("%s: mft expired on %s", fn, gentime2str(until));
               return 0;
       }