Fix non-xsc path in x509_verify_potential_parent()
authortb <tb@openbsd.org>
Fri, 7 Jun 2024 06:21:40 +0000 (06:21 +0000)
committertb <tb@openbsd.org>
Fri, 7 Jun 2024 06:21:40 +0000 (06:21 +0000)
commit41c05129ea4bafba880f8319397053cd16109ade
treeb797d44f0fe0d031e4ef822b59d2fa3a3564ee54
parent8294d648325a0d3cda94f0c4402790cd5a48e6a9
Fix non-xsc path in x509_verify_potential_parent()

The combination of two bugs made this unexpectedly work as intended. To
appreciate this, let's first note that

a) check_issued(..., child, parent) checks if child was issued by parent.

b) X509_check_issued(child, parent) checks if parent was issued by child.

Now like in the real world, b) will only be true in unusual circumstances
(child is known not to be self-issued at this point). X509_check_issued()
fails by returning something different from X509_V_OK, so

return X509_check_issued(child, parent) != X509_V_OK;

will return true if child was issued by parent since then parent was indeed
not issued by child. On the other hand, if child was not issued by parent,
the verifier will notice elsewhere, e.g., in a signature check.

Fix this by reversing the order of child and parent in the above return
line and check for equality instead. This is nearly impossible to detect
in regress.

ok beck
lib/libcrypto/x509/x509_verify.c