Go to file
David Benjamin b965c63acb Reject calls to X509_verify_cert that have not been reinitialised
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>
2015-12-22 00:12:00 +00:00
crypto Reject calls to X509_verify_cert that have not been reinitialised 2015-12-22 00:12:00 +00:00
decrepit Fix AES XTS mode key size. 2015-11-19 18:08:33 +00:00
fuzz Add four, basic fuzz tests. 2015-11-10 19:14:01 +00:00
include/openssl Simplify RSA key exchange padding check. 2015-12-22 00:10:14 +00:00
ssl Simplify RSA key exchange padding check. 2015-12-22 00:10:14 +00:00
tool Add a tool to generate Ed25519 keys. 2015-12-18 23:34:13 +00:00
util Chromium's update.sh is dead, long live update.py 2015-12-16 17:30:31 +00:00
.clang-format
.gitignore Fix documentation generation on Windows. 2015-08-19 00:45:42 +00:00
BUILDING.md Make the instructions for downloading the ARM compiler easier to copy and paste. 2015-10-30 20:47:08 +00:00
CMakeLists.txt Update and fix fuzzing instructions. 2015-11-10 23:37:36 +00:00
codereview.settings
FUZZING.md Update and fix fuzzing instructions. 2015-11-10 23:37:36 +00:00
LICENSE
PORTING.md Update PORTING.md for the new renego API. 2015-10-26 19:27:56 +00:00
README.md Add four, basic fuzz tests. 2015-11-10 19:14:01 +00:00
STYLE.md Update link to Google style guide. 2015-11-03 02:02:12 +00:00

BoringSSL

BoringSSL is a fork of OpenSSL that is designed to meet Google's needs.

Although BoringSSL is an open source project, it is not intended for general use, as OpenSSL is. We don't recommend that third parties depend upon it. Doing so is likely to be frustrating because there are no guarantees of API or ABI stability.

Programs ship their own copies of BoringSSL when they use it and we update everything as needed when deciding to make API changes. This allows us to mostly avoid compromises in the name of compatibility. It works for us, but it may not work for you.

BoringSSL arose because Google used OpenSSL for many years in various ways and, over time, built up a large number of patches that were maintained while tracking upstream OpenSSL. As Google's product portfolio became more complex, more copies of OpenSSL sprung up and the effort involved in maintaining all these patches in multiple places was growing steadily.

Currently BoringSSL is the SSL library in Chrome/Chromium, Android (but it's not part of the NDK) and a number of other apps/programs.

There are other files in this directory which might be helpful:

  • PORTING.md: how to port OpenSSL-using code to BoringSSL.
  • BUILDING.md: how to build BoringSSL
  • STYLE.md: rules and guidelines for coding style.
  • include/openssl: public headers with API documentation in comments. Also available online.
  • FUZZING.md: information about fuzzing BoringSSL.