On Wed, May 11, 2022 at 08:50:57AM -0600, Bob Beck wrote: > yes makes sense > > ok beck@
agreed, ok claudio@ > > On May 11, 2022, at 07:53, Theo Buehler <[email protected]> wrote: > > > > Some funky libcrypto business ahead. > > > > X509 API functions such as X509_check_ca() or X509_get_extension_flags() > > cache X509v3 extensions internally if they're not already cached. They > > make decisions based on (or report some of) the cached values. Although > > it's unlikely, this caching may fail halfway through. The result is > > fairly random in the case of X509_check_ca() (which can't report an > > error itself) - in LibreSSL it would actually return 1 due to a bug I > > fixed yesterday. Every use of X509_get_extension_flags() on a cert for > > which we don't know that the extensions are cached already should also > > check the EXFLAG_INVALID, which is annoying. > > > > An old workaround that used to be used in libssl is to call > > X509_check_purpose(x, -1, -1), which is effectively a wrapper around > > x509v3_cache_extensions() that allows error checking. This way, the > > reported values by the affected API functions are reliable. I suggest to > > do this once we get our hands on a cert, so this issue is out of the > > way. > > > > Caching of extensions will happen sooner or later anyway, at the latest > > within X509_verify_cert(). In LibreSSL this also ensures that the > > RFC 3779 extensions are in canonical form before we inspect them which > > I think is a good thing. > > > > Index: cert.c > > =================================================================== > > RCS file: /cvs/src/usr.sbin/rpki-client/cert.c,v > > retrieving revision 1.77 > > diff -u -p -r1.77 cert.c > > --- cert.c 11 May 2022 09:40:00 -0000 1.77 > > +++ cert.c 11 May 2022 13:16:19 -0000 > > @@ -597,6 +597,12 @@ cert_parse_pre(const char *fn, const uns > > goto out; > > } > > > > + /* Cache X509v3 extensions, see X509_check_ca(3). */ > > + if (X509_check_purpose(x, -1, -1) <= 0) { > > + cryptowarnx("%s: could not cache X509v3 extensions", p.fn); > > + goto out; > > + } > > + > > /* Look for X509v3 extensions. */ > > > > if ((extsz = X509_get_ext_count(x)) < 0) > > Index: cms.c > > =================================================================== > > RCS file: /cvs/src/usr.sbin/rpki-client/cms.c,v > > retrieving revision 1.16 > > diff -u -p -r1.16 cms.c > > --- cms.c 28 Mar 2022 13:04:01 -0000 1.16 > > +++ cms.c 11 May 2022 13:19:14 -0000 > > @@ -224,6 +224,12 @@ cms_parse_validate(X509 **xp, const char > > } > > *xp = X509_dup(sk_X509_value(certs, 0)); > > > > + /* Cache X509v3 extensions, see X509_check_ca(3). */ > > + if (X509_check_purpose(*xp, -1, -1) <= 0) { > > + cryptowarnx("%s: could not cache X509v3 extensions", fn); > > + goto out; > > + } > > + > > if (CMS_SignerInfo_get0_signer_id(si, &kid, NULL, NULL) != 1 || > > kid == NULL) { > > warnx("%s: RFC 6488: could not extract SKI from SID", fn); > > > -- :wq Claudio
