Track SSL session types a bit better on the client

A session could be offered in one of three fields:

- The TLS 1.2 session ID
- The TLS 1.2 session ticket extension
- The TLS 1.3 PSK extension

We didn't quite keep track of which kind we had. In particular:

- We are not willing to send TLS 1.2 session tickets if SSL_OP_NO_TICKET
  is set. However, if we were configured with a ticket session AND
  enabled TLS 1.3, we'd send a non-empty session ID. If the server
  echo'd the session ID anyway, we'd get confused and think the session
  was being resumed. There's no real practical consequence to this, but
  we should reject this.

- If we somehow constructed a TLS 1.3 session with ID but no ticket, we
  would think it was an ID session and offer the session ID after the
  cleanup in
  https://boringssl-review.googlesource.com/c/boringssl/+/69947. We'd
  also send a PSK extension with an empty PSK field, and then even allow
  the server to resume it. This isn't completely absurd (except that PSK
  identities cannot be empty), but offering the session ID would trip
  QUIC up.

  This case should be impossible... but before the bug fixed in
  I1651e7887f9611ebc44ac54af89c85bf86a9feff, this was actually
  reachable. There's no practical consequence, but we should reject this
  at a better place.

- The code to decide whether the server could send pre_shared_key in
  ServerHello just checked for any session at all, even a TLS 1.2
  session. This has no practical consequence because we'll just catch it
  later, but may as well fix this.

Fix this by adding a function to classify the SSL_SESSION and then catch
on that throughout.

Change-Id: I26a721b7c473d08525217e4ab1d0d341d651dfcb
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/73008
Reviewed-by: Adam Langley <[email protected]>
Commit-Queue: David Benjamin <[email protected]>
9 files changed
tree: c4788fb95b1c070ca1dbc7cf749c462ec094393b
  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. .clang-format
  20. .gitignore
  21. API-CONVENTIONS.md
  22. BREAKING-CHANGES.md
  23. BUILD.bazel
  24. build.json
  25. BUILDING.md
  26. CMakeLists.txt
  27. codereview.settings
  28. CONTRIBUTING.md
  29. FUZZING.md
  30. go.mod
  31. go.sum
  32. INCORPORATING.md
  33. LICENSE
  34. MODULE.bazel
  35. MODULE.bazel.lock
  36. PORTING.md
  37. PrivacyInfo.xcprivacy
  38. README.md
  39. SANDBOXING.md
  40. 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: