| // Copyright 2025 The BoringSSL Authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package runner |
| |
| // addEndOfFlightTests adds tests where the runner adds extra data in the final |
| // record of each handshake flight. Depending on the implementation strategy, |
| // this data may be carried over to the next flight (assuming no key change) or |
| // may be rejected. To avoid differences with split handshakes and generally |
| // reject misbehavior, BoringSSL treats this as an error. When possible, these |
| // tests pull the extra data from the subsequent flight to distinguish the data |
| // being carried over from a general syntax error. |
| // |
| // These tests are similar to tests in |addChangeCipherSpecTests| that send |
| // extra data at key changes. Not all key changes are at the end of a flight and |
| // not all flights end at a key change. |
| func addEndOfFlightTests() { |
| // TLS 1.3 client handshakes. |
| // |
| // Data following the second TLS 1.3 ClientHello is covered by |
| // PartialClientFinishedWithClientHello, |
| // PartialClientFinishedWithSecondClientHello, and |
| // PartialEndOfEarlyDataWithClientHello in |addChangeCipherSpecTests|. |
| testCases = append(testCases, testCase{ |
| testType: serverTest, |
| name: "PartialSecondClientHelloAfterFirst", |
| config: Config{ |
| MaxVersion: VersionTLS13, |
| // Trigger a curve-based HelloRetryRequest. |
| DefaultCurves: []CurveID{}, |
| Bugs: ProtocolBugs{ |
| PartialSecondClientHelloAfterFirst: true, |
| }, |
| }, |
| shouldFail: true, |
| expectedError: ":EXCESS_HANDSHAKE_DATA:", |
| expectedLocalError: "remote error: unexpected message", |
| }) |
| |
| // TLS 1.3 server handshakes. |
| testCases = append(testCases, testCase{ |
| testType: clientTest, |
| name: "PartialServerHelloWithHelloRetryRequest", |
| config: Config{ |
| MaxVersion: VersionTLS13, |
| // P-384 requires HelloRetryRequest in BoringSSL. |
| CurvePreferences: []CurveID{CurveP384}, |
| Bugs: ProtocolBugs{ |
| PartialServerHelloWithHelloRetryRequest: true, |
| }, |
| }, |
| shouldFail: true, |
| expectedError: ":EXCESS_HANDSHAKE_DATA:", |
| expectedLocalError: "remote error: unexpected message", |
| }) |
| |
| // TLS 1.2 client handshakes. |
| testCases = append(testCases, testCase{ |
| testType: serverTest, |
| name: "PartialClientKeyExchangeWithClientHello", |
| config: Config{ |
| MaxVersion: VersionTLS12, |
| Bugs: ProtocolBugs{ |
| PartialClientKeyExchangeWithClientHello: true, |
| }, |
| }, |
| shouldFail: true, |
| expectedError: ":EXCESS_HANDSHAKE_DATA:", |
| expectedLocalError: "remote error: unexpected message", |
| }) |
| |
| // TLS 1.2 server handshakes. |
| testCases = append(testCases, testCase{ |
| testType: clientTest, |
| name: "PartialNewSessionTicketWithServerHelloDone", |
| config: Config{ |
| MaxVersion: VersionTLS12, |
| Bugs: ProtocolBugs{ |
| PartialNewSessionTicketWithServerHelloDone: true, |
| }, |
| }, |
| shouldFail: true, |
| expectedError: ":EXCESS_HANDSHAKE_DATA:", |
| expectedLocalError: "remote error: unexpected message", |
| }) |
| |
| for _, vers := range tlsVersions { |
| for _, testType := range []testType{clientTest, serverTest} { |
| suffix := "-Client" |
| if testType == serverTest { |
| suffix = "-Server" |
| } |
| suffix += "-" + vers.name |
| |
| testCases = append(testCases, testCase{ |
| testType: testType, |
| name: "TrailingDataWithFinished" + suffix, |
| config: Config{ |
| MaxVersion: vers.version, |
| Bugs: ProtocolBugs{ |
| TrailingDataWithFinished: true, |
| }, |
| }, |
| shouldFail: true, |
| expectedError: ":EXCESS_HANDSHAKE_DATA:", |
| expectedLocalError: "remote error: unexpected message", |
| }) |
| testCases = append(testCases, testCase{ |
| testType: testType, |
| name: "TrailingDataWithFinished-Resume" + suffix, |
| config: Config{ |
| MaxVersion: vers.version, |
| }, |
| resumeConfig: &Config{ |
| MaxVersion: vers.version, |
| Bugs: ProtocolBugs{ |
| TrailingDataWithFinished: true, |
| }, |
| }, |
| resumeSession: true, |
| shouldFail: true, |
| expectedError: ":EXCESS_HANDSHAKE_DATA:", |
| expectedLocalError: "remote error: unexpected message", |
| }) |
| } |
| } |
| } |