Use max_cert_list for TLSv1.3 NewSessionTicket

Certificate chains are transfered to the respective peer during the TLS
handshake in the ServerHello, and sometimes the ClientHello, messages.
These certificate chains can be of arbitrary size due to the number of
intermediary issuers, and due to the extensions within the certificates.

To avoid resource exhaustion, BoringSSL limits the size of handshake
messages, and rejects handshakes beyond a certain size.
By default, the max message size is 16 KiB, but it can be increased with
the SSL_CTX_set_cert_max_list setting.

This setting allows handshakes to complete with large certificate
chains. However, a new problem surfaces for TLSv1.3 sessions.
In TLSv1.3, session tickets (for supporting session resumption) are sent
after the handshake in NewSessionTicket messages. BoringSSL currently
encode the entire peer certificate chain (and some other things) in the
session ticket, which means the size of the certificate chains
influence the size of the corresponding NewSessionTicket.

To avoid breaking the TLS session on oversized NewSessionTicket
messages, a BoringSSL server will refuse to send any NewSessionTicket
that looks like it will be larger than 16 KiB. Unfortunately, this
accounting is inaccurate and does not take the entire NewSessionTicket
message into account. Thus, certificate chains that are a few hundred
bytes smaller than 16 KiB can be accepted by a handshake when the
max_cert_list setting has been increased, and by the NewSessionTicket
size accounting, but then later fail on the client with an
EXCESSIVE_MESSAGE_SIZE error, because ssl_max_handshake_message_len()
returns the default 16 KiB, in turn because the handshake has finished
and that causes it to ignore the configured max_cert_list.

This patch fixes this problem by making TLSv1.3 clients keep using the
max_cert_list setting post-handshake, when it is greater than the
default 16 KiB.

Change-Id: I17d689906a12079add4ad48b679508bc09a79f7c
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/78647
Reviewed-by: David Benjamin <davidben@google.com>
Reviewed-by: Adam Langley <agl@google.com>
Commit-Queue: Adam Langley <agl@google.com>
1 file changed
tree: 74a38b24b720ffe2c87b556f5ccb623c8d32e596
  1. .bcr/
  2. .github/
  3. cmake/
  4. crypto/
  5. decrepit/
  6. docs/
  7. fuzz/
  8. gen/
  9. include/
  10. infra/
  11. pki/
  12. rust/
  13. ssl/
  14. third_party/
  15. tool/
  16. util/
  17. .bazelignore
  18. .bazelrc
  19. .bazelversion
  20. .clang-format
  21. .gitignore
  22. API-CONVENTIONS.md
  23. AUTHORS
  24. BREAKING-CHANGES.md
  25. BUILD.bazel
  26. build.json
  27. BUILDING.md
  28. CMakeLists.txt
  29. codereview.settings
  30. CONTRIBUTING.md
  31. FUZZING.md
  32. go.mod
  33. go.sum
  34. INCORPORATING.md
  35. LICENSE
  36. MODULE.bazel
  37. MODULE.bazel.lock
  38. PORTING.md
  39. PrivacyInfo.xcprivacy
  40. README.md
  41. SANDBOXING.md
  42. STYLE.md
README.md

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.

Project links:

To file a security issue, use the Chromium process and mention in the report this is for BoringSSL. You can ignore the parts of the process that are specific to Chromium/Chrome.

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