Make the new validator check for EXFLAG_CRITICAL
authortb <tb@openbsd.org>
Wed, 24 Feb 2021 17:59:05 +0000 (17:59 +0000)
committertb <tb@openbsd.org>
Wed, 24 Feb 2021 17:59:05 +0000 (17:59 +0000)
commitd095297bfe8368a985f255be0554186be47beede
tree130b7ff3c9d1d1483b48d5fe6af4a5e69dcbef52
parentaba87e0a09f2110c637bfbd4d3598643fa11f880
Make the new validator check for EXFLAG_CRITICAL

As should be obvious from the name and the comment in x509_vfy.h
int last_untrusted;     /* index of last untrusted cert */
last_untrusted actually counts the number of untrusted certs at the
bottom of the chain.

Unfortunately, an earlier fix introducing x509_verify_set_xsc_chain()
assumed that last_untrusted actually meant the index of the last
untrusted cert in the chain, resulting in an off-by-one, which in turn
led to x509_vfy_check_chain_extension() skipping the check for the
EXFLAG_CRITICAL flag.

A second bug in x509_verify_set_xsc_chain() assumed that it is always
called with a trusted root, which is not necessarily the case anymore.
Address this with a temporary fix which will have to be revisited once
we will allow chains with more than one trusted cert.

Reported with a test case by tobhe.

ok jsing tobhe
lib/libcrypto/x509/x509_verify.c