| // 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 | 
 |  | 
 | func addExtraHandshakeTests() { | 
 | 	// An extra SSL_do_handshake is normally a no-op. These tests use -async | 
 | 	// to ensure there is no transport I/O. | 
 | 	testCases = append(testCases, testCase{ | 
 | 		testType: clientTest, | 
 | 		name:     "ExtraHandshake-Client-TLS12", | 
 | 		config: Config{ | 
 | 			MinVersion: VersionTLS12, | 
 | 			MaxVersion: VersionTLS12, | 
 | 		}, | 
 | 		flags: []string{ | 
 | 			"-async", | 
 | 			"-no-op-extra-handshake", | 
 | 		}, | 
 | 	}) | 
 | 	testCases = append(testCases, testCase{ | 
 | 		testType: serverTest, | 
 | 		name:     "ExtraHandshake-Server-TLS12", | 
 | 		config: Config{ | 
 | 			MinVersion: VersionTLS12, | 
 | 			MaxVersion: VersionTLS12, | 
 | 		}, | 
 | 		flags: []string{ | 
 | 			"-async", | 
 | 			"-no-op-extra-handshake", | 
 | 		}, | 
 | 	}) | 
 | 	testCases = append(testCases, testCase{ | 
 | 		testType: clientTest, | 
 | 		name:     "ExtraHandshake-Client-TLS13", | 
 | 		config: Config{ | 
 | 			MinVersion: VersionTLS13, | 
 | 			MaxVersion: VersionTLS13, | 
 | 		}, | 
 | 		flags: []string{ | 
 | 			"-async", | 
 | 			"-no-op-extra-handshake", | 
 | 		}, | 
 | 	}) | 
 | 	testCases = append(testCases, testCase{ | 
 | 		testType: serverTest, | 
 | 		name:     "ExtraHandshake-Server-TLS13", | 
 | 		config: Config{ | 
 | 			MinVersion: VersionTLS13, | 
 | 			MaxVersion: VersionTLS13, | 
 | 		}, | 
 | 		flags: []string{ | 
 | 			"-async", | 
 | 			"-no-op-extra-handshake", | 
 | 		}, | 
 | 	}) | 
 |  | 
 | 	// An extra SSL_do_handshake is a no-op in server 0-RTT. | 
 | 	testCases = append(testCases, testCase{ | 
 | 		testType: serverTest, | 
 | 		name:     "ExtraHandshake-Server-EarlyData-TLS13", | 
 | 		config: Config{ | 
 | 			MaxVersion: VersionTLS13, | 
 | 			MinVersion: VersionTLS13, | 
 | 		}, | 
 | 		messageCount:  2, | 
 | 		resumeSession: true, | 
 | 		earlyData:     true, | 
 | 		flags: []string{ | 
 | 			"-async", | 
 | 			"-no-op-extra-handshake", | 
 | 		}, | 
 | 	}) | 
 |  | 
 | 	// An extra SSL_do_handshake drives the handshake to completion in False | 
 | 	// Start. We test this by handshaking twice and asserting the False | 
 | 	// Start does not appear to happen. See AlertBeforeFalseStartTest for | 
 | 	// how the test works. | 
 | 	testCases = append(testCases, testCase{ | 
 | 		testType: clientTest, | 
 | 		name:     "ExtraHandshake-FalseStart", | 
 | 		config: Config{ | 
 | 			MaxVersion:   VersionTLS12, | 
 | 			CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256}, | 
 | 			NextProtos:   []string{"foo"}, | 
 | 			Bugs: ProtocolBugs{ | 
 | 				ExpectFalseStart:          true, | 
 | 				AlertBeforeFalseStartTest: alertAccessDenied, | 
 | 			}, | 
 | 		}, | 
 | 		flags: []string{ | 
 | 			"-handshake-twice", | 
 | 			"-false-start", | 
 | 			"-advertise-alpn", "\x03foo", | 
 | 			"-expect-alpn", "foo", | 
 | 		}, | 
 | 		shimWritesFirst:    true, | 
 | 		shouldFail:         true, | 
 | 		expectedError:      ":TLSV1_ALERT_ACCESS_DENIED:", | 
 | 		expectedLocalError: "tls: peer did not false start: EOF", | 
 | 	}) | 
 | } |