Add handshake hints for TLS 1.2 session tickets.
This runs through much the same code as the TLS 1.3 bits, though we use
a different hint field to avoid mixups between the fields. (Otherwise
the receiver may misinterpret a decryptPSK hint as the result of
decrypting the session_ticket extension, or vice versa. This could
happen if a ClientHello contains both a PSK and a session ticket.)
Bug: 504
Change-Id: I968bafe12120938e6e46e52536efd552b12c66a0
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/53805
Auto-Submit: David Benjamin <davidben@google.com>
Reviewed-by: Adam Langley <agl@google.com>
Commit-Queue: Adam Langley <agl@google.com>
diff --git a/ssl/extensions.cc b/ssl/extensions.cc
index 47434de..157d19f 100644
--- a/ssl/extensions.cc
+++ b/ssl/extensions.cc
@@ -3976,6 +3976,16 @@
: ssl_ticket_aead_error;
} else if (is_psk && hints && !hs->hints_requested && hints->ignore_psk) {
result = ssl_ticket_aead_ignore_ticket;
+ } else if (!is_psk && hints && !hs->hints_requested &&
+ !hints->decrypted_ticket.empty()) {
+ if (plaintext.CopyFrom(hints->decrypted_ticket)) {
+ result = ssl_ticket_aead_success;
+ *out_renew_ticket = hints->renew_ticket;
+ } else {
+ result = ssl_ticket_aead_error;
+ }
+ } else if (!is_psk && hints && !hs->hints_requested && hints->ignore_ticket) {
+ result = ssl_ticket_aead_ignore_ticket;
} else if (ssl->session_ctx->ticket_aead_method != NULL) {
result = ssl_decrypt_ticket_with_method(hs, &plaintext, out_renew_ticket,
ticket);
@@ -3994,12 +4004,24 @@
}
}
- if (is_psk && hints && hs->hints_requested) {
+ if (hints && hs->hints_requested) {
if (result == ssl_ticket_aead_ignore_ticket) {
- hints->ignore_psk = true;
- } else if (result == ssl_ticket_aead_success &&
- !hints->decrypted_psk.CopyFrom(plaintext)) {
- return ssl_ticket_aead_error;
+ if (is_psk) {
+ hints->ignore_psk = true;
+ } else {
+ hints->ignore_ticket = true;
+ }
+ } else if (result == ssl_ticket_aead_success) {
+ if (is_psk) {
+ if (!hints->decrypted_psk.CopyFrom(plaintext)) {
+ return ssl_ticket_aead_error;
+ }
+ } else {
+ if (!hints->decrypted_ticket.CopyFrom(plaintext)) {
+ return ssl_ticket_aead_error;
+ }
+ hints->renew_ticket = *out_renew_ticket;
+ }
}
}