Loosen TLS 1.3 session/cipher matching in BoGo. Draft 18 sadly loosens the requirements to only requiring the PRF hash stay fixed. BUG=117 Change-Id: Ic94d53fd9cabaee611fcf36b0071558075e10728 Reviewed-on: https://boringssl-review.googlesource.com/12310 Reviewed-by: Nick Harper <nharper@chromium.org> Reviewed-by: David Benjamin <davidben@google.com> Commit-Queue: David Benjamin <davidben@google.com> CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
diff --git a/ssl/test/runner/handshake_client.go b/ssl/test/runner/handshake_client.go index 208dcca..d074778 100644 --- a/ssl/test/runner/handshake_client.go +++ b/ssl/test/runner/handshake_client.go
@@ -223,11 +223,17 @@ // Check that the ciphersuite/version used for the // previous session are still valid. cipherSuiteOk := false - for _, id := range hello.cipherSuites { - if id == candidateSession.cipherSuite { - cipherSuiteOk = true - break + if candidateSession.vers <= VersionTLS12 { + for _, id := range hello.cipherSuites { + if id == candidateSession.cipherSuite { + cipherSuiteOk = true + break + } } + } else { + // TLS 1.3 allows the cipher to change on + // resumption. + cipherSuiteOk = true } versOk := candidateSession.vers >= minVersion && @@ -623,9 +629,10 @@ c.sendAlert(alertUnknownPSKIdentity) return errors.New("tls: server sent unknown PSK identity") } - if hs.session.cipherSuite != hs.suite.id { + sessionCipher := cipherSuiteFromID(hs.session.cipherSuite) + if sessionCipher == nil || sessionCipher.hash() != hs.suite.hash() { c.sendAlert(alertHandshakeFailure) - return errors.New("tls: server sent invalid cipher suite") + return errors.New("tls: server resumed an invalid session for the cipher suite") } psk = hs.session.masterSecret c.didResume = true
diff --git a/ssl/test/runner/handshake_server.go b/ssl/test/runner/handshake_server.go index c9a5b50..67950ba 100644 --- a/ssl/test/runner/handshake_server.go +++ b/ssl/test/runner/handshake_server.go
@@ -462,7 +462,8 @@ if sessionState.ticketExpiration.Before(c.config.time()) { continue } - if sessionState.cipherSuite != hs.suite.id { + sessionCipher := cipherSuiteFromID(sessionState.cipherSuite) + if sessionCipher == nil || sessionCipher.hash() != hs.suite.hash() { continue } }