b965c63acb
The function X509_verify_cert checks the value of |ctx->chain| at the beginning, and if it is NULL then it initialises it, along with the value of |ctx->untrusted|. The normal way to use X509_verify_cert() is to first call X509_STORE_CTX_init(); then set up various parameters etc; then call X509_verify_cert(); then check the results; and finally call X509_STORE_CTX_cleanup(). The initial call to X509_STORE_CTX_init() sets |ctx->chain| to NULL. The only place in the OpenSSL codebase where |ctx->chain| is set to anything other than a non NULL value is in X509_verify_cert itself. Therefore the only ways that |ctx->chain| could be non NULL on entry to X509_verify_cert is if one of the following occurs: 1) An application calls X509_verify_cert() twice without re-initialising in between. 2) An application reaches inside the X509_STORE_CTX structure and changes the value of |ctx->chain| directly. With regards to the second of these, we should discount this - it should not be supported to allow this. With regards to the first of these, the documentation is not exactly crystal clear, but the implication is that you must call X509_STORE_CTX_init() before each call to X509_verify_cert(). If you fail to do this then, at best, the results would be undefined. Calling X509_verify_cert() with |ctx->chain| set to a non NULL value is likely to have unexpected results, and could be dangerous. This commit changes the behaviour of X509_verify_cert() so that it causes an error if |ctx->chain| is anything other than NULL (because this indicates that we have not been initialised properly). It also clarifies the associated documentation. (Imported from upstream's 692f07c3e0c04180b56febc2feb57cd94395a7a2.) Change-Id: I971f1a305f12bbf9f4ae955313d5557368f0d374 Reviewed-on: https://boringssl-review.googlesource.com/6760 Reviewed-by: Adam Langley <agl@google.com> |
||
---|---|---|
.. | ||
a_digest.c | ||
a_sign.c | ||
a_strex.c | ||
a_verify.c | ||
asn1_gen.c | ||
by_dir.c | ||
by_file.c | ||
charmap.h | ||
CMakeLists.txt | ||
i2d_pr.c | ||
pkcs7_test.c | ||
pkcs7.c | ||
t_crl.c | ||
t_req.c | ||
t_x509.c | ||
t_x509a.c | ||
vpm_int.h | ||
x509_att.c | ||
x509_cmp.c | ||
x509_d2.c | ||
x509_def.c | ||
x509_ext.c | ||
x509_lu.c | ||
x509_obj.c | ||
x509_r2x.c | ||
x509_req.c | ||
x509_set.c | ||
x509_trs.c | ||
x509_txt.c | ||
x509_v3.c | ||
x509_vfy.c | ||
x509_vpm.c | ||
x509.c | ||
x509cset.c | ||
x509name.c | ||
x509rset.c | ||
x509spki.c | ||
x509type.c | ||
x_algor.c | ||
x_all.c | ||
x_attrib.c | ||
x_crl.c | ||
x_exten.c | ||
x_info.c | ||
x_name.c | ||
x_pkey.c | ||
x_pubkey.c | ||
x_req.c | ||
x_sig.c | ||
x_spki.c | ||
x_val.c | ||
x_x509.c | ||
x_x509a.c |