Disable X509_STORE_CTX_purpose_inherit()
authortb <tb@openbsd.org>
Mon, 8 Jan 2024 10:06:50 +0000 (10:06 +0000)
committertb <tb@openbsd.org>
Mon, 8 Jan 2024 10:06:50 +0000 (10:06 +0000)
commit208c5b2a90852687e27138d76eedc7ed4919aa4e
tree622b7968ca2b530036ccc119e4db33373b8f0c58
parente932005d1c48c102818b29461d79de80669344dd
Disable X509_STORE_CTX_purpose_inherit()

Nothing uses this function, except two internal callers. So split its guts
temporarily into a helper function and disable the gross general case.
The internal helper can be simplified by observing that def_purpose == 0:

Overriding 0 by 0 doesn't do anything, so drop that bit. Rename ptmp into
purp, and inline X509_PURPOSE_get_by_id(), i.e., make appropriate checks and
subtract X509_PURPOSE_MIN. The fallback to X509_PURPOSE_get_by_id(0) will
always fail since X509_PURPOSE_MIN == 1. So ditch that call. In particular,
X509_STORE_CTX_set_purpose(ctx, X509_PURPOSE_ANY) fails in current because
of this. That's nonsense. So remove the purp->trust == X509_TRUST_DEFAULT
check as only change of behavior. This matches what OpenSSL do nowadays.
They now set def_purpose = purpose if purpose != 0 and def_purpose == 0,
so in all real-world uses of this function they will just fetch the same
purpose again and do not check for default trust the second time around.
Finally, X509_TRUST_get_by_id() is only used to ensure that a non-zero (or
overridden) trust is between X509_TRUST_MIN and X509_TRUST_MAX. So expand
that into its explicit form.

ok jsing
lib/libcrypto/x509/x509_vfy.c