• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright (c) 2016, Google Inc.
2//
3// Permission to use, copy, modify, and/or distribute this software for any
4// purpose with or without fee is hereby granted, provided that the above
5// copyright notice and this permission notice appear in all copies.
6//
7// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14
15package runner
16
17import (
18	"bytes"
19	"crypto/ecdsa"
20	"crypto/elliptic"
21	"crypto/rand"
22	"crypto/x509"
23	"crypto/x509/pkix"
24	"encoding/base64"
25	"encoding/hex"
26	"encoding/json"
27	"encoding/pem"
28	"errors"
29	"flag"
30	"fmt"
31	"io"
32	"io/ioutil"
33	"math/big"
34	"net"
35	"os"
36	"os/exec"
37	"path"
38	"path/filepath"
39	"runtime"
40	"strconv"
41	"strings"
42	"sync"
43	"syscall"
44	"time"
45)
46
47var (
48	useValgrind        = flag.Bool("valgrind", false, "If true, run code under valgrind")
49	useGDB             = flag.Bool("gdb", false, "If true, run BoringSSL code under gdb")
50	useLLDB            = flag.Bool("lldb", false, "If true, run BoringSSL code under lldb")
51	flagDebug          = flag.Bool("debug", false, "Hexdump the contents of the connection")
52	mallocTest         = flag.Int64("malloc-test", -1, "If non-negative, run each test with each malloc in turn failing from the given number onwards.")
53	mallocTestDebug    = flag.Bool("malloc-test-debug", false, "If true, ask bssl_shim to abort rather than fail a malloc. This can be used with a specific value for --malloc-test to identity the malloc failing that is causing problems.")
54	jsonOutput         = flag.String("json-output", "", "The file to output JSON results to.")
55	pipe               = flag.Bool("pipe", false, "If true, print status output suitable for piping into another program.")
56	testToRun          = flag.String("test", "", "The pattern to filter tests to run, or empty to run all tests")
57	numWorkers         = flag.Int("num-workers", runtime.NumCPU(), "The number of workers to run in parallel.")
58	shimPath           = flag.String("shim-path", "../../../build/ssl/test/bssl_shim", "The location of the shim binary.")
59	resourceDir        = flag.String("resource-dir", ".", "The directory in which to find certificate and key files.")
60	fuzzer             = flag.Bool("fuzzer", false, "If true, tests against a BoringSSL built in fuzzer mode.")
61	transcriptDir      = flag.String("transcript-dir", "", "The directory in which to write transcripts.")
62	idleTimeout        = flag.Duration("idle-timeout", 15*time.Second, "The number of seconds to wait for a read or write to bssl_shim.")
63	deterministic      = flag.Bool("deterministic", false, "If true, uses a deterministic PRNG in the runner.")
64	allowUnimplemented = flag.Bool("allow-unimplemented", false, "If true, report pass even if some tests are unimplemented.")
65	looseErrors        = flag.Bool("loose-errors", false, "If true, allow shims to report an untranslated error code.")
66	shimConfigFile     = flag.String("shim-config", "", "A config file to use to configure the tests for this shim.")
67	includeDisabled    = flag.Bool("include-disabled", false, "If true, also runs disabled tests.")
68	includeDHE         = flag.Bool("include-dhe", false, "If true, test DHE ciphersuites.")
69	repeatUntilFailure = flag.Bool("repeat-until-failure", false, "If true, the first selected test will be run repeatedly until failure.")
70)
71
72// ShimConfigurations is used with the “json” package and represents a shim
73// config file.
74type ShimConfiguration struct {
75	// DisabledTests maps from a glob-based pattern to a freeform string.
76	// The glob pattern is used to exclude tests from being run and the
77	// freeform string is unparsed but expected to explain why the test is
78	// disabled.
79	DisabledTests map[string]string
80
81	// ErrorMap maps from expected error strings to the correct error
82	// string for the shim in question. For example, it might map
83	// “:NO_SHARED_CIPHER:” (a BoringSSL error string) to something
84	// like “SSL_ERROR_NO_CYPHER_OVERLAP”.
85	ErrorMap map[string]string
86
87	// HalfRTTTickets is the number of half-RTT tickets the client should
88	// expect before half-RTT data when testing 0-RTT.
89	HalfRTTTickets int
90}
91
92// Setup shimConfig defaults aligning with BoringSSL.
93var shimConfig ShimConfiguration = ShimConfiguration{
94	HalfRTTTickets: 2,
95}
96
97type testCert int
98
99const (
100	testCertRSA testCert = iota
101	testCertRSA1024
102	testCertRSAChain
103	testCertECDSAP224
104	testCertECDSAP256
105	testCertECDSAP384
106	testCertECDSAP521
107)
108
109const (
110	rsaCertificateFile       = "cert.pem"
111	rsa1024CertificateFile   = "rsa_1024_cert.pem"
112	rsaChainCertificateFile  = "rsa_chain_cert.pem"
113	ecdsaP224CertificateFile = "ecdsa_p224_cert.pem"
114	ecdsaP256CertificateFile = "ecdsa_p256_cert.pem"
115	ecdsaP384CertificateFile = "ecdsa_p384_cert.pem"
116	ecdsaP521CertificateFile = "ecdsa_p521_cert.pem"
117)
118
119const (
120	rsaKeyFile       = "key.pem"
121	rsa1024KeyFile   = "rsa_1024_key.pem"
122	rsaChainKeyFile  = "rsa_chain_key.pem"
123	ecdsaP224KeyFile = "ecdsa_p224_key.pem"
124	ecdsaP256KeyFile = "ecdsa_p256_key.pem"
125	ecdsaP384KeyFile = "ecdsa_p384_key.pem"
126	ecdsaP521KeyFile = "ecdsa_p521_key.pem"
127	channelIDKeyFile = "channel_id_key.pem"
128)
129
130var (
131	rsaCertificate       Certificate
132	rsa1024Certificate   Certificate
133	rsaChainCertificate  Certificate
134	ecdsaP224Certificate Certificate
135	ecdsaP256Certificate Certificate
136	ecdsaP384Certificate Certificate
137	ecdsaP521Certificate Certificate
138)
139
140var testCerts = []struct {
141	id                testCert
142	certFile, keyFile string
143	cert              *Certificate
144}{
145	{
146		id:       testCertRSA,
147		certFile: rsaCertificateFile,
148		keyFile:  rsaKeyFile,
149		cert:     &rsaCertificate,
150	},
151	{
152		id:       testCertRSA1024,
153		certFile: rsa1024CertificateFile,
154		keyFile:  rsa1024KeyFile,
155		cert:     &rsa1024Certificate,
156	},
157	{
158		id:       testCertRSAChain,
159		certFile: rsaChainCertificateFile,
160		keyFile:  rsaChainKeyFile,
161		cert:     &rsaChainCertificate,
162	},
163	{
164		id:       testCertECDSAP224,
165		certFile: ecdsaP224CertificateFile,
166		keyFile:  ecdsaP224KeyFile,
167		cert:     &ecdsaP224Certificate,
168	},
169	{
170		id:       testCertECDSAP256,
171		certFile: ecdsaP256CertificateFile,
172		keyFile:  ecdsaP256KeyFile,
173		cert:     &ecdsaP256Certificate,
174	},
175	{
176		id:       testCertECDSAP384,
177		certFile: ecdsaP384CertificateFile,
178		keyFile:  ecdsaP384KeyFile,
179		cert:     &ecdsaP384Certificate,
180	},
181	{
182		id:       testCertECDSAP521,
183		certFile: ecdsaP521CertificateFile,
184		keyFile:  ecdsaP521KeyFile,
185		cert:     &ecdsaP521Certificate,
186	},
187}
188
189var channelIDKey *ecdsa.PrivateKey
190var channelIDBytes []byte
191
192var testOCSPResponse = []byte{1, 2, 3, 4}
193var testSCTList = []byte{0, 6, 0, 4, 5, 6, 7, 8}
194
195var testOCSPExtension = append([]byte{byte(extensionStatusRequest) >> 8, byte(extensionStatusRequest), 0, 8, statusTypeOCSP, 0, 0, 4}, testOCSPResponse...)
196var testSCTExtension = append([]byte{byte(extensionSignedCertificateTimestamp) >> 8, byte(extensionSignedCertificateTimestamp), 0, byte(len(testSCTList))}, testSCTList...)
197
198func initCertificates() {
199	for i := range testCerts {
200		cert, err := LoadX509KeyPair(path.Join(*resourceDir, testCerts[i].certFile), path.Join(*resourceDir, testCerts[i].keyFile))
201		if err != nil {
202			panic(err)
203		}
204		cert.OCSPStaple = testOCSPResponse
205		cert.SignedCertificateTimestampList = testSCTList
206		*testCerts[i].cert = cert
207	}
208
209	channelIDPEMBlock, err := ioutil.ReadFile(path.Join(*resourceDir, channelIDKeyFile))
210	if err != nil {
211		panic(err)
212	}
213	channelIDDERBlock, _ := pem.Decode(channelIDPEMBlock)
214	if channelIDDERBlock.Type != "EC PRIVATE KEY" {
215		panic("bad key type")
216	}
217	channelIDKey, err = x509.ParseECPrivateKey(channelIDDERBlock.Bytes)
218	if err != nil {
219		panic(err)
220	}
221	if channelIDKey.Curve != elliptic.P256() {
222		panic("bad curve")
223	}
224
225	channelIDBytes = make([]byte, 64)
226	writeIntPadded(channelIDBytes[:32], channelIDKey.X)
227	writeIntPadded(channelIDBytes[32:], channelIDKey.Y)
228}
229
230func getRunnerCertificate(t testCert) Certificate {
231	for _, cert := range testCerts {
232		if cert.id == t {
233			return *cert.cert
234		}
235	}
236	panic("Unknown test certificate")
237}
238
239func getShimCertificate(t testCert) string {
240	for _, cert := range testCerts {
241		if cert.id == t {
242			return cert.certFile
243		}
244	}
245	panic("Unknown test certificate")
246}
247
248func getShimKey(t testCert) string {
249	for _, cert := range testCerts {
250		if cert.id == t {
251			return cert.keyFile
252		}
253	}
254	panic("Unknown test certificate")
255}
256
257// encodeDERValues encodes a series of bytestrings in comma-separated-hex form.
258func encodeDERValues(values [][]byte) string {
259	var ret string
260	for i, v := range values {
261		if i > 0 {
262			ret += ","
263		}
264		ret += hex.EncodeToString(v)
265	}
266
267	return ret
268}
269
270type testType int
271
272const (
273	clientTest testType = iota
274	serverTest
275)
276
277type protocol int
278
279const (
280	tls protocol = iota
281	dtls
282)
283
284const (
285	alpn = 1
286	npn  = 2
287)
288
289type testCase struct {
290	testType      testType
291	protocol      protocol
292	name          string
293	config        Config
294	shouldFail    bool
295	expectedError string
296	// expectedLocalError, if not empty, contains a substring that must be
297	// found in the local error.
298	expectedLocalError string
299	// expectedVersion, if non-zero, specifies the TLS version that must be
300	// negotiated.
301	expectedVersion uint16
302	// expectedResumeVersion, if non-zero, specifies the TLS version that
303	// must be negotiated on resumption. If zero, expectedVersion is used.
304	expectedResumeVersion uint16
305	// expectedCipher, if non-zero, specifies the TLS cipher suite that
306	// should be negotiated.
307	expectedCipher uint16
308	// expectChannelID controls whether the connection should have
309	// negotiated a Channel ID with channelIDKey.
310	expectChannelID bool
311	// expectedNextProto controls whether the connection should
312	// negotiate a next protocol via NPN or ALPN.
313	expectedNextProto string
314	// expectNoNextProto, if true, means that no next protocol should be
315	// negotiated.
316	expectNoNextProto bool
317	// expectedNextProtoType, if non-zero, is the expected next
318	// protocol negotiation mechanism.
319	expectedNextProtoType int
320	// expectedSRTPProtectionProfile is the DTLS-SRTP profile that
321	// should be negotiated. If zero, none should be negotiated.
322	expectedSRTPProtectionProfile uint16
323	// expectedOCSPResponse, if not nil, is the expected OCSP response to be received.
324	expectedOCSPResponse []uint8
325	// expectedSCTList, if not nil, is the expected SCT list to be received.
326	expectedSCTList []uint8
327	// expectedPeerSignatureAlgorithm, if not zero, is the signature
328	// algorithm that the peer should have used in the handshake.
329	expectedPeerSignatureAlgorithm signatureAlgorithm
330	// expectedCurveID, if not zero, is the curve that the handshake should
331	// have used.
332	expectedCurveID CurveID
333	// messageLen is the length, in bytes, of the test message that will be
334	// sent.
335	messageLen int
336	// messageCount is the number of test messages that will be sent.
337	messageCount int
338	// certFile is the path to the certificate to use for the server.
339	certFile string
340	// keyFile is the path to the private key to use for the server.
341	keyFile string
342	// resumeSession controls whether a second connection should be tested
343	// which attempts to resume the first session.
344	resumeSession bool
345	// resumeRenewedSession controls whether a third connection should be
346	// tested which attempts to resume the second connection's session.
347	resumeRenewedSession bool
348	// expectResumeRejected, if true, specifies that the attempted
349	// resumption must be rejected by the client. This is only valid for a
350	// serverTest.
351	expectResumeRejected bool
352	// resumeConfig, if not nil, points to a Config to be used on
353	// resumption. Unless newSessionsOnResume is set,
354	// SessionTicketKey, ServerSessionCache, and
355	// ClientSessionCache are copied from the initial connection's
356	// config. If nil, the initial connection's config is used.
357	resumeConfig *Config
358	// newSessionsOnResume, if true, will cause resumeConfig to
359	// use a different session resumption context.
360	newSessionsOnResume bool
361	// noSessionCache, if true, will cause the server to run without a
362	// session cache.
363	noSessionCache bool
364	// sendPrefix sends a prefix on the socket before actually performing a
365	// handshake.
366	sendPrefix string
367	// shimWritesFirst controls whether the shim sends an initial "hello"
368	// message before doing a roundtrip with the runner.
369	shimWritesFirst bool
370	// shimShutsDown, if true, runs a test where the shim shuts down the
371	// connection immediately after the handshake rather than echoing
372	// messages from the runner.
373	shimShutsDown bool
374	// renegotiate indicates the number of times the connection should be
375	// renegotiated during the exchange.
376	renegotiate int
377	// sendHalfHelloRequest, if true, causes the server to send half a
378	// HelloRequest when the handshake completes.
379	sendHalfHelloRequest bool
380	// renegotiateCiphers is a list of ciphersuite ids that will be
381	// switched in just before renegotiation.
382	renegotiateCiphers []uint16
383	// replayWrites, if true, configures the underlying transport
384	// to replay every write it makes in DTLS tests.
385	replayWrites bool
386	// damageFirstWrite, if true, configures the underlying transport to
387	// damage the final byte of the first application data write.
388	damageFirstWrite bool
389	// exportKeyingMaterial, if non-zero, configures the test to exchange
390	// keying material and verify they match.
391	exportKeyingMaterial int
392	exportLabel          string
393	exportContext        string
394	useExportContext     bool
395	// flags, if not empty, contains a list of command-line flags that will
396	// be passed to the shim program.
397	flags []string
398	// testTLSUnique, if true, causes the shim to send the tls-unique value
399	// which will be compared against the expected value.
400	testTLSUnique bool
401	// sendEmptyRecords is the number of consecutive empty records to send
402	// before and after the test message.
403	sendEmptyRecords int
404	// sendWarningAlerts is the number of consecutive warning alerts to send
405	// before and after the test message.
406	sendWarningAlerts int
407	// sendKeyUpdates is the number of consecutive key updates to send
408	// before and after the test message.
409	sendKeyUpdates int
410	// keyUpdateRequest is the KeyUpdateRequest value to send in KeyUpdate messages.
411	keyUpdateRequest byte
412	// expectMessageDropped, if true, means the test message is expected to
413	// be dropped by the client rather than echoed back.
414	expectMessageDropped bool
415	// expectPeerCertificate, if not nil, is the certificate chain the peer
416	// is expected to send.
417	expectPeerCertificate *Certificate
418}
419
420var testCases []testCase
421
422func writeTranscript(test *testCase, num int, data []byte) {
423	if len(data) == 0 {
424		return
425	}
426
427	protocol := "tls"
428	if test.protocol == dtls {
429		protocol = "dtls"
430	}
431
432	side := "client"
433	if test.testType == serverTest {
434		side = "server"
435	}
436
437	dir := path.Join(*transcriptDir, protocol, side)
438	if err := os.MkdirAll(dir, 0755); err != nil {
439		fmt.Fprintf(os.Stderr, "Error making %s: %s\n", dir, err)
440		return
441	}
442
443	name := fmt.Sprintf("%s-%d", test.name, num)
444	if err := ioutil.WriteFile(path.Join(dir, name), data, 0644); err != nil {
445		fmt.Fprintf(os.Stderr, "Error writing %s: %s\n", name, err)
446	}
447}
448
449// A timeoutConn implements an idle timeout on each Read and Write operation.
450type timeoutConn struct {
451	net.Conn
452	timeout time.Duration
453}
454
455func (t *timeoutConn) Read(b []byte) (int, error) {
456	if err := t.SetReadDeadline(time.Now().Add(t.timeout)); err != nil {
457		return 0, err
458	}
459	return t.Conn.Read(b)
460}
461
462func (t *timeoutConn) Write(b []byte) (int, error) {
463	if err := t.SetWriteDeadline(time.Now().Add(t.timeout)); err != nil {
464		return 0, err
465	}
466	return t.Conn.Write(b)
467}
468
469func doExchange(test *testCase, config *Config, conn net.Conn, isResume bool, num int) error {
470	if !test.noSessionCache {
471		if config.ClientSessionCache == nil {
472			config.ClientSessionCache = NewLRUClientSessionCache(1)
473		}
474		if config.ServerSessionCache == nil {
475			config.ServerSessionCache = NewLRUServerSessionCache(1)
476		}
477	}
478	if test.testType == clientTest {
479		if len(config.Certificates) == 0 {
480			config.Certificates = []Certificate{rsaCertificate}
481		}
482	} else {
483		// Supply a ServerName to ensure a constant session cache key,
484		// rather than falling back to net.Conn.RemoteAddr.
485		if len(config.ServerName) == 0 {
486			config.ServerName = "test"
487		}
488	}
489	if *fuzzer {
490		config.Bugs.NullAllCiphers = true
491	}
492	if *deterministic {
493		config.Time = func() time.Time { return time.Unix(1234, 1234) }
494	}
495
496	conn = &timeoutConn{conn, *idleTimeout}
497
498	if test.protocol == dtls {
499		config.Bugs.PacketAdaptor = newPacketAdaptor(conn)
500		conn = config.Bugs.PacketAdaptor
501	}
502
503	if *flagDebug || len(*transcriptDir) != 0 {
504		local, peer := "client", "server"
505		if test.testType == clientTest {
506			local, peer = peer, local
507		}
508		connDebug := &recordingConn{
509			Conn:       conn,
510			isDatagram: test.protocol == dtls,
511			local:      local,
512			peer:       peer,
513		}
514		conn = connDebug
515		if *flagDebug {
516			defer connDebug.WriteTo(os.Stdout)
517		}
518		if len(*transcriptDir) != 0 {
519			defer func() {
520				writeTranscript(test, num, connDebug.Transcript())
521			}()
522		}
523
524		if config.Bugs.PacketAdaptor != nil {
525			config.Bugs.PacketAdaptor.debug = connDebug
526		}
527	}
528
529	if test.replayWrites {
530		conn = newReplayAdaptor(conn)
531	}
532
533	var connDamage *damageAdaptor
534	if test.damageFirstWrite {
535		connDamage = newDamageAdaptor(conn)
536		conn = connDamage
537	}
538
539	if test.sendPrefix != "" {
540		if _, err := conn.Write([]byte(test.sendPrefix)); err != nil {
541			return err
542		}
543	}
544
545	var tlsConn *Conn
546	if test.testType == clientTest {
547		if test.protocol == dtls {
548			tlsConn = DTLSServer(conn, config)
549		} else {
550			tlsConn = Server(conn, config)
551		}
552	} else {
553		config.InsecureSkipVerify = true
554		if test.protocol == dtls {
555			tlsConn = DTLSClient(conn, config)
556		} else {
557			tlsConn = Client(conn, config)
558		}
559	}
560	defer tlsConn.Close()
561
562	if err := tlsConn.Handshake(); err != nil {
563		return err
564	}
565
566	// TODO(davidben): move all per-connection expectations into a dedicated
567	// expectations struct that can be specified separately for the two
568	// legs.
569	expectedVersion := test.expectedVersion
570	if isResume && test.expectedResumeVersion != 0 {
571		expectedVersion = test.expectedResumeVersion
572	}
573	connState := tlsConn.ConnectionState()
574	if vers := connState.Version; expectedVersion != 0 && vers != expectedVersion {
575		return fmt.Errorf("got version %x, expected %x", vers, expectedVersion)
576	}
577
578	if cipher := connState.CipherSuite; test.expectedCipher != 0 && cipher != test.expectedCipher {
579		return fmt.Errorf("got cipher %x, expected %x", cipher, test.expectedCipher)
580	}
581	if didResume := connState.DidResume; isResume && didResume == test.expectResumeRejected {
582		return fmt.Errorf("didResume is %t, but we expected the opposite", didResume)
583	}
584
585	if test.expectChannelID {
586		channelID := connState.ChannelID
587		if channelID == nil {
588			return fmt.Errorf("no channel ID negotiated")
589		}
590		if channelID.Curve != channelIDKey.Curve ||
591			channelIDKey.X.Cmp(channelIDKey.X) != 0 ||
592			channelIDKey.Y.Cmp(channelIDKey.Y) != 0 {
593			return fmt.Errorf("incorrect channel ID")
594		}
595	}
596
597	if expected := test.expectedNextProto; expected != "" {
598		if actual := connState.NegotiatedProtocol; actual != expected {
599			return fmt.Errorf("next proto mismatch: got %s, wanted %s", actual, expected)
600		}
601	}
602
603	if test.expectNoNextProto {
604		if actual := connState.NegotiatedProtocol; actual != "" {
605			return fmt.Errorf("got unexpected next proto %s", actual)
606		}
607	}
608
609	if test.expectedNextProtoType != 0 {
610		if (test.expectedNextProtoType == alpn) != connState.NegotiatedProtocolFromALPN {
611			return fmt.Errorf("next proto type mismatch")
612		}
613	}
614
615	if p := connState.SRTPProtectionProfile; p != test.expectedSRTPProtectionProfile {
616		return fmt.Errorf("SRTP profile mismatch: got %d, wanted %d", p, test.expectedSRTPProtectionProfile)
617	}
618
619	if test.expectedOCSPResponse != nil && !bytes.Equal(test.expectedOCSPResponse, tlsConn.OCSPResponse()) {
620		return fmt.Errorf("OCSP Response mismatch: got %x, wanted %x", tlsConn.OCSPResponse(), test.expectedOCSPResponse)
621	}
622
623	if test.expectedSCTList != nil && !bytes.Equal(test.expectedSCTList, connState.SCTList) {
624		return fmt.Errorf("SCT list mismatch")
625	}
626
627	if expected := test.expectedPeerSignatureAlgorithm; expected != 0 && expected != connState.PeerSignatureAlgorithm {
628		return fmt.Errorf("expected peer to use signature algorithm %04x, but got %04x", expected, connState.PeerSignatureAlgorithm)
629	}
630
631	if expected := test.expectedCurveID; expected != 0 && expected != connState.CurveID {
632		return fmt.Errorf("expected peer to use curve %04x, but got %04x", expected, connState.CurveID)
633	}
634
635	if test.expectPeerCertificate != nil {
636		if len(connState.PeerCertificates) != len(test.expectPeerCertificate.Certificate) {
637			return fmt.Errorf("expected peer to send %d certificates, but got %d", len(connState.PeerCertificates), len(test.expectPeerCertificate.Certificate))
638		}
639		for i, cert := range connState.PeerCertificates {
640			if !bytes.Equal(cert.Raw, test.expectPeerCertificate.Certificate[i]) {
641				return fmt.Errorf("peer certificate %d did not match", i+1)
642			}
643		}
644	}
645
646	if test.exportKeyingMaterial > 0 {
647		actual := make([]byte, test.exportKeyingMaterial)
648		if _, err := io.ReadFull(tlsConn, actual); err != nil {
649			return err
650		}
651		expected, err := tlsConn.ExportKeyingMaterial(test.exportKeyingMaterial, []byte(test.exportLabel), []byte(test.exportContext), test.useExportContext)
652		if err != nil {
653			return err
654		}
655		if !bytes.Equal(actual, expected) {
656			return fmt.Errorf("keying material mismatch")
657		}
658	}
659
660	if test.testTLSUnique {
661		var peersValue [12]byte
662		if _, err := io.ReadFull(tlsConn, peersValue[:]); err != nil {
663			return err
664		}
665		expected := tlsConn.ConnectionState().TLSUnique
666		if !bytes.Equal(peersValue[:], expected) {
667			return fmt.Errorf("tls-unique mismatch: peer sent %x, but %x was expected", peersValue[:], expected)
668		}
669	}
670
671	if test.shimWritesFirst {
672		var buf [5]byte
673		_, err := io.ReadFull(tlsConn, buf[:])
674		if err != nil {
675			return err
676		}
677		if string(buf[:]) != "hello" {
678			return fmt.Errorf("bad initial message")
679		}
680	}
681
682	for i := 0; i < test.sendKeyUpdates; i++ {
683		if err := tlsConn.SendKeyUpdate(test.keyUpdateRequest); err != nil {
684			return err
685		}
686	}
687
688	for i := 0; i < test.sendEmptyRecords; i++ {
689		tlsConn.Write(nil)
690	}
691
692	for i := 0; i < test.sendWarningAlerts; i++ {
693		tlsConn.SendAlert(alertLevelWarning, alertUnexpectedMessage)
694	}
695
696	if test.sendHalfHelloRequest {
697		tlsConn.SendHalfHelloRequest()
698	}
699
700	if test.renegotiate > 0 {
701		if test.renegotiateCiphers != nil {
702			config.CipherSuites = test.renegotiateCiphers
703		}
704		for i := 0; i < test.renegotiate; i++ {
705			if err := tlsConn.Renegotiate(); err != nil {
706				return err
707			}
708		}
709	} else if test.renegotiateCiphers != nil {
710		panic("renegotiateCiphers without renegotiate")
711	}
712
713	if test.damageFirstWrite {
714		connDamage.setDamage(true)
715		tlsConn.Write([]byte("DAMAGED WRITE"))
716		connDamage.setDamage(false)
717	}
718
719	messageLen := test.messageLen
720	if messageLen < 0 {
721		if test.protocol == dtls {
722			return fmt.Errorf("messageLen < 0 not supported for DTLS tests")
723		}
724		// Read until EOF.
725		_, err := io.Copy(ioutil.Discard, tlsConn)
726		return err
727	}
728	if messageLen == 0 {
729		messageLen = 32
730	}
731
732	messageCount := test.messageCount
733	if messageCount == 0 {
734		messageCount = 1
735	}
736
737	for j := 0; j < messageCount; j++ {
738		testMessage := make([]byte, messageLen)
739		for i := range testMessage {
740			testMessage[i] = 0x42 ^ byte(j)
741		}
742		tlsConn.Write(testMessage)
743
744		for i := 0; i < test.sendKeyUpdates; i++ {
745			tlsConn.SendKeyUpdate(test.keyUpdateRequest)
746		}
747
748		for i := 0; i < test.sendEmptyRecords; i++ {
749			tlsConn.Write(nil)
750		}
751
752		for i := 0; i < test.sendWarningAlerts; i++ {
753			tlsConn.SendAlert(alertLevelWarning, alertUnexpectedMessage)
754		}
755
756		if test.shimShutsDown || test.expectMessageDropped {
757			// The shim will not respond.
758			continue
759		}
760
761		buf := make([]byte, len(testMessage))
762		if test.protocol == dtls {
763			bufTmp := make([]byte, len(buf)+1)
764			n, err := tlsConn.Read(bufTmp)
765			if err != nil {
766				return err
767			}
768			if n != len(buf) {
769				return fmt.Errorf("bad reply; length mismatch (%d vs %d)", n, len(buf))
770			}
771			copy(buf, bufTmp)
772		} else {
773			_, err := io.ReadFull(tlsConn, buf)
774			if err != nil {
775				return err
776			}
777		}
778
779		for i, v := range buf {
780			if v != testMessage[i]^0xff {
781				return fmt.Errorf("bad reply contents at byte %d", i)
782			}
783		}
784	}
785
786	return nil
787}
788
789func valgrindOf(dbAttach bool, path string, args ...string) *exec.Cmd {
790	valgrindArgs := []string{"--error-exitcode=99", "--track-origins=yes", "--leak-check=full", "--quiet"}
791	if dbAttach {
792		valgrindArgs = append(valgrindArgs, "--db-attach=yes", "--db-command=xterm -e gdb -nw %f %p")
793	}
794	valgrindArgs = append(valgrindArgs, path)
795	valgrindArgs = append(valgrindArgs, args...)
796
797	return exec.Command("valgrind", valgrindArgs...)
798}
799
800func gdbOf(path string, args ...string) *exec.Cmd {
801	xtermArgs := []string{"-e", "gdb", "--args"}
802	xtermArgs = append(xtermArgs, path)
803	xtermArgs = append(xtermArgs, args...)
804
805	return exec.Command("xterm", xtermArgs...)
806}
807
808func lldbOf(path string, args ...string) *exec.Cmd {
809	xtermArgs := []string{"-e", "lldb", "--"}
810	xtermArgs = append(xtermArgs, path)
811	xtermArgs = append(xtermArgs, args...)
812
813	return exec.Command("xterm", xtermArgs...)
814}
815
816var (
817	errMoreMallocs   = errors.New("child process did not exhaust all allocation calls")
818	errUnimplemented = errors.New("child process does not implement needed flags")
819)
820
821// accept accepts a connection from listener, unless waitChan signals a process
822// exit first.
823func acceptOrWait(listener net.Listener, waitChan chan error) (net.Conn, error) {
824	type connOrError struct {
825		conn net.Conn
826		err  error
827	}
828	connChan := make(chan connOrError, 1)
829	go func() {
830		conn, err := listener.Accept()
831		connChan <- connOrError{conn, err}
832		close(connChan)
833	}()
834	select {
835	case result := <-connChan:
836		return result.conn, result.err
837	case childErr := <-waitChan:
838		waitChan <- childErr
839		return nil, fmt.Errorf("child exited early: %s", childErr)
840	}
841}
842
843func translateExpectedError(errorStr string) string {
844	if translated, ok := shimConfig.ErrorMap[errorStr]; ok {
845		return translated
846	}
847
848	if *looseErrors {
849		return ""
850	}
851
852	return errorStr
853}
854
855func runTest(test *testCase, shimPath string, mallocNumToFail int64) error {
856	// Help debugging panics on the Go side.
857	defer func() {
858		if r := recover(); r != nil {
859			fmt.Fprintf(os.Stderr, "Test '%s' panicked.\n", test.name)
860			panic(r)
861		}
862	}()
863
864	if !test.shouldFail && (len(test.expectedError) > 0 || len(test.expectedLocalError) > 0) {
865		panic("Error expected without shouldFail in " + test.name)
866	}
867
868	if test.expectResumeRejected && !test.resumeSession {
869		panic("expectResumeRejected without resumeSession in " + test.name)
870	}
871
872	for _, ver := range tlsVersions {
873		if !strings.Contains("-"+test.name+"-", "-"+ver.name+"-") {
874			continue
875		}
876
877		if test.config.MaxVersion != 0 || test.config.MinVersion != 0 || test.expectedVersion != 0 {
878			continue
879		}
880
881		panic(fmt.Sprintf("The name of test %q suggests that it's version specific, but min/max version in the Config is %x/%x. One of them should probably be %x", test.name, test.config.MinVersion, test.config.MaxVersion, ver.version))
882	}
883
884	listener, err := net.ListenTCP("tcp4", &net.TCPAddr{IP: net.IP{127, 0, 0, 1}})
885	if err != nil {
886		panic(err)
887	}
888	defer func() {
889		if listener != nil {
890			listener.Close()
891		}
892	}()
893
894	flags := []string{"-port", strconv.Itoa(listener.Addr().(*net.TCPAddr).Port)}
895	if test.testType == serverTest {
896		flags = append(flags, "-server")
897
898		flags = append(flags, "-key-file")
899		if test.keyFile == "" {
900			flags = append(flags, path.Join(*resourceDir, rsaKeyFile))
901		} else {
902			flags = append(flags, path.Join(*resourceDir, test.keyFile))
903		}
904
905		flags = append(flags, "-cert-file")
906		if test.certFile == "" {
907			flags = append(flags, path.Join(*resourceDir, rsaCertificateFile))
908		} else {
909			flags = append(flags, path.Join(*resourceDir, test.certFile))
910		}
911	}
912
913	if test.protocol == dtls {
914		flags = append(flags, "-dtls")
915	}
916
917	var resumeCount int
918	if test.resumeSession {
919		resumeCount++
920		if test.resumeRenewedSession {
921			resumeCount++
922		}
923	}
924
925	if resumeCount > 0 {
926		flags = append(flags, "-resume-count", strconv.Itoa(resumeCount))
927	}
928
929	if test.shimWritesFirst {
930		flags = append(flags, "-shim-writes-first")
931	}
932
933	if test.shimShutsDown {
934		flags = append(flags, "-shim-shuts-down")
935	}
936
937	if test.exportKeyingMaterial > 0 {
938		flags = append(flags, "-export-keying-material", strconv.Itoa(test.exportKeyingMaterial))
939		flags = append(flags, "-export-label", test.exportLabel)
940		flags = append(flags, "-export-context", test.exportContext)
941		if test.useExportContext {
942			flags = append(flags, "-use-export-context")
943		}
944	}
945	if test.expectResumeRejected {
946		flags = append(flags, "-expect-session-miss")
947	}
948
949	if test.testTLSUnique {
950		flags = append(flags, "-tls-unique")
951	}
952
953	flags = append(flags, test.flags...)
954
955	var shim *exec.Cmd
956	if *useValgrind {
957		shim = valgrindOf(false, shimPath, flags...)
958	} else if *useGDB {
959		shim = gdbOf(shimPath, flags...)
960	} else if *useLLDB {
961		shim = lldbOf(shimPath, flags...)
962	} else {
963		shim = exec.Command(shimPath, flags...)
964	}
965	shim.Stdin = os.Stdin
966	var stdoutBuf, stderrBuf bytes.Buffer
967	shim.Stdout = &stdoutBuf
968	shim.Stderr = &stderrBuf
969	if mallocNumToFail >= 0 {
970		shim.Env = os.Environ()
971		shim.Env = append(shim.Env, "MALLOC_NUMBER_TO_FAIL="+strconv.FormatInt(mallocNumToFail, 10))
972		if *mallocTestDebug {
973			shim.Env = append(shim.Env, "MALLOC_BREAK_ON_FAIL=1")
974		}
975		shim.Env = append(shim.Env, "_MALLOC_CHECK=1")
976	}
977
978	if err := shim.Start(); err != nil {
979		panic(err)
980	}
981	waitChan := make(chan error, 1)
982	go func() { waitChan <- shim.Wait() }()
983
984	config := test.config
985
986	if *deterministic {
987		config.Rand = &deterministicRand{}
988	}
989
990	conn, err := acceptOrWait(listener, waitChan)
991	if err == nil {
992		err = doExchange(test, &config, conn, false /* not a resumption */, 0)
993		conn.Close()
994	}
995
996	for i := 0; err == nil && i < resumeCount; i++ {
997		var resumeConfig Config
998		if test.resumeConfig != nil {
999			resumeConfig = *test.resumeConfig
1000			if !test.newSessionsOnResume {
1001				resumeConfig.SessionTicketKey = config.SessionTicketKey
1002				resumeConfig.ClientSessionCache = config.ClientSessionCache
1003				resumeConfig.ServerSessionCache = config.ServerSessionCache
1004			}
1005			resumeConfig.Rand = config.Rand
1006		} else {
1007			resumeConfig = config
1008		}
1009		var connResume net.Conn
1010		connResume, err = acceptOrWait(listener, waitChan)
1011		if err == nil {
1012			err = doExchange(test, &resumeConfig, connResume, true /* resumption */, i+1)
1013			connResume.Close()
1014		}
1015	}
1016
1017	// Close the listener now. This is to avoid hangs should the shim try to
1018	// open more connections than expected.
1019	listener.Close()
1020	listener = nil
1021
1022	childErr := <-waitChan
1023	var isValgrindError bool
1024	if exitError, ok := childErr.(*exec.ExitError); ok {
1025		switch exitError.Sys().(syscall.WaitStatus).ExitStatus() {
1026		case 88:
1027			return errMoreMallocs
1028		case 89:
1029			return errUnimplemented
1030		case 99:
1031			isValgrindError = true
1032		}
1033	}
1034
1035	// Account for Windows line endings.
1036	stdout := strings.Replace(string(stdoutBuf.Bytes()), "\r\n", "\n", -1)
1037	stderr := strings.Replace(string(stderrBuf.Bytes()), "\r\n", "\n", -1)
1038
1039	// Separate the errors from the shim and those from tools like
1040	// AddressSanitizer.
1041	var extraStderr string
1042	if stderrParts := strings.SplitN(stderr, "--- DONE ---\n", 2); len(stderrParts) == 2 {
1043		stderr = stderrParts[0]
1044		extraStderr = stderrParts[1]
1045	}
1046
1047	failed := err != nil || childErr != nil
1048	expectedError := translateExpectedError(test.expectedError)
1049	correctFailure := len(expectedError) == 0 || strings.Contains(stderr, expectedError)
1050
1051	localError := "none"
1052	if err != nil {
1053		localError = err.Error()
1054	}
1055	if len(test.expectedLocalError) != 0 {
1056		correctFailure = correctFailure && strings.Contains(localError, test.expectedLocalError)
1057	}
1058
1059	if failed != test.shouldFail || failed && !correctFailure {
1060		childError := "none"
1061		if childErr != nil {
1062			childError = childErr.Error()
1063		}
1064
1065		var msg string
1066		switch {
1067		case failed && !test.shouldFail:
1068			msg = "unexpected failure"
1069		case !failed && test.shouldFail:
1070			msg = "unexpected success"
1071		case failed && !correctFailure:
1072			msg = "bad error (wanted '" + expectedError + "' / '" + test.expectedLocalError + "')"
1073		default:
1074			panic("internal error")
1075		}
1076
1077		return fmt.Errorf("%s: local error '%s', child error '%s', stdout:\n%s\nstderr:\n%s\n%s", msg, localError, childError, stdout, stderr, extraStderr)
1078	}
1079
1080	if len(extraStderr) > 0 || (!failed && len(stderr) > 0) {
1081		return fmt.Errorf("unexpected error output:\n%s\n%s", stderr, extraStderr)
1082	}
1083
1084	if *useValgrind && isValgrindError {
1085		return fmt.Errorf("valgrind error:\n%s\n%s", stderr, extraStderr)
1086	}
1087
1088	return nil
1089}
1090
1091type tlsVersion struct {
1092	name    string
1093	version uint16
1094	flag    string
1095	hasDTLS bool
1096}
1097
1098var tlsVersions = []tlsVersion{
1099	{"SSL3", VersionSSL30, "-no-ssl3", false},
1100	{"TLS1", VersionTLS10, "-no-tls1", true},
1101	{"TLS11", VersionTLS11, "-no-tls11", false},
1102	{"TLS12", VersionTLS12, "-no-tls12", true},
1103	{"TLS13", VersionTLS13, "-no-tls13", false},
1104}
1105
1106type testCipherSuite struct {
1107	name string
1108	id   uint16
1109}
1110
1111var testCipherSuites = []testCipherSuite{
1112	{"3DES-SHA", TLS_RSA_WITH_3DES_EDE_CBC_SHA},
1113	{"AES128-GCM", TLS_RSA_WITH_AES_128_GCM_SHA256},
1114	{"AES128-SHA", TLS_RSA_WITH_AES_128_CBC_SHA},
1115	{"AES128-SHA256", TLS_RSA_WITH_AES_128_CBC_SHA256},
1116	{"AES256-GCM", TLS_RSA_WITH_AES_256_GCM_SHA384},
1117	{"AES256-SHA", TLS_RSA_WITH_AES_256_CBC_SHA},
1118	{"AES256-SHA256", TLS_RSA_WITH_AES_256_CBC_SHA256},
1119	{"ECDHE-ECDSA-AES128-GCM", TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
1120	{"ECDHE-ECDSA-AES128-SHA", TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA},
1121	{"ECDHE-ECDSA-AES128-SHA256", TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256},
1122	{"ECDHE-ECDSA-AES256-GCM", TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384},
1123	{"ECDHE-ECDSA-AES256-SHA", TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA},
1124	{"ECDHE-ECDSA-AES256-SHA384", TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384},
1125	{"ECDHE-ECDSA-CHACHA20-POLY1305", TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256},
1126	{"ECDHE-RSA-AES128-GCM", TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
1127	{"ECDHE-RSA-AES128-SHA", TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA},
1128	{"ECDHE-RSA-AES128-SHA256", TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256},
1129	{"ECDHE-RSA-AES256-GCM", TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384},
1130	{"ECDHE-RSA-AES256-SHA", TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA},
1131	{"ECDHE-RSA-AES256-SHA384", TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384},
1132	{"ECDHE-RSA-CHACHA20-POLY1305", TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256},
1133	{"PSK-AES128-CBC-SHA", TLS_PSK_WITH_AES_128_CBC_SHA},
1134	{"PSK-AES256-CBC-SHA", TLS_PSK_WITH_AES_256_CBC_SHA},
1135	{"ECDHE-PSK-AES128-CBC-SHA", TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA},
1136	{"ECDHE-PSK-AES256-CBC-SHA", TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA},
1137	{"ECDHE-PSK-CHACHA20-POLY1305", TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256},
1138	{"AEAD-CHACHA20-POLY1305", TLS_CHACHA20_POLY1305_SHA256},
1139	{"AEAD-AES128-GCM-SHA256", TLS_AES_128_GCM_SHA256},
1140	{"AEAD-AES256-GCM-SHA384", TLS_AES_256_GCM_SHA384},
1141	{"NULL-SHA", TLS_RSA_WITH_NULL_SHA},
1142}
1143
1144func hasComponent(suiteName, component string) bool {
1145	return strings.Contains("-"+suiteName+"-", "-"+component+"-")
1146}
1147
1148func isTLS12Only(suiteName string) bool {
1149	return hasComponent(suiteName, "GCM") ||
1150		hasComponent(suiteName, "SHA256") ||
1151		hasComponent(suiteName, "SHA384") ||
1152		hasComponent(suiteName, "POLY1305")
1153}
1154
1155func isTLS13Suite(suiteName string) bool {
1156	return strings.HasPrefix(suiteName, "AEAD-")
1157}
1158
1159func isDTLSCipher(suiteName string) bool {
1160	return !hasComponent(suiteName, "RC4") && !hasComponent(suiteName, "NULL")
1161}
1162
1163func bigFromHex(hex string) *big.Int {
1164	ret, ok := new(big.Int).SetString(hex, 16)
1165	if !ok {
1166		panic("failed to parse hex number 0x" + hex)
1167	}
1168	return ret
1169}
1170
1171func addBasicTests() {
1172	basicTests := []testCase{
1173		{
1174			name: "NoFallbackSCSV",
1175			config: Config{
1176				Bugs: ProtocolBugs{
1177					FailIfNotFallbackSCSV: true,
1178				},
1179			},
1180			shouldFail:         true,
1181			expectedLocalError: "no fallback SCSV found",
1182		},
1183		{
1184			name: "SendFallbackSCSV",
1185			config: Config{
1186				Bugs: ProtocolBugs{
1187					FailIfNotFallbackSCSV: true,
1188				},
1189			},
1190			flags: []string{"-fallback-scsv"},
1191		},
1192		{
1193			name: "ClientCertificateTypes",
1194			config: Config{
1195				MaxVersion: VersionTLS12,
1196				ClientAuth: RequestClientCert,
1197				ClientCertificateTypes: []byte{
1198					CertTypeDSSSign,
1199					CertTypeRSASign,
1200					CertTypeECDSASign,
1201				},
1202			},
1203			flags: []string{
1204				"-expect-certificate-types",
1205				base64.StdEncoding.EncodeToString([]byte{
1206					CertTypeDSSSign,
1207					CertTypeRSASign,
1208					CertTypeECDSASign,
1209				}),
1210			},
1211		},
1212		{
1213			name: "UnauthenticatedECDH",
1214			config: Config{
1215				MaxVersion:   VersionTLS12,
1216				CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
1217				Bugs: ProtocolBugs{
1218					UnauthenticatedECDH: true,
1219				},
1220			},
1221			shouldFail:    true,
1222			expectedError: ":UNEXPECTED_MESSAGE:",
1223		},
1224		{
1225			name: "SkipCertificateStatus",
1226			config: Config{
1227				MaxVersion:   VersionTLS12,
1228				CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
1229				Bugs: ProtocolBugs{
1230					SkipCertificateStatus: true,
1231				},
1232			},
1233			flags: []string{
1234				"-enable-ocsp-stapling",
1235			},
1236		},
1237		{
1238			name: "SkipServerKeyExchange",
1239			config: Config{
1240				MaxVersion:   VersionTLS12,
1241				CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
1242				Bugs: ProtocolBugs{
1243					SkipServerKeyExchange: true,
1244				},
1245			},
1246			shouldFail:    true,
1247			expectedError: ":UNEXPECTED_MESSAGE:",
1248		},
1249		{
1250			testType: serverTest,
1251			name:     "Alert",
1252			config: Config{
1253				Bugs: ProtocolBugs{
1254					SendSpuriousAlert: alertRecordOverflow,
1255				},
1256			},
1257			shouldFail:    true,
1258			expectedError: ":TLSV1_ALERT_RECORD_OVERFLOW:",
1259		},
1260		{
1261			protocol: dtls,
1262			testType: serverTest,
1263			name:     "Alert-DTLS",
1264			config: Config{
1265				Bugs: ProtocolBugs{
1266					SendSpuriousAlert: alertRecordOverflow,
1267				},
1268			},
1269			shouldFail:    true,
1270			expectedError: ":TLSV1_ALERT_RECORD_OVERFLOW:",
1271		},
1272		{
1273			testType: serverTest,
1274			name:     "FragmentAlert",
1275			config: Config{
1276				Bugs: ProtocolBugs{
1277					FragmentAlert:     true,
1278					SendSpuriousAlert: alertRecordOverflow,
1279				},
1280			},
1281			shouldFail:    true,
1282			expectedError: ":BAD_ALERT:",
1283		},
1284		{
1285			protocol: dtls,
1286			testType: serverTest,
1287			name:     "FragmentAlert-DTLS",
1288			config: Config{
1289				Bugs: ProtocolBugs{
1290					FragmentAlert:     true,
1291					SendSpuriousAlert: alertRecordOverflow,
1292				},
1293			},
1294			shouldFail:    true,
1295			expectedError: ":BAD_ALERT:",
1296		},
1297		{
1298			testType: serverTest,
1299			name:     "DoubleAlert",
1300			config: Config{
1301				Bugs: ProtocolBugs{
1302					DoubleAlert:       true,
1303					SendSpuriousAlert: alertRecordOverflow,
1304				},
1305			},
1306			shouldFail:    true,
1307			expectedError: ":BAD_ALERT:",
1308		},
1309		{
1310			protocol: dtls,
1311			testType: serverTest,
1312			name:     "DoubleAlert-DTLS",
1313			config: Config{
1314				Bugs: ProtocolBugs{
1315					DoubleAlert:       true,
1316					SendSpuriousAlert: alertRecordOverflow,
1317				},
1318			},
1319			shouldFail:    true,
1320			expectedError: ":BAD_ALERT:",
1321		},
1322		{
1323			name: "SkipNewSessionTicket",
1324			config: Config{
1325				MaxVersion: VersionTLS12,
1326				Bugs: ProtocolBugs{
1327					SkipNewSessionTicket: true,
1328				},
1329			},
1330			shouldFail:    true,
1331			expectedError: ":UNEXPECTED_RECORD:",
1332		},
1333		{
1334			testType: serverTest,
1335			name:     "FallbackSCSV",
1336			config: Config{
1337				MaxVersion: VersionTLS11,
1338				Bugs: ProtocolBugs{
1339					SendFallbackSCSV: true,
1340				},
1341			},
1342			shouldFail:         true,
1343			expectedError:      ":INAPPROPRIATE_FALLBACK:",
1344			expectedLocalError: "remote error: inappropriate fallback",
1345		},
1346		{
1347			testType: serverTest,
1348			name:     "FallbackSCSV-VersionMatch-TLS13",
1349			config: Config{
1350				MaxVersion: VersionTLS13,
1351				Bugs: ProtocolBugs{
1352					SendFallbackSCSV: true,
1353				},
1354			},
1355		},
1356		{
1357			testType: serverTest,
1358			name:     "FallbackSCSV-VersionMatch-TLS12",
1359			config: Config{
1360				MaxVersion: VersionTLS12,
1361				Bugs: ProtocolBugs{
1362					SendFallbackSCSV: true,
1363				},
1364			},
1365			flags: []string{"-max-version", strconv.Itoa(VersionTLS12)},
1366		},
1367		{
1368			testType: serverTest,
1369			name:     "FragmentedClientVersion",
1370			config: Config{
1371				Bugs: ProtocolBugs{
1372					MaxHandshakeRecordLength: 1,
1373					FragmentClientVersion:    true,
1374				},
1375			},
1376			expectedVersion: VersionTLS13,
1377		},
1378		{
1379			testType:      serverTest,
1380			name:          "HttpGET",
1381			sendPrefix:    "GET / HTTP/1.0\n",
1382			shouldFail:    true,
1383			expectedError: ":HTTP_REQUEST:",
1384		},
1385		{
1386			testType:      serverTest,
1387			name:          "HttpPOST",
1388			sendPrefix:    "POST / HTTP/1.0\n",
1389			shouldFail:    true,
1390			expectedError: ":HTTP_REQUEST:",
1391		},
1392		{
1393			testType:      serverTest,
1394			name:          "HttpHEAD",
1395			sendPrefix:    "HEAD / HTTP/1.0\n",
1396			shouldFail:    true,
1397			expectedError: ":HTTP_REQUEST:",
1398		},
1399		{
1400			testType:      serverTest,
1401			name:          "HttpPUT",
1402			sendPrefix:    "PUT / HTTP/1.0\n",
1403			shouldFail:    true,
1404			expectedError: ":HTTP_REQUEST:",
1405		},
1406		{
1407			testType:      serverTest,
1408			name:          "HttpCONNECT",
1409			sendPrefix:    "CONNECT www.google.com:443 HTTP/1.0\n",
1410			shouldFail:    true,
1411			expectedError: ":HTTPS_PROXY_REQUEST:",
1412		},
1413		{
1414			testType:      serverTest,
1415			name:          "Garbage",
1416			sendPrefix:    "blah",
1417			shouldFail:    true,
1418			expectedError: ":WRONG_VERSION_NUMBER:",
1419		},
1420		{
1421			name: "RSAEphemeralKey",
1422			config: Config{
1423				MaxVersion:   VersionTLS12,
1424				CipherSuites: []uint16{TLS_RSA_WITH_AES_128_CBC_SHA},
1425				Bugs: ProtocolBugs{
1426					RSAEphemeralKey: true,
1427				},
1428			},
1429			shouldFail:    true,
1430			expectedError: ":UNEXPECTED_MESSAGE:",
1431		},
1432		{
1433			name:          "DisableEverything",
1434			flags:         []string{"-no-tls13", "-no-tls12", "-no-tls11", "-no-tls1", "-no-ssl3"},
1435			shouldFail:    true,
1436			expectedError: ":WRONG_SSL_VERSION:",
1437		},
1438		{
1439			protocol:      dtls,
1440			name:          "DisableEverything-DTLS",
1441			flags:         []string{"-no-tls12", "-no-tls1"},
1442			shouldFail:    true,
1443			expectedError: ":WRONG_SSL_VERSION:",
1444		},
1445		{
1446			protocol: dtls,
1447			testType: serverTest,
1448			name:     "MTU",
1449			config: Config{
1450				Bugs: ProtocolBugs{
1451					MaxPacketLength: 256,
1452				},
1453			},
1454			flags: []string{"-mtu", "256"},
1455		},
1456		{
1457			protocol: dtls,
1458			testType: serverTest,
1459			name:     "MTUExceeded",
1460			config: Config{
1461				Bugs: ProtocolBugs{
1462					MaxPacketLength: 255,
1463				},
1464			},
1465			flags:              []string{"-mtu", "256"},
1466			shouldFail:         true,
1467			expectedLocalError: "dtls: exceeded maximum packet length",
1468		},
1469		{
1470			name: "CertMismatchRSA",
1471			config: Config{
1472				MaxVersion:   VersionTLS12,
1473				CipherSuites: []uint16{TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
1474				Certificates: []Certificate{ecdsaP256Certificate},
1475				Bugs: ProtocolBugs{
1476					SendCipherSuite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
1477				},
1478			},
1479			shouldFail:    true,
1480			expectedError: ":WRONG_CERTIFICATE_TYPE:",
1481		},
1482		{
1483			name: "CertMismatchECDSA",
1484			config: Config{
1485				MaxVersion:   VersionTLS12,
1486				CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
1487				Certificates: []Certificate{rsaCertificate},
1488				Bugs: ProtocolBugs{
1489					SendCipherSuite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
1490				},
1491			},
1492			shouldFail:    true,
1493			expectedError: ":WRONG_CERTIFICATE_TYPE:",
1494		},
1495		{
1496			name: "EmptyCertificateList",
1497			config: Config{
1498				MaxVersion: VersionTLS12,
1499				Bugs: ProtocolBugs{
1500					EmptyCertificateList: true,
1501				},
1502			},
1503			shouldFail:    true,
1504			expectedError: ":DECODE_ERROR:",
1505		},
1506		{
1507			name: "EmptyCertificateList-TLS13",
1508			config: Config{
1509				MaxVersion: VersionTLS13,
1510				Bugs: ProtocolBugs{
1511					EmptyCertificateList: true,
1512				},
1513			},
1514			shouldFail:    true,
1515			expectedError: ":PEER_DID_NOT_RETURN_A_CERTIFICATE:",
1516		},
1517		{
1518			name:             "TLSFatalBadPackets",
1519			damageFirstWrite: true,
1520			shouldFail:       true,
1521			expectedError:    ":DECRYPTION_FAILED_OR_BAD_RECORD_MAC:",
1522		},
1523		{
1524			protocol:         dtls,
1525			name:             "DTLSIgnoreBadPackets",
1526			damageFirstWrite: true,
1527		},
1528		{
1529			protocol:         dtls,
1530			name:             "DTLSIgnoreBadPackets-Async",
1531			damageFirstWrite: true,
1532			flags:            []string{"-async"},
1533		},
1534		{
1535			name: "AppDataBeforeHandshake",
1536			config: Config{
1537				Bugs: ProtocolBugs{
1538					AppDataBeforeHandshake: []byte("TEST MESSAGE"),
1539				},
1540			},
1541			shouldFail:    true,
1542			expectedError: ":UNEXPECTED_RECORD:",
1543		},
1544		{
1545			name: "AppDataBeforeHandshake-Empty",
1546			config: Config{
1547				Bugs: ProtocolBugs{
1548					AppDataBeforeHandshake: []byte{},
1549				},
1550			},
1551			shouldFail:    true,
1552			expectedError: ":UNEXPECTED_RECORD:",
1553		},
1554		{
1555			protocol: dtls,
1556			name:     "AppDataBeforeHandshake-DTLS",
1557			config: Config{
1558				Bugs: ProtocolBugs{
1559					AppDataBeforeHandshake: []byte("TEST MESSAGE"),
1560				},
1561			},
1562			shouldFail:    true,
1563			expectedError: ":UNEXPECTED_RECORD:",
1564		},
1565		{
1566			protocol: dtls,
1567			name:     "AppDataBeforeHandshake-DTLS-Empty",
1568			config: Config{
1569				Bugs: ProtocolBugs{
1570					AppDataBeforeHandshake: []byte{},
1571				},
1572			},
1573			shouldFail:    true,
1574			expectedError: ":UNEXPECTED_RECORD:",
1575		},
1576		{
1577			name: "AppDataAfterChangeCipherSpec",
1578			config: Config{
1579				MaxVersion: VersionTLS12,
1580				Bugs: ProtocolBugs{
1581					AppDataAfterChangeCipherSpec: []byte("TEST MESSAGE"),
1582				},
1583			},
1584			shouldFail:    true,
1585			expectedError: ":UNEXPECTED_RECORD:",
1586		},
1587		{
1588			name: "AppDataAfterChangeCipherSpec-Empty",
1589			config: Config{
1590				MaxVersion: VersionTLS12,
1591				Bugs: ProtocolBugs{
1592					AppDataAfterChangeCipherSpec: []byte{},
1593				},
1594			},
1595			shouldFail:    true,
1596			expectedError: ":UNEXPECTED_RECORD:",
1597		},
1598		{
1599			protocol: dtls,
1600			name:     "AppDataAfterChangeCipherSpec-DTLS",
1601			config: Config{
1602				MaxVersion: VersionTLS12,
1603				Bugs: ProtocolBugs{
1604					AppDataAfterChangeCipherSpec: []byte("TEST MESSAGE"),
1605				},
1606			},
1607			// BoringSSL's DTLS implementation will drop the out-of-order
1608			// application data.
1609		},
1610		{
1611			protocol: dtls,
1612			name:     "AppDataAfterChangeCipherSpec-DTLS-Empty",
1613			config: Config{
1614				MaxVersion: VersionTLS12,
1615				Bugs: ProtocolBugs{
1616					AppDataAfterChangeCipherSpec: []byte{},
1617				},
1618			},
1619			// BoringSSL's DTLS implementation will drop the out-of-order
1620			// application data.
1621		},
1622		{
1623			name: "AlertAfterChangeCipherSpec",
1624			config: Config{
1625				MaxVersion: VersionTLS12,
1626				Bugs: ProtocolBugs{
1627					AlertAfterChangeCipherSpec: alertRecordOverflow,
1628				},
1629			},
1630			shouldFail:    true,
1631			expectedError: ":TLSV1_ALERT_RECORD_OVERFLOW:",
1632		},
1633		{
1634			protocol: dtls,
1635			name:     "AlertAfterChangeCipherSpec-DTLS",
1636			config: Config{
1637				MaxVersion: VersionTLS12,
1638				Bugs: ProtocolBugs{
1639					AlertAfterChangeCipherSpec: alertRecordOverflow,
1640				},
1641			},
1642			shouldFail:    true,
1643			expectedError: ":TLSV1_ALERT_RECORD_OVERFLOW:",
1644		},
1645		{
1646			protocol: dtls,
1647			name:     "ReorderHandshakeFragments-Small-DTLS",
1648			config: Config{
1649				Bugs: ProtocolBugs{
1650					ReorderHandshakeFragments: true,
1651					// Small enough that every handshake message is
1652					// fragmented.
1653					MaxHandshakeRecordLength: 2,
1654				},
1655			},
1656		},
1657		{
1658			protocol: dtls,
1659			name:     "ReorderHandshakeFragments-Large-DTLS",
1660			config: Config{
1661				Bugs: ProtocolBugs{
1662					ReorderHandshakeFragments: true,
1663					// Large enough that no handshake message is
1664					// fragmented.
1665					MaxHandshakeRecordLength: 2048,
1666				},
1667			},
1668		},
1669		{
1670			protocol: dtls,
1671			name:     "MixCompleteMessageWithFragments-DTLS",
1672			config: Config{
1673				Bugs: ProtocolBugs{
1674					ReorderHandshakeFragments:       true,
1675					MixCompleteMessageWithFragments: true,
1676					MaxHandshakeRecordLength:        2,
1677				},
1678			},
1679		},
1680		{
1681			name: "SendInvalidRecordType",
1682			config: Config{
1683				Bugs: ProtocolBugs{
1684					SendInvalidRecordType: true,
1685				},
1686			},
1687			shouldFail:    true,
1688			expectedError: ":UNEXPECTED_RECORD:",
1689		},
1690		{
1691			protocol: dtls,
1692			name:     "SendInvalidRecordType-DTLS",
1693			config: Config{
1694				Bugs: ProtocolBugs{
1695					SendInvalidRecordType: true,
1696				},
1697			},
1698			shouldFail:    true,
1699			expectedError: ":UNEXPECTED_RECORD:",
1700		},
1701		{
1702			name: "FalseStart-SkipServerSecondLeg",
1703			config: Config{
1704				MaxVersion:   VersionTLS12,
1705				CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
1706				NextProtos:   []string{"foo"},
1707				Bugs: ProtocolBugs{
1708					SkipNewSessionTicket: true,
1709					SkipChangeCipherSpec: true,
1710					SkipFinished:         true,
1711					ExpectFalseStart:     true,
1712				},
1713			},
1714			flags: []string{
1715				"-false-start",
1716				"-handshake-never-done",
1717				"-advertise-alpn", "\x03foo",
1718			},
1719			shimWritesFirst: true,
1720			shouldFail:      true,
1721			expectedError:   ":UNEXPECTED_RECORD:",
1722		},
1723		{
1724			name: "FalseStart-SkipServerSecondLeg-Implicit",
1725			config: Config{
1726				MaxVersion:   VersionTLS12,
1727				CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
1728				NextProtos:   []string{"foo"},
1729				Bugs: ProtocolBugs{
1730					SkipNewSessionTicket: true,
1731					SkipChangeCipherSpec: true,
1732					SkipFinished:         true,
1733				},
1734			},
1735			flags: []string{
1736				"-implicit-handshake",
1737				"-false-start",
1738				"-handshake-never-done",
1739				"-advertise-alpn", "\x03foo",
1740			},
1741			shouldFail:    true,
1742			expectedError: ":UNEXPECTED_RECORD:",
1743		},
1744		{
1745			testType:           serverTest,
1746			name:               "FailEarlyCallback",
1747			flags:              []string{"-fail-early-callback"},
1748			shouldFail:         true,
1749			expectedError:      ":CONNECTION_REJECTED:",
1750			expectedLocalError: "remote error: handshake failure",
1751		},
1752		{
1753			name: "FailCertCallback-Client-TLS12",
1754			config: Config{
1755				MaxVersion: VersionTLS12,
1756				ClientAuth: RequestClientCert,
1757			},
1758			flags:              []string{"-fail-cert-callback"},
1759			shouldFail:         true,
1760			expectedError:      ":CERT_CB_ERROR:",
1761			expectedLocalError: "remote error: internal error",
1762		},
1763		{
1764			testType: serverTest,
1765			name:     "FailCertCallback-Server-TLS12",
1766			config: Config{
1767				MaxVersion: VersionTLS12,
1768			},
1769			flags:              []string{"-fail-cert-callback"},
1770			shouldFail:         true,
1771			expectedError:      ":CERT_CB_ERROR:",
1772			expectedLocalError: "remote error: internal error",
1773		},
1774		{
1775			name: "FailCertCallback-Client-TLS13",
1776			config: Config{
1777				MaxVersion: VersionTLS13,
1778				ClientAuth: RequestClientCert,
1779			},
1780			flags:              []string{"-fail-cert-callback"},
1781			shouldFail:         true,
1782			expectedError:      ":CERT_CB_ERROR:",
1783			expectedLocalError: "remote error: internal error",
1784		},
1785		{
1786			testType: serverTest,
1787			name:     "FailCertCallback-Server-TLS13",
1788			config: Config{
1789				MaxVersion: VersionTLS13,
1790			},
1791			flags:              []string{"-fail-cert-callback"},
1792			shouldFail:         true,
1793			expectedError:      ":CERT_CB_ERROR:",
1794			expectedLocalError: "remote error: internal error",
1795		},
1796		{
1797			protocol: dtls,
1798			name:     "FragmentMessageTypeMismatch-DTLS",
1799			config: Config{
1800				Bugs: ProtocolBugs{
1801					MaxHandshakeRecordLength:    2,
1802					FragmentMessageTypeMismatch: true,
1803				},
1804			},
1805			shouldFail:    true,
1806			expectedError: ":FRAGMENT_MISMATCH:",
1807		},
1808		{
1809			protocol: dtls,
1810			name:     "FragmentMessageLengthMismatch-DTLS",
1811			config: Config{
1812				Bugs: ProtocolBugs{
1813					MaxHandshakeRecordLength:      2,
1814					FragmentMessageLengthMismatch: true,
1815				},
1816			},
1817			shouldFail:    true,
1818			expectedError: ":FRAGMENT_MISMATCH:",
1819		},
1820		{
1821			protocol: dtls,
1822			name:     "SplitFragments-Header-DTLS",
1823			config: Config{
1824				Bugs: ProtocolBugs{
1825					SplitFragments: 2,
1826				},
1827			},
1828			shouldFail:    true,
1829			expectedError: ":BAD_HANDSHAKE_RECORD:",
1830		},
1831		{
1832			protocol: dtls,
1833			name:     "SplitFragments-Boundary-DTLS",
1834			config: Config{
1835				Bugs: ProtocolBugs{
1836					SplitFragments: dtlsRecordHeaderLen,
1837				},
1838			},
1839			shouldFail:    true,
1840			expectedError: ":BAD_HANDSHAKE_RECORD:",
1841		},
1842		{
1843			protocol: dtls,
1844			name:     "SplitFragments-Body-DTLS",
1845			config: Config{
1846				Bugs: ProtocolBugs{
1847					SplitFragments: dtlsRecordHeaderLen + 1,
1848				},
1849			},
1850			shouldFail:    true,
1851			expectedError: ":BAD_HANDSHAKE_RECORD:",
1852		},
1853		{
1854			protocol: dtls,
1855			name:     "SendEmptyFragments-DTLS",
1856			config: Config{
1857				Bugs: ProtocolBugs{
1858					SendEmptyFragments: true,
1859				},
1860			},
1861		},
1862		{
1863			name: "BadFinished-Client",
1864			config: Config{
1865				MaxVersion: VersionTLS12,
1866				Bugs: ProtocolBugs{
1867					BadFinished: true,
1868				},
1869			},
1870			shouldFail:    true,
1871			expectedError: ":DIGEST_CHECK_FAILED:",
1872		},
1873		{
1874			name: "BadFinished-Client-TLS13",
1875			config: Config{
1876				MaxVersion: VersionTLS13,
1877				Bugs: ProtocolBugs{
1878					BadFinished: true,
1879				},
1880			},
1881			shouldFail:    true,
1882			expectedError: ":DIGEST_CHECK_FAILED:",
1883		},
1884		{
1885			testType: serverTest,
1886			name:     "BadFinished-Server",
1887			config: Config{
1888				MaxVersion: VersionTLS12,
1889				Bugs: ProtocolBugs{
1890					BadFinished: true,
1891				},
1892			},
1893			shouldFail:    true,
1894			expectedError: ":DIGEST_CHECK_FAILED:",
1895		},
1896		{
1897			testType: serverTest,
1898			name:     "BadFinished-Server-TLS13",
1899			config: Config{
1900				MaxVersion: VersionTLS13,
1901				Bugs: ProtocolBugs{
1902					BadFinished: true,
1903				},
1904			},
1905			shouldFail:    true,
1906			expectedError: ":DIGEST_CHECK_FAILED:",
1907		},
1908		{
1909			name: "FalseStart-BadFinished",
1910			config: Config{
1911				MaxVersion:   VersionTLS12,
1912				CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
1913				NextProtos:   []string{"foo"},
1914				Bugs: ProtocolBugs{
1915					BadFinished:      true,
1916					ExpectFalseStart: true,
1917				},
1918			},
1919			flags: []string{
1920				"-false-start",
1921				"-handshake-never-done",
1922				"-advertise-alpn", "\x03foo",
1923			},
1924			shimWritesFirst: true,
1925			shouldFail:      true,
1926			expectedError:   ":DIGEST_CHECK_FAILED:",
1927		},
1928		{
1929			name: "NoFalseStart-NoALPN",
1930			config: Config{
1931				MaxVersion:   VersionTLS12,
1932				CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
1933				Bugs: ProtocolBugs{
1934					ExpectFalseStart:          true,
1935					AlertBeforeFalseStartTest: alertAccessDenied,
1936				},
1937			},
1938			flags: []string{
1939				"-false-start",
1940			},
1941			shimWritesFirst:    true,
1942			shouldFail:         true,
1943			expectedError:      ":TLSV1_ALERT_ACCESS_DENIED:",
1944			expectedLocalError: "tls: peer did not false start: EOF",
1945		},
1946		{
1947			name: "NoFalseStart-NoAEAD",
1948			config: Config{
1949				MaxVersion:   VersionTLS12,
1950				CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA},
1951				NextProtos:   []string{"foo"},
1952				Bugs: ProtocolBugs{
1953					ExpectFalseStart:          true,
1954					AlertBeforeFalseStartTest: alertAccessDenied,
1955				},
1956			},
1957			flags: []string{
1958				"-false-start",
1959				"-advertise-alpn", "\x03foo",
1960			},
1961			shimWritesFirst:    true,
1962			shouldFail:         true,
1963			expectedError:      ":TLSV1_ALERT_ACCESS_DENIED:",
1964			expectedLocalError: "tls: peer did not false start: EOF",
1965		},
1966		{
1967			name: "NoFalseStart-RSA",
1968			config: Config{
1969				MaxVersion:   VersionTLS12,
1970				CipherSuites: []uint16{TLS_RSA_WITH_AES_128_GCM_SHA256},
1971				NextProtos:   []string{"foo"},
1972				Bugs: ProtocolBugs{
1973					ExpectFalseStart:          true,
1974					AlertBeforeFalseStartTest: alertAccessDenied,
1975				},
1976			},
1977			flags: []string{
1978				"-false-start",
1979				"-advertise-alpn", "\x03foo",
1980			},
1981			shimWritesFirst:    true,
1982			shouldFail:         true,
1983			expectedError:      ":TLSV1_ALERT_ACCESS_DENIED:",
1984			expectedLocalError: "tls: peer did not false start: EOF",
1985		},
1986		{
1987			protocol: dtls,
1988			name:     "SendSplitAlert-Sync",
1989			config: Config{
1990				Bugs: ProtocolBugs{
1991					SendSplitAlert: true,
1992				},
1993			},
1994		},
1995		{
1996			protocol: dtls,
1997			name:     "SendSplitAlert-Async",
1998			config: Config{
1999				Bugs: ProtocolBugs{
2000					SendSplitAlert: true,
2001				},
2002			},
2003			flags: []string{"-async"},
2004		},
2005		{
2006			protocol: dtls,
2007			name:     "PackDTLSHandshake",
2008			config: Config{
2009				Bugs: ProtocolBugs{
2010					MaxHandshakeRecordLength: 2,
2011					PackHandshakeFragments:   20,
2012					PackHandshakeRecords:     200,
2013				},
2014			},
2015		},
2016		{
2017			name:             "SendEmptyRecords-Pass",
2018			sendEmptyRecords: 32,
2019		},
2020		{
2021			name:             "SendEmptyRecords",
2022			sendEmptyRecords: 33,
2023			shouldFail:       true,
2024			expectedError:    ":TOO_MANY_EMPTY_FRAGMENTS:",
2025		},
2026		{
2027			name:             "SendEmptyRecords-Async",
2028			sendEmptyRecords: 33,
2029			flags:            []string{"-async"},
2030			shouldFail:       true,
2031			expectedError:    ":TOO_MANY_EMPTY_FRAGMENTS:",
2032		},
2033		{
2034			name: "SendWarningAlerts-Pass",
2035			config: Config{
2036				MaxVersion: VersionTLS12,
2037			},
2038			sendWarningAlerts: 4,
2039		},
2040		{
2041			protocol: dtls,
2042			name:     "SendWarningAlerts-DTLS-Pass",
2043			config: Config{
2044				MaxVersion: VersionTLS12,
2045			},
2046			sendWarningAlerts: 4,
2047		},
2048		{
2049			name: "SendWarningAlerts-TLS13",
2050			config: Config{
2051				MaxVersion: VersionTLS13,
2052			},
2053			sendWarningAlerts:  4,
2054			shouldFail:         true,
2055			expectedError:      ":BAD_ALERT:",
2056			expectedLocalError: "remote error: error decoding message",
2057		},
2058		{
2059			name: "SendWarningAlerts",
2060			config: Config{
2061				MaxVersion: VersionTLS12,
2062			},
2063			sendWarningAlerts: 5,
2064			shouldFail:        true,
2065			expectedError:     ":TOO_MANY_WARNING_ALERTS:",
2066		},
2067		{
2068			name: "SendWarningAlerts-Async",
2069			config: Config{
2070				MaxVersion: VersionTLS12,
2071			},
2072			sendWarningAlerts: 5,
2073			flags:             []string{"-async"},
2074			shouldFail:        true,
2075			expectedError:     ":TOO_MANY_WARNING_ALERTS:",
2076		},
2077		{
2078			name: "TooManyKeyUpdates",
2079			config: Config{
2080				MaxVersion: VersionTLS13,
2081			},
2082			sendKeyUpdates:   33,
2083			keyUpdateRequest: keyUpdateNotRequested,
2084			shouldFail:       true,
2085			expectedError:    ":TOO_MANY_KEY_UPDATES:",
2086		},
2087		{
2088			name: "EmptySessionID",
2089			config: Config{
2090				MaxVersion:             VersionTLS12,
2091				SessionTicketsDisabled: true,
2092			},
2093			noSessionCache: true,
2094			flags:          []string{"-expect-no-session"},
2095		},
2096		{
2097			name: "Unclean-Shutdown",
2098			config: Config{
2099				Bugs: ProtocolBugs{
2100					NoCloseNotify:     true,
2101					ExpectCloseNotify: true,
2102				},
2103			},
2104			shimShutsDown: true,
2105			flags:         []string{"-check-close-notify"},
2106			shouldFail:    true,
2107			expectedError: "Unexpected SSL_shutdown result: -1 != 1",
2108		},
2109		{
2110			name: "Unclean-Shutdown-Ignored",
2111			config: Config{
2112				Bugs: ProtocolBugs{
2113					NoCloseNotify: true,
2114				},
2115			},
2116			shimShutsDown: true,
2117		},
2118		{
2119			name: "Unclean-Shutdown-Alert",
2120			config: Config{
2121				Bugs: ProtocolBugs{
2122					SendAlertOnShutdown: alertDecompressionFailure,
2123					ExpectCloseNotify:   true,
2124				},
2125			},
2126			shimShutsDown: true,
2127			flags:         []string{"-check-close-notify"},
2128			shouldFail:    true,
2129			expectedError: ":SSLV3_ALERT_DECOMPRESSION_FAILURE:",
2130		},
2131		{
2132			name: "LargePlaintext",
2133			config: Config{
2134				Bugs: ProtocolBugs{
2135					SendLargeRecords: true,
2136				},
2137			},
2138			messageLen:    maxPlaintext + 1,
2139			shouldFail:    true,
2140			expectedError: ":DATA_LENGTH_TOO_LONG:",
2141		},
2142		{
2143			protocol: dtls,
2144			name:     "LargePlaintext-DTLS",
2145			config: Config{
2146				Bugs: ProtocolBugs{
2147					SendLargeRecords: true,
2148				},
2149			},
2150			messageLen:    maxPlaintext + 1,
2151			shouldFail:    true,
2152			expectedError: ":DATA_LENGTH_TOO_LONG:",
2153		},
2154		{
2155			name: "LargeCiphertext",
2156			config: Config{
2157				Bugs: ProtocolBugs{
2158					SendLargeRecords: true,
2159				},
2160			},
2161			messageLen:    maxPlaintext * 2,
2162			shouldFail:    true,
2163			expectedError: ":ENCRYPTED_LENGTH_TOO_LONG:",
2164		},
2165		{
2166			protocol: dtls,
2167			name:     "LargeCiphertext-DTLS",
2168			config: Config{
2169				Bugs: ProtocolBugs{
2170					SendLargeRecords: true,
2171				},
2172			},
2173			messageLen: maxPlaintext * 2,
2174			// Unlike the other four cases, DTLS drops records which
2175			// are invalid before authentication, so the connection
2176			// does not fail.
2177			expectMessageDropped: true,
2178		},
2179		{
2180			name:        "BadHelloRequest-1",
2181			renegotiate: 1,
2182			config: Config{
2183				MaxVersion: VersionTLS12,
2184				Bugs: ProtocolBugs{
2185					BadHelloRequest: []byte{typeHelloRequest, 0, 0, 1, 1},
2186				},
2187			},
2188			flags: []string{
2189				"-renegotiate-freely",
2190				"-expect-total-renegotiations", "1",
2191			},
2192			shouldFail:    true,
2193			expectedError: ":EXCESSIVE_MESSAGE_SIZE:",
2194		},
2195		{
2196			name:        "BadHelloRequest-2",
2197			renegotiate: 1,
2198			config: Config{
2199				MaxVersion: VersionTLS12,
2200				Bugs: ProtocolBugs{
2201					BadHelloRequest: []byte{typeServerKeyExchange, 0, 0, 0},
2202				},
2203			},
2204			flags: []string{
2205				"-renegotiate-freely",
2206				"-expect-total-renegotiations", "1",
2207			},
2208			shouldFail:    true,
2209			expectedError: ":BAD_HELLO_REQUEST:",
2210		},
2211		{
2212			testType: serverTest,
2213			name:     "SupportTicketsWithSessionID",
2214			config: Config{
2215				MaxVersion:             VersionTLS12,
2216				SessionTicketsDisabled: true,
2217			},
2218			resumeConfig: &Config{
2219				MaxVersion: VersionTLS12,
2220			},
2221			resumeSession: true,
2222		},
2223		{
2224			protocol: dtls,
2225			name:     "DTLS-SendExtraFinished",
2226			config: Config{
2227				Bugs: ProtocolBugs{
2228					SendExtraFinished: true,
2229				},
2230			},
2231			shouldFail:    true,
2232			expectedError: ":UNEXPECTED_RECORD:",
2233		},
2234		{
2235			protocol: dtls,
2236			name:     "DTLS-SendExtraFinished-Reordered",
2237			config: Config{
2238				Bugs: ProtocolBugs{
2239					MaxHandshakeRecordLength:  2,
2240					ReorderHandshakeFragments: true,
2241					SendExtraFinished:         true,
2242				},
2243			},
2244			shouldFail:    true,
2245			expectedError: ":UNEXPECTED_RECORD:",
2246		},
2247		{
2248			testType: serverTest,
2249			name:     "V2ClientHello-EmptyRecordPrefix",
2250			config: Config{
2251				// Choose a cipher suite that does not involve
2252				// elliptic curves, so no extensions are
2253				// involved.
2254				MaxVersion:   VersionTLS12,
2255				CipherSuites: []uint16{TLS_RSA_WITH_3DES_EDE_CBC_SHA},
2256				Bugs: ProtocolBugs{
2257					SendV2ClientHello: true,
2258				},
2259			},
2260			sendPrefix: string([]byte{
2261				byte(recordTypeHandshake),
2262				3, 1, // version
2263				0, 0, // length
2264			}),
2265			// A no-op empty record may not be sent before V2ClientHello.
2266			shouldFail:    true,
2267			expectedError: ":WRONG_VERSION_NUMBER:",
2268		},
2269		{
2270			testType: serverTest,
2271			name:     "V2ClientHello-WarningAlertPrefix",
2272			config: Config{
2273				// Choose a cipher suite that does not involve
2274				// elliptic curves, so no extensions are
2275				// involved.
2276				MaxVersion:   VersionTLS12,
2277				CipherSuites: []uint16{TLS_RSA_WITH_3DES_EDE_CBC_SHA},
2278				Bugs: ProtocolBugs{
2279					SendV2ClientHello: true,
2280				},
2281			},
2282			sendPrefix: string([]byte{
2283				byte(recordTypeAlert),
2284				3, 1, // version
2285				0, 2, // length
2286				alertLevelWarning, byte(alertDecompressionFailure),
2287			}),
2288			// A no-op warning alert may not be sent before V2ClientHello.
2289			shouldFail:    true,
2290			expectedError: ":WRONG_VERSION_NUMBER:",
2291		},
2292		{
2293			name: "KeyUpdate-Client",
2294			config: Config{
2295				MaxVersion: VersionTLS13,
2296			},
2297			sendKeyUpdates:   1,
2298			keyUpdateRequest: keyUpdateNotRequested,
2299		},
2300		{
2301			testType: serverTest,
2302			name:     "KeyUpdate-Server",
2303			config: Config{
2304				MaxVersion: VersionTLS13,
2305			},
2306			sendKeyUpdates:   1,
2307			keyUpdateRequest: keyUpdateNotRequested,
2308		},
2309		{
2310			name: "KeyUpdate-InvalidRequestMode",
2311			config: Config{
2312				MaxVersion: VersionTLS13,
2313			},
2314			sendKeyUpdates:   1,
2315			keyUpdateRequest: 42,
2316			shouldFail:       true,
2317			expectedError:    ":DECODE_ERROR:",
2318		},
2319		{
2320			name: "SendSNIWarningAlert",
2321			config: Config{
2322				MaxVersion: VersionTLS12,
2323				Bugs: ProtocolBugs{
2324					SendSNIWarningAlert: true,
2325				},
2326			},
2327		},
2328		{
2329			testType: serverTest,
2330			name:     "ExtraCompressionMethods-TLS12",
2331			config: Config{
2332				MaxVersion: VersionTLS12,
2333				Bugs: ProtocolBugs{
2334					SendCompressionMethods: []byte{1, 2, 3, compressionNone, 4, 5, 6},
2335				},
2336			},
2337		},
2338		{
2339			testType: serverTest,
2340			name:     "ExtraCompressionMethods-TLS13",
2341			config: Config{
2342				MaxVersion: VersionTLS13,
2343				Bugs: ProtocolBugs{
2344					SendCompressionMethods: []byte{1, 2, 3, compressionNone, 4, 5, 6},
2345				},
2346			},
2347			shouldFail:         true,
2348			expectedError:      ":INVALID_COMPRESSION_LIST:",
2349			expectedLocalError: "remote error: illegal parameter",
2350		},
2351		{
2352			testType: serverTest,
2353			name:     "NoNullCompression-TLS12",
2354			config: Config{
2355				MaxVersion: VersionTLS12,
2356				Bugs: ProtocolBugs{
2357					SendCompressionMethods: []byte{1, 2, 3, 4, 5, 6},
2358				},
2359			},
2360			shouldFail:         true,
2361			expectedError:      ":INVALID_COMPRESSION_LIST:",
2362			expectedLocalError: "remote error: illegal parameter",
2363		},
2364		{
2365			testType: serverTest,
2366			name:     "NoNullCompression-TLS13",
2367			config: Config{
2368				MaxVersion: VersionTLS13,
2369				Bugs: ProtocolBugs{
2370					SendCompressionMethods: []byte{1, 2, 3, 4, 5, 6},
2371				},
2372			},
2373			shouldFail:         true,
2374			expectedError:      ":INVALID_COMPRESSION_LIST:",
2375			expectedLocalError: "remote error: illegal parameter",
2376		},
2377		{
2378			name: "GREASE-Client-TLS12",
2379			config: Config{
2380				MaxVersion: VersionTLS12,
2381				Bugs: ProtocolBugs{
2382					ExpectGREASE: true,
2383				},
2384			},
2385			flags: []string{"-enable-grease"},
2386		},
2387		{
2388			name: "GREASE-Client-TLS13",
2389			config: Config{
2390				MaxVersion: VersionTLS13,
2391				Bugs: ProtocolBugs{
2392					ExpectGREASE: true,
2393				},
2394			},
2395			flags: []string{"-enable-grease"},
2396		},
2397		{
2398			testType: serverTest,
2399			name:     "GREASE-Server-TLS13",
2400			config: Config{
2401				MaxVersion: VersionTLS13,
2402				Bugs: ProtocolBugs{
2403					// TLS 1.3 servers are expected to
2404					// always enable GREASE. TLS 1.3 is new,
2405					// so there is no existing ecosystem to
2406					// worry about.
2407					ExpectGREASE: true,
2408				},
2409			},
2410		},
2411		{
2412			// Test the server so there is a large certificate as
2413			// well as application data.
2414			testType: serverTest,
2415			name:     "MaxSendFragment",
2416			config: Config{
2417				Bugs: ProtocolBugs{
2418					MaxReceivePlaintext: 512,
2419				},
2420			},
2421			messageLen: 1024,
2422			flags: []string{
2423				"-max-send-fragment", "512",
2424				"-read-size", "1024",
2425			},
2426		},
2427		{
2428			// Test the server so there is a large certificate as
2429			// well as application data.
2430			testType: serverTest,
2431			name:     "MaxSendFragment-TooLarge",
2432			config: Config{
2433				Bugs: ProtocolBugs{
2434					// Ensure that some of the records are
2435					// 512.
2436					MaxReceivePlaintext: 511,
2437				},
2438			},
2439			messageLen: 1024,
2440			flags: []string{
2441				"-max-send-fragment", "512",
2442				"-read-size", "1024",
2443			},
2444			shouldFail:         true,
2445			expectedLocalError: "local error: record overflow",
2446		},
2447	}
2448	testCases = append(testCases, basicTests...)
2449
2450	if *includeDHE {
2451		testCases = append(testCases, testCase{
2452			name: "NoFalseStart-DHE_RSA",
2453			config: Config{
2454				MaxVersion:   VersionTLS12,
2455				CipherSuites: []uint16{TLS_DHE_RSA_WITH_AES_128_GCM_SHA256},
2456				NextProtos:   []string{"foo"},
2457				Bugs: ProtocolBugs{
2458					ExpectFalseStart:          true,
2459					AlertBeforeFalseStartTest: alertAccessDenied,
2460				},
2461			},
2462			flags: []string{
2463				"-false-start",
2464				"-advertise-alpn", "\x03foo",
2465			},
2466			shimWritesFirst:    true,
2467			shouldFail:         true,
2468			expectedError:      ":TLSV1_ALERT_ACCESS_DENIED:",
2469			expectedLocalError: "tls: peer did not false start: EOF",
2470		})
2471	}
2472
2473	// Test that very large messages can be received.
2474	cert := rsaCertificate
2475	for i := 0; i < 50; i++ {
2476		cert.Certificate = append(cert.Certificate, cert.Certificate[0])
2477	}
2478	testCases = append(testCases, testCase{
2479		name: "LargeMessage",
2480		config: Config{
2481			Certificates: []Certificate{cert},
2482		},
2483	})
2484	testCases = append(testCases, testCase{
2485		protocol: dtls,
2486		name:     "LargeMessage-DTLS",
2487		config: Config{
2488			Certificates: []Certificate{cert},
2489		},
2490	})
2491
2492	// They are rejected if the maximum certificate chain length is capped.
2493	testCases = append(testCases, testCase{
2494		name: "LargeMessage-Reject",
2495		config: Config{
2496			Certificates: []Certificate{cert},
2497		},
2498		flags:         []string{"-max-cert-list", "16384"},
2499		shouldFail:    true,
2500		expectedError: ":EXCESSIVE_MESSAGE_SIZE:",
2501	})
2502	testCases = append(testCases, testCase{
2503		protocol: dtls,
2504		name:     "LargeMessage-Reject-DTLS",
2505		config: Config{
2506			Certificates: []Certificate{cert},
2507		},
2508		flags:         []string{"-max-cert-list", "16384"},
2509		shouldFail:    true,
2510		expectedError: ":EXCESSIVE_MESSAGE_SIZE:",
2511	})
2512}
2513
2514func addTestForCipherSuite(suite testCipherSuite, ver tlsVersion, protocol protocol) {
2515	const psk = "12345"
2516	const pskIdentity = "luggage combo"
2517
2518	var prefix string
2519	if protocol == dtls {
2520		if !ver.hasDTLS {
2521			return
2522		}
2523		prefix = "D"
2524	}
2525
2526	var cert Certificate
2527	var certFile string
2528	var keyFile string
2529	if hasComponent(suite.name, "ECDSA") {
2530		cert = ecdsaP256Certificate
2531		certFile = ecdsaP256CertificateFile
2532		keyFile = ecdsaP256KeyFile
2533	} else {
2534		cert = rsaCertificate
2535		certFile = rsaCertificateFile
2536		keyFile = rsaKeyFile
2537	}
2538
2539	var flags []string
2540	if hasComponent(suite.name, "PSK") {
2541		flags = append(flags,
2542			"-psk", psk,
2543			"-psk-identity", pskIdentity)
2544	}
2545	if hasComponent(suite.name, "NULL") {
2546		// NULL ciphers must be explicitly enabled.
2547		flags = append(flags, "-cipher", "DEFAULT:NULL-SHA")
2548	}
2549
2550	var shouldServerFail, shouldClientFail bool
2551	if hasComponent(suite.name, "ECDHE") && ver.version == VersionSSL30 {
2552		// BoringSSL clients accept ECDHE on SSLv3, but
2553		// a BoringSSL server will never select it
2554		// because the extension is missing.
2555		shouldServerFail = true
2556	}
2557	if isTLS12Only(suite.name) && ver.version < VersionTLS12 {
2558		shouldClientFail = true
2559		shouldServerFail = true
2560	}
2561	if !isTLS13Suite(suite.name) && ver.version >= VersionTLS13 {
2562		shouldClientFail = true
2563		shouldServerFail = true
2564	}
2565	if isTLS13Suite(suite.name) && ver.version < VersionTLS13 {
2566		shouldClientFail = true
2567		shouldServerFail = true
2568	}
2569	if !isDTLSCipher(suite.name) && protocol == dtls {
2570		shouldClientFail = true
2571		shouldServerFail = true
2572	}
2573
2574	var sendCipherSuite uint16
2575	var expectedServerError, expectedClientError string
2576	serverCipherSuites := []uint16{suite.id}
2577	if shouldServerFail {
2578		expectedServerError = ":NO_SHARED_CIPHER:"
2579	}
2580	if shouldClientFail {
2581		expectedClientError = ":WRONG_CIPHER_RETURNED:"
2582		// Configure the server to select ciphers as normal but
2583		// select an incompatible cipher in ServerHello.
2584		serverCipherSuites = nil
2585		sendCipherSuite = suite.id
2586	}
2587
2588	// For cipher suites and versions where exporters are defined, verify
2589	// that they interoperate.
2590	var exportKeyingMaterial int
2591	if ver.version > VersionSSL30 {
2592		exportKeyingMaterial = 1024
2593	}
2594
2595	testCases = append(testCases, testCase{
2596		testType: serverTest,
2597		protocol: protocol,
2598		name:     prefix + ver.name + "-" + suite.name + "-server",
2599		config: Config{
2600			MinVersion:           ver.version,
2601			MaxVersion:           ver.version,
2602			CipherSuites:         []uint16{suite.id},
2603			Certificates:         []Certificate{cert},
2604			PreSharedKey:         []byte(psk),
2605			PreSharedKeyIdentity: pskIdentity,
2606			Bugs: ProtocolBugs{
2607				AdvertiseAllConfiguredCiphers: true,
2608			},
2609		},
2610		certFile:             certFile,
2611		keyFile:              keyFile,
2612		flags:                flags,
2613		resumeSession:        true,
2614		shouldFail:           shouldServerFail,
2615		expectedError:        expectedServerError,
2616		exportKeyingMaterial: exportKeyingMaterial,
2617	})
2618
2619	testCases = append(testCases, testCase{
2620		testType: clientTest,
2621		protocol: protocol,
2622		name:     prefix + ver.name + "-" + suite.name + "-client",
2623		config: Config{
2624			MinVersion:           ver.version,
2625			MaxVersion:           ver.version,
2626			CipherSuites:         serverCipherSuites,
2627			Certificates:         []Certificate{cert},
2628			PreSharedKey:         []byte(psk),
2629			PreSharedKeyIdentity: pskIdentity,
2630			Bugs: ProtocolBugs{
2631				IgnorePeerCipherPreferences: shouldClientFail,
2632				SendCipherSuite:             sendCipherSuite,
2633			},
2634		},
2635		flags:                flags,
2636		resumeSession:        true,
2637		shouldFail:           shouldClientFail,
2638		expectedError:        expectedClientError,
2639		exportKeyingMaterial: exportKeyingMaterial,
2640	})
2641
2642	if shouldClientFail {
2643		return
2644	}
2645
2646	// Ensure the maximum record size is accepted.
2647	testCases = append(testCases, testCase{
2648		protocol: protocol,
2649		name:     prefix + ver.name + "-" + suite.name + "-LargeRecord",
2650		config: Config{
2651			MinVersion:           ver.version,
2652			MaxVersion:           ver.version,
2653			CipherSuites:         []uint16{suite.id},
2654			Certificates:         []Certificate{cert},
2655			PreSharedKey:         []byte(psk),
2656			PreSharedKeyIdentity: pskIdentity,
2657		},
2658		flags:      flags,
2659		messageLen: maxPlaintext,
2660	})
2661
2662	// Test bad records for all ciphers. Bad records are fatal in TLS
2663	// and ignored in DTLS.
2664	var shouldFail bool
2665	var expectedError string
2666	if protocol == tls {
2667		shouldFail = true
2668		expectedError = ":DECRYPTION_FAILED_OR_BAD_RECORD_MAC:"
2669	}
2670
2671	testCases = append(testCases, testCase{
2672		protocol: protocol,
2673		name:     prefix + ver.name + "-" + suite.name + "-BadRecord",
2674		config: Config{
2675			MinVersion:           ver.version,
2676			MaxVersion:           ver.version,
2677			CipherSuites:         []uint16{suite.id},
2678			Certificates:         []Certificate{cert},
2679			PreSharedKey:         []byte(psk),
2680			PreSharedKeyIdentity: pskIdentity,
2681		},
2682		flags:            flags,
2683		damageFirstWrite: true,
2684		messageLen:       maxPlaintext,
2685		shouldFail:       shouldFail,
2686		expectedError:    expectedError,
2687	})
2688}
2689
2690func addCipherSuiteTests() {
2691	const bogusCipher = 0xfe00
2692
2693	if *includeDHE {
2694		testCipherSuites = append(testCipherSuites, []testCipherSuite{
2695			{"DHE-RSA-AES128-GCM", TLS_DHE_RSA_WITH_AES_128_GCM_SHA256},
2696			{"DHE-RSA-AES128-SHA", TLS_DHE_RSA_WITH_AES_128_CBC_SHA},
2697			{"DHE-RSA-AES128-SHA256", TLS_DHE_RSA_WITH_AES_128_CBC_SHA256},
2698			{"DHE-RSA-AES256-GCM", TLS_DHE_RSA_WITH_AES_256_GCM_SHA384},
2699			{"DHE-RSA-AES256-SHA", TLS_DHE_RSA_WITH_AES_256_CBC_SHA},
2700			{"DHE-RSA-AES256-SHA256", TLS_DHE_RSA_WITH_AES_256_CBC_SHA256},
2701		}...)
2702	}
2703
2704	for _, suite := range testCipherSuites {
2705		for _, ver := range tlsVersions {
2706			for _, protocol := range []protocol{tls, dtls} {
2707				addTestForCipherSuite(suite, ver, protocol)
2708			}
2709		}
2710	}
2711
2712	testCases = append(testCases, testCase{
2713		name: "NoSharedCipher",
2714		config: Config{
2715			MaxVersion:   VersionTLS12,
2716			CipherSuites: []uint16{},
2717		},
2718		shouldFail:    true,
2719		expectedError: ":HANDSHAKE_FAILURE_ON_CLIENT_HELLO:",
2720	})
2721
2722	testCases = append(testCases, testCase{
2723		name: "NoSharedCipher-TLS13",
2724		config: Config{
2725			MaxVersion:   VersionTLS13,
2726			CipherSuites: []uint16{},
2727		},
2728		shouldFail:    true,
2729		expectedError: ":HANDSHAKE_FAILURE_ON_CLIENT_HELLO:",
2730	})
2731
2732	testCases = append(testCases, testCase{
2733		name: "UnsupportedCipherSuite",
2734		config: Config{
2735			MaxVersion:   VersionTLS12,
2736			CipherSuites: []uint16{TLS_RSA_WITH_AES_128_CBC_SHA},
2737			Bugs: ProtocolBugs{
2738				IgnorePeerCipherPreferences: true,
2739			},
2740		},
2741		flags:         []string{"-cipher", "DEFAULT:!AES"},
2742		shouldFail:    true,
2743		expectedError: ":WRONG_CIPHER_RETURNED:",
2744	})
2745
2746	testCases = append(testCases, testCase{
2747		name: "ServerHelloBogusCipher",
2748		config: Config{
2749			MaxVersion: VersionTLS12,
2750			Bugs: ProtocolBugs{
2751				SendCipherSuite: bogusCipher,
2752			},
2753		},
2754		shouldFail:    true,
2755		expectedError: ":UNKNOWN_CIPHER_RETURNED:",
2756	})
2757	testCases = append(testCases, testCase{
2758		name: "ServerHelloBogusCipher-TLS13",
2759		config: Config{
2760			MaxVersion: VersionTLS13,
2761			Bugs: ProtocolBugs{
2762				SendCipherSuite: bogusCipher,
2763			},
2764		},
2765		shouldFail:    true,
2766		expectedError: ":UNKNOWN_CIPHER_RETURNED:",
2767	})
2768
2769	if *includeDHE {
2770		testCases = append(testCases, testCase{
2771			name: "WeakDH",
2772			config: Config{
2773				MaxVersion:   VersionTLS12,
2774				CipherSuites: []uint16{TLS_DHE_RSA_WITH_AES_128_GCM_SHA256},
2775				Bugs: ProtocolBugs{
2776					// This is a 1023-bit prime number, generated
2777					// with:
2778					// openssl gendh 1023 | openssl asn1parse -i
2779					DHGroupPrime: bigFromHex("518E9B7930CE61C6E445C8360584E5FC78D9137C0FFDC880B495D5338ADF7689951A6821C17A76B3ACB8E0156AEA607B7EC406EBEDBB84D8376EB8FE8F8BA1433488BEE0C3EDDFD3A32DBB9481980A7AF6C96BFCF490A094CFFB2B8192C1BB5510B77B658436E27C2D4D023FE3718222AB0CA1273995B51F6D625A4944D0DD4B"),
2780				},
2781			},
2782			shouldFail:    true,
2783			expectedError: ":BAD_DH_P_LENGTH:",
2784		})
2785
2786		testCases = append(testCases, testCase{
2787			name: "SillyDH",
2788			config: Config{
2789				MaxVersion:   VersionTLS12,
2790				CipherSuites: []uint16{TLS_DHE_RSA_WITH_AES_128_GCM_SHA256},
2791				Bugs: ProtocolBugs{
2792					// This is a 4097-bit prime number, generated
2793					// with:
2794					// openssl gendh 4097 | openssl asn1parse -i
2795					DHGroupPrime: bigFromHex("01D366FA64A47419B0CD4A45918E8D8C8430F674621956A9F52B0CA592BC104C6E38D60C58F2CA66792A2B7EBDC6F8FFE75AB7D6862C261F34E96A2AEEF53AB7C21365C2E8FB0582F71EB57B1C227C0E55AE859E9904A25EFECD7B435C4D4357BD840B03649D4A1F8037D89EA4E1967DBEEF1CC17A6111C48F12E9615FFF336D3F07064CB17C0B765A012C850B9E3AA7A6984B96D8C867DDC6D0F4AB52042572244796B7ECFF681CD3B3E2E29AAECA391A775BEE94E502FB15881B0F4AC60314EA947C0C82541C3D16FD8C0E09BB7F8F786582032859D9C13187CE6C0CB6F2D3EE6C3C9727C15F14B21D3CD2E02BDB9D119959B0E03DC9E5A91E2578762300B1517D2352FC1D0BB934A4C3E1B20CE9327DB102E89A6C64A8C3148EDFC5A94913933853442FA84451B31FD21E492F92DD5488E0D871AEBFE335A4B92431DEC69591548010E76A5B365D346786E9A2D3E589867D796AA5E25211201D757560D318A87DFB27F3E625BC373DB48BF94A63161C674C3D4265CB737418441B7650EABC209CF675A439BEB3E9D1AA1B79F67198A40CEFD1C89144F7D8BAF61D6AD36F466DA546B4174A0E0CAF5BD788C8243C7C2DDDCC3DB6FC89F12F17D19FBD9B0BC76FE92891CD6BA07BEA3B66EF12D0D85E788FD58675C1B0FBD16029DCC4D34E7A1A41471BDEDF78BF591A8B4E96D88BEC8EDC093E616292BFC096E69A916E8D624B"),
2796				},
2797			},
2798			shouldFail:    true,
2799			expectedError: ":DH_P_TOO_LONG:",
2800		})
2801
2802		// This test ensures that Diffie-Hellman public values are padded with
2803		// zeros so that they're the same length as the prime. This is to avoid
2804		// hitting a bug in yaSSL.
2805		testCases = append(testCases, testCase{
2806			testType: serverTest,
2807			name:     "DHPublicValuePadded",
2808			config: Config{
2809				MaxVersion:   VersionTLS12,
2810				CipherSuites: []uint16{TLS_DHE_RSA_WITH_AES_128_GCM_SHA256},
2811				Bugs: ProtocolBugs{
2812					RequireDHPublicValueLen: (1025 + 7) / 8,
2813				},
2814			},
2815			flags: []string{"-use-sparse-dh-prime"},
2816		})
2817	}
2818
2819	// The server must be tolerant to bogus ciphers.
2820	testCases = append(testCases, testCase{
2821		testType: serverTest,
2822		name:     "UnknownCipher",
2823		config: Config{
2824			MaxVersion:   VersionTLS12,
2825			CipherSuites: []uint16{bogusCipher, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
2826			Bugs: ProtocolBugs{
2827				AdvertiseAllConfiguredCiphers: true,
2828			},
2829		},
2830	})
2831
2832	// The server must be tolerant to bogus ciphers.
2833	testCases = append(testCases, testCase{
2834		testType: serverTest,
2835		name:     "UnknownCipher-TLS13",
2836		config: Config{
2837			MaxVersion:   VersionTLS13,
2838			CipherSuites: []uint16{bogusCipher, TLS_AES_128_GCM_SHA256},
2839			Bugs: ProtocolBugs{
2840				AdvertiseAllConfiguredCiphers: true,
2841			},
2842		},
2843	})
2844
2845	// Test empty ECDHE_PSK identity hints work as expected.
2846	testCases = append(testCases, testCase{
2847		name: "EmptyECDHEPSKHint",
2848		config: Config{
2849			MaxVersion:   VersionTLS12,
2850			CipherSuites: []uint16{TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA},
2851			PreSharedKey: []byte("secret"),
2852		},
2853		flags: []string{"-psk", "secret"},
2854	})
2855
2856	// Test empty PSK identity hints work as expected, even if an explicit
2857	// ServerKeyExchange is sent.
2858	testCases = append(testCases, testCase{
2859		name: "ExplicitEmptyPSKHint",
2860		config: Config{
2861			MaxVersion:   VersionTLS12,
2862			CipherSuites: []uint16{TLS_PSK_WITH_AES_128_CBC_SHA},
2863			PreSharedKey: []byte("secret"),
2864			Bugs: ProtocolBugs{
2865				AlwaysSendPreSharedKeyIdentityHint: true,
2866			},
2867		},
2868		flags: []string{"-psk", "secret"},
2869	})
2870}
2871
2872func addBadECDSASignatureTests() {
2873	for badR := BadValue(1); badR < NumBadValues; badR++ {
2874		for badS := BadValue(1); badS < NumBadValues; badS++ {
2875			testCases = append(testCases, testCase{
2876				name: fmt.Sprintf("BadECDSA-%d-%d", badR, badS),
2877				config: Config{
2878					MaxVersion:   VersionTLS12,
2879					CipherSuites: []uint16{TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
2880					Certificates: []Certificate{ecdsaP256Certificate},
2881					Bugs: ProtocolBugs{
2882						BadECDSAR: badR,
2883						BadECDSAS: badS,
2884					},
2885				},
2886				shouldFail:    true,
2887				expectedError: ":BAD_SIGNATURE:",
2888			})
2889			testCases = append(testCases, testCase{
2890				name: fmt.Sprintf("BadECDSA-%d-%d-TLS13", badR, badS),
2891				config: Config{
2892					MaxVersion:   VersionTLS13,
2893					Certificates: []Certificate{ecdsaP256Certificate},
2894					Bugs: ProtocolBugs{
2895						BadECDSAR: badR,
2896						BadECDSAS: badS,
2897					},
2898				},
2899				shouldFail:    true,
2900				expectedError: ":BAD_SIGNATURE:",
2901			})
2902		}
2903	}
2904}
2905
2906func addCBCPaddingTests() {
2907	testCases = append(testCases, testCase{
2908		name: "MaxCBCPadding",
2909		config: Config{
2910			MaxVersion:   VersionTLS12,
2911			CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA},
2912			Bugs: ProtocolBugs{
2913				MaxPadding: true,
2914			},
2915		},
2916		messageLen: 12, // 20 bytes of SHA-1 + 12 == 0 % block size
2917	})
2918	testCases = append(testCases, testCase{
2919		name: "BadCBCPadding",
2920		config: Config{
2921			MaxVersion:   VersionTLS12,
2922			CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA},
2923			Bugs: ProtocolBugs{
2924				PaddingFirstByteBad: true,
2925			},
2926		},
2927		shouldFail:    true,
2928		expectedError: ":DECRYPTION_FAILED_OR_BAD_RECORD_MAC:",
2929	})
2930	// OpenSSL previously had an issue where the first byte of padding in
2931	// 255 bytes of padding wasn't checked.
2932	testCases = append(testCases, testCase{
2933		name: "BadCBCPadding255",
2934		config: Config{
2935			MaxVersion:   VersionTLS12,
2936			CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA},
2937			Bugs: ProtocolBugs{
2938				MaxPadding:               true,
2939				PaddingFirstByteBadIf255: true,
2940			},
2941		},
2942		messageLen:    12, // 20 bytes of SHA-1 + 12 == 0 % block size
2943		shouldFail:    true,
2944		expectedError: ":DECRYPTION_FAILED_OR_BAD_RECORD_MAC:",
2945	})
2946}
2947
2948func addCBCSplittingTests() {
2949	testCases = append(testCases, testCase{
2950		name: "CBCRecordSplitting",
2951		config: Config{
2952			MaxVersion:   VersionTLS10,
2953			MinVersion:   VersionTLS10,
2954			CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA},
2955		},
2956		messageLen:    -1, // read until EOF
2957		resumeSession: true,
2958		flags: []string{
2959			"-async",
2960			"-write-different-record-sizes",
2961			"-cbc-record-splitting",
2962		},
2963	})
2964	testCases = append(testCases, testCase{
2965		name: "CBCRecordSplittingPartialWrite",
2966		config: Config{
2967			MaxVersion:   VersionTLS10,
2968			MinVersion:   VersionTLS10,
2969			CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA},
2970		},
2971		messageLen: -1, // read until EOF
2972		flags: []string{
2973			"-async",
2974			"-write-different-record-sizes",
2975			"-cbc-record-splitting",
2976			"-partial-write",
2977		},
2978	})
2979}
2980
2981func addClientAuthTests() {
2982	// Add a dummy cert pool to stress certificate authority parsing.
2983	certPool := x509.NewCertPool()
2984	for _, cert := range []Certificate{rsaCertificate, rsa1024Certificate} {
2985		cert, err := x509.ParseCertificate(cert.Certificate[0])
2986		if err != nil {
2987			panic(err)
2988		}
2989		certPool.AddCert(cert)
2990	}
2991	caNames := certPool.Subjects()
2992
2993	for _, ver := range tlsVersions {
2994		testCases = append(testCases, testCase{
2995			testType: clientTest,
2996			name:     ver.name + "-Client-ClientAuth-RSA",
2997			config: Config{
2998				MinVersion: ver.version,
2999				MaxVersion: ver.version,
3000				ClientAuth: RequireAnyClientCert,
3001				ClientCAs:  certPool,
3002			},
3003			flags: []string{
3004				"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
3005				"-key-file", path.Join(*resourceDir, rsaKeyFile),
3006			},
3007		})
3008		testCases = append(testCases, testCase{
3009			testType: serverTest,
3010			name:     ver.name + "-Server-ClientAuth-RSA",
3011			config: Config{
3012				MinVersion:   ver.version,
3013				MaxVersion:   ver.version,
3014				Certificates: []Certificate{rsaCertificate},
3015			},
3016			flags: []string{"-require-any-client-certificate"},
3017		})
3018		if ver.version != VersionSSL30 {
3019			testCases = append(testCases, testCase{
3020				testType: serverTest,
3021				name:     ver.name + "-Server-ClientAuth-ECDSA",
3022				config: Config{
3023					MinVersion:   ver.version,
3024					MaxVersion:   ver.version,
3025					Certificates: []Certificate{ecdsaP256Certificate},
3026				},
3027				flags: []string{"-require-any-client-certificate"},
3028			})
3029			testCases = append(testCases, testCase{
3030				testType: clientTest,
3031				name:     ver.name + "-Client-ClientAuth-ECDSA",
3032				config: Config{
3033					MinVersion: ver.version,
3034					MaxVersion: ver.version,
3035					ClientAuth: RequireAnyClientCert,
3036					ClientCAs:  certPool,
3037				},
3038				flags: []string{
3039					"-cert-file", path.Join(*resourceDir, ecdsaP256CertificateFile),
3040					"-key-file", path.Join(*resourceDir, ecdsaP256KeyFile),
3041				},
3042			})
3043		}
3044
3045		testCases = append(testCases, testCase{
3046			name: "NoClientCertificate-" + ver.name,
3047			config: Config{
3048				MinVersion: ver.version,
3049				MaxVersion: ver.version,
3050				ClientAuth: RequireAnyClientCert,
3051			},
3052			shouldFail:         true,
3053			expectedLocalError: "client didn't provide a certificate",
3054		})
3055
3056		testCases = append(testCases, testCase{
3057			// Even if not configured to expect a certificate, OpenSSL will
3058			// return X509_V_OK as the verify_result.
3059			testType: serverTest,
3060			name:     "NoClientCertificateRequested-Server-" + ver.name,
3061			config: Config{
3062				MinVersion: ver.version,
3063				MaxVersion: ver.version,
3064			},
3065			flags: []string{
3066				"-expect-verify-result",
3067			},
3068			resumeSession: true,
3069		})
3070
3071		testCases = append(testCases, testCase{
3072			// If a client certificate is not provided, OpenSSL will still
3073			// return X509_V_OK as the verify_result.
3074			testType: serverTest,
3075			name:     "NoClientCertificate-Server-" + ver.name,
3076			config: Config{
3077				MinVersion: ver.version,
3078				MaxVersion: ver.version,
3079			},
3080			flags: []string{
3081				"-expect-verify-result",
3082				"-verify-peer",
3083			},
3084			resumeSession: true,
3085		})
3086
3087		certificateRequired := "remote error: certificate required"
3088		if ver.version < VersionTLS13 {
3089			// Prior to TLS 1.3, the generic handshake_failure alert
3090			// was used.
3091			certificateRequired = "remote error: handshake failure"
3092		}
3093		testCases = append(testCases, testCase{
3094			testType: serverTest,
3095			name:     "RequireAnyClientCertificate-" + ver.name,
3096			config: Config{
3097				MinVersion: ver.version,
3098				MaxVersion: ver.version,
3099			},
3100			flags:              []string{"-require-any-client-certificate"},
3101			shouldFail:         true,
3102			expectedError:      ":PEER_DID_NOT_RETURN_A_CERTIFICATE:",
3103			expectedLocalError: certificateRequired,
3104		})
3105
3106		if ver.version != VersionSSL30 {
3107			testCases = append(testCases, testCase{
3108				testType: serverTest,
3109				name:     "SkipClientCertificate-" + ver.name,
3110				config: Config{
3111					MinVersion: ver.version,
3112					MaxVersion: ver.version,
3113					Bugs: ProtocolBugs{
3114						SkipClientCertificate: true,
3115					},
3116				},
3117				// Setting SSL_VERIFY_PEER allows anonymous clients.
3118				flags:         []string{"-verify-peer"},
3119				shouldFail:    true,
3120				expectedError: ":UNEXPECTED_MESSAGE:",
3121			})
3122		}
3123
3124		testCases = append(testCases, testCase{
3125			testType: serverTest,
3126			name:     ver.name + "-Server-CertReq-CA-List",
3127			config: Config{
3128				MinVersion:   ver.version,
3129				MaxVersion:   ver.version,
3130				Certificates: []Certificate{rsaCertificate},
3131				Bugs: ProtocolBugs{
3132					ExpectCertificateReqNames: caNames,
3133				},
3134			},
3135			flags: []string{
3136				"-require-any-client-certificate",
3137				"-use-client-ca-list", encodeDERValues(caNames),
3138			},
3139		})
3140
3141		testCases = append(testCases, testCase{
3142			testType: clientTest,
3143			name:     ver.name + "-Client-CertReq-CA-List",
3144			config: Config{
3145				MinVersion:   ver.version,
3146				MaxVersion:   ver.version,
3147				Certificates: []Certificate{rsaCertificate},
3148				ClientAuth:   RequireAnyClientCert,
3149				ClientCAs:    certPool,
3150			},
3151			flags: []string{
3152				"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
3153				"-key-file", path.Join(*resourceDir, rsaKeyFile),
3154				"-expect-client-ca-list", encodeDERValues(caNames),
3155			},
3156		})
3157	}
3158
3159	// Client auth is only legal in certificate-based ciphers.
3160	testCases = append(testCases, testCase{
3161		testType: clientTest,
3162		name:     "ClientAuth-PSK",
3163		config: Config{
3164			MaxVersion:   VersionTLS12,
3165			CipherSuites: []uint16{TLS_PSK_WITH_AES_128_CBC_SHA},
3166			PreSharedKey: []byte("secret"),
3167			ClientAuth:   RequireAnyClientCert,
3168		},
3169		flags: []string{
3170			"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
3171			"-key-file", path.Join(*resourceDir, rsaKeyFile),
3172			"-psk", "secret",
3173		},
3174		shouldFail:    true,
3175		expectedError: ":UNEXPECTED_MESSAGE:",
3176	})
3177	testCases = append(testCases, testCase{
3178		testType: clientTest,
3179		name:     "ClientAuth-ECDHE_PSK",
3180		config: Config{
3181			MaxVersion:   VersionTLS12,
3182			CipherSuites: []uint16{TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA},
3183			PreSharedKey: []byte("secret"),
3184			ClientAuth:   RequireAnyClientCert,
3185		},
3186		flags: []string{
3187			"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
3188			"-key-file", path.Join(*resourceDir, rsaKeyFile),
3189			"-psk", "secret",
3190		},
3191		shouldFail:    true,
3192		expectedError: ":UNEXPECTED_MESSAGE:",
3193	})
3194
3195	// Regression test for a bug where the client CA list, if explicitly
3196	// set to NULL, was mis-encoded.
3197	testCases = append(testCases, testCase{
3198		testType: serverTest,
3199		name:     "Null-Client-CA-List",
3200		config: Config{
3201			MaxVersion:   VersionTLS12,
3202			Certificates: []Certificate{rsaCertificate},
3203			Bugs: ProtocolBugs{
3204				ExpectCertificateReqNames: [][]byte{},
3205			},
3206		},
3207		flags: []string{
3208			"-require-any-client-certificate",
3209			"-use-client-ca-list", "<NULL>",
3210		},
3211	})
3212}
3213
3214func addExtendedMasterSecretTests() {
3215	const expectEMSFlag = "-expect-extended-master-secret"
3216
3217	for _, with := range []bool{false, true} {
3218		prefix := "No"
3219		if with {
3220			prefix = ""
3221		}
3222
3223		for _, isClient := range []bool{false, true} {
3224			suffix := "-Server"
3225			testType := serverTest
3226			if isClient {
3227				suffix = "-Client"
3228				testType = clientTest
3229			}
3230
3231			for _, ver := range tlsVersions {
3232				// In TLS 1.3, the extension is irrelevant and
3233				// always reports as enabled.
3234				var flags []string
3235				if with || ver.version >= VersionTLS13 {
3236					flags = []string{expectEMSFlag}
3237				}
3238
3239				test := testCase{
3240					testType: testType,
3241					name:     prefix + "ExtendedMasterSecret-" + ver.name + suffix,
3242					config: Config{
3243						MinVersion: ver.version,
3244						MaxVersion: ver.version,
3245						Bugs: ProtocolBugs{
3246							NoExtendedMasterSecret:      !with,
3247							RequireExtendedMasterSecret: with,
3248						},
3249					},
3250					flags:      flags,
3251					shouldFail: ver.version == VersionSSL30 && with,
3252				}
3253				if test.shouldFail {
3254					test.expectedLocalError = "extended master secret required but not supported by peer"
3255				}
3256				testCases = append(testCases, test)
3257			}
3258		}
3259	}
3260
3261	for _, isClient := range []bool{false, true} {
3262		for _, supportedInFirstConnection := range []bool{false, true} {
3263			for _, supportedInResumeConnection := range []bool{false, true} {
3264				boolToWord := func(b bool) string {
3265					if b {
3266						return "Yes"
3267					}
3268					return "No"
3269				}
3270				suffix := boolToWord(supportedInFirstConnection) + "To" + boolToWord(supportedInResumeConnection) + "-"
3271				if isClient {
3272					suffix += "Client"
3273				} else {
3274					suffix += "Server"
3275				}
3276
3277				supportedConfig := Config{
3278					MaxVersion: VersionTLS12,
3279					Bugs: ProtocolBugs{
3280						RequireExtendedMasterSecret: true,
3281					},
3282				}
3283
3284				noSupportConfig := Config{
3285					MaxVersion: VersionTLS12,
3286					Bugs: ProtocolBugs{
3287						NoExtendedMasterSecret: true,
3288					},
3289				}
3290
3291				test := testCase{
3292					name:          "ExtendedMasterSecret-" + suffix,
3293					resumeSession: true,
3294				}
3295
3296				if !isClient {
3297					test.testType = serverTest
3298				}
3299
3300				if supportedInFirstConnection {
3301					test.config = supportedConfig
3302				} else {
3303					test.config = noSupportConfig
3304				}
3305
3306				if supportedInResumeConnection {
3307					test.resumeConfig = &supportedConfig
3308				} else {
3309					test.resumeConfig = &noSupportConfig
3310				}
3311
3312				switch suffix {
3313				case "YesToYes-Client", "YesToYes-Server":
3314					// When a session is resumed, it should
3315					// still be aware that its master
3316					// secret was generated via EMS and
3317					// thus it's safe to use tls-unique.
3318					test.flags = []string{expectEMSFlag}
3319				case "NoToYes-Server":
3320					// If an original connection did not
3321					// contain EMS, but a resumption
3322					// handshake does, then a server should
3323					// not resume the session.
3324					test.expectResumeRejected = true
3325				case "YesToNo-Server":
3326					// Resuming an EMS session without the
3327					// EMS extension should cause the
3328					// server to abort the connection.
3329					test.shouldFail = true
3330					test.expectedError = ":RESUMED_EMS_SESSION_WITHOUT_EMS_EXTENSION:"
3331				case "NoToYes-Client":
3332					// A client should abort a connection
3333					// where the server resumed a non-EMS
3334					// session but echoed the EMS
3335					// extension.
3336					test.shouldFail = true
3337					test.expectedError = ":RESUMED_NON_EMS_SESSION_WITH_EMS_EXTENSION:"
3338				case "YesToNo-Client":
3339					// A client should abort a connection
3340					// where the server didn't echo EMS
3341					// when the session used it.
3342					test.shouldFail = true
3343					test.expectedError = ":RESUMED_EMS_SESSION_WITHOUT_EMS_EXTENSION:"
3344				}
3345
3346				testCases = append(testCases, test)
3347			}
3348		}
3349	}
3350
3351	// Switching EMS on renegotiation is forbidden.
3352	testCases = append(testCases, testCase{
3353		name: "ExtendedMasterSecret-Renego-NoEMS",
3354		config: Config{
3355			MaxVersion: VersionTLS12,
3356			Bugs: ProtocolBugs{
3357				NoExtendedMasterSecret:                true,
3358				NoExtendedMasterSecretOnRenegotiation: true,
3359			},
3360		},
3361		renegotiate: 1,
3362		flags: []string{
3363			"-renegotiate-freely",
3364			"-expect-total-renegotiations", "1",
3365		},
3366	})
3367
3368	testCases = append(testCases, testCase{
3369		name: "ExtendedMasterSecret-Renego-Upgrade",
3370		config: Config{
3371			MaxVersion: VersionTLS12,
3372			Bugs: ProtocolBugs{
3373				NoExtendedMasterSecret: true,
3374			},
3375		},
3376		renegotiate: 1,
3377		flags: []string{
3378			"-renegotiate-freely",
3379			"-expect-total-renegotiations", "1",
3380		},
3381		shouldFail:    true,
3382		expectedError: ":RENEGOTIATION_EMS_MISMATCH:",
3383	})
3384
3385	testCases = append(testCases, testCase{
3386		name: "ExtendedMasterSecret-Renego-Downgrade",
3387		config: Config{
3388			MaxVersion: VersionTLS12,
3389			Bugs: ProtocolBugs{
3390				NoExtendedMasterSecretOnRenegotiation: true,
3391			},
3392		},
3393		renegotiate: 1,
3394		flags: []string{
3395			"-renegotiate-freely",
3396			"-expect-total-renegotiations", "1",
3397		},
3398		shouldFail:    true,
3399		expectedError: ":RENEGOTIATION_EMS_MISMATCH:",
3400	})
3401}
3402
3403type stateMachineTestConfig struct {
3404	protocol            protocol
3405	async               bool
3406	splitHandshake      bool
3407	packHandshakeFlight bool
3408	implicitHandshake   bool
3409}
3410
3411// Adds tests that try to cover the range of the handshake state machine, under
3412// various conditions. Some of these are redundant with other tests, but they
3413// only cover the synchronous case.
3414func addAllStateMachineCoverageTests() {
3415	for _, async := range []bool{false, true} {
3416		for _, protocol := range []protocol{tls, dtls} {
3417			addStateMachineCoverageTests(stateMachineTestConfig{
3418				protocol: protocol,
3419				async:    async,
3420			})
3421			addStateMachineCoverageTests(stateMachineTestConfig{
3422				protocol:          protocol,
3423				async:             async,
3424				implicitHandshake: true,
3425			})
3426			addStateMachineCoverageTests(stateMachineTestConfig{
3427				protocol:       protocol,
3428				async:          async,
3429				splitHandshake: true,
3430			})
3431			if protocol == tls {
3432				addStateMachineCoverageTests(stateMachineTestConfig{
3433					protocol:            protocol,
3434					async:               async,
3435					packHandshakeFlight: true,
3436				})
3437			}
3438		}
3439	}
3440}
3441
3442func addStateMachineCoverageTests(config stateMachineTestConfig) {
3443	var tests []testCase
3444
3445	// Basic handshake, with resumption. Client and server,
3446	// session ID and session ticket.
3447	tests = append(tests, testCase{
3448		name: "Basic-Client",
3449		config: Config{
3450			MaxVersion: VersionTLS12,
3451		},
3452		resumeSession: true,
3453		// Ensure session tickets are used, not session IDs.
3454		noSessionCache: true,
3455	})
3456	tests = append(tests, testCase{
3457		name: "Basic-Client-RenewTicket",
3458		config: Config{
3459			MaxVersion: VersionTLS12,
3460			Bugs: ProtocolBugs{
3461				RenewTicketOnResume: true,
3462			},
3463		},
3464		flags:                []string{"-expect-ticket-renewal"},
3465		resumeSession:        true,
3466		resumeRenewedSession: true,
3467	})
3468	tests = append(tests, testCase{
3469		name: "Basic-Client-NoTicket",
3470		config: Config{
3471			MaxVersion:             VersionTLS12,
3472			SessionTicketsDisabled: true,
3473		},
3474		resumeSession: true,
3475	})
3476	tests = append(tests, testCase{
3477		testType: serverTest,
3478		name:     "Basic-Server",
3479		config: Config{
3480			MaxVersion: VersionTLS12,
3481			Bugs: ProtocolBugs{
3482				RequireSessionTickets: true,
3483			},
3484		},
3485		resumeSession: true,
3486		flags:         []string{"-expect-no-session-id"},
3487	})
3488	tests = append(tests, testCase{
3489		testType: serverTest,
3490		name:     "Basic-Server-NoTickets",
3491		config: Config{
3492			MaxVersion:             VersionTLS12,
3493			SessionTicketsDisabled: true,
3494		},
3495		resumeSession: true,
3496		flags:         []string{"-expect-session-id"},
3497	})
3498	tests = append(tests, testCase{
3499		testType: serverTest,
3500		name:     "Basic-Server-EarlyCallback",
3501		config: Config{
3502			MaxVersion: VersionTLS12,
3503		},
3504		flags:         []string{"-use-early-callback"},
3505		resumeSession: true,
3506	})
3507
3508	// TLS 1.3 basic handshake shapes.
3509	if config.protocol == tls {
3510		tests = append(tests, testCase{
3511			name: "TLS13-1RTT-Client",
3512			config: Config{
3513				MaxVersion: VersionTLS13,
3514				MinVersion: VersionTLS13,
3515			},
3516			resumeSession:        true,
3517			resumeRenewedSession: true,
3518		})
3519
3520		tests = append(tests, testCase{
3521			testType: serverTest,
3522			name:     "TLS13-1RTT-Server",
3523			config: Config{
3524				MaxVersion: VersionTLS13,
3525				MinVersion: VersionTLS13,
3526			},
3527			resumeSession:        true,
3528			resumeRenewedSession: true,
3529			// TLS 1.3 uses tickets, so the session should not be
3530			// cached statefully.
3531			flags: []string{"-expect-no-session-id"},
3532		})
3533
3534		tests = append(tests, testCase{
3535			name: "TLS13-HelloRetryRequest-Client",
3536			config: Config{
3537				MaxVersion: VersionTLS13,
3538				MinVersion: VersionTLS13,
3539				// P-384 requires a HelloRetryRequest against BoringSSL's default
3540				// configuration. Assert this with ExpectMissingKeyShare.
3541				CurvePreferences: []CurveID{CurveP384},
3542				Bugs: ProtocolBugs{
3543					ExpectMissingKeyShare: true,
3544				},
3545			},
3546			// Cover HelloRetryRequest during an ECDHE-PSK resumption.
3547			resumeSession: true,
3548		})
3549
3550		tests = append(tests, testCase{
3551			testType: serverTest,
3552			name:     "TLS13-HelloRetryRequest-Server",
3553			config: Config{
3554				MaxVersion: VersionTLS13,
3555				MinVersion: VersionTLS13,
3556				// Require a HelloRetryRequest for every curve.
3557				DefaultCurves: []CurveID{},
3558			},
3559			// Cover HelloRetryRequest during an ECDHE-PSK resumption.
3560			resumeSession: true,
3561		})
3562
3563		// TODO(svaldez): Send data on early data once implemented.
3564		tests = append(tests, testCase{
3565			testType: clientTest,
3566			name:     "TLS13-EarlyData-Client",
3567			config: Config{
3568				MaxVersion:       VersionTLS13,
3569				MinVersion:       VersionTLS13,
3570				MaxEarlyDataSize: 16384,
3571			},
3572			resumeSession: true,
3573			flags: []string{
3574				"-enable-early-data",
3575				"-expect-early-data-info",
3576				"-expect-accept-early-data",
3577			},
3578		})
3579
3580		tests = append(tests, testCase{
3581			testType: serverTest,
3582			name:     "TLS13-EarlyData-Server",
3583			config: Config{
3584				MaxVersion: VersionTLS13,
3585				MinVersion: VersionTLS13,
3586				Bugs: ProtocolBugs{
3587					SendEarlyData:           [][]byte{{1, 2, 3, 4}},
3588					ExpectEarlyDataAccepted: true,
3589					ExpectHalfRTTData:       [][]byte{{254, 253, 252, 251}},
3590				},
3591			},
3592			messageCount:  2,
3593			resumeSession: true,
3594			flags: []string{
3595				"-enable-early-data",
3596				"-expect-accept-early-data",
3597			},
3598		})
3599	}
3600
3601	// TLS client auth.
3602	tests = append(tests, testCase{
3603		testType: clientTest,
3604		name:     "ClientAuth-NoCertificate-Client",
3605		config: Config{
3606			MaxVersion: VersionTLS12,
3607			ClientAuth: RequestClientCert,
3608		},
3609	})
3610	tests = append(tests, testCase{
3611		testType: serverTest,
3612		name:     "ClientAuth-NoCertificate-Server",
3613		config: Config{
3614			MaxVersion: VersionTLS12,
3615		},
3616		// Setting SSL_VERIFY_PEER allows anonymous clients.
3617		flags: []string{"-verify-peer"},
3618	})
3619	if config.protocol == tls {
3620		tests = append(tests, testCase{
3621			testType: clientTest,
3622			name:     "ClientAuth-NoCertificate-Client-SSL3",
3623			config: Config{
3624				MaxVersion: VersionSSL30,
3625				ClientAuth: RequestClientCert,
3626			},
3627		})
3628		tests = append(tests, testCase{
3629			testType: serverTest,
3630			name:     "ClientAuth-NoCertificate-Server-SSL3",
3631			config: Config{
3632				MaxVersion: VersionSSL30,
3633			},
3634			// Setting SSL_VERIFY_PEER allows anonymous clients.
3635			flags: []string{"-verify-peer"},
3636		})
3637		tests = append(tests, testCase{
3638			testType: clientTest,
3639			name:     "ClientAuth-NoCertificate-Client-TLS13",
3640			config: Config{
3641				MaxVersion: VersionTLS13,
3642				ClientAuth: RequestClientCert,
3643			},
3644		})
3645		tests = append(tests, testCase{
3646			testType: serverTest,
3647			name:     "ClientAuth-NoCertificate-Server-TLS13",
3648			config: Config{
3649				MaxVersion: VersionTLS13,
3650			},
3651			// Setting SSL_VERIFY_PEER allows anonymous clients.
3652			flags: []string{"-verify-peer"},
3653		})
3654	}
3655	tests = append(tests, testCase{
3656		testType: clientTest,
3657		name:     "ClientAuth-RSA-Client",
3658		config: Config{
3659			MaxVersion: VersionTLS12,
3660			ClientAuth: RequireAnyClientCert,
3661		},
3662		flags: []string{
3663			"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
3664			"-key-file", path.Join(*resourceDir, rsaKeyFile),
3665		},
3666	})
3667	tests = append(tests, testCase{
3668		testType: clientTest,
3669		name:     "ClientAuth-RSA-Client-TLS13",
3670		config: Config{
3671			MaxVersion: VersionTLS13,
3672			ClientAuth: RequireAnyClientCert,
3673		},
3674		flags: []string{
3675			"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
3676			"-key-file", path.Join(*resourceDir, rsaKeyFile),
3677		},
3678	})
3679	tests = append(tests, testCase{
3680		testType: clientTest,
3681		name:     "ClientAuth-ECDSA-Client",
3682		config: Config{
3683			MaxVersion: VersionTLS12,
3684			ClientAuth: RequireAnyClientCert,
3685		},
3686		flags: []string{
3687			"-cert-file", path.Join(*resourceDir, ecdsaP256CertificateFile),
3688			"-key-file", path.Join(*resourceDir, ecdsaP256KeyFile),
3689		},
3690	})
3691	tests = append(tests, testCase{
3692		testType: clientTest,
3693		name:     "ClientAuth-ECDSA-Client-TLS13",
3694		config: Config{
3695			MaxVersion: VersionTLS13,
3696			ClientAuth: RequireAnyClientCert,
3697		},
3698		flags: []string{
3699			"-cert-file", path.Join(*resourceDir, ecdsaP256CertificateFile),
3700			"-key-file", path.Join(*resourceDir, ecdsaP256KeyFile),
3701		},
3702	})
3703	tests = append(tests, testCase{
3704		testType: clientTest,
3705		name:     "ClientAuth-NoCertificate-OldCallback",
3706		config: Config{
3707			MaxVersion: VersionTLS12,
3708			ClientAuth: RequestClientCert,
3709		},
3710		flags: []string{"-use-old-client-cert-callback"},
3711	})
3712	tests = append(tests, testCase{
3713		testType: clientTest,
3714		name:     "ClientAuth-NoCertificate-OldCallback-TLS13",
3715		config: Config{
3716			MaxVersion: VersionTLS13,
3717			ClientAuth: RequestClientCert,
3718		},
3719		flags: []string{"-use-old-client-cert-callback"},
3720	})
3721	tests = append(tests, testCase{
3722		testType: clientTest,
3723		name:     "ClientAuth-OldCallback",
3724		config: Config{
3725			MaxVersion: VersionTLS12,
3726			ClientAuth: RequireAnyClientCert,
3727		},
3728		flags: []string{
3729			"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
3730			"-key-file", path.Join(*resourceDir, rsaKeyFile),
3731			"-use-old-client-cert-callback",
3732		},
3733	})
3734	tests = append(tests, testCase{
3735		testType: clientTest,
3736		name:     "ClientAuth-OldCallback-TLS13",
3737		config: Config{
3738			MaxVersion: VersionTLS13,
3739			ClientAuth: RequireAnyClientCert,
3740		},
3741		flags: []string{
3742			"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
3743			"-key-file", path.Join(*resourceDir, rsaKeyFile),
3744			"-use-old-client-cert-callback",
3745		},
3746	})
3747	tests = append(tests, testCase{
3748		testType: serverTest,
3749		name:     "ClientAuth-Server",
3750		config: Config{
3751			MaxVersion:   VersionTLS12,
3752			Certificates: []Certificate{rsaCertificate},
3753		},
3754		flags: []string{"-require-any-client-certificate"},
3755	})
3756	tests = append(tests, testCase{
3757		testType: serverTest,
3758		name:     "ClientAuth-Server-TLS13",
3759		config: Config{
3760			MaxVersion:   VersionTLS13,
3761			Certificates: []Certificate{rsaCertificate},
3762		},
3763		flags: []string{"-require-any-client-certificate"},
3764	})
3765
3766	// Test each key exchange on the server side for async keys.
3767	tests = append(tests, testCase{
3768		testType: serverTest,
3769		name:     "Basic-Server-RSA",
3770		config: Config{
3771			MaxVersion:   VersionTLS12,
3772			CipherSuites: []uint16{TLS_RSA_WITH_AES_128_GCM_SHA256},
3773		},
3774		flags: []string{
3775			"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
3776			"-key-file", path.Join(*resourceDir, rsaKeyFile),
3777		},
3778	})
3779	tests = append(tests, testCase{
3780		testType: serverTest,
3781		name:     "Basic-Server-ECDHE-RSA",
3782		config: Config{
3783			MaxVersion:   VersionTLS12,
3784			CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
3785		},
3786		flags: []string{
3787			"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
3788			"-key-file", path.Join(*resourceDir, rsaKeyFile),
3789		},
3790	})
3791	tests = append(tests, testCase{
3792		testType: serverTest,
3793		name:     "Basic-Server-ECDHE-ECDSA",
3794		config: Config{
3795			MaxVersion:   VersionTLS12,
3796			CipherSuites: []uint16{TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
3797		},
3798		flags: []string{
3799			"-cert-file", path.Join(*resourceDir, ecdsaP256CertificateFile),
3800			"-key-file", path.Join(*resourceDir, ecdsaP256KeyFile),
3801		},
3802	})
3803
3804	// No session ticket support; server doesn't send NewSessionTicket.
3805	tests = append(tests, testCase{
3806		name: "SessionTicketsDisabled-Client",
3807		config: Config{
3808			MaxVersion:             VersionTLS12,
3809			SessionTicketsDisabled: true,
3810		},
3811	})
3812	tests = append(tests, testCase{
3813		testType: serverTest,
3814		name:     "SessionTicketsDisabled-Server",
3815		config: Config{
3816			MaxVersion:             VersionTLS12,
3817			SessionTicketsDisabled: true,
3818		},
3819	})
3820
3821	// Skip ServerKeyExchange in PSK key exchange if there's no
3822	// identity hint.
3823	tests = append(tests, testCase{
3824		name: "EmptyPSKHint-Client",
3825		config: Config{
3826			MaxVersion:   VersionTLS12,
3827			CipherSuites: []uint16{TLS_PSK_WITH_AES_128_CBC_SHA},
3828			PreSharedKey: []byte("secret"),
3829		},
3830		flags: []string{"-psk", "secret"},
3831	})
3832	tests = append(tests, testCase{
3833		testType: serverTest,
3834		name:     "EmptyPSKHint-Server",
3835		config: Config{
3836			MaxVersion:   VersionTLS12,
3837			CipherSuites: []uint16{TLS_PSK_WITH_AES_128_CBC_SHA},
3838			PreSharedKey: []byte("secret"),
3839		},
3840		flags: []string{"-psk", "secret"},
3841	})
3842
3843	// OCSP stapling tests.
3844	tests = append(tests, testCase{
3845		testType: clientTest,
3846		name:     "OCSPStapling-Client",
3847		config: Config{
3848			MaxVersion: VersionTLS12,
3849		},
3850		flags: []string{
3851			"-enable-ocsp-stapling",
3852			"-expect-ocsp-response",
3853			base64.StdEncoding.EncodeToString(testOCSPResponse),
3854			"-verify-peer",
3855		},
3856		resumeSession: true,
3857	})
3858	tests = append(tests, testCase{
3859		testType: serverTest,
3860		name:     "OCSPStapling-Server",
3861		config: Config{
3862			MaxVersion: VersionTLS12,
3863		},
3864		expectedOCSPResponse: testOCSPResponse,
3865		flags: []string{
3866			"-ocsp-response",
3867			base64.StdEncoding.EncodeToString(testOCSPResponse),
3868		},
3869		resumeSession: true,
3870	})
3871	tests = append(tests, testCase{
3872		testType: clientTest,
3873		name:     "OCSPStapling-Client-TLS13",
3874		config: Config{
3875			MaxVersion: VersionTLS13,
3876		},
3877		flags: []string{
3878			"-enable-ocsp-stapling",
3879			"-expect-ocsp-response",
3880			base64.StdEncoding.EncodeToString(testOCSPResponse),
3881			"-verify-peer",
3882		},
3883		resumeSession: true,
3884	})
3885	tests = append(tests, testCase{
3886		testType: serverTest,
3887		name:     "OCSPStapling-Server-TLS13",
3888		config: Config{
3889			MaxVersion: VersionTLS13,
3890		},
3891		expectedOCSPResponse: testOCSPResponse,
3892		flags: []string{
3893			"-ocsp-response",
3894			base64.StdEncoding.EncodeToString(testOCSPResponse),
3895		},
3896		resumeSession: true,
3897	})
3898
3899	// Certificate verification tests.
3900	for _, vers := range tlsVersions {
3901		if config.protocol == dtls && !vers.hasDTLS {
3902			continue
3903		}
3904		for _, testType := range []testType{clientTest, serverTest} {
3905			suffix := "-Client"
3906			if testType == serverTest {
3907				suffix = "-Server"
3908			}
3909			suffix += "-" + vers.name
3910
3911			flag := "-verify-peer"
3912			if testType == serverTest {
3913				flag = "-require-any-client-certificate"
3914			}
3915
3916			tests = append(tests, testCase{
3917				testType: testType,
3918				name:     "CertificateVerificationSucceed" + suffix,
3919				config: Config{
3920					MaxVersion:   vers.version,
3921					Certificates: []Certificate{rsaCertificate},
3922				},
3923				flags: []string{
3924					flag,
3925					"-expect-verify-result",
3926				},
3927				resumeSession: true,
3928			})
3929			tests = append(tests, testCase{
3930				testType: testType,
3931				name:     "CertificateVerificationFail" + suffix,
3932				config: Config{
3933					MaxVersion:   vers.version,
3934					Certificates: []Certificate{rsaCertificate},
3935				},
3936				flags: []string{
3937					flag,
3938					"-verify-fail",
3939				},
3940				shouldFail:    true,
3941				expectedError: ":CERTIFICATE_VERIFY_FAILED:",
3942			})
3943		}
3944
3945		// By default, the client is in a soft fail mode where the peer
3946		// certificate is verified but failures are non-fatal.
3947		tests = append(tests, testCase{
3948			testType: clientTest,
3949			name:     "CertificateVerificationSoftFail-" + vers.name,
3950			config: Config{
3951				MaxVersion:   vers.version,
3952				Certificates: []Certificate{rsaCertificate},
3953			},
3954			flags: []string{
3955				"-verify-fail",
3956				"-expect-verify-result",
3957			},
3958			resumeSession: true,
3959		})
3960	}
3961
3962	tests = append(tests, testCase{
3963		name:               "ShimSendAlert",
3964		flags:              []string{"-send-alert"},
3965		shimWritesFirst:    true,
3966		shouldFail:         true,
3967		expectedLocalError: "remote error: decompression failure",
3968	})
3969
3970	if config.protocol == tls {
3971		tests = append(tests, testCase{
3972			name: "Renegotiate-Client",
3973			config: Config{
3974				MaxVersion: VersionTLS12,
3975			},
3976			renegotiate: 1,
3977			flags: []string{
3978				"-renegotiate-freely",
3979				"-expect-total-renegotiations", "1",
3980			},
3981		})
3982
3983		tests = append(tests, testCase{
3984			name: "SendHalfHelloRequest",
3985			config: Config{
3986				MaxVersion: VersionTLS12,
3987				Bugs: ProtocolBugs{
3988					PackHelloRequestWithFinished: config.packHandshakeFlight,
3989				},
3990			},
3991			sendHalfHelloRequest: true,
3992			flags:                []string{"-renegotiate-ignore"},
3993			shouldFail:           true,
3994			expectedError:        ":UNEXPECTED_RECORD:",
3995		})
3996
3997		// NPN on client and server; results in post-handshake message.
3998		tests = append(tests, testCase{
3999			name: "NPN-Client",
4000			config: Config{
4001				MaxVersion: VersionTLS12,
4002				NextProtos: []string{"foo"},
4003			},
4004			flags:                 []string{"-select-next-proto", "foo"},
4005			resumeSession:         true,
4006			expectedNextProto:     "foo",
4007			expectedNextProtoType: npn,
4008		})
4009		tests = append(tests, testCase{
4010			testType: serverTest,
4011			name:     "NPN-Server",
4012			config: Config{
4013				MaxVersion: VersionTLS12,
4014				NextProtos: []string{"bar"},
4015			},
4016			flags: []string{
4017				"-advertise-npn", "\x03foo\x03bar\x03baz",
4018				"-expect-next-proto", "bar",
4019			},
4020			resumeSession:         true,
4021			expectedNextProto:     "bar",
4022			expectedNextProtoType: npn,
4023		})
4024
4025		// TODO(davidben): Add tests for when False Start doesn't trigger.
4026
4027		// Client does False Start and negotiates NPN.
4028		tests = append(tests, testCase{
4029			name: "FalseStart",
4030			config: Config{
4031				MaxVersion:   VersionTLS12,
4032				CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
4033				NextProtos:   []string{"foo"},
4034				Bugs: ProtocolBugs{
4035					ExpectFalseStart: true,
4036				},
4037			},
4038			flags: []string{
4039				"-false-start",
4040				"-select-next-proto", "foo",
4041			},
4042			shimWritesFirst: true,
4043			resumeSession:   true,
4044		})
4045
4046		// Client does False Start and negotiates ALPN.
4047		tests = append(tests, testCase{
4048			name: "FalseStart-ALPN",
4049			config: Config{
4050				MaxVersion:   VersionTLS12,
4051				CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
4052				NextProtos:   []string{"foo"},
4053				Bugs: ProtocolBugs{
4054					ExpectFalseStart: true,
4055				},
4056			},
4057			flags: []string{
4058				"-false-start",
4059				"-advertise-alpn", "\x03foo",
4060			},
4061			shimWritesFirst: true,
4062			resumeSession:   true,
4063		})
4064
4065		// False Start without session tickets.
4066		tests = append(tests, testCase{
4067			name: "FalseStart-SessionTicketsDisabled",
4068			config: Config{
4069				MaxVersion:             VersionTLS12,
4070				CipherSuites:           []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
4071				NextProtos:             []string{"foo"},
4072				SessionTicketsDisabled: true,
4073				Bugs: ProtocolBugs{
4074					ExpectFalseStart: true,
4075				},
4076			},
4077			flags: []string{
4078				"-false-start",
4079				"-select-next-proto", "foo",
4080			},
4081			shimWritesFirst: true,
4082		})
4083
4084		// Server parses a V2ClientHello.
4085		tests = append(tests, testCase{
4086			testType: serverTest,
4087			name:     "SendV2ClientHello",
4088			config: Config{
4089				// Choose a cipher suite that does not involve
4090				// elliptic curves, so no extensions are
4091				// involved.
4092				MaxVersion:   VersionTLS12,
4093				CipherSuites: []uint16{TLS_RSA_WITH_3DES_EDE_CBC_SHA},
4094				Bugs: ProtocolBugs{
4095					SendV2ClientHello: true,
4096				},
4097			},
4098		})
4099
4100		// Test Channel ID
4101		for _, ver := range tlsVersions {
4102			if ver.version < VersionTLS10 {
4103				continue
4104			}
4105			// Client sends a Channel ID.
4106			tests = append(tests, testCase{
4107				name: "ChannelID-Client-" + ver.name,
4108				config: Config{
4109					MaxVersion:       ver.version,
4110					RequestChannelID: true,
4111				},
4112				flags:           []string{"-send-channel-id", path.Join(*resourceDir, channelIDKeyFile)},
4113				resumeSession:   true,
4114				expectChannelID: true,
4115			})
4116
4117			// Server accepts a Channel ID.
4118			tests = append(tests, testCase{
4119				testType: serverTest,
4120				name:     "ChannelID-Server-" + ver.name,
4121				config: Config{
4122					MaxVersion: ver.version,
4123					ChannelID:  channelIDKey,
4124				},
4125				flags: []string{
4126					"-expect-channel-id",
4127					base64.StdEncoding.EncodeToString(channelIDBytes),
4128				},
4129				resumeSession:   true,
4130				expectChannelID: true,
4131			})
4132
4133			tests = append(tests, testCase{
4134				testType: serverTest,
4135				name:     "InvalidChannelIDSignature-" + ver.name,
4136				config: Config{
4137					MaxVersion: ver.version,
4138					ChannelID:  channelIDKey,
4139					Bugs: ProtocolBugs{
4140						InvalidChannelIDSignature: true,
4141					},
4142				},
4143				flags:         []string{"-enable-channel-id"},
4144				shouldFail:    true,
4145				expectedError: ":CHANNEL_ID_SIGNATURE_INVALID:",
4146			})
4147		}
4148
4149		// Channel ID and NPN at the same time, to ensure their relative
4150		// ordering is correct.
4151		tests = append(tests, testCase{
4152			name: "ChannelID-NPN-Client",
4153			config: Config{
4154				MaxVersion:       VersionTLS12,
4155				RequestChannelID: true,
4156				NextProtos:       []string{"foo"},
4157			},
4158			flags: []string{
4159				"-send-channel-id", path.Join(*resourceDir, channelIDKeyFile),
4160				"-select-next-proto", "foo",
4161			},
4162			resumeSession:         true,
4163			expectChannelID:       true,
4164			expectedNextProto:     "foo",
4165			expectedNextProtoType: npn,
4166		})
4167		tests = append(tests, testCase{
4168			testType: serverTest,
4169			name:     "ChannelID-NPN-Server",
4170			config: Config{
4171				MaxVersion: VersionTLS12,
4172				ChannelID:  channelIDKey,
4173				NextProtos: []string{"bar"},
4174			},
4175			flags: []string{
4176				"-expect-channel-id",
4177				base64.StdEncoding.EncodeToString(channelIDBytes),
4178				"-advertise-npn", "\x03foo\x03bar\x03baz",
4179				"-expect-next-proto", "bar",
4180			},
4181			resumeSession:         true,
4182			expectChannelID:       true,
4183			expectedNextProto:     "bar",
4184			expectedNextProtoType: npn,
4185		})
4186
4187		// Bidirectional shutdown with the runner initiating.
4188		tests = append(tests, testCase{
4189			name: "Shutdown-Runner",
4190			config: Config{
4191				Bugs: ProtocolBugs{
4192					ExpectCloseNotify: true,
4193				},
4194			},
4195			flags: []string{"-check-close-notify"},
4196		})
4197
4198		if !config.implicitHandshake {
4199			// Bidirectional shutdown with the shim initiating. The runner,
4200			// in the meantime, sends garbage before the close_notify which
4201			// the shim must ignore. This test is disabled under implicit
4202			// handshake tests because the shim never reads or writes.
4203			tests = append(tests, testCase{
4204				name: "Shutdown-Shim",
4205				config: Config{
4206					MaxVersion: VersionTLS12,
4207					Bugs: ProtocolBugs{
4208						ExpectCloseNotify: true,
4209					},
4210				},
4211				shimShutsDown:     true,
4212				sendEmptyRecords:  1,
4213				sendWarningAlerts: 1,
4214				flags:             []string{"-check-close-notify"},
4215			})
4216		}
4217	} else {
4218		// TODO(davidben): DTLS 1.3 will want a similar thing for
4219		// HelloRetryRequest.
4220		tests = append(tests, testCase{
4221			name: "SkipHelloVerifyRequest",
4222			config: Config{
4223				MaxVersion: VersionTLS12,
4224				Bugs: ProtocolBugs{
4225					SkipHelloVerifyRequest: true,
4226				},
4227			},
4228		})
4229	}
4230
4231	for _, test := range tests {
4232		test.protocol = config.protocol
4233		if config.protocol == dtls {
4234			test.name += "-DTLS"
4235		}
4236		if config.async {
4237			test.name += "-Async"
4238			test.flags = append(test.flags, "-async")
4239		} else {
4240			test.name += "-Sync"
4241		}
4242		if config.splitHandshake {
4243			test.name += "-SplitHandshakeRecords"
4244			test.config.Bugs.MaxHandshakeRecordLength = 1
4245			if config.protocol == dtls {
4246				test.config.Bugs.MaxPacketLength = 256
4247				test.flags = append(test.flags, "-mtu", "256")
4248			}
4249		}
4250		if config.packHandshakeFlight {
4251			test.name += "-PackHandshakeFlight"
4252			test.config.Bugs.PackHandshakeFlight = true
4253		}
4254		if config.implicitHandshake {
4255			test.name += "-ImplicitHandshake"
4256			test.flags = append(test.flags, "-implicit-handshake")
4257		}
4258		testCases = append(testCases, test)
4259	}
4260}
4261
4262func addDDoSCallbackTests() {
4263	// DDoS callback.
4264	for _, resume := range []bool{false, true} {
4265		suffix := "Resume"
4266		if resume {
4267			suffix = "No" + suffix
4268		}
4269
4270		testCases = append(testCases, testCase{
4271			testType: serverTest,
4272			name:     "Server-DDoS-OK-" + suffix,
4273			config: Config{
4274				MaxVersion: VersionTLS12,
4275			},
4276			flags:         []string{"-install-ddos-callback"},
4277			resumeSession: resume,
4278		})
4279		testCases = append(testCases, testCase{
4280			testType: serverTest,
4281			name:     "Server-DDoS-OK-" + suffix + "-TLS13",
4282			config: Config{
4283				MaxVersion: VersionTLS13,
4284			},
4285			flags:         []string{"-install-ddos-callback"},
4286			resumeSession: resume,
4287		})
4288
4289		failFlag := "-fail-ddos-callback"
4290		if resume {
4291			failFlag = "-fail-second-ddos-callback"
4292		}
4293		testCases = append(testCases, testCase{
4294			testType: serverTest,
4295			name:     "Server-DDoS-Reject-" + suffix,
4296			config: Config{
4297				MaxVersion: VersionTLS12,
4298			},
4299			flags:              []string{"-install-ddos-callback", failFlag},
4300			resumeSession:      resume,
4301			shouldFail:         true,
4302			expectedError:      ":CONNECTION_REJECTED:",
4303			expectedLocalError: "remote error: internal error",
4304		})
4305		testCases = append(testCases, testCase{
4306			testType: serverTest,
4307			name:     "Server-DDoS-Reject-" + suffix + "-TLS13",
4308			config: Config{
4309				MaxVersion: VersionTLS13,
4310			},
4311			flags:              []string{"-install-ddos-callback", failFlag},
4312			resumeSession:      resume,
4313			shouldFail:         true,
4314			expectedError:      ":CONNECTION_REJECTED:",
4315			expectedLocalError: "remote error: internal error",
4316		})
4317	}
4318}
4319
4320func addVersionNegotiationTests() {
4321	for i, shimVers := range tlsVersions {
4322		// Assemble flags to disable all newer versions on the shim.
4323		var flags []string
4324		for _, vers := range tlsVersions[i+1:] {
4325			flags = append(flags, vers.flag)
4326		}
4327
4328		// Test configuring the runner's maximum version.
4329		for _, runnerVers := range tlsVersions {
4330			protocols := []protocol{tls}
4331			if runnerVers.hasDTLS && shimVers.hasDTLS {
4332				protocols = append(protocols, dtls)
4333			}
4334			for _, protocol := range protocols {
4335				expectedVersion := shimVers.version
4336				if runnerVers.version < shimVers.version {
4337					expectedVersion = runnerVers.version
4338				}
4339
4340				suffix := shimVers.name + "-" + runnerVers.name
4341				if protocol == dtls {
4342					suffix += "-DTLS"
4343				}
4344
4345				shimVersFlag := strconv.Itoa(int(versionToWire(shimVers.version, protocol == dtls)))
4346
4347				// Determine the expected initial record-layer versions.
4348				clientVers := shimVers.version
4349				if clientVers > VersionTLS10 {
4350					clientVers = VersionTLS10
4351				}
4352				clientVers = versionToWire(clientVers, protocol == dtls)
4353				serverVers := expectedVersion
4354				if expectedVersion >= VersionTLS13 {
4355					serverVers = VersionTLS10
4356				}
4357				serverVers = versionToWire(serverVers, protocol == dtls)
4358
4359				testCases = append(testCases, testCase{
4360					protocol: protocol,
4361					testType: clientTest,
4362					name:     "VersionNegotiation-Client-" + suffix,
4363					config: Config{
4364						MaxVersion: runnerVers.version,
4365						Bugs: ProtocolBugs{
4366							ExpectInitialRecordVersion: clientVers,
4367						},
4368					},
4369					flags:           flags,
4370					expectedVersion: expectedVersion,
4371				})
4372				testCases = append(testCases, testCase{
4373					protocol: protocol,
4374					testType: clientTest,
4375					name:     "VersionNegotiation-Client2-" + suffix,
4376					config: Config{
4377						MaxVersion: runnerVers.version,
4378						Bugs: ProtocolBugs{
4379							ExpectInitialRecordVersion: clientVers,
4380						},
4381					},
4382					flags:           []string{"-max-version", shimVersFlag},
4383					expectedVersion: expectedVersion,
4384				})
4385
4386				testCases = append(testCases, testCase{
4387					protocol: protocol,
4388					testType: serverTest,
4389					name:     "VersionNegotiation-Server-" + suffix,
4390					config: Config{
4391						MaxVersion: runnerVers.version,
4392						Bugs: ProtocolBugs{
4393							ExpectInitialRecordVersion: serverVers,
4394						},
4395					},
4396					flags:           flags,
4397					expectedVersion: expectedVersion,
4398				})
4399				testCases = append(testCases, testCase{
4400					protocol: protocol,
4401					testType: serverTest,
4402					name:     "VersionNegotiation-Server2-" + suffix,
4403					config: Config{
4404						MaxVersion: runnerVers.version,
4405						Bugs: ProtocolBugs{
4406							ExpectInitialRecordVersion: serverVers,
4407						},
4408					},
4409					flags:           []string{"-max-version", shimVersFlag},
4410					expectedVersion: expectedVersion,
4411				})
4412			}
4413		}
4414	}
4415
4416	// Test the version extension at all versions.
4417	for _, vers := range tlsVersions {
4418		protocols := []protocol{tls}
4419		if vers.hasDTLS {
4420			protocols = append(protocols, dtls)
4421		}
4422		for _, protocol := range protocols {
4423			suffix := vers.name
4424			if protocol == dtls {
4425				suffix += "-DTLS"
4426			}
4427
4428			wireVersion := versionToWire(vers.version, protocol == dtls)
4429			testCases = append(testCases, testCase{
4430				protocol: protocol,
4431				testType: serverTest,
4432				name:     "VersionNegotiationExtension-" + suffix,
4433				config: Config{
4434					Bugs: ProtocolBugs{
4435						SendSupportedVersions: []uint16{0x1111, wireVersion, 0x2222},
4436					},
4437				},
4438				expectedVersion: vers.version,
4439			})
4440		}
4441
4442	}
4443
4444	// If all versions are unknown, negotiation fails.
4445	testCases = append(testCases, testCase{
4446		testType: serverTest,
4447		name:     "NoSupportedVersions",
4448		config: Config{
4449			Bugs: ProtocolBugs{
4450				SendSupportedVersions: []uint16{0x1111},
4451			},
4452		},
4453		shouldFail:    true,
4454		expectedError: ":UNSUPPORTED_PROTOCOL:",
4455	})
4456	testCases = append(testCases, testCase{
4457		protocol: dtls,
4458		testType: serverTest,
4459		name:     "NoSupportedVersions-DTLS",
4460		config: Config{
4461			Bugs: ProtocolBugs{
4462				SendSupportedVersions: []uint16{0x1111},
4463			},
4464		},
4465		shouldFail:    true,
4466		expectedError: ":UNSUPPORTED_PROTOCOL:",
4467	})
4468
4469	testCases = append(testCases, testCase{
4470		testType: serverTest,
4471		name:     "ClientHelloVersionTooHigh",
4472		config: Config{
4473			MaxVersion: VersionTLS13,
4474			Bugs: ProtocolBugs{
4475				SendClientVersion:     0x0304,
4476				OmitSupportedVersions: true,
4477			},
4478		},
4479		expectedVersion: VersionTLS12,
4480	})
4481
4482	testCases = append(testCases, testCase{
4483		testType: serverTest,
4484		name:     "ConflictingVersionNegotiation",
4485		config: Config{
4486			Bugs: ProtocolBugs{
4487				SendClientVersion:     VersionTLS12,
4488				SendSupportedVersions: []uint16{VersionTLS11},
4489			},
4490		},
4491		// The extension takes precedence over the ClientHello version.
4492		expectedVersion: VersionTLS11,
4493	})
4494
4495	testCases = append(testCases, testCase{
4496		testType: serverTest,
4497		name:     "ConflictingVersionNegotiation-2",
4498		config: Config{
4499			Bugs: ProtocolBugs{
4500				SendClientVersion:     VersionTLS11,
4501				SendSupportedVersions: []uint16{VersionTLS12},
4502			},
4503		},
4504		// The extension takes precedence over the ClientHello version.
4505		expectedVersion: VersionTLS12,
4506	})
4507
4508	testCases = append(testCases, testCase{
4509		testType: serverTest,
4510		name:     "RejectFinalTLS13",
4511		config: Config{
4512			Bugs: ProtocolBugs{
4513				SendSupportedVersions: []uint16{VersionTLS13, VersionTLS12},
4514			},
4515		},
4516		// We currently implement a draft TLS 1.3 version. Ensure that
4517		// the true TLS 1.3 value is ignored for now.
4518		expectedVersion: VersionTLS12,
4519	})
4520
4521	// Test that the maximum version is selected regardless of the
4522	// client-sent order.
4523	testCases = append(testCases, testCase{
4524		testType: serverTest,
4525		name:     "IgnoreClientVersionOrder",
4526		config: Config{
4527			Bugs: ProtocolBugs{
4528				SendSupportedVersions: []uint16{VersionTLS12, tls13DraftVersion},
4529			},
4530		},
4531		expectedVersion: VersionTLS13,
4532	})
4533
4534	// Test for version tolerance.
4535	testCases = append(testCases, testCase{
4536		testType: serverTest,
4537		name:     "MinorVersionTolerance",
4538		config: Config{
4539			Bugs: ProtocolBugs{
4540				SendClientVersion:     0x03ff,
4541				OmitSupportedVersions: true,
4542			},
4543		},
4544		expectedVersion: VersionTLS12,
4545	})
4546	testCases = append(testCases, testCase{
4547		testType: serverTest,
4548		name:     "MajorVersionTolerance",
4549		config: Config{
4550			Bugs: ProtocolBugs{
4551				SendClientVersion:     0x0400,
4552				OmitSupportedVersions: true,
4553			},
4554		},
4555		// TLS 1.3 must be negotiated with the supported_versions
4556		// extension, not ClientHello.version.
4557		expectedVersion: VersionTLS12,
4558	})
4559	testCases = append(testCases, testCase{
4560		testType: serverTest,
4561		name:     "VersionTolerance-TLS13",
4562		config: Config{
4563			Bugs: ProtocolBugs{
4564				// Although TLS 1.3 does not use
4565				// ClientHello.version, it still tolerates high
4566				// values there.
4567				SendClientVersion: 0x0400,
4568			},
4569		},
4570		expectedVersion: VersionTLS13,
4571	})
4572
4573	testCases = append(testCases, testCase{
4574		protocol: dtls,
4575		testType: serverTest,
4576		name:     "MinorVersionTolerance-DTLS",
4577		config: Config{
4578			Bugs: ProtocolBugs{
4579				SendClientVersion:     0xfe00,
4580				OmitSupportedVersions: true,
4581			},
4582		},
4583		expectedVersion: VersionTLS12,
4584	})
4585	testCases = append(testCases, testCase{
4586		protocol: dtls,
4587		testType: serverTest,
4588		name:     "MajorVersionTolerance-DTLS",
4589		config: Config{
4590			Bugs: ProtocolBugs{
4591				SendClientVersion:     0xfdff,
4592				OmitSupportedVersions: true,
4593			},
4594		},
4595		expectedVersion: VersionTLS12,
4596	})
4597
4598	// Test that versions below 3.0 are rejected.
4599	testCases = append(testCases, testCase{
4600		testType: serverTest,
4601		name:     "VersionTooLow",
4602		config: Config{
4603			Bugs: ProtocolBugs{
4604				SendClientVersion:     0x0200,
4605				OmitSupportedVersions: true,
4606			},
4607		},
4608		shouldFail:    true,
4609		expectedError: ":UNSUPPORTED_PROTOCOL:",
4610	})
4611	testCases = append(testCases, testCase{
4612		protocol: dtls,
4613		testType: serverTest,
4614		name:     "VersionTooLow-DTLS",
4615		config: Config{
4616			Bugs: ProtocolBugs{
4617				SendClientVersion: 0xffff,
4618			},
4619		},
4620		shouldFail:    true,
4621		expectedError: ":UNSUPPORTED_PROTOCOL:",
4622	})
4623
4624	testCases = append(testCases, testCase{
4625		name: "ServerBogusVersion",
4626		config: Config{
4627			Bugs: ProtocolBugs{
4628				SendServerHelloVersion: 0x1234,
4629			},
4630		},
4631		shouldFail:    true,
4632		expectedError: ":UNSUPPORTED_PROTOCOL:",
4633	})
4634
4635	// Test TLS 1.3's downgrade signal.
4636	testCases = append(testCases, testCase{
4637		name: "Downgrade-TLS12-Client",
4638		config: Config{
4639			Bugs: ProtocolBugs{
4640				NegotiateVersion: VersionTLS12,
4641			},
4642		},
4643		expectedVersion: VersionTLS12,
4644		// TODO(davidben): This test should fail once TLS 1.3 is final
4645		// and the fallback signal restored.
4646	})
4647	testCases = append(testCases, testCase{
4648		testType: serverTest,
4649		name:     "Downgrade-TLS12-Server",
4650		config: Config{
4651			Bugs: ProtocolBugs{
4652				SendSupportedVersions: []uint16{VersionTLS12},
4653			},
4654		},
4655		expectedVersion: VersionTLS12,
4656		// TODO(davidben): This test should fail once TLS 1.3 is final
4657		// and the fallback signal restored.
4658	})
4659}
4660
4661func addMinimumVersionTests() {
4662	for i, shimVers := range tlsVersions {
4663		// Assemble flags to disable all older versions on the shim.
4664		var flags []string
4665		for _, vers := range tlsVersions[:i] {
4666			flags = append(flags, vers.flag)
4667		}
4668
4669		for _, runnerVers := range tlsVersions {
4670			protocols := []protocol{tls}
4671			if runnerVers.hasDTLS && shimVers.hasDTLS {
4672				protocols = append(protocols, dtls)
4673			}
4674			for _, protocol := range protocols {
4675				suffix := shimVers.name + "-" + runnerVers.name
4676				if protocol == dtls {
4677					suffix += "-DTLS"
4678				}
4679				shimVersFlag := strconv.Itoa(int(versionToWire(shimVers.version, protocol == dtls)))
4680
4681				var expectedVersion uint16
4682				var shouldFail bool
4683				var expectedError, expectedLocalError string
4684				if runnerVers.version >= shimVers.version {
4685					expectedVersion = runnerVers.version
4686				} else {
4687					shouldFail = true
4688					expectedError = ":UNSUPPORTED_PROTOCOL:"
4689					expectedLocalError = "remote error: protocol version not supported"
4690				}
4691
4692				testCases = append(testCases, testCase{
4693					protocol: protocol,
4694					testType: clientTest,
4695					name:     "MinimumVersion-Client-" + suffix,
4696					config: Config{
4697						MaxVersion: runnerVers.version,
4698						Bugs: ProtocolBugs{
4699							// Ensure the server does not decline to
4700							// select a version (versions extension) or
4701							// cipher (some ciphers depend on versions).
4702							NegotiateVersion:            runnerVers.version,
4703							IgnorePeerCipherPreferences: shouldFail,
4704						},
4705					},
4706					flags:              flags,
4707					expectedVersion:    expectedVersion,
4708					shouldFail:         shouldFail,
4709					expectedError:      expectedError,
4710					expectedLocalError: expectedLocalError,
4711				})
4712				testCases = append(testCases, testCase{
4713					protocol: protocol,
4714					testType: clientTest,
4715					name:     "MinimumVersion-Client2-" + suffix,
4716					config: Config{
4717						MaxVersion: runnerVers.version,
4718						Bugs: ProtocolBugs{
4719							// Ensure the server does not decline to
4720							// select a version (versions extension) or
4721							// cipher (some ciphers depend on versions).
4722							NegotiateVersion:            runnerVers.version,
4723							IgnorePeerCipherPreferences: shouldFail,
4724						},
4725					},
4726					flags:              []string{"-min-version", shimVersFlag},
4727					expectedVersion:    expectedVersion,
4728					shouldFail:         shouldFail,
4729					expectedError:      expectedError,
4730					expectedLocalError: expectedLocalError,
4731				})
4732
4733				testCases = append(testCases, testCase{
4734					protocol: protocol,
4735					testType: serverTest,
4736					name:     "MinimumVersion-Server-" + suffix,
4737					config: Config{
4738						MaxVersion: runnerVers.version,
4739					},
4740					flags:              flags,
4741					expectedVersion:    expectedVersion,
4742					shouldFail:         shouldFail,
4743					expectedError:      expectedError,
4744					expectedLocalError: expectedLocalError,
4745				})
4746				testCases = append(testCases, testCase{
4747					protocol: protocol,
4748					testType: serverTest,
4749					name:     "MinimumVersion-Server2-" + suffix,
4750					config: Config{
4751						MaxVersion: runnerVers.version,
4752					},
4753					flags:              []string{"-min-version", shimVersFlag},
4754					expectedVersion:    expectedVersion,
4755					shouldFail:         shouldFail,
4756					expectedError:      expectedError,
4757					expectedLocalError: expectedLocalError,
4758				})
4759			}
4760		}
4761	}
4762}
4763
4764func addExtensionTests() {
4765	// TODO(davidben): Extensions, where applicable, all move their server
4766	// halves to EncryptedExtensions in TLS 1.3. Duplicate each of these
4767	// tests for both. Also test interaction with 0-RTT when implemented.
4768
4769	// Repeat extensions tests all versions except SSL 3.0.
4770	for _, ver := range tlsVersions {
4771		if ver.version == VersionSSL30 {
4772			continue
4773		}
4774
4775		// Test that duplicate extensions are rejected.
4776		testCases = append(testCases, testCase{
4777			testType: clientTest,
4778			name:     "DuplicateExtensionClient-" + ver.name,
4779			config: Config{
4780				MaxVersion: ver.version,
4781				Bugs: ProtocolBugs{
4782					DuplicateExtension: true,
4783				},
4784			},
4785			shouldFail:         true,
4786			expectedLocalError: "remote error: error decoding message",
4787		})
4788		testCases = append(testCases, testCase{
4789			testType: serverTest,
4790			name:     "DuplicateExtensionServer-" + ver.name,
4791			config: Config{
4792				MaxVersion: ver.version,
4793				Bugs: ProtocolBugs{
4794					DuplicateExtension: true,
4795				},
4796			},
4797			shouldFail:         true,
4798			expectedLocalError: "remote error: error decoding message",
4799		})
4800
4801		// Test SNI.
4802		testCases = append(testCases, testCase{
4803			testType: clientTest,
4804			name:     "ServerNameExtensionClient-" + ver.name,
4805			config: Config{
4806				MaxVersion: ver.version,
4807				Bugs: ProtocolBugs{
4808					ExpectServerName: "example.com",
4809				},
4810			},
4811			flags: []string{"-host-name", "example.com"},
4812		})
4813		testCases = append(testCases, testCase{
4814			testType: clientTest,
4815			name:     "ServerNameExtensionClientMismatch-" + ver.name,
4816			config: Config{
4817				MaxVersion: ver.version,
4818				Bugs: ProtocolBugs{
4819					ExpectServerName: "mismatch.com",
4820				},
4821			},
4822			flags:              []string{"-host-name", "example.com"},
4823			shouldFail:         true,
4824			expectedLocalError: "tls: unexpected server name",
4825		})
4826		testCases = append(testCases, testCase{
4827			testType: clientTest,
4828			name:     "ServerNameExtensionClientMissing-" + ver.name,
4829			config: Config{
4830				MaxVersion: ver.version,
4831				Bugs: ProtocolBugs{
4832					ExpectServerName: "missing.com",
4833				},
4834			},
4835			shouldFail:         true,
4836			expectedLocalError: "tls: unexpected server name",
4837		})
4838		testCases = append(testCases, testCase{
4839			testType: clientTest,
4840			name:     "TolerateServerNameAck-" + ver.name,
4841			config: Config{
4842				MaxVersion: ver.version,
4843				Bugs: ProtocolBugs{
4844					SendServerNameAck: true,
4845				},
4846			},
4847			flags:         []string{"-host-name", "example.com"},
4848			resumeSession: true,
4849		})
4850		testCases = append(testCases, testCase{
4851			testType: clientTest,
4852			name:     "UnsolicitedServerNameAck-" + ver.name,
4853			config: Config{
4854				MaxVersion: ver.version,
4855				Bugs: ProtocolBugs{
4856					SendServerNameAck: true,
4857				},
4858			},
4859			shouldFail:         true,
4860			expectedError:      ":UNEXPECTED_EXTENSION:",
4861			expectedLocalError: "remote error: unsupported extension",
4862		})
4863		testCases = append(testCases, testCase{
4864			testType: serverTest,
4865			name:     "ServerNameExtensionServer-" + ver.name,
4866			config: Config{
4867				MaxVersion: ver.version,
4868				ServerName: "example.com",
4869			},
4870			flags:         []string{"-expect-server-name", "example.com"},
4871			resumeSession: true,
4872		})
4873
4874		// Test ALPN.
4875		testCases = append(testCases, testCase{
4876			testType: clientTest,
4877			name:     "ALPNClient-" + ver.name,
4878			config: Config{
4879				MaxVersion: ver.version,
4880				NextProtos: []string{"foo"},
4881			},
4882			flags: []string{
4883				"-advertise-alpn", "\x03foo\x03bar\x03baz",
4884				"-expect-alpn", "foo",
4885			},
4886			expectedNextProto:     "foo",
4887			expectedNextProtoType: alpn,
4888			resumeSession:         true,
4889		})
4890		testCases = append(testCases, testCase{
4891			testType: clientTest,
4892			name:     "ALPNClient-Mismatch-" + ver.name,
4893			config: Config{
4894				MaxVersion: ver.version,
4895				Bugs: ProtocolBugs{
4896					SendALPN: "baz",
4897				},
4898			},
4899			flags: []string{
4900				"-advertise-alpn", "\x03foo\x03bar",
4901			},
4902			shouldFail:         true,
4903			expectedError:      ":INVALID_ALPN_PROTOCOL:",
4904			expectedLocalError: "remote error: illegal parameter",
4905		})
4906		testCases = append(testCases, testCase{
4907			testType: serverTest,
4908			name:     "ALPNServer-" + ver.name,
4909			config: Config{
4910				MaxVersion: ver.version,
4911				NextProtos: []string{"foo", "bar", "baz"},
4912			},
4913			flags: []string{
4914				"-expect-advertised-alpn", "\x03foo\x03bar\x03baz",
4915				"-select-alpn", "foo",
4916			},
4917			expectedNextProto:     "foo",
4918			expectedNextProtoType: alpn,
4919			resumeSession:         true,
4920		})
4921		testCases = append(testCases, testCase{
4922			testType: serverTest,
4923			name:     "ALPNServer-Decline-" + ver.name,
4924			config: Config{
4925				MaxVersion: ver.version,
4926				NextProtos: []string{"foo", "bar", "baz"},
4927			},
4928			flags:             []string{"-decline-alpn"},
4929			expectNoNextProto: true,
4930			resumeSession:     true,
4931		})
4932
4933		// Test ALPN in async mode as well to ensure that extensions callbacks are only
4934		// called once.
4935		testCases = append(testCases, testCase{
4936			testType: serverTest,
4937			name:     "ALPNServer-Async-" + ver.name,
4938			config: Config{
4939				MaxVersion: ver.version,
4940				NextProtos: []string{"foo", "bar", "baz"},
4941				// Prior to TLS 1.3, exercise the asynchronous session callback.
4942				SessionTicketsDisabled: ver.version < VersionTLS13,
4943			},
4944			flags: []string{
4945				"-expect-advertised-alpn", "\x03foo\x03bar\x03baz",
4946				"-select-alpn", "foo",
4947				"-async",
4948			},
4949			expectedNextProto:     "foo",
4950			expectedNextProtoType: alpn,
4951			resumeSession:         true,
4952		})
4953
4954		var emptyString string
4955		testCases = append(testCases, testCase{
4956			testType: clientTest,
4957			name:     "ALPNClient-EmptyProtocolName-" + ver.name,
4958			config: Config{
4959				MaxVersion: ver.version,
4960				NextProtos: []string{""},
4961				Bugs: ProtocolBugs{
4962					// A server returning an empty ALPN protocol
4963					// should be rejected.
4964					ALPNProtocol: &emptyString,
4965				},
4966			},
4967			flags: []string{
4968				"-advertise-alpn", "\x03foo",
4969			},
4970			shouldFail:    true,
4971			expectedError: ":PARSE_TLSEXT:",
4972		})
4973		testCases = append(testCases, testCase{
4974			testType: serverTest,
4975			name:     "ALPNServer-EmptyProtocolName-" + ver.name,
4976			config: Config{
4977				MaxVersion: ver.version,
4978				// A ClientHello containing an empty ALPN protocol
4979				// should be rejected.
4980				NextProtos: []string{"foo", "", "baz"},
4981			},
4982			flags: []string{
4983				"-select-alpn", "foo",
4984			},
4985			shouldFail:    true,
4986			expectedError: ":PARSE_TLSEXT:",
4987		})
4988
4989		// Test NPN and the interaction with ALPN.
4990		if ver.version < VersionTLS13 {
4991			// Test that the server prefers ALPN over NPN.
4992			testCases = append(testCases, testCase{
4993				testType: serverTest,
4994				name:     "ALPNServer-Preferred-" + ver.name,
4995				config: Config{
4996					MaxVersion: ver.version,
4997					NextProtos: []string{"foo", "bar", "baz"},
4998				},
4999				flags: []string{
5000					"-expect-advertised-alpn", "\x03foo\x03bar\x03baz",
5001					"-select-alpn", "foo",
5002					"-advertise-npn", "\x03foo\x03bar\x03baz",
5003				},
5004				expectedNextProto:     "foo",
5005				expectedNextProtoType: alpn,
5006				resumeSession:         true,
5007			})
5008			testCases = append(testCases, testCase{
5009				testType: serverTest,
5010				name:     "ALPNServer-Preferred-Swapped-" + ver.name,
5011				config: Config{
5012					MaxVersion: ver.version,
5013					NextProtos: []string{"foo", "bar", "baz"},
5014					Bugs: ProtocolBugs{
5015						SwapNPNAndALPN: true,
5016					},
5017				},
5018				flags: []string{
5019					"-expect-advertised-alpn", "\x03foo\x03bar\x03baz",
5020					"-select-alpn", "foo",
5021					"-advertise-npn", "\x03foo\x03bar\x03baz",
5022				},
5023				expectedNextProto:     "foo",
5024				expectedNextProtoType: alpn,
5025				resumeSession:         true,
5026			})
5027
5028			// Test that negotiating both NPN and ALPN is forbidden.
5029			testCases = append(testCases, testCase{
5030				name: "NegotiateALPNAndNPN-" + ver.name,
5031				config: Config{
5032					MaxVersion: ver.version,
5033					NextProtos: []string{"foo", "bar", "baz"},
5034					Bugs: ProtocolBugs{
5035						NegotiateALPNAndNPN: true,
5036					},
5037				},
5038				flags: []string{
5039					"-advertise-alpn", "\x03foo",
5040					"-select-next-proto", "foo",
5041				},
5042				shouldFail:    true,
5043				expectedError: ":NEGOTIATED_BOTH_NPN_AND_ALPN:",
5044			})
5045			testCases = append(testCases, testCase{
5046				name: "NegotiateALPNAndNPN-Swapped-" + ver.name,
5047				config: Config{
5048					MaxVersion: ver.version,
5049					NextProtos: []string{"foo", "bar", "baz"},
5050					Bugs: ProtocolBugs{
5051						NegotiateALPNAndNPN: true,
5052						SwapNPNAndALPN:      true,
5053					},
5054				},
5055				flags: []string{
5056					"-advertise-alpn", "\x03foo",
5057					"-select-next-proto", "foo",
5058				},
5059				shouldFail:    true,
5060				expectedError: ":NEGOTIATED_BOTH_NPN_AND_ALPN:",
5061			})
5062		}
5063
5064		// Test ticket behavior.
5065
5066		// Resume with a corrupt ticket.
5067		testCases = append(testCases, testCase{
5068			testType: serverTest,
5069			name:     "CorruptTicket-" + ver.name,
5070			config: Config{
5071				MaxVersion: ver.version,
5072				Bugs: ProtocolBugs{
5073					FilterTicket: func(in []byte) ([]byte, error) {
5074						in[len(in)-1] ^= 1
5075						return in, nil
5076					},
5077				},
5078			},
5079			resumeSession:        true,
5080			expectResumeRejected: true,
5081		})
5082		// Test the ticket callback, with and without renewal.
5083		testCases = append(testCases, testCase{
5084			testType: serverTest,
5085			name:     "TicketCallback-" + ver.name,
5086			config: Config{
5087				MaxVersion: ver.version,
5088			},
5089			resumeSession: true,
5090			flags:         []string{"-use-ticket-callback"},
5091		})
5092		testCases = append(testCases, testCase{
5093			testType: serverTest,
5094			name:     "TicketCallback-Renew-" + ver.name,
5095			config: Config{
5096				MaxVersion: ver.version,
5097				Bugs: ProtocolBugs{
5098					ExpectNewTicket: true,
5099				},
5100			},
5101			flags:         []string{"-use-ticket-callback", "-renew-ticket"},
5102			resumeSession: true,
5103		})
5104
5105		// Test that the ticket callback is only called once when everything before
5106		// it in the ClientHello is asynchronous. This corrupts the ticket so
5107		// certificate selection callbacks run.
5108		testCases = append(testCases, testCase{
5109			testType: serverTest,
5110			name:     "TicketCallback-SingleCall-" + ver.name,
5111			config: Config{
5112				MaxVersion: ver.version,
5113				Bugs: ProtocolBugs{
5114					FilterTicket: func(in []byte) ([]byte, error) {
5115						in[len(in)-1] ^= 1
5116						return in, nil
5117					},
5118				},
5119			},
5120			resumeSession:        true,
5121			expectResumeRejected: true,
5122			flags: []string{
5123				"-use-ticket-callback",
5124				"-async",
5125			},
5126		})
5127
5128		// Resume with various lengths of ticket session id.
5129		if ver.version < VersionTLS13 {
5130			testCases = append(testCases, testCase{
5131				testType: serverTest,
5132				name:     "TicketSessionIDLength-0-" + ver.name,
5133				config: Config{
5134					MaxVersion: ver.version,
5135					Bugs: ProtocolBugs{
5136						EmptyTicketSessionID: true,
5137					},
5138				},
5139				resumeSession: true,
5140			})
5141			testCases = append(testCases, testCase{
5142				testType: serverTest,
5143				name:     "TicketSessionIDLength-16-" + ver.name,
5144				config: Config{
5145					MaxVersion: ver.version,
5146					Bugs: ProtocolBugs{
5147						TicketSessionIDLength: 16,
5148					},
5149				},
5150				resumeSession: true,
5151			})
5152			testCases = append(testCases, testCase{
5153				testType: serverTest,
5154				name:     "TicketSessionIDLength-32-" + ver.name,
5155				config: Config{
5156					MaxVersion: ver.version,
5157					Bugs: ProtocolBugs{
5158						TicketSessionIDLength: 32,
5159					},
5160				},
5161				resumeSession: true,
5162			})
5163			testCases = append(testCases, testCase{
5164				testType: serverTest,
5165				name:     "TicketSessionIDLength-33-" + ver.name,
5166				config: Config{
5167					MaxVersion: ver.version,
5168					Bugs: ProtocolBugs{
5169						TicketSessionIDLength: 33,
5170					},
5171				},
5172				resumeSession: true,
5173				shouldFail:    true,
5174				// The maximum session ID length is 32.
5175				expectedError: ":DECODE_ERROR:",
5176			})
5177		}
5178
5179		// Basic DTLS-SRTP tests. Include fake profiles to ensure they
5180		// are ignored.
5181		if ver.hasDTLS {
5182			testCases = append(testCases, testCase{
5183				protocol: dtls,
5184				name:     "SRTP-Client-" + ver.name,
5185				config: Config{
5186					MaxVersion:             ver.version,
5187					SRTPProtectionProfiles: []uint16{40, SRTP_AES128_CM_HMAC_SHA1_80, 42},
5188				},
5189				flags: []string{
5190					"-srtp-profiles",
5191					"SRTP_AES128_CM_SHA1_80:SRTP_AES128_CM_SHA1_32",
5192				},
5193				expectedSRTPProtectionProfile: SRTP_AES128_CM_HMAC_SHA1_80,
5194			})
5195			testCases = append(testCases, testCase{
5196				protocol: dtls,
5197				testType: serverTest,
5198				name:     "SRTP-Server-" + ver.name,
5199				config: Config{
5200					MaxVersion:             ver.version,
5201					SRTPProtectionProfiles: []uint16{40, SRTP_AES128_CM_HMAC_SHA1_80, 42},
5202				},
5203				flags: []string{
5204					"-srtp-profiles",
5205					"SRTP_AES128_CM_SHA1_80:SRTP_AES128_CM_SHA1_32",
5206				},
5207				expectedSRTPProtectionProfile: SRTP_AES128_CM_HMAC_SHA1_80,
5208			})
5209			// Test that the MKI is ignored.
5210			testCases = append(testCases, testCase{
5211				protocol: dtls,
5212				testType: serverTest,
5213				name:     "SRTP-Server-IgnoreMKI-" + ver.name,
5214				config: Config{
5215					MaxVersion:             ver.version,
5216					SRTPProtectionProfiles: []uint16{SRTP_AES128_CM_HMAC_SHA1_80},
5217					Bugs: ProtocolBugs{
5218						SRTPMasterKeyIdentifer: "bogus",
5219					},
5220				},
5221				flags: []string{
5222					"-srtp-profiles",
5223					"SRTP_AES128_CM_SHA1_80:SRTP_AES128_CM_SHA1_32",
5224				},
5225				expectedSRTPProtectionProfile: SRTP_AES128_CM_HMAC_SHA1_80,
5226			})
5227			// Test that SRTP isn't negotiated on the server if there were
5228			// no matching profiles.
5229			testCases = append(testCases, testCase{
5230				protocol: dtls,
5231				testType: serverTest,
5232				name:     "SRTP-Server-NoMatch-" + ver.name,
5233				config: Config{
5234					MaxVersion:             ver.version,
5235					SRTPProtectionProfiles: []uint16{100, 101, 102},
5236				},
5237				flags: []string{
5238					"-srtp-profiles",
5239					"SRTP_AES128_CM_SHA1_80:SRTP_AES128_CM_SHA1_32",
5240				},
5241				expectedSRTPProtectionProfile: 0,
5242			})
5243			// Test that the server returning an invalid SRTP profile is
5244			// flagged as an error by the client.
5245			testCases = append(testCases, testCase{
5246				protocol: dtls,
5247				name:     "SRTP-Client-NoMatch-" + ver.name,
5248				config: Config{
5249					MaxVersion: ver.version,
5250					Bugs: ProtocolBugs{
5251						SendSRTPProtectionProfile: SRTP_AES128_CM_HMAC_SHA1_32,
5252					},
5253				},
5254				flags: []string{
5255					"-srtp-profiles",
5256					"SRTP_AES128_CM_SHA1_80",
5257				},
5258				shouldFail:    true,
5259				expectedError: ":BAD_SRTP_PROTECTION_PROFILE_LIST:",
5260			})
5261		}
5262
5263		// Test SCT list.
5264		testCases = append(testCases, testCase{
5265			name:     "SignedCertificateTimestampList-Client-" + ver.name,
5266			testType: clientTest,
5267			config: Config{
5268				MaxVersion: ver.version,
5269			},
5270			flags: []string{
5271				"-enable-signed-cert-timestamps",
5272				"-expect-signed-cert-timestamps",
5273				base64.StdEncoding.EncodeToString(testSCTList),
5274			},
5275			resumeSession: true,
5276		})
5277
5278		var differentSCTList []byte
5279		differentSCTList = append(differentSCTList, testSCTList...)
5280		differentSCTList[len(differentSCTList)-1] ^= 1
5281
5282		// The SCT extension did not specify that it must only be sent on resumption as it
5283		// should have, so test that we tolerate but ignore it.
5284		testCases = append(testCases, testCase{
5285			name: "SendSCTListOnResume-" + ver.name,
5286			config: Config{
5287				MaxVersion: ver.version,
5288				Bugs: ProtocolBugs{
5289					SendSCTListOnResume: differentSCTList,
5290				},
5291			},
5292			flags: []string{
5293				"-enable-signed-cert-timestamps",
5294				"-expect-signed-cert-timestamps",
5295				base64.StdEncoding.EncodeToString(testSCTList),
5296			},
5297			resumeSession: true,
5298		})
5299
5300		testCases = append(testCases, testCase{
5301			name:     "SignedCertificateTimestampList-Server-" + ver.name,
5302			testType: serverTest,
5303			config: Config{
5304				MaxVersion: ver.version,
5305			},
5306			flags: []string{
5307				"-signed-cert-timestamps",
5308				base64.StdEncoding.EncodeToString(testSCTList),
5309			},
5310			expectedSCTList: testSCTList,
5311			resumeSession:   true,
5312		})
5313
5314		emptySCTListCert := *testCerts[0].cert
5315		emptySCTListCert.SignedCertificateTimestampList = []byte{0, 0}
5316
5317		// Test empty SCT list.
5318		testCases = append(testCases, testCase{
5319			name:     "SignedCertificateTimestampListEmpty-Client-" + ver.name,
5320			testType: clientTest,
5321			config: Config{
5322				MaxVersion:   ver.version,
5323				Certificates: []Certificate{emptySCTListCert},
5324			},
5325			flags: []string{
5326				"-enable-signed-cert-timestamps",
5327			},
5328			shouldFail:    true,
5329			expectedError: ":ERROR_PARSING_EXTENSION:",
5330		})
5331
5332		emptySCTCert := *testCerts[0].cert
5333		emptySCTCert.SignedCertificateTimestampList = []byte{0, 6, 0, 2, 1, 2, 0, 0}
5334
5335		// Test empty SCT in non-empty list.
5336		testCases = append(testCases, testCase{
5337			name:     "SignedCertificateTimestampListEmptySCT-Client-" + ver.name,
5338			testType: clientTest,
5339			config: Config{
5340				MaxVersion:   ver.version,
5341				Certificates: []Certificate{emptySCTCert},
5342			},
5343			flags: []string{
5344				"-enable-signed-cert-timestamps",
5345			},
5346			shouldFail:    true,
5347			expectedError: ":ERROR_PARSING_EXTENSION:",
5348		})
5349
5350		// Test that certificate-related extensions are not sent unsolicited.
5351		testCases = append(testCases, testCase{
5352			testType: serverTest,
5353			name:     "UnsolicitedCertificateExtensions-" + ver.name,
5354			config: Config{
5355				MaxVersion: ver.version,
5356				Bugs: ProtocolBugs{
5357					NoOCSPStapling:                true,
5358					NoSignedCertificateTimestamps: true,
5359				},
5360			},
5361			flags: []string{
5362				"-ocsp-response",
5363				base64.StdEncoding.EncodeToString(testOCSPResponse),
5364				"-signed-cert-timestamps",
5365				base64.StdEncoding.EncodeToString(testSCTList),
5366			},
5367		})
5368	}
5369
5370	testCases = append(testCases, testCase{
5371		testType: clientTest,
5372		name:     "ClientHelloPadding",
5373		config: Config{
5374			Bugs: ProtocolBugs{
5375				RequireClientHelloSize: 512,
5376			},
5377		},
5378		// This hostname just needs to be long enough to push the
5379		// ClientHello into F5's danger zone between 256 and 511 bytes
5380		// long.
5381		flags: []string{"-host-name", "01234567890123456789012345678901234567890123456789012345678901234567890123456789.com"},
5382	})
5383
5384	// Extensions should not function in SSL 3.0.
5385	testCases = append(testCases, testCase{
5386		testType: serverTest,
5387		name:     "SSLv3Extensions-NoALPN",
5388		config: Config{
5389			MaxVersion: VersionSSL30,
5390			NextProtos: []string{"foo", "bar", "baz"},
5391		},
5392		flags: []string{
5393			"-select-alpn", "foo",
5394		},
5395		expectNoNextProto: true,
5396	})
5397
5398	// Test session tickets separately as they follow a different codepath.
5399	testCases = append(testCases, testCase{
5400		testType: serverTest,
5401		name:     "SSLv3Extensions-NoTickets",
5402		config: Config{
5403			MaxVersion: VersionSSL30,
5404			Bugs: ProtocolBugs{
5405				// Historically, session tickets in SSL 3.0
5406				// failed in different ways depending on whether
5407				// the client supported renegotiation_info.
5408				NoRenegotiationInfo: true,
5409			},
5410		},
5411		resumeSession: true,
5412	})
5413	testCases = append(testCases, testCase{
5414		testType: serverTest,
5415		name:     "SSLv3Extensions-NoTickets2",
5416		config: Config{
5417			MaxVersion: VersionSSL30,
5418		},
5419		resumeSession: true,
5420	})
5421
5422	// But SSL 3.0 does send and process renegotiation_info.
5423	testCases = append(testCases, testCase{
5424		testType: serverTest,
5425		name:     "SSLv3Extensions-RenegotiationInfo",
5426		config: Config{
5427			MaxVersion: VersionSSL30,
5428			Bugs: ProtocolBugs{
5429				RequireRenegotiationInfo: true,
5430			},
5431		},
5432		flags: []string{"-expect-secure-renegotiation"},
5433	})
5434	testCases = append(testCases, testCase{
5435		testType: serverTest,
5436		name:     "SSLv3Extensions-RenegotiationInfo-SCSV",
5437		config: Config{
5438			MaxVersion: VersionSSL30,
5439			Bugs: ProtocolBugs{
5440				NoRenegotiationInfo:      true,
5441				SendRenegotiationSCSV:    true,
5442				RequireRenegotiationInfo: true,
5443			},
5444		},
5445		flags: []string{"-expect-secure-renegotiation"},
5446	})
5447
5448	// Test that illegal extensions in TLS 1.3 are rejected by the client if
5449	// in ServerHello.
5450	testCases = append(testCases, testCase{
5451		name: "NPN-Forbidden-TLS13",
5452		config: Config{
5453			MaxVersion: VersionTLS13,
5454			NextProtos: []string{"foo"},
5455			Bugs: ProtocolBugs{
5456				NegotiateNPNAtAllVersions: true,
5457			},
5458		},
5459		flags:         []string{"-select-next-proto", "foo"},
5460		shouldFail:    true,
5461		expectedError: ":ERROR_PARSING_EXTENSION:",
5462	})
5463	testCases = append(testCases, testCase{
5464		name: "EMS-Forbidden-TLS13",
5465		config: Config{
5466			MaxVersion: VersionTLS13,
5467			Bugs: ProtocolBugs{
5468				NegotiateEMSAtAllVersions: true,
5469			},
5470		},
5471		shouldFail:    true,
5472		expectedError: ":ERROR_PARSING_EXTENSION:",
5473	})
5474	testCases = append(testCases, testCase{
5475		name: "RenegotiationInfo-Forbidden-TLS13",
5476		config: Config{
5477			MaxVersion: VersionTLS13,
5478			Bugs: ProtocolBugs{
5479				NegotiateRenegotiationInfoAtAllVersions: true,
5480			},
5481		},
5482		shouldFail:    true,
5483		expectedError: ":ERROR_PARSING_EXTENSION:",
5484	})
5485	testCases = append(testCases, testCase{
5486		name: "Ticket-Forbidden-TLS13",
5487		config: Config{
5488			MaxVersion: VersionTLS12,
5489		},
5490		resumeConfig: &Config{
5491			MaxVersion: VersionTLS13,
5492			Bugs: ProtocolBugs{
5493				AdvertiseTicketExtension: true,
5494			},
5495		},
5496		resumeSession: true,
5497		shouldFail:    true,
5498		expectedError: ":ERROR_PARSING_EXTENSION:",
5499	})
5500
5501	// Test that illegal extensions in TLS 1.3 are declined by the server if
5502	// offered in ClientHello. The runner's server will fail if this occurs,
5503	// so we exercise the offering path. (EMS and Renegotiation Info are
5504	// implicit in every test.)
5505	testCases = append(testCases, testCase{
5506		testType: serverTest,
5507		name:     "NPN-Declined-TLS13",
5508		config: Config{
5509			MaxVersion: VersionTLS13,
5510			NextProtos: []string{"bar"},
5511		},
5512		flags: []string{"-advertise-npn", "\x03foo\x03bar\x03baz"},
5513	})
5514
5515	// OpenSSL sends the status_request extension on resumption in TLS 1.2. Test that this is
5516	// tolerated.
5517	testCases = append(testCases, testCase{
5518		name: "SendOCSPResponseOnResume-TLS12",
5519		config: Config{
5520			MaxVersion: VersionTLS12,
5521			Bugs: ProtocolBugs{
5522				SendOCSPResponseOnResume: []byte("bogus"),
5523			},
5524		},
5525		flags: []string{
5526			"-enable-ocsp-stapling",
5527			"-expect-ocsp-response",
5528			base64.StdEncoding.EncodeToString(testOCSPResponse),
5529		},
5530		resumeSession: true,
5531	})
5532
5533	testCases = append(testCases, testCase{
5534		name: "SendUnsolicitedOCSPOnCertificate-TLS13",
5535		config: Config{
5536			MaxVersion: VersionTLS13,
5537			Bugs: ProtocolBugs{
5538				SendExtensionOnCertificate: testOCSPExtension,
5539			},
5540		},
5541		shouldFail:    true,
5542		expectedError: ":UNEXPECTED_EXTENSION:",
5543	})
5544
5545	testCases = append(testCases, testCase{
5546		name: "SendUnsolicitedSCTOnCertificate-TLS13",
5547		config: Config{
5548			MaxVersion: VersionTLS13,
5549			Bugs: ProtocolBugs{
5550				SendExtensionOnCertificate: testSCTExtension,
5551			},
5552		},
5553		shouldFail:    true,
5554		expectedError: ":UNEXPECTED_EXTENSION:",
5555	})
5556
5557	// Test that extensions on client certificates are never accepted.
5558	testCases = append(testCases, testCase{
5559		name:     "SendExtensionOnClientCertificate-TLS13",
5560		testType: serverTest,
5561		config: Config{
5562			MaxVersion:   VersionTLS13,
5563			Certificates: []Certificate{rsaCertificate},
5564			Bugs: ProtocolBugs{
5565				SendExtensionOnCertificate: testOCSPExtension,
5566			},
5567		},
5568		flags: []string{
5569			"-enable-ocsp-stapling",
5570			"-require-any-client-certificate",
5571		},
5572		shouldFail:    true,
5573		expectedError: ":UNEXPECTED_EXTENSION:",
5574	})
5575
5576	testCases = append(testCases, testCase{
5577		name: "SendUnknownExtensionOnCertificate-TLS13",
5578		config: Config{
5579			MaxVersion: VersionTLS13,
5580			Bugs: ProtocolBugs{
5581				SendExtensionOnCertificate: []byte{0x00, 0x7f, 0, 0},
5582			},
5583		},
5584		shouldFail:    true,
5585		expectedError: ":UNEXPECTED_EXTENSION:",
5586	})
5587
5588	var differentSCTList []byte
5589	differentSCTList = append(differentSCTList, testSCTList...)
5590	differentSCTList[len(differentSCTList)-1] ^= 1
5591
5592	// Test that extensions on intermediates are allowed but ignored.
5593	testCases = append(testCases, testCase{
5594		name: "IgnoreExtensionsOnIntermediates-TLS13",
5595		config: Config{
5596			MaxVersion:   VersionTLS13,
5597			Certificates: []Certificate{rsaChainCertificate},
5598			Bugs: ProtocolBugs{
5599				// Send different values on the intermediate. This tests
5600				// the intermediate's extensions do not override the
5601				// leaf's.
5602				SendOCSPOnIntermediates: []byte{1, 3, 3, 7},
5603				SendSCTOnIntermediates:  differentSCTList,
5604			},
5605		},
5606		flags: []string{
5607			"-enable-ocsp-stapling",
5608			"-expect-ocsp-response",
5609			base64.StdEncoding.EncodeToString(testOCSPResponse),
5610			"-enable-signed-cert-timestamps",
5611			"-expect-signed-cert-timestamps",
5612			base64.StdEncoding.EncodeToString(testSCTList),
5613		},
5614		resumeSession: true,
5615	})
5616
5617	// Test that extensions are not sent on intermediates when configured
5618	// only for a leaf.
5619	testCases = append(testCases, testCase{
5620		testType: serverTest,
5621		name:     "SendNoExtensionsOnIntermediate-TLS13",
5622		config: Config{
5623			MaxVersion: VersionTLS13,
5624			Bugs: ProtocolBugs{
5625				ExpectNoExtensionsOnIntermediate: true,
5626			},
5627		},
5628		flags: []string{
5629			"-cert-file", path.Join(*resourceDir, rsaChainCertificateFile),
5630			"-key-file", path.Join(*resourceDir, rsaChainKeyFile),
5631			"-ocsp-response",
5632			base64.StdEncoding.EncodeToString(testOCSPResponse),
5633			"-signed-cert-timestamps",
5634			base64.StdEncoding.EncodeToString(testSCTList),
5635		},
5636	})
5637
5638	// Test that extensions are not sent on client certificates.
5639	testCases = append(testCases, testCase{
5640		name: "SendNoClientCertificateExtensions-TLS13",
5641		config: Config{
5642			MaxVersion: VersionTLS13,
5643			ClientAuth: RequireAnyClientCert,
5644		},
5645		flags: []string{
5646			"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
5647			"-key-file", path.Join(*resourceDir, rsaKeyFile),
5648			"-ocsp-response",
5649			base64.StdEncoding.EncodeToString(testOCSPResponse),
5650			"-signed-cert-timestamps",
5651			base64.StdEncoding.EncodeToString(testSCTList),
5652		},
5653	})
5654
5655	testCases = append(testCases, testCase{
5656		name: "SendDuplicateExtensionsOnCerts-TLS13",
5657		config: Config{
5658			MaxVersion: VersionTLS13,
5659			Bugs: ProtocolBugs{
5660				SendDuplicateCertExtensions: true,
5661			},
5662		},
5663		flags: []string{
5664			"-enable-ocsp-stapling",
5665			"-enable-signed-cert-timestamps",
5666		},
5667		resumeSession: true,
5668		shouldFail:    true,
5669		expectedError: ":DUPLICATE_EXTENSION:",
5670	})
5671
5672	testCases = append(testCases, testCase{
5673		name:     "SignedCertificateTimestampListInvalid-Server",
5674		testType: serverTest,
5675		flags: []string{
5676			"-signed-cert-timestamps",
5677			base64.StdEncoding.EncodeToString([]byte{0, 0}),
5678		},
5679		shouldFail:    true,
5680		expectedError: ":INVALID_SCT_LIST:",
5681	})
5682}
5683
5684func addResumptionVersionTests() {
5685	for _, sessionVers := range tlsVersions {
5686		for _, resumeVers := range tlsVersions {
5687			// SSL 3.0 does not have tickets and TLS 1.3 does not
5688			// have session IDs, so skip their cross-resumption
5689			// tests.
5690			if (sessionVers.version >= VersionTLS13 && resumeVers.version == VersionSSL30) ||
5691				(resumeVers.version >= VersionTLS13 && sessionVers.version == VersionSSL30) {
5692				continue
5693			}
5694
5695			protocols := []protocol{tls}
5696			if sessionVers.hasDTLS && resumeVers.hasDTLS {
5697				protocols = append(protocols, dtls)
5698			}
5699			for _, protocol := range protocols {
5700				suffix := "-" + sessionVers.name + "-" + resumeVers.name
5701				if protocol == dtls {
5702					suffix += "-DTLS"
5703				}
5704
5705				if sessionVers.version == resumeVers.version {
5706					testCases = append(testCases, testCase{
5707						protocol:      protocol,
5708						name:          "Resume-Client" + suffix,
5709						resumeSession: true,
5710						config: Config{
5711							MaxVersion: sessionVers.version,
5712							Bugs: ProtocolBugs{
5713								ExpectNoTLS12Session: sessionVers.version >= VersionTLS13,
5714								ExpectNoTLS13PSK:     sessionVers.version < VersionTLS13,
5715							},
5716						},
5717						expectedVersion:       sessionVers.version,
5718						expectedResumeVersion: resumeVers.version,
5719					})
5720				} else {
5721					error := ":OLD_SESSION_VERSION_NOT_RETURNED:"
5722
5723					// Offering a TLS 1.3 session sends an empty session ID, so
5724					// there is no way to convince a non-lookahead client the
5725					// session was resumed. It will appear to the client that a
5726					// stray ChangeCipherSpec was sent.
5727					if resumeVers.version < VersionTLS13 && sessionVers.version >= VersionTLS13 {
5728						error = ":UNEXPECTED_RECORD:"
5729					}
5730
5731					testCases = append(testCases, testCase{
5732						protocol:      protocol,
5733						name:          "Resume-Client-Mismatch" + suffix,
5734						resumeSession: true,
5735						config: Config{
5736							MaxVersion: sessionVers.version,
5737						},
5738						expectedVersion: sessionVers.version,
5739						resumeConfig: &Config{
5740							MaxVersion: resumeVers.version,
5741							Bugs: ProtocolBugs{
5742								AcceptAnySession: true,
5743							},
5744						},
5745						expectedResumeVersion: resumeVers.version,
5746						shouldFail:            true,
5747						expectedError:         error,
5748					})
5749				}
5750
5751				testCases = append(testCases, testCase{
5752					protocol:      protocol,
5753					name:          "Resume-Client-NoResume" + suffix,
5754					resumeSession: true,
5755					config: Config{
5756						MaxVersion: sessionVers.version,
5757					},
5758					expectedVersion: sessionVers.version,
5759					resumeConfig: &Config{
5760						MaxVersion: resumeVers.version,
5761					},
5762					newSessionsOnResume:   true,
5763					expectResumeRejected:  true,
5764					expectedResumeVersion: resumeVers.version,
5765				})
5766
5767				testCases = append(testCases, testCase{
5768					protocol:      protocol,
5769					testType:      serverTest,
5770					name:          "Resume-Server" + suffix,
5771					resumeSession: true,
5772					config: Config{
5773						MaxVersion: sessionVers.version,
5774					},
5775					expectedVersion:      sessionVers.version,
5776					expectResumeRejected: sessionVers.version != resumeVers.version,
5777					resumeConfig: &Config{
5778						MaxVersion: resumeVers.version,
5779						Bugs: ProtocolBugs{
5780							SendBothTickets: true,
5781						},
5782					},
5783					expectedResumeVersion: resumeVers.version,
5784				})
5785			}
5786		}
5787	}
5788
5789	// Make sure shim ticket mutations are functional.
5790	testCases = append(testCases, testCase{
5791		testType:      serverTest,
5792		name:          "ShimTicketRewritable",
5793		resumeSession: true,
5794		config: Config{
5795			MaxVersion:   VersionTLS12,
5796			CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
5797			Bugs: ProtocolBugs{
5798				FilterTicket: func(in []byte) ([]byte, error) {
5799					in, err := SetShimTicketVersion(in, VersionTLS12)
5800					if err != nil {
5801						return nil, err
5802					}
5803					return SetShimTicketCipherSuite(in, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256)
5804				},
5805			},
5806		},
5807		flags: []string{
5808			"-ticket-key",
5809			base64.StdEncoding.EncodeToString(TestShimTicketKey),
5810		},
5811	})
5812
5813	// Resumptions are declined if the version does not match.
5814	testCases = append(testCases, testCase{
5815		testType:      serverTest,
5816		name:          "Resume-Server-DeclineCrossVersion",
5817		resumeSession: true,
5818		config: Config{
5819			MaxVersion: VersionTLS12,
5820			Bugs: ProtocolBugs{
5821				ExpectNewTicket: true,
5822				FilterTicket: func(in []byte) ([]byte, error) {
5823					return SetShimTicketVersion(in, VersionTLS13)
5824				},
5825			},
5826		},
5827		flags: []string{
5828			"-ticket-key",
5829			base64.StdEncoding.EncodeToString(TestShimTicketKey),
5830		},
5831		expectResumeRejected: true,
5832	})
5833
5834	testCases = append(testCases, testCase{
5835		testType:      serverTest,
5836		name:          "Resume-Server-DeclineCrossVersion-TLS13",
5837		resumeSession: true,
5838		config: Config{
5839			MaxVersion: VersionTLS13,
5840			Bugs: ProtocolBugs{
5841				FilterTicket: func(in []byte) ([]byte, error) {
5842					return SetShimTicketVersion(in, VersionTLS12)
5843				},
5844			},
5845		},
5846		flags: []string{
5847			"-ticket-key",
5848			base64.StdEncoding.EncodeToString(TestShimTicketKey),
5849		},
5850		expectResumeRejected: true,
5851	})
5852
5853	// Resumptions are declined if the cipher is invalid or disabled.
5854	testCases = append(testCases, testCase{
5855		testType:      serverTest,
5856		name:          "Resume-Server-DeclineBadCipher",
5857		resumeSession: true,
5858		config: Config{
5859			MaxVersion: VersionTLS12,
5860			Bugs: ProtocolBugs{
5861				ExpectNewTicket: true,
5862				FilterTicket: func(in []byte) ([]byte, error) {
5863					return SetShimTicketCipherSuite(in, TLS_AES_128_GCM_SHA256)
5864				},
5865			},
5866		},
5867		flags: []string{
5868			"-ticket-key",
5869			base64.StdEncoding.EncodeToString(TestShimTicketKey),
5870		},
5871		expectResumeRejected: true,
5872	})
5873
5874	testCases = append(testCases, testCase{
5875		testType:      serverTest,
5876		name:          "Resume-Server-DeclineBadCipher-2",
5877		resumeSession: true,
5878		config: Config{
5879			MaxVersion: VersionTLS12,
5880			Bugs: ProtocolBugs{
5881				ExpectNewTicket: true,
5882				FilterTicket: func(in []byte) ([]byte, error) {
5883					return SetShimTicketCipherSuite(in, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384)
5884				},
5885			},
5886		},
5887		flags: []string{
5888			"-cipher", "AES128",
5889			"-ticket-key",
5890			base64.StdEncoding.EncodeToString(TestShimTicketKey),
5891		},
5892		expectResumeRejected: true,
5893	})
5894
5895	// Sessions are not resumed if they do not use the preferred cipher.
5896	testCases = append(testCases, testCase{
5897		testType:      serverTest,
5898		name:          "Resume-Server-CipherNotPreferred",
5899		resumeSession: true,
5900		config: Config{
5901			MaxVersion: VersionTLS12,
5902			Bugs: ProtocolBugs{
5903				ExpectNewTicket: true,
5904				FilterTicket: func(in []byte) ([]byte, error) {
5905					return SetShimTicketCipherSuite(in, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA)
5906				},
5907			},
5908		},
5909		flags: []string{
5910			"-ticket-key",
5911			base64.StdEncoding.EncodeToString(TestShimTicketKey),
5912		},
5913		shouldFail:           false,
5914		expectResumeRejected: true,
5915	})
5916
5917	// TLS 1.3 allows sessions to be resumed at a different cipher if their
5918	// PRF hashes match, but BoringSSL will always decline such resumptions.
5919	testCases = append(testCases, testCase{
5920		testType:      serverTest,
5921		name:          "Resume-Server-CipherNotPreferred-TLS13",
5922		resumeSession: true,
5923		config: Config{
5924			MaxVersion:   VersionTLS13,
5925			CipherSuites: []uint16{TLS_CHACHA20_POLY1305_SHA256, TLS_AES_128_GCM_SHA256},
5926			Bugs: ProtocolBugs{
5927				FilterTicket: func(in []byte) ([]byte, error) {
5928					// If the client (runner) offers ChaCha20-Poly1305 first, the
5929					// server (shim) always prefers it. Switch it to AES-GCM.
5930					return SetShimTicketCipherSuite(in, TLS_AES_128_GCM_SHA256)
5931				},
5932			},
5933		},
5934		flags: []string{
5935			"-ticket-key",
5936			base64.StdEncoding.EncodeToString(TestShimTicketKey),
5937		},
5938		shouldFail:           false,
5939		expectResumeRejected: true,
5940	})
5941
5942	// Sessions may not be resumed if they contain another version's cipher.
5943	testCases = append(testCases, testCase{
5944		testType:      serverTest,
5945		name:          "Resume-Server-DeclineBadCipher-TLS13",
5946		resumeSession: true,
5947		config: Config{
5948			MaxVersion: VersionTLS13,
5949			Bugs: ProtocolBugs{
5950				FilterTicket: func(in []byte) ([]byte, error) {
5951					return SetShimTicketCipherSuite(in, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256)
5952				},
5953			},
5954		},
5955		flags: []string{
5956			"-ticket-key",
5957			base64.StdEncoding.EncodeToString(TestShimTicketKey),
5958		},
5959		expectResumeRejected: true,
5960	})
5961
5962	// If the client does not offer the cipher from the session, decline to
5963	// resume. Clients are forbidden from doing this, but BoringSSL selects
5964	// the cipher first, so we only decline.
5965	testCases = append(testCases, testCase{
5966		testType:      serverTest,
5967		name:          "Resume-Server-UnofferedCipher",
5968		resumeSession: true,
5969		config: Config{
5970			MaxVersion:   VersionTLS12,
5971			CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256},
5972		},
5973		resumeConfig: &Config{
5974			MaxVersion:   VersionTLS12,
5975			CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256},
5976			Bugs: ProtocolBugs{
5977				SendCipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
5978			},
5979		},
5980		expectResumeRejected: true,
5981	})
5982
5983	// In TLS 1.3, clients may advertise a cipher list which does not
5984	// include the selected cipher. Test that we tolerate this. Servers may
5985	// resume at another cipher if the PRF matches and are not doing 0-RTT, but
5986	// BoringSSL will always decline.
5987	testCases = append(testCases, testCase{
5988		testType:      serverTest,
5989		name:          "Resume-Server-UnofferedCipher-TLS13",
5990		resumeSession: true,
5991		config: Config{
5992			MaxVersion:   VersionTLS13,
5993			CipherSuites: []uint16{TLS_CHACHA20_POLY1305_SHA256},
5994		},
5995		resumeConfig: &Config{
5996			MaxVersion:   VersionTLS13,
5997			CipherSuites: []uint16{TLS_CHACHA20_POLY1305_SHA256},
5998			Bugs: ProtocolBugs{
5999				SendCipherSuites: []uint16{TLS_AES_128_GCM_SHA256},
6000			},
6001		},
6002		expectResumeRejected: true,
6003	})
6004
6005	// Sessions may not be resumed at a different cipher.
6006	testCases = append(testCases, testCase{
6007		name:          "Resume-Client-CipherMismatch",
6008		resumeSession: true,
6009		config: Config{
6010			MaxVersion:   VersionTLS12,
6011			CipherSuites: []uint16{TLS_RSA_WITH_AES_128_GCM_SHA256},
6012		},
6013		resumeConfig: &Config{
6014			MaxVersion:   VersionTLS12,
6015			CipherSuites: []uint16{TLS_RSA_WITH_AES_128_GCM_SHA256},
6016			Bugs: ProtocolBugs{
6017				SendCipherSuite: TLS_RSA_WITH_AES_128_CBC_SHA,
6018			},
6019		},
6020		shouldFail:    true,
6021		expectedError: ":OLD_SESSION_CIPHER_NOT_RETURNED:",
6022	})
6023
6024	// Session resumption in TLS 1.3 may change the cipher suite if the PRF
6025	// matches.
6026	testCases = append(testCases, testCase{
6027		name:          "Resume-Client-CipherMismatch-TLS13",
6028		resumeSession: true,
6029		config: Config{
6030			MaxVersion:   VersionTLS13,
6031			CipherSuites: []uint16{TLS_AES_128_GCM_SHA256},
6032		},
6033		resumeConfig: &Config{
6034			MaxVersion:   VersionTLS13,
6035			CipherSuites: []uint16{TLS_CHACHA20_POLY1305_SHA256},
6036		},
6037	})
6038
6039	// Session resumption in TLS 1.3 is forbidden if the PRF does not match.
6040	testCases = append(testCases, testCase{
6041		name:          "Resume-Client-PRFMismatch-TLS13",
6042		resumeSession: true,
6043		config: Config{
6044			MaxVersion:   VersionTLS13,
6045			CipherSuites: []uint16{TLS_AES_128_GCM_SHA256},
6046		},
6047		resumeConfig: &Config{
6048			MaxVersion:   VersionTLS13,
6049			CipherSuites: []uint16{TLS_AES_128_GCM_SHA256},
6050			Bugs: ProtocolBugs{
6051				SendCipherSuite: TLS_AES_256_GCM_SHA384,
6052			},
6053		},
6054		shouldFail:    true,
6055		expectedError: ":OLD_SESSION_PRF_HASH_MISMATCH:",
6056	})
6057
6058	testCases = append(testCases, testCase{
6059		testType:      serverTest,
6060		name:          "Resume-Server-BinderWrongLength",
6061		resumeSession: true,
6062		config: Config{
6063			MaxVersion: VersionTLS13,
6064			Bugs: ProtocolBugs{
6065				SendShortPSKBinder: true,
6066			},
6067		},
6068		shouldFail:         true,
6069		expectedLocalError: "remote error: error decrypting message",
6070		expectedError:      ":DIGEST_CHECK_FAILED:",
6071	})
6072
6073	testCases = append(testCases, testCase{
6074		testType:      serverTest,
6075		name:          "Resume-Server-NoPSKBinder",
6076		resumeSession: true,
6077		config: Config{
6078			MaxVersion: VersionTLS13,
6079			Bugs: ProtocolBugs{
6080				SendNoPSKBinder: true,
6081			},
6082		},
6083		shouldFail:         true,
6084		expectedLocalError: "remote error: error decoding message",
6085		expectedError:      ":DECODE_ERROR:",
6086	})
6087
6088	testCases = append(testCases, testCase{
6089		testType:      serverTest,
6090		name:          "Resume-Server-ExtraPSKBinder",
6091		resumeSession: true,
6092		config: Config{
6093			MaxVersion: VersionTLS13,
6094			Bugs: ProtocolBugs{
6095				SendExtraPSKBinder: true,
6096			},
6097		},
6098		shouldFail:         true,
6099		expectedLocalError: "remote error: illegal parameter",
6100		expectedError:      ":PSK_IDENTITY_BINDER_COUNT_MISMATCH:",
6101	})
6102
6103	testCases = append(testCases, testCase{
6104		testType:      serverTest,
6105		name:          "Resume-Server-ExtraIdentityNoBinder",
6106		resumeSession: true,
6107		config: Config{
6108			MaxVersion: VersionTLS13,
6109			Bugs: ProtocolBugs{
6110				ExtraPSKIdentity: true,
6111			},
6112		},
6113		shouldFail:         true,
6114		expectedLocalError: "remote error: illegal parameter",
6115		expectedError:      ":PSK_IDENTITY_BINDER_COUNT_MISMATCH:",
6116	})
6117
6118	testCases = append(testCases, testCase{
6119		testType:      serverTest,
6120		name:          "Resume-Server-InvalidPSKBinder",
6121		resumeSession: true,
6122		config: Config{
6123			MaxVersion: VersionTLS13,
6124			Bugs: ProtocolBugs{
6125				SendInvalidPSKBinder: true,
6126			},
6127		},
6128		shouldFail:         true,
6129		expectedLocalError: "remote error: error decrypting message",
6130		expectedError:      ":DIGEST_CHECK_FAILED:",
6131	})
6132
6133	testCases = append(testCases, testCase{
6134		testType:      serverTest,
6135		name:          "Resume-Server-PSKBinderFirstExtension",
6136		resumeSession: true,
6137		config: Config{
6138			MaxVersion: VersionTLS13,
6139			Bugs: ProtocolBugs{
6140				PSKBinderFirst: true,
6141			},
6142		},
6143		shouldFail:         true,
6144		expectedLocalError: "remote error: illegal parameter",
6145		expectedError:      ":PRE_SHARED_KEY_MUST_BE_LAST:",
6146	})
6147}
6148
6149func addRenegotiationTests() {
6150	// Servers cannot renegotiate.
6151	testCases = append(testCases, testCase{
6152		testType: serverTest,
6153		name:     "Renegotiate-Server-Forbidden",
6154		config: Config{
6155			MaxVersion: VersionTLS12,
6156		},
6157		renegotiate:        1,
6158		shouldFail:         true,
6159		expectedError:      ":NO_RENEGOTIATION:",
6160		expectedLocalError: "remote error: no renegotiation",
6161	})
6162	// The server shouldn't echo the renegotiation extension unless
6163	// requested by the client.
6164	testCases = append(testCases, testCase{
6165		testType: serverTest,
6166		name:     "Renegotiate-Server-NoExt",
6167		config: Config{
6168			MaxVersion: VersionTLS12,
6169			Bugs: ProtocolBugs{
6170				NoRenegotiationInfo:      true,
6171				RequireRenegotiationInfo: true,
6172			},
6173		},
6174		shouldFail:         true,
6175		expectedLocalError: "renegotiation extension missing",
6176	})
6177	// The renegotiation SCSV should be sufficient for the server to echo
6178	// the extension.
6179	testCases = append(testCases, testCase{
6180		testType: serverTest,
6181		name:     "Renegotiate-Server-NoExt-SCSV",
6182		config: Config{
6183			MaxVersion: VersionTLS12,
6184			Bugs: ProtocolBugs{
6185				NoRenegotiationInfo:      true,
6186				SendRenegotiationSCSV:    true,
6187				RequireRenegotiationInfo: true,
6188			},
6189		},
6190	})
6191	testCases = append(testCases, testCase{
6192		name: "Renegotiate-Client",
6193		config: Config{
6194			MaxVersion: VersionTLS12,
6195			Bugs: ProtocolBugs{
6196				FailIfResumeOnRenego: true,
6197			},
6198		},
6199		renegotiate: 1,
6200		flags: []string{
6201			"-renegotiate-freely",
6202			"-expect-total-renegotiations", "1",
6203			"-expect-secure-renegotiation",
6204		},
6205	})
6206	testCases = append(testCases, testCase{
6207		name:        "Renegotiate-Client-EmptyExt",
6208		renegotiate: 1,
6209		config: Config{
6210			MaxVersion: VersionTLS12,
6211			Bugs: ProtocolBugs{
6212				EmptyRenegotiationInfo: true,
6213			},
6214		},
6215		flags:         []string{"-renegotiate-freely"},
6216		shouldFail:    true,
6217		expectedError: ":RENEGOTIATION_MISMATCH:",
6218	})
6219	testCases = append(testCases, testCase{
6220		name:        "Renegotiate-Client-BadExt",
6221		renegotiate: 1,
6222		config: Config{
6223			MaxVersion: VersionTLS12,
6224			Bugs: ProtocolBugs{
6225				BadRenegotiationInfo: true,
6226			},
6227		},
6228		flags:         []string{"-renegotiate-freely"},
6229		shouldFail:    true,
6230		expectedError: ":RENEGOTIATION_MISMATCH:",
6231	})
6232	testCases = append(testCases, testCase{
6233		name:        "Renegotiate-Client-Downgrade",
6234		renegotiate: 1,
6235		config: Config{
6236			MaxVersion: VersionTLS12,
6237			Bugs: ProtocolBugs{
6238				NoRenegotiationInfoAfterInitial: true,
6239			},
6240		},
6241		flags:         []string{"-renegotiate-freely"},
6242		shouldFail:    true,
6243		expectedError: ":RENEGOTIATION_MISMATCH:",
6244	})
6245	testCases = append(testCases, testCase{
6246		name:        "Renegotiate-Client-Upgrade",
6247		renegotiate: 1,
6248		config: Config{
6249			MaxVersion: VersionTLS12,
6250			Bugs: ProtocolBugs{
6251				NoRenegotiationInfoInInitial: true,
6252			},
6253		},
6254		flags:         []string{"-renegotiate-freely"},
6255		shouldFail:    true,
6256		expectedError: ":RENEGOTIATION_MISMATCH:",
6257	})
6258	testCases = append(testCases, testCase{
6259		name:        "Renegotiate-Client-NoExt-Allowed",
6260		renegotiate: 1,
6261		config: Config{
6262			MaxVersion: VersionTLS12,
6263			Bugs: ProtocolBugs{
6264				NoRenegotiationInfo: true,
6265			},
6266		},
6267		flags: []string{
6268			"-renegotiate-freely",
6269			"-expect-total-renegotiations", "1",
6270			"-expect-no-secure-renegotiation",
6271		},
6272	})
6273
6274	// Test that the server may switch ciphers on renegotiation without
6275	// problems.
6276	testCases = append(testCases, testCase{
6277		name:        "Renegotiate-Client-SwitchCiphers",
6278		renegotiate: 1,
6279		config: Config{
6280			MaxVersion:   VersionTLS12,
6281			CipherSuites: []uint16{TLS_RSA_WITH_3DES_EDE_CBC_SHA},
6282		},
6283		renegotiateCiphers: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
6284		flags: []string{
6285			"-renegotiate-freely",
6286			"-expect-total-renegotiations", "1",
6287		},
6288	})
6289	testCases = append(testCases, testCase{
6290		name:        "Renegotiate-Client-SwitchCiphers2",
6291		renegotiate: 1,
6292		config: Config{
6293			MaxVersion:   VersionTLS12,
6294			CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
6295		},
6296		renegotiateCiphers: []uint16{TLS_RSA_WITH_3DES_EDE_CBC_SHA},
6297		flags: []string{
6298			"-renegotiate-freely",
6299			"-expect-total-renegotiations", "1",
6300		},
6301	})
6302
6303	// Test that the server may not switch versions on renegotiation.
6304	testCases = append(testCases, testCase{
6305		name: "Renegotiate-Client-SwitchVersion",
6306		config: Config{
6307			MaxVersion: VersionTLS12,
6308			// Pick a cipher which exists at both versions.
6309			CipherSuites: []uint16{TLS_RSA_WITH_AES_128_CBC_SHA},
6310			Bugs: ProtocolBugs{
6311				NegotiateVersionOnRenego: VersionTLS11,
6312				// Avoid failing early at the record layer.
6313				SendRecordVersion: VersionTLS12,
6314			},
6315		},
6316		renegotiate: 1,
6317		flags: []string{
6318			"-renegotiate-freely",
6319			"-expect-total-renegotiations", "1",
6320		},
6321		shouldFail:    true,
6322		expectedError: ":WRONG_SSL_VERSION:",
6323	})
6324
6325	testCases = append(testCases, testCase{
6326		name:        "Renegotiate-SameClientVersion",
6327		renegotiate: 1,
6328		config: Config{
6329			MaxVersion: VersionTLS10,
6330			Bugs: ProtocolBugs{
6331				RequireSameRenegoClientVersion: true,
6332			},
6333		},
6334		flags: []string{
6335			"-renegotiate-freely",
6336			"-expect-total-renegotiations", "1",
6337		},
6338	})
6339	testCases = append(testCases, testCase{
6340		name:        "Renegotiate-FalseStart",
6341		renegotiate: 1,
6342		config: Config{
6343			MaxVersion:   VersionTLS12,
6344			CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
6345			NextProtos:   []string{"foo"},
6346		},
6347		flags: []string{
6348			"-false-start",
6349			"-select-next-proto", "foo",
6350			"-renegotiate-freely",
6351			"-expect-total-renegotiations", "1",
6352		},
6353		shimWritesFirst: true,
6354	})
6355
6356	// Client-side renegotiation controls.
6357	testCases = append(testCases, testCase{
6358		name: "Renegotiate-Client-Forbidden-1",
6359		config: Config{
6360			MaxVersion: VersionTLS12,
6361		},
6362		renegotiate:        1,
6363		shouldFail:         true,
6364		expectedError:      ":NO_RENEGOTIATION:",
6365		expectedLocalError: "remote error: no renegotiation",
6366	})
6367	testCases = append(testCases, testCase{
6368		name: "Renegotiate-Client-Once-1",
6369		config: Config{
6370			MaxVersion: VersionTLS12,
6371		},
6372		renegotiate: 1,
6373		flags: []string{
6374			"-renegotiate-once",
6375			"-expect-total-renegotiations", "1",
6376		},
6377	})
6378	testCases = append(testCases, testCase{
6379		name: "Renegotiate-Client-Freely-1",
6380		config: Config{
6381			MaxVersion: VersionTLS12,
6382		},
6383		renegotiate: 1,
6384		flags: []string{
6385			"-renegotiate-freely",
6386			"-expect-total-renegotiations", "1",
6387		},
6388	})
6389	testCases = append(testCases, testCase{
6390		name: "Renegotiate-Client-Once-2",
6391		config: Config{
6392			MaxVersion: VersionTLS12,
6393		},
6394		renegotiate:        2,
6395		flags:              []string{"-renegotiate-once"},
6396		shouldFail:         true,
6397		expectedError:      ":NO_RENEGOTIATION:",
6398		expectedLocalError: "remote error: no renegotiation",
6399	})
6400	testCases = append(testCases, testCase{
6401		name: "Renegotiate-Client-Freely-2",
6402		config: Config{
6403			MaxVersion: VersionTLS12,
6404		},
6405		renegotiate: 2,
6406		flags: []string{
6407			"-renegotiate-freely",
6408			"-expect-total-renegotiations", "2",
6409		},
6410	})
6411	testCases = append(testCases, testCase{
6412		name: "Renegotiate-Client-NoIgnore",
6413		config: Config{
6414			MaxVersion: VersionTLS12,
6415			Bugs: ProtocolBugs{
6416				SendHelloRequestBeforeEveryAppDataRecord: true,
6417			},
6418		},
6419		shouldFail:    true,
6420		expectedError: ":NO_RENEGOTIATION:",
6421	})
6422	testCases = append(testCases, testCase{
6423		name: "Renegotiate-Client-Ignore",
6424		config: Config{
6425			MaxVersion: VersionTLS12,
6426			Bugs: ProtocolBugs{
6427				SendHelloRequestBeforeEveryAppDataRecord: true,
6428			},
6429		},
6430		flags: []string{
6431			"-renegotiate-ignore",
6432			"-expect-total-renegotiations", "0",
6433		},
6434	})
6435
6436	// Renegotiation is not allowed at SSL 3.0.
6437	testCases = append(testCases, testCase{
6438		name: "Renegotiate-Client-SSL3",
6439		config: Config{
6440			MaxVersion: VersionSSL30,
6441		},
6442		renegotiate: 1,
6443		flags: []string{
6444			"-renegotiate-freely",
6445			"-expect-total-renegotiations", "1",
6446		},
6447		shouldFail:         true,
6448		expectedError:      ":NO_RENEGOTIATION:",
6449		expectedLocalError: "remote error: no renegotiation",
6450	})
6451
6452	// Renegotiation is not allowed when there is an unfinished write.
6453	testCases = append(testCases, testCase{
6454		name: "Renegotiate-Client-UnfinishedWrite",
6455		config: Config{
6456			MaxVersion: VersionTLS12,
6457		},
6458		renegotiate: 1,
6459		flags: []string{
6460			"-async",
6461			"-renegotiate-freely",
6462			"-read-with-unfinished-write",
6463		},
6464		shouldFail:    true,
6465		expectedError: ":NO_RENEGOTIATION:",
6466		// We do not successfully send the no_renegotiation alert in
6467		// this case. https://crbug.com/boringssl/130
6468	})
6469
6470	// We reject stray HelloRequests during the handshake in TLS 1.2.
6471	testCases = append(testCases, testCase{
6472		name: "StrayHelloRequest",
6473		config: Config{
6474			MaxVersion: VersionTLS12,
6475			Bugs: ProtocolBugs{
6476				SendHelloRequestBeforeEveryHandshakeMessage: true,
6477			},
6478		},
6479		shouldFail:    true,
6480		expectedError: ":UNEXPECTED_MESSAGE:",
6481	})
6482	testCases = append(testCases, testCase{
6483		name: "StrayHelloRequest-Packed",
6484		config: Config{
6485			MaxVersion: VersionTLS12,
6486			Bugs: ProtocolBugs{
6487				PackHandshakeFlight:                         true,
6488				SendHelloRequestBeforeEveryHandshakeMessage: true,
6489			},
6490		},
6491		shouldFail:    true,
6492		expectedError: ":UNEXPECTED_MESSAGE:",
6493	})
6494
6495	// Test renegotiation works if HelloRequest and server Finished come in
6496	// the same record.
6497	testCases = append(testCases, testCase{
6498		name: "Renegotiate-Client-Packed",
6499		config: Config{
6500			MaxVersion: VersionTLS12,
6501			Bugs: ProtocolBugs{
6502				PackHandshakeFlight:          true,
6503				PackHelloRequestWithFinished: true,
6504			},
6505		},
6506		renegotiate: 1,
6507		flags: []string{
6508			"-renegotiate-freely",
6509			"-expect-total-renegotiations", "1",
6510		},
6511	})
6512
6513	// Renegotiation is forbidden in TLS 1.3.
6514	testCases = append(testCases, testCase{
6515		name: "Renegotiate-Client-TLS13",
6516		config: Config{
6517			MaxVersion: VersionTLS13,
6518			Bugs: ProtocolBugs{
6519				SendHelloRequestBeforeEveryAppDataRecord: true,
6520			},
6521		},
6522		flags: []string{
6523			"-renegotiate-freely",
6524		},
6525		shouldFail:    true,
6526		expectedError: ":UNEXPECTED_MESSAGE:",
6527	})
6528
6529	// Stray HelloRequests during the handshake are forbidden in TLS 1.3.
6530	testCases = append(testCases, testCase{
6531		name: "StrayHelloRequest-TLS13",
6532		config: Config{
6533			MaxVersion: VersionTLS13,
6534			Bugs: ProtocolBugs{
6535				SendHelloRequestBeforeEveryHandshakeMessage: true,
6536			},
6537		},
6538		shouldFail:    true,
6539		expectedError: ":UNEXPECTED_MESSAGE:",
6540	})
6541
6542	// The renegotiation_info extension is not sent in TLS 1.3, but TLS 1.3
6543	// always reads as supporting it, regardless of whether it was
6544	// negotiated.
6545	testCases = append(testCases, testCase{
6546		name: "AlwaysReportRenegotiationInfo-TLS13",
6547		config: Config{
6548			MaxVersion: VersionTLS13,
6549			Bugs: ProtocolBugs{
6550				NoRenegotiationInfo: true,
6551			},
6552		},
6553		flags: []string{
6554			"-expect-secure-renegotiation",
6555		},
6556	})
6557
6558	// Certificates may not change on renegotiation.
6559	testCases = append(testCases, testCase{
6560		name: "Renegotiation-CertificateChange",
6561		config: Config{
6562			MaxVersion:   VersionTLS12,
6563			Certificates: []Certificate{rsaCertificate},
6564			Bugs: ProtocolBugs{
6565				RenegotiationCertificate: &rsaChainCertificate,
6566			},
6567		},
6568		renegotiate:   1,
6569		flags:         []string{"-renegotiate-freely"},
6570		shouldFail:    true,
6571		expectedError: ":SERVER_CERT_CHANGED:",
6572	})
6573	testCases = append(testCases, testCase{
6574		name: "Renegotiation-CertificateChange-2",
6575		config: Config{
6576			MaxVersion:   VersionTLS12,
6577			Certificates: []Certificate{rsaCertificate},
6578			Bugs: ProtocolBugs{
6579				RenegotiationCertificate: &rsa1024Certificate,
6580			},
6581		},
6582		renegotiate:   1,
6583		flags:         []string{"-renegotiate-freely"},
6584		shouldFail:    true,
6585		expectedError: ":SERVER_CERT_CHANGED:",
6586	})
6587
6588	// We do not negotiate ALPN after the initial handshake. This is
6589	// error-prone and only risks bugs in consumers.
6590	testCases = append(testCases, testCase{
6591		testType: clientTest,
6592		name:     "Renegotiation-ForbidALPN",
6593		config: Config{
6594			MaxVersion: VersionTLS12,
6595			Bugs: ProtocolBugs{
6596				// Forcibly negotiate ALPN on both initial and
6597				// renegotiation handshakes. The test stack will
6598				// internally check the client does not offer
6599				// it.
6600				SendALPN: "foo",
6601			},
6602		},
6603		flags: []string{
6604			"-advertise-alpn", "\x03foo\x03bar\x03baz",
6605			"-expect-alpn", "foo",
6606			"-renegotiate-freely",
6607		},
6608		renegotiate:   1,
6609		shouldFail:    true,
6610		expectedError: ":UNEXPECTED_EXTENSION:",
6611	})
6612}
6613
6614func addDTLSReplayTests() {
6615	// Test that sequence number replays are detected.
6616	testCases = append(testCases, testCase{
6617		protocol:     dtls,
6618		name:         "DTLS-Replay",
6619		messageCount: 200,
6620		replayWrites: true,
6621	})
6622
6623	// Test the incoming sequence number skipping by values larger
6624	// than the retransmit window.
6625	testCases = append(testCases, testCase{
6626		protocol: dtls,
6627		name:     "DTLS-Replay-LargeGaps",
6628		config: Config{
6629			Bugs: ProtocolBugs{
6630				SequenceNumberMapping: func(in uint64) uint64 {
6631					return in * 127
6632				},
6633			},
6634		},
6635		messageCount: 200,
6636		replayWrites: true,
6637	})
6638
6639	// Test the incoming sequence number changing non-monotonically.
6640	testCases = append(testCases, testCase{
6641		protocol: dtls,
6642		name:     "DTLS-Replay-NonMonotonic",
6643		config: Config{
6644			Bugs: ProtocolBugs{
6645				SequenceNumberMapping: func(in uint64) uint64 {
6646					return in ^ 31
6647				},
6648			},
6649		},
6650		messageCount: 200,
6651		replayWrites: true,
6652	})
6653}
6654
6655var testSignatureAlgorithms = []struct {
6656	name string
6657	id   signatureAlgorithm
6658	cert testCert
6659}{
6660	{"RSA-PKCS1-SHA1", signatureRSAPKCS1WithSHA1, testCertRSA},
6661	{"RSA-PKCS1-SHA256", signatureRSAPKCS1WithSHA256, testCertRSA},
6662	{"RSA-PKCS1-SHA384", signatureRSAPKCS1WithSHA384, testCertRSA},
6663	{"RSA-PKCS1-SHA512", signatureRSAPKCS1WithSHA512, testCertRSA},
6664	{"ECDSA-SHA1", signatureECDSAWithSHA1, testCertECDSAP256},
6665	{"ECDSA-P256-SHA256", signatureECDSAWithP256AndSHA256, testCertECDSAP256},
6666	{"ECDSA-P384-SHA384", signatureECDSAWithP384AndSHA384, testCertECDSAP384},
6667	{"ECDSA-P521-SHA512", signatureECDSAWithP521AndSHA512, testCertECDSAP521},
6668	{"RSA-PSS-SHA256", signatureRSAPSSWithSHA256, testCertRSA},
6669	{"RSA-PSS-SHA384", signatureRSAPSSWithSHA384, testCertRSA},
6670	{"RSA-PSS-SHA512", signatureRSAPSSWithSHA512, testCertRSA},
6671	// Tests for key types prior to TLS 1.2.
6672	{"RSA", 0, testCertRSA},
6673	{"ECDSA", 0, testCertECDSAP256},
6674}
6675
6676const fakeSigAlg1 signatureAlgorithm = 0x2a01
6677const fakeSigAlg2 signatureAlgorithm = 0xff01
6678
6679func addSignatureAlgorithmTests() {
6680	// Not all ciphers involve a signature. Advertise a list which gives all
6681	// versions a signing cipher.
6682	signingCiphers := []uint16{
6683		TLS_AES_128_GCM_SHA256,
6684		TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
6685		TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
6686		TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
6687		TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
6688	}
6689	if *includeDHE {
6690		signingCiphers = append(signingCiphers, TLS_DHE_RSA_WITH_AES_128_CBC_SHA)
6691	}
6692
6693	var allAlgorithms []signatureAlgorithm
6694	for _, alg := range testSignatureAlgorithms {
6695		if alg.id != 0 {
6696			allAlgorithms = append(allAlgorithms, alg.id)
6697		}
6698	}
6699
6700	// Make sure each signature algorithm works. Include some fake values in
6701	// the list and ensure they're ignored.
6702	for _, alg := range testSignatureAlgorithms {
6703		for _, ver := range tlsVersions {
6704			if (ver.version < VersionTLS12) != (alg.id == 0) {
6705				continue
6706			}
6707
6708			// TODO(davidben): Support ECDSA in SSL 3.0 in Go for testing
6709			// or remove it in C.
6710			if ver.version == VersionSSL30 && alg.cert != testCertRSA {
6711				continue
6712			}
6713
6714			var shouldSignFail, shouldVerifyFail bool
6715			// ecdsa_sha1 does not exist in TLS 1.3.
6716			if ver.version >= VersionTLS13 && alg.id == signatureECDSAWithSHA1 {
6717				shouldSignFail = true
6718				shouldVerifyFail = true
6719			}
6720			// RSA-PKCS1 does not exist in TLS 1.3.
6721			if ver.version == VersionTLS13 && hasComponent(alg.name, "PKCS1") {
6722				shouldSignFail = true
6723				shouldVerifyFail = true
6724			}
6725
6726			// BoringSSL will sign SHA-1 and SHA-512 with ECDSA but not accept them.
6727			if alg.id == signatureECDSAWithSHA1 || alg.id == signatureECDSAWithP521AndSHA512 {
6728				shouldVerifyFail = true
6729			}
6730
6731			var signError, verifyError string
6732			if shouldSignFail {
6733				signError = ":NO_COMMON_SIGNATURE_ALGORITHMS:"
6734			}
6735			if shouldVerifyFail {
6736				verifyError = ":WRONG_SIGNATURE_TYPE:"
6737			}
6738
6739			suffix := "-" + alg.name + "-" + ver.name
6740
6741			testCases = append(testCases, testCase{
6742				name: "ClientAuth-Sign" + suffix,
6743				config: Config{
6744					MaxVersion: ver.version,
6745					ClientAuth: RequireAnyClientCert,
6746					VerifySignatureAlgorithms: []signatureAlgorithm{
6747						fakeSigAlg1,
6748						alg.id,
6749						fakeSigAlg2,
6750					},
6751				},
6752				flags: []string{
6753					"-cert-file", path.Join(*resourceDir, getShimCertificate(alg.cert)),
6754					"-key-file", path.Join(*resourceDir, getShimKey(alg.cert)),
6755					"-enable-all-curves",
6756				},
6757				shouldFail:                     shouldSignFail,
6758				expectedError:                  signError,
6759				expectedPeerSignatureAlgorithm: alg.id,
6760			})
6761
6762			testCases = append(testCases, testCase{
6763				testType: serverTest,
6764				name:     "ClientAuth-Verify" + suffix,
6765				config: Config{
6766					MaxVersion:   ver.version,
6767					Certificates: []Certificate{getRunnerCertificate(alg.cert)},
6768					SignSignatureAlgorithms: []signatureAlgorithm{
6769						alg.id,
6770					},
6771					Bugs: ProtocolBugs{
6772						SkipECDSACurveCheck:          shouldVerifyFail,
6773						IgnoreSignatureVersionChecks: shouldVerifyFail,
6774						// Some signature algorithms may not be advertised.
6775						IgnorePeerSignatureAlgorithmPreferences: shouldVerifyFail,
6776					},
6777				},
6778				flags: []string{
6779					"-require-any-client-certificate",
6780					"-expect-peer-signature-algorithm", strconv.Itoa(int(alg.id)),
6781					"-enable-all-curves",
6782				},
6783				// Resume the session to assert the peer signature
6784				// algorithm is reported on both handshakes.
6785				resumeSession: !shouldVerifyFail,
6786				shouldFail:    shouldVerifyFail,
6787				expectedError: verifyError,
6788			})
6789
6790			// No signing cipher for SSL 3.0.
6791			if *includeDHE || ver.version > VersionSSL30 {
6792				testCases = append(testCases, testCase{
6793					testType: serverTest,
6794					name:     "ServerAuth-Sign" + suffix,
6795					config: Config{
6796						MaxVersion:   ver.version,
6797						CipherSuites: signingCiphers,
6798						VerifySignatureAlgorithms: []signatureAlgorithm{
6799							fakeSigAlg1,
6800							alg.id,
6801							fakeSigAlg2,
6802						},
6803					},
6804					flags: []string{
6805						"-cert-file", path.Join(*resourceDir, getShimCertificate(alg.cert)),
6806						"-key-file", path.Join(*resourceDir, getShimKey(alg.cert)),
6807						"-enable-all-curves",
6808					},
6809					shouldFail:                     shouldSignFail,
6810					expectedError:                  signError,
6811					expectedPeerSignatureAlgorithm: alg.id,
6812				})
6813			}
6814
6815			testCases = append(testCases, testCase{
6816				name: "ServerAuth-Verify" + suffix,
6817				config: Config{
6818					MaxVersion:   ver.version,
6819					Certificates: []Certificate{getRunnerCertificate(alg.cert)},
6820					CipherSuites: signingCiphers,
6821					SignSignatureAlgorithms: []signatureAlgorithm{
6822						alg.id,
6823					},
6824					Bugs: ProtocolBugs{
6825						SkipECDSACurveCheck:          shouldVerifyFail,
6826						IgnoreSignatureVersionChecks: shouldVerifyFail,
6827						// Some signature algorithms may not be advertised.
6828						IgnorePeerSignatureAlgorithmPreferences: shouldVerifyFail,
6829					},
6830				},
6831				flags: []string{
6832					"-expect-peer-signature-algorithm", strconv.Itoa(int(alg.id)),
6833					"-enable-all-curves",
6834				},
6835				// Resume the session to assert the peer signature
6836				// algorithm is reported on both handshakes.
6837				resumeSession: !shouldVerifyFail,
6838				shouldFail:    shouldVerifyFail,
6839				expectedError: verifyError,
6840			})
6841
6842			if !shouldVerifyFail {
6843				testCases = append(testCases, testCase{
6844					testType: serverTest,
6845					name:     "ClientAuth-InvalidSignature" + suffix,
6846					config: Config{
6847						MaxVersion:   ver.version,
6848						Certificates: []Certificate{getRunnerCertificate(alg.cert)},
6849						SignSignatureAlgorithms: []signatureAlgorithm{
6850							alg.id,
6851						},
6852						Bugs: ProtocolBugs{
6853							InvalidSignature: true,
6854						},
6855					},
6856					flags: []string{
6857						"-require-any-client-certificate",
6858						"-enable-all-curves",
6859					},
6860					shouldFail:    true,
6861					expectedError: ":BAD_SIGNATURE:",
6862				})
6863
6864				testCases = append(testCases, testCase{
6865					name: "ServerAuth-InvalidSignature" + suffix,
6866					config: Config{
6867						MaxVersion:   ver.version,
6868						Certificates: []Certificate{getRunnerCertificate(alg.cert)},
6869						CipherSuites: signingCiphers,
6870						SignSignatureAlgorithms: []signatureAlgorithm{
6871							alg.id,
6872						},
6873						Bugs: ProtocolBugs{
6874							InvalidSignature: true,
6875						},
6876					},
6877					flags:         []string{"-enable-all-curves"},
6878					shouldFail:    true,
6879					expectedError: ":BAD_SIGNATURE:",
6880				})
6881			}
6882
6883			if ver.version >= VersionTLS12 && !shouldSignFail {
6884				testCases = append(testCases, testCase{
6885					name: "ClientAuth-Sign-Negotiate" + suffix,
6886					config: Config{
6887						MaxVersion:                ver.version,
6888						ClientAuth:                RequireAnyClientCert,
6889						VerifySignatureAlgorithms: allAlgorithms,
6890					},
6891					flags: []string{
6892						"-cert-file", path.Join(*resourceDir, getShimCertificate(alg.cert)),
6893						"-key-file", path.Join(*resourceDir, getShimKey(alg.cert)),
6894						"-enable-all-curves",
6895						"-signing-prefs", strconv.Itoa(int(alg.id)),
6896					},
6897					expectedPeerSignatureAlgorithm: alg.id,
6898				})
6899
6900				testCases = append(testCases, testCase{
6901					testType: serverTest,
6902					name:     "ServerAuth-Sign-Negotiate" + suffix,
6903					config: Config{
6904						MaxVersion:                ver.version,
6905						CipherSuites:              signingCiphers,
6906						VerifySignatureAlgorithms: allAlgorithms,
6907					},
6908					flags: []string{
6909						"-cert-file", path.Join(*resourceDir, getShimCertificate(alg.cert)),
6910						"-key-file", path.Join(*resourceDir, getShimKey(alg.cert)),
6911						"-enable-all-curves",
6912						"-signing-prefs", strconv.Itoa(int(alg.id)),
6913					},
6914					expectedPeerSignatureAlgorithm: alg.id,
6915				})
6916			}
6917		}
6918	}
6919
6920	// Test that algorithm selection takes the key type into account.
6921	testCases = append(testCases, testCase{
6922		name: "ClientAuth-SignatureType",
6923		config: Config{
6924			ClientAuth: RequireAnyClientCert,
6925			MaxVersion: VersionTLS12,
6926			VerifySignatureAlgorithms: []signatureAlgorithm{
6927				signatureECDSAWithP521AndSHA512,
6928				signatureRSAPKCS1WithSHA384,
6929				signatureECDSAWithSHA1,
6930			},
6931		},
6932		flags: []string{
6933			"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
6934			"-key-file", path.Join(*resourceDir, rsaKeyFile),
6935		},
6936		expectedPeerSignatureAlgorithm: signatureRSAPKCS1WithSHA384,
6937	})
6938
6939	testCases = append(testCases, testCase{
6940		name: "ClientAuth-SignatureType-TLS13",
6941		config: Config{
6942			ClientAuth: RequireAnyClientCert,
6943			MaxVersion: VersionTLS13,
6944			VerifySignatureAlgorithms: []signatureAlgorithm{
6945				signatureECDSAWithP521AndSHA512,
6946				signatureRSAPKCS1WithSHA384,
6947				signatureRSAPSSWithSHA384,
6948				signatureECDSAWithSHA1,
6949			},
6950		},
6951		flags: []string{
6952			"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
6953			"-key-file", path.Join(*resourceDir, rsaKeyFile),
6954		},
6955		expectedPeerSignatureAlgorithm: signatureRSAPSSWithSHA384,
6956	})
6957
6958	testCases = append(testCases, testCase{
6959		testType: serverTest,
6960		name:     "ServerAuth-SignatureType",
6961		config: Config{
6962			MaxVersion:   VersionTLS12,
6963			CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
6964			VerifySignatureAlgorithms: []signatureAlgorithm{
6965				signatureECDSAWithP521AndSHA512,
6966				signatureRSAPKCS1WithSHA384,
6967				signatureECDSAWithSHA1,
6968			},
6969		},
6970		expectedPeerSignatureAlgorithm: signatureRSAPKCS1WithSHA384,
6971	})
6972
6973	testCases = append(testCases, testCase{
6974		testType: serverTest,
6975		name:     "ServerAuth-SignatureType-TLS13",
6976		config: Config{
6977			MaxVersion: VersionTLS13,
6978			VerifySignatureAlgorithms: []signatureAlgorithm{
6979				signatureECDSAWithP521AndSHA512,
6980				signatureRSAPKCS1WithSHA384,
6981				signatureRSAPSSWithSHA384,
6982				signatureECDSAWithSHA1,
6983			},
6984		},
6985		expectedPeerSignatureAlgorithm: signatureRSAPSSWithSHA384,
6986	})
6987
6988	// Test that signature verification takes the key type into account.
6989	testCases = append(testCases, testCase{
6990		testType: serverTest,
6991		name:     "Verify-ClientAuth-SignatureType",
6992		config: Config{
6993			MaxVersion:   VersionTLS12,
6994			Certificates: []Certificate{rsaCertificate},
6995			SignSignatureAlgorithms: []signatureAlgorithm{
6996				signatureRSAPKCS1WithSHA256,
6997			},
6998			Bugs: ProtocolBugs{
6999				SendSignatureAlgorithm: signatureECDSAWithP256AndSHA256,
7000			},
7001		},
7002		flags: []string{
7003			"-require-any-client-certificate",
7004		},
7005		shouldFail:    true,
7006		expectedError: ":WRONG_SIGNATURE_TYPE:",
7007	})
7008
7009	testCases = append(testCases, testCase{
7010		testType: serverTest,
7011		name:     "Verify-ClientAuth-SignatureType-TLS13",
7012		config: Config{
7013			MaxVersion:   VersionTLS13,
7014			Certificates: []Certificate{rsaCertificate},
7015			SignSignatureAlgorithms: []signatureAlgorithm{
7016				signatureRSAPSSWithSHA256,
7017			},
7018			Bugs: ProtocolBugs{
7019				SendSignatureAlgorithm: signatureECDSAWithP256AndSHA256,
7020			},
7021		},
7022		flags: []string{
7023			"-require-any-client-certificate",
7024		},
7025		shouldFail:    true,
7026		expectedError: ":WRONG_SIGNATURE_TYPE:",
7027	})
7028
7029	testCases = append(testCases, testCase{
7030		name: "Verify-ServerAuth-SignatureType",
7031		config: Config{
7032			MaxVersion:   VersionTLS12,
7033			CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
7034			SignSignatureAlgorithms: []signatureAlgorithm{
7035				signatureRSAPKCS1WithSHA256,
7036			},
7037			Bugs: ProtocolBugs{
7038				SendSignatureAlgorithm: signatureECDSAWithP256AndSHA256,
7039			},
7040		},
7041		shouldFail:    true,
7042		expectedError: ":WRONG_SIGNATURE_TYPE:",
7043	})
7044
7045	testCases = append(testCases, testCase{
7046		name: "Verify-ServerAuth-SignatureType-TLS13",
7047		config: Config{
7048			MaxVersion: VersionTLS13,
7049			SignSignatureAlgorithms: []signatureAlgorithm{
7050				signatureRSAPSSWithSHA256,
7051			},
7052			Bugs: ProtocolBugs{
7053				SendSignatureAlgorithm: signatureECDSAWithP256AndSHA256,
7054			},
7055		},
7056		shouldFail:    true,
7057		expectedError: ":WRONG_SIGNATURE_TYPE:",
7058	})
7059
7060	// Test that, if the list is missing, the peer falls back to SHA-1 in
7061	// TLS 1.2, but not TLS 1.3.
7062	testCases = append(testCases, testCase{
7063		name: "ClientAuth-SHA1-Fallback-RSA",
7064		config: Config{
7065			MaxVersion: VersionTLS12,
7066			ClientAuth: RequireAnyClientCert,
7067			VerifySignatureAlgorithms: []signatureAlgorithm{
7068				signatureRSAPKCS1WithSHA1,
7069			},
7070			Bugs: ProtocolBugs{
7071				NoSignatureAlgorithms: true,
7072			},
7073		},
7074		flags: []string{
7075			"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
7076			"-key-file", path.Join(*resourceDir, rsaKeyFile),
7077		},
7078	})
7079
7080	testCases = append(testCases, testCase{
7081		testType: serverTest,
7082		name:     "ServerAuth-SHA1-Fallback-RSA",
7083		config: Config{
7084			MaxVersion: VersionTLS12,
7085			VerifySignatureAlgorithms: []signatureAlgorithm{
7086				signatureRSAPKCS1WithSHA1,
7087			},
7088			Bugs: ProtocolBugs{
7089				NoSignatureAlgorithms: true,
7090			},
7091		},
7092		flags: []string{
7093			"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
7094			"-key-file", path.Join(*resourceDir, rsaKeyFile),
7095		},
7096	})
7097
7098	testCases = append(testCases, testCase{
7099		name: "ClientAuth-SHA1-Fallback-ECDSA",
7100		config: Config{
7101			MaxVersion: VersionTLS12,
7102			ClientAuth: RequireAnyClientCert,
7103			VerifySignatureAlgorithms: []signatureAlgorithm{
7104				signatureECDSAWithSHA1,
7105			},
7106			Bugs: ProtocolBugs{
7107				NoSignatureAlgorithms: true,
7108			},
7109		},
7110		flags: []string{
7111			"-cert-file", path.Join(*resourceDir, ecdsaP256CertificateFile),
7112			"-key-file", path.Join(*resourceDir, ecdsaP256KeyFile),
7113		},
7114	})
7115
7116	testCases = append(testCases, testCase{
7117		testType: serverTest,
7118		name:     "ServerAuth-SHA1-Fallback-ECDSA",
7119		config: Config{
7120			MaxVersion: VersionTLS12,
7121			VerifySignatureAlgorithms: []signatureAlgorithm{
7122				signatureECDSAWithSHA1,
7123			},
7124			Bugs: ProtocolBugs{
7125				NoSignatureAlgorithms: true,
7126			},
7127		},
7128		flags: []string{
7129			"-cert-file", path.Join(*resourceDir, ecdsaP256CertificateFile),
7130			"-key-file", path.Join(*resourceDir, ecdsaP256KeyFile),
7131		},
7132	})
7133
7134	testCases = append(testCases, testCase{
7135		name: "ClientAuth-NoFallback-TLS13",
7136		config: Config{
7137			MaxVersion: VersionTLS13,
7138			ClientAuth: RequireAnyClientCert,
7139			VerifySignatureAlgorithms: []signatureAlgorithm{
7140				signatureRSAPKCS1WithSHA1,
7141			},
7142			Bugs: ProtocolBugs{
7143				NoSignatureAlgorithms: true,
7144			},
7145		},
7146		flags: []string{
7147			"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
7148			"-key-file", path.Join(*resourceDir, rsaKeyFile),
7149		},
7150		shouldFail: true,
7151		// An empty CertificateRequest signature algorithm list is a
7152		// syntax error in TLS 1.3.
7153		expectedError:      ":DECODE_ERROR:",
7154		expectedLocalError: "remote error: error decoding message",
7155	})
7156
7157	testCases = append(testCases, testCase{
7158		testType: serverTest,
7159		name:     "ServerAuth-NoFallback-TLS13",
7160		config: Config{
7161			MaxVersion: VersionTLS13,
7162			VerifySignatureAlgorithms: []signatureAlgorithm{
7163				signatureRSAPKCS1WithSHA1,
7164			},
7165			Bugs: ProtocolBugs{
7166				NoSignatureAlgorithms: true,
7167			},
7168		},
7169		shouldFail:    true,
7170		expectedError: ":NO_COMMON_SIGNATURE_ALGORITHMS:",
7171	})
7172
7173	// Test that hash preferences are enforced. BoringSSL does not implement
7174	// MD5 signatures.
7175	testCases = append(testCases, testCase{
7176		testType: serverTest,
7177		name:     "ClientAuth-Enforced",
7178		config: Config{
7179			MaxVersion:   VersionTLS12,
7180			Certificates: []Certificate{rsaCertificate},
7181			SignSignatureAlgorithms: []signatureAlgorithm{
7182				signatureRSAPKCS1WithMD5,
7183			},
7184			Bugs: ProtocolBugs{
7185				IgnorePeerSignatureAlgorithmPreferences: true,
7186			},
7187		},
7188		flags:         []string{"-require-any-client-certificate"},
7189		shouldFail:    true,
7190		expectedError: ":WRONG_SIGNATURE_TYPE:",
7191	})
7192
7193	testCases = append(testCases, testCase{
7194		name: "ServerAuth-Enforced",
7195		config: Config{
7196			MaxVersion:   VersionTLS12,
7197			CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
7198			SignSignatureAlgorithms: []signatureAlgorithm{
7199				signatureRSAPKCS1WithMD5,
7200			},
7201			Bugs: ProtocolBugs{
7202				IgnorePeerSignatureAlgorithmPreferences: true,
7203			},
7204		},
7205		shouldFail:    true,
7206		expectedError: ":WRONG_SIGNATURE_TYPE:",
7207	})
7208	testCases = append(testCases, testCase{
7209		testType: serverTest,
7210		name:     "ClientAuth-Enforced-TLS13",
7211		config: Config{
7212			MaxVersion:   VersionTLS13,
7213			Certificates: []Certificate{rsaCertificate},
7214			SignSignatureAlgorithms: []signatureAlgorithm{
7215				signatureRSAPKCS1WithMD5,
7216			},
7217			Bugs: ProtocolBugs{
7218				IgnorePeerSignatureAlgorithmPreferences: true,
7219				IgnoreSignatureVersionChecks:            true,
7220			},
7221		},
7222		flags:         []string{"-require-any-client-certificate"},
7223		shouldFail:    true,
7224		expectedError: ":WRONG_SIGNATURE_TYPE:",
7225	})
7226
7227	testCases = append(testCases, testCase{
7228		name: "ServerAuth-Enforced-TLS13",
7229		config: Config{
7230			MaxVersion: VersionTLS13,
7231			SignSignatureAlgorithms: []signatureAlgorithm{
7232				signatureRSAPKCS1WithMD5,
7233			},
7234			Bugs: ProtocolBugs{
7235				IgnorePeerSignatureAlgorithmPreferences: true,
7236				IgnoreSignatureVersionChecks:            true,
7237			},
7238		},
7239		shouldFail:    true,
7240		expectedError: ":WRONG_SIGNATURE_TYPE:",
7241	})
7242
7243	// Test that the agreed upon digest respects the client preferences and
7244	// the server digests.
7245	testCases = append(testCases, testCase{
7246		name: "NoCommonAlgorithms-Digests",
7247		config: Config{
7248			MaxVersion: VersionTLS12,
7249			ClientAuth: RequireAnyClientCert,
7250			VerifySignatureAlgorithms: []signatureAlgorithm{
7251				signatureRSAPKCS1WithSHA512,
7252				signatureRSAPKCS1WithSHA1,
7253			},
7254		},
7255		flags: []string{
7256			"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
7257			"-key-file", path.Join(*resourceDir, rsaKeyFile),
7258			"-digest-prefs", "SHA256",
7259		},
7260		shouldFail:    true,
7261		expectedError: ":NO_COMMON_SIGNATURE_ALGORITHMS:",
7262	})
7263	testCases = append(testCases, testCase{
7264		name: "NoCommonAlgorithms",
7265		config: Config{
7266			MaxVersion: VersionTLS12,
7267			ClientAuth: RequireAnyClientCert,
7268			VerifySignatureAlgorithms: []signatureAlgorithm{
7269				signatureRSAPKCS1WithSHA512,
7270				signatureRSAPKCS1WithSHA1,
7271			},
7272		},
7273		flags: []string{
7274			"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
7275			"-key-file", path.Join(*resourceDir, rsaKeyFile),
7276			"-signing-prefs", strconv.Itoa(int(signatureRSAPKCS1WithSHA256)),
7277		},
7278		shouldFail:    true,
7279		expectedError: ":NO_COMMON_SIGNATURE_ALGORITHMS:",
7280	})
7281	testCases = append(testCases, testCase{
7282		name: "NoCommonAlgorithms-TLS13",
7283		config: Config{
7284			MaxVersion: VersionTLS13,
7285			ClientAuth: RequireAnyClientCert,
7286			VerifySignatureAlgorithms: []signatureAlgorithm{
7287				signatureRSAPSSWithSHA512,
7288				signatureRSAPSSWithSHA384,
7289			},
7290		},
7291		flags: []string{
7292			"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
7293			"-key-file", path.Join(*resourceDir, rsaKeyFile),
7294			"-signing-prefs", strconv.Itoa(int(signatureRSAPSSWithSHA256)),
7295		},
7296		shouldFail:    true,
7297		expectedError: ":NO_COMMON_SIGNATURE_ALGORITHMS:",
7298	})
7299	testCases = append(testCases, testCase{
7300		name: "Agree-Digest-SHA256",
7301		config: Config{
7302			MaxVersion: VersionTLS12,
7303			ClientAuth: RequireAnyClientCert,
7304			VerifySignatureAlgorithms: []signatureAlgorithm{
7305				signatureRSAPKCS1WithSHA1,
7306				signatureRSAPKCS1WithSHA256,
7307			},
7308		},
7309		flags: []string{
7310			"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
7311			"-key-file", path.Join(*resourceDir, rsaKeyFile),
7312			"-digest-prefs", "SHA256,SHA1",
7313		},
7314		expectedPeerSignatureAlgorithm: signatureRSAPKCS1WithSHA256,
7315	})
7316	testCases = append(testCases, testCase{
7317		name: "Agree-Digest-SHA1",
7318		config: Config{
7319			MaxVersion: VersionTLS12,
7320			ClientAuth: RequireAnyClientCert,
7321			VerifySignatureAlgorithms: []signatureAlgorithm{
7322				signatureRSAPKCS1WithSHA1,
7323			},
7324		},
7325		flags: []string{
7326			"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
7327			"-key-file", path.Join(*resourceDir, rsaKeyFile),
7328			"-digest-prefs", "SHA512,SHA256,SHA1",
7329		},
7330		expectedPeerSignatureAlgorithm: signatureRSAPKCS1WithSHA1,
7331	})
7332	testCases = append(testCases, testCase{
7333		name: "Agree-Digest-Default",
7334		config: Config{
7335			MaxVersion: VersionTLS12,
7336			ClientAuth: RequireAnyClientCert,
7337			VerifySignatureAlgorithms: []signatureAlgorithm{
7338				signatureRSAPKCS1WithSHA256,
7339				signatureECDSAWithP256AndSHA256,
7340				signatureRSAPKCS1WithSHA1,
7341				signatureECDSAWithSHA1,
7342			},
7343		},
7344		flags: []string{
7345			"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
7346			"-key-file", path.Join(*resourceDir, rsaKeyFile),
7347		},
7348		expectedPeerSignatureAlgorithm: signatureRSAPKCS1WithSHA256,
7349	})
7350
7351	// Test that the signing preference list may include extra algorithms
7352	// without negotiation problems.
7353	testCases = append(testCases, testCase{
7354		testType: serverTest,
7355		name:     "FilterExtraAlgorithms",
7356		config: Config{
7357			MaxVersion: VersionTLS12,
7358			VerifySignatureAlgorithms: []signatureAlgorithm{
7359				signatureRSAPKCS1WithSHA256,
7360			},
7361		},
7362		flags: []string{
7363			"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
7364			"-key-file", path.Join(*resourceDir, rsaKeyFile),
7365			"-signing-prefs", strconv.Itoa(int(fakeSigAlg1)),
7366			"-signing-prefs", strconv.Itoa(int(signatureECDSAWithP256AndSHA256)),
7367			"-signing-prefs", strconv.Itoa(int(signatureRSAPKCS1WithSHA256)),
7368			"-signing-prefs", strconv.Itoa(int(fakeSigAlg2)),
7369		},
7370		expectedPeerSignatureAlgorithm: signatureRSAPKCS1WithSHA256,
7371	})
7372
7373	// In TLS 1.2 and below, ECDSA uses the curve list rather than the
7374	// signature algorithms.
7375	testCases = append(testCases, testCase{
7376		name: "CheckLeafCurve",
7377		config: Config{
7378			MaxVersion:   VersionTLS12,
7379			CipherSuites: []uint16{TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
7380			Certificates: []Certificate{ecdsaP256Certificate},
7381		},
7382		flags:         []string{"-p384-only"},
7383		shouldFail:    true,
7384		expectedError: ":BAD_ECC_CERT:",
7385	})
7386
7387	// In TLS 1.3, ECDSA does not use the ECDHE curve list.
7388	testCases = append(testCases, testCase{
7389		name: "CheckLeafCurve-TLS13",
7390		config: Config{
7391			MaxVersion:   VersionTLS13,
7392			Certificates: []Certificate{ecdsaP256Certificate},
7393		},
7394		flags: []string{"-p384-only"},
7395	})
7396
7397	// In TLS 1.2, the ECDSA curve is not in the signature algorithm.
7398	testCases = append(testCases, testCase{
7399		name: "ECDSACurveMismatch-Verify-TLS12",
7400		config: Config{
7401			MaxVersion:   VersionTLS12,
7402			CipherSuites: []uint16{TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
7403			Certificates: []Certificate{ecdsaP256Certificate},
7404			SignSignatureAlgorithms: []signatureAlgorithm{
7405				signatureECDSAWithP384AndSHA384,
7406			},
7407		},
7408	})
7409
7410	// In TLS 1.3, the ECDSA curve comes from the signature algorithm.
7411	testCases = append(testCases, testCase{
7412		name: "ECDSACurveMismatch-Verify-TLS13",
7413		config: Config{
7414			MaxVersion:   VersionTLS13,
7415			Certificates: []Certificate{ecdsaP256Certificate},
7416			SignSignatureAlgorithms: []signatureAlgorithm{
7417				signatureECDSAWithP384AndSHA384,
7418			},
7419			Bugs: ProtocolBugs{
7420				SkipECDSACurveCheck: true,
7421			},
7422		},
7423		shouldFail:    true,
7424		expectedError: ":WRONG_SIGNATURE_TYPE:",
7425	})
7426
7427	// Signature algorithm selection in TLS 1.3 should take the curve into
7428	// account.
7429	testCases = append(testCases, testCase{
7430		testType: serverTest,
7431		name:     "ECDSACurveMismatch-Sign-TLS13",
7432		config: Config{
7433			MaxVersion: VersionTLS13,
7434			VerifySignatureAlgorithms: []signatureAlgorithm{
7435				signatureECDSAWithP384AndSHA384,
7436				signatureECDSAWithP256AndSHA256,
7437			},
7438		},
7439		flags: []string{
7440			"-cert-file", path.Join(*resourceDir, ecdsaP256CertificateFile),
7441			"-key-file", path.Join(*resourceDir, ecdsaP256KeyFile),
7442		},
7443		expectedPeerSignatureAlgorithm: signatureECDSAWithP256AndSHA256,
7444	})
7445
7446	// RSASSA-PSS with SHA-512 is too large for 1024-bit RSA. Test that the
7447	// server does not attempt to sign in that case.
7448	testCases = append(testCases, testCase{
7449		testType: serverTest,
7450		name:     "RSA-PSS-Large",
7451		config: Config{
7452			MaxVersion: VersionTLS13,
7453			VerifySignatureAlgorithms: []signatureAlgorithm{
7454				signatureRSAPSSWithSHA512,
7455			},
7456		},
7457		flags: []string{
7458			"-cert-file", path.Join(*resourceDir, rsa1024CertificateFile),
7459			"-key-file", path.Join(*resourceDir, rsa1024KeyFile),
7460		},
7461		shouldFail:    true,
7462		expectedError: ":NO_COMMON_SIGNATURE_ALGORITHMS:",
7463	})
7464
7465	// Test that RSA-PSS is enabled by default for TLS 1.2.
7466	testCases = append(testCases, testCase{
7467		testType: clientTest,
7468		name:     "RSA-PSS-Default-Verify",
7469		config: Config{
7470			MaxVersion: VersionTLS12,
7471			SignSignatureAlgorithms: []signatureAlgorithm{
7472				signatureRSAPSSWithSHA256,
7473			},
7474		},
7475		flags: []string{"-max-version", strconv.Itoa(VersionTLS12)},
7476	})
7477
7478	testCases = append(testCases, testCase{
7479		testType: serverTest,
7480		name:     "RSA-PSS-Default-Sign",
7481		config: Config{
7482			MaxVersion: VersionTLS12,
7483			VerifySignatureAlgorithms: []signatureAlgorithm{
7484				signatureRSAPSSWithSHA256,
7485			},
7486		},
7487		flags: []string{"-max-version", strconv.Itoa(VersionTLS12)},
7488	})
7489
7490	// A server certificate with a P-224 key will only work up to TLS 1.2
7491	// and we only test it with BoringSSL acting as a server because that's
7492	// all Alphabet requires with it.
7493	testCases = append(testCases, testCase{
7494		testType: serverTest,
7495		name:     "P224-Server",
7496		config: Config{
7497			VerifySignatureAlgorithms: []signatureAlgorithm{
7498				// TLS 1.2 does not require that the curve
7499				// match the hash, thus P-256 with SHA-256 is
7500				// the same signature algorithm value as P-224
7501				// with SHA-256.
7502				signatureECDSAWithP256AndSHA256,
7503			},
7504			// P-256 must be offered as well because ECDHE requires
7505			// it.
7506			CurvePreferences: []CurveID{CurveP224, CurveP256},
7507		},
7508		flags: []string{
7509			"-max-version", strconv.Itoa(VersionTLS12),
7510			"-cert-file", path.Join(*resourceDir, ecdsaP224CertificateFile),
7511			"-key-file", path.Join(*resourceDir, ecdsaP224KeyFile),
7512		},
7513	})
7514}
7515
7516// timeouts is the retransmit schedule for BoringSSL. It doubles and
7517// caps at 60 seconds. On the 13th timeout, it gives up.
7518var timeouts = []time.Duration{
7519	1 * time.Second,
7520	2 * time.Second,
7521	4 * time.Second,
7522	8 * time.Second,
7523	16 * time.Second,
7524	32 * time.Second,
7525	60 * time.Second,
7526	60 * time.Second,
7527	60 * time.Second,
7528	60 * time.Second,
7529	60 * time.Second,
7530	60 * time.Second,
7531	60 * time.Second,
7532}
7533
7534// shortTimeouts is an alternate set of timeouts which would occur if the
7535// initial timeout duration was set to 250ms.
7536var shortTimeouts = []time.Duration{
7537	250 * time.Millisecond,
7538	500 * time.Millisecond,
7539	1 * time.Second,
7540	2 * time.Second,
7541	4 * time.Second,
7542	8 * time.Second,
7543	16 * time.Second,
7544	32 * time.Second,
7545	60 * time.Second,
7546	60 * time.Second,
7547	60 * time.Second,
7548	60 * time.Second,
7549	60 * time.Second,
7550}
7551
7552func addDTLSRetransmitTests() {
7553	// These tests work by coordinating some behavior on both the shim and
7554	// the runner.
7555	//
7556	// TimeoutSchedule configures the runner to send a series of timeout
7557	// opcodes to the shim (see packetAdaptor) immediately before reading
7558	// each peer handshake flight N. The timeout opcode both simulates a
7559	// timeout in the shim and acts as a synchronization point to help the
7560	// runner bracket each handshake flight.
7561	//
7562	// We assume the shim does not read from the channel eagerly. It must
7563	// first wait until it has sent flight N and is ready to receive
7564	// handshake flight N+1. At this point, it will process the timeout
7565	// opcode. It must then immediately respond with a timeout ACK and act
7566	// as if the shim was idle for the specified amount of time.
7567	//
7568	// The runner then drops all packets received before the ACK and
7569	// continues waiting for flight N. This ordering results in one attempt
7570	// at sending flight N to be dropped. For the test to complete, the
7571	// shim must send flight N again, testing that the shim implements DTLS
7572	// retransmit on a timeout.
7573
7574	// TODO(davidben): Add DTLS 1.3 versions of these tests. There will
7575	// likely be more epochs to cross and the final message's retransmit may
7576	// be more complex.
7577
7578	// Test that this is indeed the timeout schedule. Stress all
7579	// four patterns of handshake.
7580	for i := 1; i < len(timeouts); i++ {
7581		number := strconv.Itoa(i)
7582		testCases = append(testCases, testCase{
7583			protocol: dtls,
7584			name:     "DTLS-Retransmit-Client-" + number,
7585			config: Config{
7586				MaxVersion: VersionTLS12,
7587				Bugs: ProtocolBugs{
7588					TimeoutSchedule: timeouts[:i],
7589				},
7590			},
7591			resumeSession: true,
7592			flags:         []string{"-async"},
7593		})
7594		testCases = append(testCases, testCase{
7595			protocol: dtls,
7596			testType: serverTest,
7597			name:     "DTLS-Retransmit-Server-" + number,
7598			config: Config{
7599				MaxVersion: VersionTLS12,
7600				Bugs: ProtocolBugs{
7601					TimeoutSchedule: timeouts[:i],
7602				},
7603			},
7604			resumeSession: true,
7605			flags:         []string{"-async"},
7606		})
7607	}
7608
7609	// Test that exceeding the timeout schedule hits a read
7610	// timeout.
7611	testCases = append(testCases, testCase{
7612		protocol: dtls,
7613		name:     "DTLS-Retransmit-Timeout",
7614		config: Config{
7615			MaxVersion: VersionTLS12,
7616			Bugs: ProtocolBugs{
7617				TimeoutSchedule: timeouts,
7618			},
7619		},
7620		resumeSession: true,
7621		flags:         []string{"-async"},
7622		shouldFail:    true,
7623		expectedError: ":READ_TIMEOUT_EXPIRED:",
7624	})
7625
7626	// Test that timeout handling has a fudge factor, due to API
7627	// problems.
7628	testCases = append(testCases, testCase{
7629		protocol: dtls,
7630		name:     "DTLS-Retransmit-Fudge",
7631		config: Config{
7632			MaxVersion: VersionTLS12,
7633			Bugs: ProtocolBugs{
7634				TimeoutSchedule: []time.Duration{
7635					timeouts[0] - 10*time.Millisecond,
7636				},
7637			},
7638		},
7639		resumeSession: true,
7640		flags:         []string{"-async"},
7641	})
7642
7643	// Test that the final Finished retransmitting isn't
7644	// duplicated if the peer badly fragments everything.
7645	testCases = append(testCases, testCase{
7646		testType: serverTest,
7647		protocol: dtls,
7648		name:     "DTLS-Retransmit-Fragmented",
7649		config: Config{
7650			MaxVersion: VersionTLS12,
7651			Bugs: ProtocolBugs{
7652				TimeoutSchedule:          []time.Duration{timeouts[0]},
7653				MaxHandshakeRecordLength: 2,
7654			},
7655		},
7656		flags: []string{"-async"},
7657	})
7658
7659	// Test the timeout schedule when a shorter initial timeout duration is set.
7660	testCases = append(testCases, testCase{
7661		protocol: dtls,
7662		name:     "DTLS-Retransmit-Short-Client",
7663		config: Config{
7664			MaxVersion: VersionTLS12,
7665			Bugs: ProtocolBugs{
7666				TimeoutSchedule: shortTimeouts[:len(shortTimeouts)-1],
7667			},
7668		},
7669		resumeSession: true,
7670		flags: []string{
7671			"-async",
7672			"-initial-timeout-duration-ms", "250",
7673		},
7674	})
7675	testCases = append(testCases, testCase{
7676		protocol: dtls,
7677		testType: serverTest,
7678		name:     "DTLS-Retransmit-Short-Server",
7679		config: Config{
7680			MaxVersion: VersionTLS12,
7681			Bugs: ProtocolBugs{
7682				TimeoutSchedule: shortTimeouts[:len(shortTimeouts)-1],
7683			},
7684		},
7685		resumeSession: true,
7686		flags: []string{
7687			"-async",
7688			"-initial-timeout-duration-ms", "250",
7689		},
7690	})
7691}
7692
7693func addExportKeyingMaterialTests() {
7694	for _, vers := range tlsVersions {
7695		if vers.version == VersionSSL30 {
7696			continue
7697		}
7698		testCases = append(testCases, testCase{
7699			name: "ExportKeyingMaterial-" + vers.name,
7700			config: Config{
7701				MaxVersion: vers.version,
7702			},
7703			exportKeyingMaterial: 1024,
7704			exportLabel:          "label",
7705			exportContext:        "context",
7706			useExportContext:     true,
7707		})
7708		testCases = append(testCases, testCase{
7709			name: "ExportKeyingMaterial-NoContext-" + vers.name,
7710			config: Config{
7711				MaxVersion: vers.version,
7712			},
7713			exportKeyingMaterial: 1024,
7714		})
7715		testCases = append(testCases, testCase{
7716			name: "ExportKeyingMaterial-EmptyContext-" + vers.name,
7717			config: Config{
7718				MaxVersion: vers.version,
7719			},
7720			exportKeyingMaterial: 1024,
7721			useExportContext:     true,
7722		})
7723		testCases = append(testCases, testCase{
7724			name: "ExportKeyingMaterial-Small-" + vers.name,
7725			config: Config{
7726				MaxVersion: vers.version,
7727			},
7728			exportKeyingMaterial: 1,
7729			exportLabel:          "label",
7730			exportContext:        "context",
7731			useExportContext:     true,
7732		})
7733	}
7734
7735	testCases = append(testCases, testCase{
7736		name: "ExportKeyingMaterial-SSL3",
7737		config: Config{
7738			MaxVersion: VersionSSL30,
7739		},
7740		exportKeyingMaterial: 1024,
7741		exportLabel:          "label",
7742		exportContext:        "context",
7743		useExportContext:     true,
7744		shouldFail:           true,
7745		expectedError:        "failed to export keying material",
7746	})
7747
7748	// Exporters work during a False Start.
7749	testCases = append(testCases, testCase{
7750		name: "ExportKeyingMaterial-FalseStart",
7751		config: Config{
7752			MaxVersion:   VersionTLS12,
7753			CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
7754			NextProtos:   []string{"foo"},
7755			Bugs: ProtocolBugs{
7756				ExpectFalseStart: true,
7757			},
7758		},
7759		flags: []string{
7760			"-false-start",
7761			"-advertise-alpn", "\x03foo",
7762		},
7763		shimWritesFirst:      true,
7764		exportKeyingMaterial: 1024,
7765		exportLabel:          "label",
7766		exportContext:        "context",
7767		useExportContext:     true,
7768	})
7769
7770	// Exporters do not work in the middle of a renegotiation. Test this by
7771	// triggering the exporter after every SSL_read call and configuring the
7772	// shim to run asynchronously.
7773	testCases = append(testCases, testCase{
7774		name: "ExportKeyingMaterial-Renegotiate",
7775		config: Config{
7776			MaxVersion: VersionTLS12,
7777		},
7778		renegotiate: 1,
7779		flags: []string{
7780			"-async",
7781			"-use-exporter-between-reads",
7782			"-renegotiate-freely",
7783			"-expect-total-renegotiations", "1",
7784		},
7785		shouldFail:    true,
7786		expectedError: "failed to export keying material",
7787	})
7788}
7789
7790func addTLSUniqueTests() {
7791	for _, isClient := range []bool{false, true} {
7792		for _, isResumption := range []bool{false, true} {
7793			for _, hasEMS := range []bool{false, true} {
7794				var suffix string
7795				if isResumption {
7796					suffix = "Resume-"
7797				} else {
7798					suffix = "Full-"
7799				}
7800
7801				if hasEMS {
7802					suffix += "EMS-"
7803				} else {
7804					suffix += "NoEMS-"
7805				}
7806
7807				if isClient {
7808					suffix += "Client"
7809				} else {
7810					suffix += "Server"
7811				}
7812
7813				test := testCase{
7814					name:          "TLSUnique-" + suffix,
7815					testTLSUnique: true,
7816					config: Config{
7817						MaxVersion: VersionTLS12,
7818						Bugs: ProtocolBugs{
7819							NoExtendedMasterSecret: !hasEMS,
7820						},
7821					},
7822				}
7823
7824				if isResumption {
7825					test.resumeSession = true
7826					test.resumeConfig = &Config{
7827						MaxVersion: VersionTLS12,
7828						Bugs: ProtocolBugs{
7829							NoExtendedMasterSecret: !hasEMS,
7830						},
7831					}
7832				}
7833
7834				if isResumption && !hasEMS {
7835					test.shouldFail = true
7836					test.expectedError = "failed to get tls-unique"
7837				}
7838
7839				testCases = append(testCases, test)
7840			}
7841		}
7842	}
7843}
7844
7845func addCustomExtensionTests() {
7846	expectedContents := "custom extension"
7847	emptyString := ""
7848
7849	for _, isClient := range []bool{false, true} {
7850		suffix := "Server"
7851		flag := "-enable-server-custom-extension"
7852		testType := serverTest
7853		if isClient {
7854			suffix = "Client"
7855			flag = "-enable-client-custom-extension"
7856			testType = clientTest
7857		}
7858
7859		testCases = append(testCases, testCase{
7860			testType: testType,
7861			name:     "CustomExtensions-" + suffix,
7862			config: Config{
7863				MaxVersion: VersionTLS12,
7864				Bugs: ProtocolBugs{
7865					CustomExtension:         expectedContents,
7866					ExpectedCustomExtension: &expectedContents,
7867				},
7868			},
7869			flags: []string{flag},
7870		})
7871		testCases = append(testCases, testCase{
7872			testType: testType,
7873			name:     "CustomExtensions-" + suffix + "-TLS13",
7874			config: Config{
7875				MaxVersion: VersionTLS13,
7876				Bugs: ProtocolBugs{
7877					CustomExtension:         expectedContents,
7878					ExpectedCustomExtension: &expectedContents,
7879				},
7880			},
7881			flags: []string{flag},
7882		})
7883
7884		// 0-RTT is not currently supported with Custom Extensions.
7885		testCases = append(testCases, testCase{
7886			testType: testType,
7887			name:     "CustomExtensions-" + suffix + "-EarlyData",
7888			config: Config{
7889				MaxVersion: VersionTLS13,
7890				Bugs: ProtocolBugs{
7891					CustomExtension:         expectedContents,
7892					ExpectedCustomExtension: &expectedContents,
7893				},
7894			},
7895			shouldFail:    true,
7896			expectedError: ":CUSTOM_EXTENSION_ERROR:",
7897			flags:         []string{flag, "-enable-early-data"},
7898		})
7899
7900		// If the parse callback fails, the handshake should also fail.
7901		testCases = append(testCases, testCase{
7902			testType: testType,
7903			name:     "CustomExtensions-ParseError-" + suffix,
7904			config: Config{
7905				MaxVersion: VersionTLS12,
7906				Bugs: ProtocolBugs{
7907					CustomExtension:         expectedContents + "foo",
7908					ExpectedCustomExtension: &expectedContents,
7909				},
7910			},
7911			flags:         []string{flag},
7912			shouldFail:    true,
7913			expectedError: ":CUSTOM_EXTENSION_ERROR:",
7914		})
7915		testCases = append(testCases, testCase{
7916			testType: testType,
7917			name:     "CustomExtensions-ParseError-" + suffix + "-TLS13",
7918			config: Config{
7919				MaxVersion: VersionTLS13,
7920				Bugs: ProtocolBugs{
7921					CustomExtension:         expectedContents + "foo",
7922					ExpectedCustomExtension: &expectedContents,
7923				},
7924			},
7925			flags:         []string{flag},
7926			shouldFail:    true,
7927			expectedError: ":CUSTOM_EXTENSION_ERROR:",
7928		})
7929
7930		// If the add callback fails, the handshake should also fail.
7931		testCases = append(testCases, testCase{
7932			testType: testType,
7933			name:     "CustomExtensions-FailAdd-" + suffix,
7934			config: Config{
7935				MaxVersion: VersionTLS12,
7936				Bugs: ProtocolBugs{
7937					CustomExtension:         expectedContents,
7938					ExpectedCustomExtension: &expectedContents,
7939				},
7940			},
7941			flags:         []string{flag, "-custom-extension-fail-add"},
7942			shouldFail:    true,
7943			expectedError: ":CUSTOM_EXTENSION_ERROR:",
7944		})
7945		testCases = append(testCases, testCase{
7946			testType: testType,
7947			name:     "CustomExtensions-FailAdd-" + suffix + "-TLS13",
7948			config: Config{
7949				MaxVersion: VersionTLS13,
7950				Bugs: ProtocolBugs{
7951					CustomExtension:         expectedContents,
7952					ExpectedCustomExtension: &expectedContents,
7953				},
7954			},
7955			flags:         []string{flag, "-custom-extension-fail-add"},
7956			shouldFail:    true,
7957			expectedError: ":CUSTOM_EXTENSION_ERROR:",
7958		})
7959
7960		// If the add callback returns zero, no extension should be
7961		// added.
7962		skipCustomExtension := expectedContents
7963		if isClient {
7964			// For the case where the client skips sending the
7965			// custom extension, the server must not “echo” it.
7966			skipCustomExtension = ""
7967		}
7968		testCases = append(testCases, testCase{
7969			testType: testType,
7970			name:     "CustomExtensions-Skip-" + suffix,
7971			config: Config{
7972				MaxVersion: VersionTLS12,
7973				Bugs: ProtocolBugs{
7974					CustomExtension:         skipCustomExtension,
7975					ExpectedCustomExtension: &emptyString,
7976				},
7977			},
7978			flags: []string{flag, "-custom-extension-skip"},
7979		})
7980		testCases = append(testCases, testCase{
7981			testType: testType,
7982			name:     "CustomExtensions-Skip-" + suffix + "-TLS13",
7983			config: Config{
7984				MaxVersion: VersionTLS13,
7985				Bugs: ProtocolBugs{
7986					CustomExtension:         skipCustomExtension,
7987					ExpectedCustomExtension: &emptyString,
7988				},
7989			},
7990			flags: []string{flag, "-custom-extension-skip"},
7991		})
7992	}
7993
7994	// The custom extension add callback should not be called if the client
7995	// doesn't send the extension.
7996	testCases = append(testCases, testCase{
7997		testType: serverTest,
7998		name:     "CustomExtensions-NotCalled-Server",
7999		config: Config{
8000			MaxVersion: VersionTLS12,
8001			Bugs: ProtocolBugs{
8002				ExpectedCustomExtension: &emptyString,
8003			},
8004		},
8005		flags: []string{"-enable-server-custom-extension", "-custom-extension-fail-add"},
8006	})
8007
8008	testCases = append(testCases, testCase{
8009		testType: serverTest,
8010		name:     "CustomExtensions-NotCalled-Server-TLS13",
8011		config: Config{
8012			MaxVersion: VersionTLS13,
8013			Bugs: ProtocolBugs{
8014				ExpectedCustomExtension: &emptyString,
8015			},
8016		},
8017		flags: []string{"-enable-server-custom-extension", "-custom-extension-fail-add"},
8018	})
8019
8020	// Test an unknown extension from the server.
8021	testCases = append(testCases, testCase{
8022		testType: clientTest,
8023		name:     "UnknownExtension-Client",
8024		config: Config{
8025			MaxVersion: VersionTLS12,
8026			Bugs: ProtocolBugs{
8027				CustomExtension: expectedContents,
8028			},
8029		},
8030		shouldFail:         true,
8031		expectedError:      ":UNEXPECTED_EXTENSION:",
8032		expectedLocalError: "remote error: unsupported extension",
8033	})
8034	testCases = append(testCases, testCase{
8035		testType: clientTest,
8036		name:     "UnknownExtension-Client-TLS13",
8037		config: Config{
8038			MaxVersion: VersionTLS13,
8039			Bugs: ProtocolBugs{
8040				CustomExtension: expectedContents,
8041			},
8042		},
8043		shouldFail:         true,
8044		expectedError:      ":UNEXPECTED_EXTENSION:",
8045		expectedLocalError: "remote error: unsupported extension",
8046	})
8047	testCases = append(testCases, testCase{
8048		testType: clientTest,
8049		name:     "UnknownUnencryptedExtension-Client-TLS13",
8050		config: Config{
8051			MaxVersion: VersionTLS13,
8052			Bugs: ProtocolBugs{
8053				CustomUnencryptedExtension: expectedContents,
8054			},
8055		},
8056		shouldFail:    true,
8057		expectedError: ":UNEXPECTED_EXTENSION:",
8058		// The shim must send an alert, but alerts at this point do not
8059		// get successfully decrypted by the runner.
8060		expectedLocalError: "local error: bad record MAC",
8061	})
8062	testCases = append(testCases, testCase{
8063		testType: clientTest,
8064		name:     "UnexpectedUnencryptedExtension-Client-TLS13",
8065		config: Config{
8066			MaxVersion: VersionTLS13,
8067			Bugs: ProtocolBugs{
8068				SendUnencryptedALPN: "foo",
8069			},
8070		},
8071		flags: []string{
8072			"-advertise-alpn", "\x03foo\x03bar",
8073		},
8074		shouldFail:    true,
8075		expectedError: ":UNEXPECTED_EXTENSION:",
8076		// The shim must send an alert, but alerts at this point do not
8077		// get successfully decrypted by the runner.
8078		expectedLocalError: "local error: bad record MAC",
8079	})
8080
8081	// Test a known but unoffered extension from the server.
8082	testCases = append(testCases, testCase{
8083		testType: clientTest,
8084		name:     "UnofferedExtension-Client",
8085		config: Config{
8086			MaxVersion: VersionTLS12,
8087			Bugs: ProtocolBugs{
8088				SendALPN: "alpn",
8089			},
8090		},
8091		shouldFail:         true,
8092		expectedError:      ":UNEXPECTED_EXTENSION:",
8093		expectedLocalError: "remote error: unsupported extension",
8094	})
8095	testCases = append(testCases, testCase{
8096		testType: clientTest,
8097		name:     "UnofferedExtension-Client-TLS13",
8098		config: Config{
8099			MaxVersion: VersionTLS13,
8100			Bugs: ProtocolBugs{
8101				SendALPN: "alpn",
8102			},
8103		},
8104		shouldFail:         true,
8105		expectedError:      ":UNEXPECTED_EXTENSION:",
8106		expectedLocalError: "remote error: unsupported extension",
8107	})
8108}
8109
8110func addRSAClientKeyExchangeTests() {
8111	for bad := RSABadValue(1); bad < NumRSABadValues; bad++ {
8112		testCases = append(testCases, testCase{
8113			testType: serverTest,
8114			name:     fmt.Sprintf("BadRSAClientKeyExchange-%d", bad),
8115			config: Config{
8116				// Ensure the ClientHello version and final
8117				// version are different, to detect if the
8118				// server uses the wrong one.
8119				MaxVersion:   VersionTLS11,
8120				CipherSuites: []uint16{TLS_RSA_WITH_3DES_EDE_CBC_SHA},
8121				Bugs: ProtocolBugs{
8122					BadRSAClientKeyExchange: bad,
8123				},
8124			},
8125			shouldFail:    true,
8126			expectedError: ":DECRYPTION_FAILED_OR_BAD_RECORD_MAC:",
8127		})
8128	}
8129
8130	// The server must compare whatever was in ClientHello.version for the
8131	// RSA premaster.
8132	testCases = append(testCases, testCase{
8133		testType: serverTest,
8134		name:     "SendClientVersion-RSA",
8135		config: Config{
8136			CipherSuites: []uint16{TLS_RSA_WITH_AES_128_GCM_SHA256},
8137			Bugs: ProtocolBugs{
8138				SendClientVersion: 0x1234,
8139			},
8140		},
8141		flags: []string{"-max-version", strconv.Itoa(VersionTLS12)},
8142	})
8143}
8144
8145var testCurves = []struct {
8146	name string
8147	id   CurveID
8148}{
8149	{"P-256", CurveP256},
8150	{"P-384", CurveP384},
8151	{"P-521", CurveP521},
8152	{"X25519", CurveX25519},
8153}
8154
8155const bogusCurve = 0x1234
8156
8157func addCurveTests() {
8158	for _, curve := range testCurves {
8159		testCases = append(testCases, testCase{
8160			name: "CurveTest-Client-" + curve.name,
8161			config: Config{
8162				MaxVersion:       VersionTLS12,
8163				CipherSuites:     []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
8164				CurvePreferences: []CurveID{curve.id},
8165			},
8166			flags: []string{
8167				"-enable-all-curves",
8168				"-expect-curve-id", strconv.Itoa(int(curve.id)),
8169			},
8170			expectedCurveID: curve.id,
8171		})
8172		testCases = append(testCases, testCase{
8173			name: "CurveTest-Client-" + curve.name + "-TLS13",
8174			config: Config{
8175				MaxVersion:       VersionTLS13,
8176				CurvePreferences: []CurveID{curve.id},
8177			},
8178			flags: []string{
8179				"-enable-all-curves",
8180				"-expect-curve-id", strconv.Itoa(int(curve.id)),
8181			},
8182			expectedCurveID: curve.id,
8183		})
8184		testCases = append(testCases, testCase{
8185			testType: serverTest,
8186			name:     "CurveTest-Server-" + curve.name,
8187			config: Config{
8188				MaxVersion:       VersionTLS12,
8189				CipherSuites:     []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
8190				CurvePreferences: []CurveID{curve.id},
8191			},
8192			flags: []string{
8193				"-enable-all-curves",
8194				"-expect-curve-id", strconv.Itoa(int(curve.id)),
8195			},
8196			expectedCurveID: curve.id,
8197		})
8198		testCases = append(testCases, testCase{
8199			testType: serverTest,
8200			name:     "CurveTest-Server-" + curve.name + "-TLS13",
8201			config: Config{
8202				MaxVersion:       VersionTLS13,
8203				CurvePreferences: []CurveID{curve.id},
8204			},
8205			flags: []string{
8206				"-enable-all-curves",
8207				"-expect-curve-id", strconv.Itoa(int(curve.id)),
8208			},
8209			expectedCurveID: curve.id,
8210		})
8211	}
8212
8213	// The server must be tolerant to bogus curves.
8214	testCases = append(testCases, testCase{
8215		testType: serverTest,
8216		name:     "UnknownCurve",
8217		config: Config{
8218			MaxVersion:       VersionTLS12,
8219			CipherSuites:     []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
8220			CurvePreferences: []CurveID{bogusCurve, CurveP256},
8221		},
8222	})
8223
8224	// The server must be tolerant to bogus curves.
8225	testCases = append(testCases, testCase{
8226		testType: serverTest,
8227		name:     "UnknownCurve-TLS13",
8228		config: Config{
8229			MaxVersion:       VersionTLS13,
8230			CurvePreferences: []CurveID{bogusCurve, CurveP256},
8231		},
8232	})
8233
8234	// The server must not consider ECDHE ciphers when there are no
8235	// supported curves.
8236	testCases = append(testCases, testCase{
8237		testType: serverTest,
8238		name:     "NoSupportedCurves",
8239		config: Config{
8240			MaxVersion:   VersionTLS12,
8241			CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
8242			Bugs: ProtocolBugs{
8243				NoSupportedCurves: true,
8244			},
8245		},
8246		shouldFail:    true,
8247		expectedError: ":NO_SHARED_CIPHER:",
8248	})
8249	testCases = append(testCases, testCase{
8250		testType: serverTest,
8251		name:     "NoSupportedCurves-TLS13",
8252		config: Config{
8253			MaxVersion: VersionTLS13,
8254			Bugs: ProtocolBugs{
8255				NoSupportedCurves: true,
8256			},
8257		},
8258		shouldFail:    true,
8259		expectedError: ":NO_SHARED_GROUP:",
8260	})
8261
8262	// The server must fall back to another cipher when there are no
8263	// supported curves.
8264	testCases = append(testCases, testCase{
8265		testType: serverTest,
8266		name:     "NoCommonCurves",
8267		config: Config{
8268			MaxVersion: VersionTLS12,
8269			CipherSuites: []uint16{
8270				TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
8271				TLS_RSA_WITH_AES_128_GCM_SHA256,
8272			},
8273			CurvePreferences: []CurveID{CurveP224},
8274		},
8275		expectedCipher: TLS_RSA_WITH_AES_128_GCM_SHA256,
8276	})
8277
8278	// The client must reject bogus curves and disabled curves.
8279	testCases = append(testCases, testCase{
8280		name: "BadECDHECurve",
8281		config: Config{
8282			MaxVersion:   VersionTLS12,
8283			CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
8284			Bugs: ProtocolBugs{
8285				SendCurve: bogusCurve,
8286			},
8287		},
8288		shouldFail:    true,
8289		expectedError: ":WRONG_CURVE:",
8290	})
8291	testCases = append(testCases, testCase{
8292		name: "BadECDHECurve-TLS13",
8293		config: Config{
8294			MaxVersion: VersionTLS13,
8295			Bugs: ProtocolBugs{
8296				SendCurve: bogusCurve,
8297			},
8298		},
8299		shouldFail:    true,
8300		expectedError: ":WRONG_CURVE:",
8301	})
8302
8303	testCases = append(testCases, testCase{
8304		name: "UnsupportedCurve",
8305		config: Config{
8306			MaxVersion:       VersionTLS12,
8307			CipherSuites:     []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
8308			CurvePreferences: []CurveID{CurveP256},
8309			Bugs: ProtocolBugs{
8310				IgnorePeerCurvePreferences: true,
8311			},
8312		},
8313		flags:         []string{"-p384-only"},
8314		shouldFail:    true,
8315		expectedError: ":WRONG_CURVE:",
8316	})
8317
8318	testCases = append(testCases, testCase{
8319		// TODO(davidben): Add a TLS 1.3 version where
8320		// HelloRetryRequest requests an unsupported curve.
8321		name: "UnsupportedCurve-ServerHello-TLS13",
8322		config: Config{
8323			MaxVersion:       VersionTLS13,
8324			CurvePreferences: []CurveID{CurveP384},
8325			Bugs: ProtocolBugs{
8326				SendCurve: CurveP256,
8327			},
8328		},
8329		flags:         []string{"-p384-only"},
8330		shouldFail:    true,
8331		expectedError: ":WRONG_CURVE:",
8332	})
8333
8334	// Test invalid curve points.
8335	testCases = append(testCases, testCase{
8336		name: "InvalidECDHPoint-Client",
8337		config: Config{
8338			MaxVersion:       VersionTLS12,
8339			CipherSuites:     []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
8340			CurvePreferences: []CurveID{CurveP256},
8341			Bugs: ProtocolBugs{
8342				InvalidECDHPoint: true,
8343			},
8344		},
8345		shouldFail:    true,
8346		expectedError: ":INVALID_ENCODING:",
8347	})
8348	testCases = append(testCases, testCase{
8349		name: "InvalidECDHPoint-Client-TLS13",
8350		config: Config{
8351			MaxVersion:       VersionTLS13,
8352			CurvePreferences: []CurveID{CurveP256},
8353			Bugs: ProtocolBugs{
8354				InvalidECDHPoint: true,
8355			},
8356		},
8357		shouldFail:    true,
8358		expectedError: ":INVALID_ENCODING:",
8359	})
8360	testCases = append(testCases, testCase{
8361		testType: serverTest,
8362		name:     "InvalidECDHPoint-Server",
8363		config: Config{
8364			MaxVersion:       VersionTLS12,
8365			CipherSuites:     []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
8366			CurvePreferences: []CurveID{CurveP256},
8367			Bugs: ProtocolBugs{
8368				InvalidECDHPoint: true,
8369			},
8370		},
8371		shouldFail:    true,
8372		expectedError: ":INVALID_ENCODING:",
8373	})
8374	testCases = append(testCases, testCase{
8375		testType: serverTest,
8376		name:     "InvalidECDHPoint-Server-TLS13",
8377		config: Config{
8378			MaxVersion:       VersionTLS13,
8379			CurvePreferences: []CurveID{CurveP256},
8380			Bugs: ProtocolBugs{
8381				InvalidECDHPoint: true,
8382			},
8383		},
8384		shouldFail:    true,
8385		expectedError: ":INVALID_ENCODING:",
8386	})
8387
8388	// The previous curve ID should be reported on TLS 1.2 resumption.
8389	testCases = append(testCases, testCase{
8390		name: "CurveID-Resume-Client",
8391		config: Config{
8392			MaxVersion:       VersionTLS12,
8393			CipherSuites:     []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
8394			CurvePreferences: []CurveID{CurveX25519},
8395		},
8396		flags:         []string{"-expect-curve-id", strconv.Itoa(int(CurveX25519))},
8397		resumeSession: true,
8398	})
8399	testCases = append(testCases, testCase{
8400		testType: serverTest,
8401		name:     "CurveID-Resume-Server",
8402		config: Config{
8403			MaxVersion:       VersionTLS12,
8404			CipherSuites:     []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
8405			CurvePreferences: []CurveID{CurveX25519},
8406		},
8407		flags:         []string{"-expect-curve-id", strconv.Itoa(int(CurveX25519))},
8408		resumeSession: true,
8409	})
8410
8411	// TLS 1.3 allows resuming at a differet curve. If this happens, the new
8412	// one should be reported.
8413	testCases = append(testCases, testCase{
8414		name: "CurveID-Resume-Client-TLS13",
8415		config: Config{
8416			MaxVersion:       VersionTLS13,
8417			CurvePreferences: []CurveID{CurveX25519},
8418		},
8419		resumeConfig: &Config{
8420			MaxVersion:       VersionTLS13,
8421			CurvePreferences: []CurveID{CurveP256},
8422		},
8423		flags: []string{
8424			"-expect-curve-id", strconv.Itoa(int(CurveX25519)),
8425			"-expect-resume-curve-id", strconv.Itoa(int(CurveP256)),
8426		},
8427		resumeSession: true,
8428	})
8429	testCases = append(testCases, testCase{
8430		testType: serverTest,
8431		name:     "CurveID-Resume-Server-TLS13",
8432		config: Config{
8433			MaxVersion:       VersionTLS13,
8434			CurvePreferences: []CurveID{CurveX25519},
8435		},
8436		resumeConfig: &Config{
8437			MaxVersion:       VersionTLS13,
8438			CurvePreferences: []CurveID{CurveP256},
8439		},
8440		flags: []string{
8441			"-expect-curve-id", strconv.Itoa(int(CurveX25519)),
8442			"-expect-resume-curve-id", strconv.Itoa(int(CurveP256)),
8443		},
8444		resumeSession: true,
8445	})
8446
8447	// Server-sent point formats are legal in TLS 1.2, but not in TLS 1.3.
8448	testCases = append(testCases, testCase{
8449		name: "PointFormat-ServerHello-TLS12",
8450		config: Config{
8451			MaxVersion: VersionTLS12,
8452			Bugs: ProtocolBugs{
8453				SendSupportedPointFormats: []byte{pointFormatUncompressed},
8454			},
8455		},
8456	})
8457	testCases = append(testCases, testCase{
8458		name: "PointFormat-EncryptedExtensions-TLS13",
8459		config: Config{
8460			MaxVersion: VersionTLS13,
8461			Bugs: ProtocolBugs{
8462				SendSupportedPointFormats: []byte{pointFormatUncompressed},
8463			},
8464		},
8465		shouldFail:    true,
8466		expectedError: ":ERROR_PARSING_EXTENSION:",
8467	})
8468
8469	// Test that we tolerate unknown point formats, as long as
8470	// pointFormatUncompressed is present. Limit ciphers to ECDHE ciphers to
8471	// check they are still functional.
8472	testCases = append(testCases, testCase{
8473		name: "PointFormat-Client-Tolerance",
8474		config: Config{
8475			MaxVersion: VersionTLS12,
8476			Bugs: ProtocolBugs{
8477				SendSupportedPointFormats: []byte{42, pointFormatUncompressed, 99, pointFormatCompressedPrime},
8478			},
8479		},
8480	})
8481	testCases = append(testCases, testCase{
8482		testType: serverTest,
8483		name:     "PointFormat-Server-Tolerance",
8484		config: Config{
8485			MaxVersion:   VersionTLS12,
8486			CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256},
8487			Bugs: ProtocolBugs{
8488				SendSupportedPointFormats: []byte{42, pointFormatUncompressed, 99, pointFormatCompressedPrime},
8489			},
8490		},
8491	})
8492
8493	// Test TLS 1.2 does not require the point format extension to be
8494	// present.
8495	testCases = append(testCases, testCase{
8496		name: "PointFormat-Client-Missing",
8497		config: Config{
8498			MaxVersion:   VersionTLS12,
8499			CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256},
8500			Bugs: ProtocolBugs{
8501				SendSupportedPointFormats: []byte{},
8502			},
8503		},
8504	})
8505	testCases = append(testCases, testCase{
8506		testType: serverTest,
8507		name:     "PointFormat-Server-Missing",
8508		config: Config{
8509			MaxVersion:   VersionTLS12,
8510			CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256},
8511			Bugs: ProtocolBugs{
8512				SendSupportedPointFormats: []byte{},
8513			},
8514		},
8515	})
8516
8517	// If the point format extension is present, uncompressed points must be
8518	// offered. BoringSSL requires this whether or not ECDHE is used.
8519	testCases = append(testCases, testCase{
8520		name: "PointFormat-Client-MissingUncompressed",
8521		config: Config{
8522			MaxVersion: VersionTLS12,
8523			Bugs: ProtocolBugs{
8524				SendSupportedPointFormats: []byte{pointFormatCompressedPrime},
8525			},
8526		},
8527		shouldFail:    true,
8528		expectedError: ":ERROR_PARSING_EXTENSION:",
8529	})
8530	testCases = append(testCases, testCase{
8531		testType: serverTest,
8532		name:     "PointFormat-Server-MissingUncompressed",
8533		config: Config{
8534			MaxVersion: VersionTLS12,
8535			Bugs: ProtocolBugs{
8536				SendSupportedPointFormats: []byte{pointFormatCompressedPrime},
8537			},
8538		},
8539		shouldFail:    true,
8540		expectedError: ":ERROR_PARSING_EXTENSION:",
8541	})
8542}
8543
8544func addTLS13RecordTests() {
8545	testCases = append(testCases, testCase{
8546		name: "TLS13-RecordPadding",
8547		config: Config{
8548			MaxVersion: VersionTLS13,
8549			MinVersion: VersionTLS13,
8550			Bugs: ProtocolBugs{
8551				RecordPadding: 10,
8552			},
8553		},
8554	})
8555
8556	testCases = append(testCases, testCase{
8557		name: "TLS13-EmptyRecords",
8558		config: Config{
8559			MaxVersion: VersionTLS13,
8560			MinVersion: VersionTLS13,
8561			Bugs: ProtocolBugs{
8562				OmitRecordContents: true,
8563			},
8564		},
8565		shouldFail:    true,
8566		expectedError: ":DECRYPTION_FAILED_OR_BAD_RECORD_MAC:",
8567	})
8568
8569	testCases = append(testCases, testCase{
8570		name: "TLS13-OnlyPadding",
8571		config: Config{
8572			MaxVersion: VersionTLS13,
8573			MinVersion: VersionTLS13,
8574			Bugs: ProtocolBugs{
8575				OmitRecordContents: true,
8576				RecordPadding:      10,
8577			},
8578		},
8579		shouldFail:    true,
8580		expectedError: ":DECRYPTION_FAILED_OR_BAD_RECORD_MAC:",
8581	})
8582
8583	testCases = append(testCases, testCase{
8584		name: "TLS13-WrongOuterRecord",
8585		config: Config{
8586			MaxVersion: VersionTLS13,
8587			MinVersion: VersionTLS13,
8588			Bugs: ProtocolBugs{
8589				OuterRecordType: recordTypeHandshake,
8590			},
8591		},
8592		shouldFail:    true,
8593		expectedError: ":INVALID_OUTER_RECORD_TYPE:",
8594	})
8595}
8596
8597func addSessionTicketTests() {
8598	testCases = append(testCases, testCase{
8599		// In TLS 1.2 and below, empty NewSessionTicket messages
8600		// mean the server changed its mind on sending a ticket.
8601		name: "SendEmptySessionTicket",
8602		config: Config{
8603			MaxVersion: VersionTLS12,
8604			Bugs: ProtocolBugs{
8605				SendEmptySessionTicket: true,
8606			},
8607		},
8608		flags: []string{"-expect-no-session"},
8609	})
8610
8611	// Test that the server ignores unknown PSK modes.
8612	testCases = append(testCases, testCase{
8613		testType: serverTest,
8614		name:     "TLS13-SendUnknownModeSessionTicket-Server",
8615		config: Config{
8616			MaxVersion: VersionTLS13,
8617			Bugs: ProtocolBugs{
8618				SendPSKKeyExchangeModes: []byte{0x1a, pskDHEKEMode, 0x2a},
8619			},
8620		},
8621		resumeSession:         true,
8622		expectedResumeVersion: VersionTLS13,
8623	})
8624
8625	// Test that the server does not send session tickets with no matching key exchange mode.
8626	testCases = append(testCases, testCase{
8627		testType: serverTest,
8628		name:     "TLS13-ExpectNoSessionTicketOnBadKEMode-Server",
8629		config: Config{
8630			MaxVersion: VersionTLS13,
8631			Bugs: ProtocolBugs{
8632				SendPSKKeyExchangeModes:  []byte{0x1a},
8633				ExpectNoNewSessionTicket: true,
8634			},
8635		},
8636	})
8637
8638	// Test that the server does not accept a session with no matching key exchange mode.
8639	testCases = append(testCases, testCase{
8640		testType: serverTest,
8641		name:     "TLS13-SendBadKEModeSessionTicket-Server",
8642		config: Config{
8643			MaxVersion: VersionTLS13,
8644		},
8645		resumeConfig: &Config{
8646			MaxVersion: VersionTLS13,
8647			Bugs: ProtocolBugs{
8648				SendPSKKeyExchangeModes: []byte{0x1a},
8649			},
8650		},
8651		resumeSession:        true,
8652		expectResumeRejected: true,
8653	})
8654
8655	// Test that the client ticket age is sent correctly.
8656	testCases = append(testCases, testCase{
8657		testType: clientTest,
8658		name:     "TLS13-TestValidTicketAge-Client",
8659		config: Config{
8660			MaxVersion: VersionTLS13,
8661			Bugs: ProtocolBugs{
8662				ExpectTicketAge: 10 * time.Second,
8663			},
8664		},
8665		resumeSession: true,
8666		flags: []string{
8667			"-resumption-delay", "10",
8668		},
8669	})
8670
8671	// Test that the client ticket age is enforced.
8672	testCases = append(testCases, testCase{
8673		testType: clientTest,
8674		name:     "TLS13-TestBadTicketAge-Client",
8675		config: Config{
8676			MaxVersion: VersionTLS13,
8677			Bugs: ProtocolBugs{
8678				ExpectTicketAge: 1000 * time.Second,
8679			},
8680		},
8681		resumeSession:      true,
8682		shouldFail:         true,
8683		expectedLocalError: "tls: invalid ticket age",
8684	})
8685
8686	// Test that the server's ticket age skew reporting works.
8687	testCases = append(testCases, testCase{
8688		testType: serverTest,
8689		name:     "TLS13-TicketAgeSkew-Forward",
8690		config: Config{
8691			MaxVersion: VersionTLS13,
8692			Bugs: ProtocolBugs{
8693				SendTicketAge: 15 * time.Second,
8694			},
8695		},
8696		resumeSession:        true,
8697		resumeRenewedSession: true,
8698		flags: []string{
8699			"-resumption-delay", "10",
8700			"-expect-ticket-age-skew", "5",
8701		},
8702	})
8703	testCases = append(testCases, testCase{
8704		testType: serverTest,
8705		name:     "TLS13-TicketAgeSkew-Backward",
8706		config: Config{
8707			MaxVersion: VersionTLS13,
8708			Bugs: ProtocolBugs{
8709				SendTicketAge: 5 * time.Second,
8710			},
8711		},
8712		resumeSession:        true,
8713		resumeRenewedSession: true,
8714		flags: []string{
8715			"-resumption-delay", "10",
8716			"-expect-ticket-age-skew", "-5",
8717		},
8718	})
8719
8720	testCases = append(testCases, testCase{
8721		testType: clientTest,
8722		name:     "TLS13-SendTicketEarlyDataInfo",
8723		config: Config{
8724			MaxVersion:       VersionTLS13,
8725			MaxEarlyDataSize: 16384,
8726		},
8727		flags: []string{
8728			"-enable-early-data",
8729			"-expect-early-data-info",
8730		},
8731	})
8732
8733	// Test that 0-RTT tickets are ignored in clients unless opted in.
8734	testCases = append(testCases, testCase{
8735		testType: clientTest,
8736		name:     "TLS13-SendTicketEarlyDataInfo-Disabled",
8737		config: Config{
8738			MaxVersion:       VersionTLS13,
8739			MaxEarlyDataSize: 16384,
8740		},
8741	})
8742
8743	testCases = append(testCases, testCase{
8744		testType: clientTest,
8745		name:     "TLS13-DuplicateTicketEarlyDataInfo",
8746		config: Config{
8747			MaxVersion:       VersionTLS13,
8748			MaxEarlyDataSize: 16384,
8749			Bugs: ProtocolBugs{
8750				DuplicateTicketEarlyDataInfo: true,
8751			},
8752		},
8753		shouldFail:         true,
8754		expectedError:      ":DUPLICATE_EXTENSION:",
8755		expectedLocalError: "remote error: illegal parameter",
8756	})
8757
8758	testCases = append(testCases, testCase{
8759		testType: serverTest,
8760		name:     "TLS13-ExpectTicketEarlyDataInfo",
8761		config: Config{
8762			MaxVersion: VersionTLS13,
8763			Bugs: ProtocolBugs{
8764				ExpectTicketEarlyDataInfo: true,
8765			},
8766		},
8767		flags: []string{
8768			"-enable-early-data",
8769		},
8770	})
8771
8772	// Test that, in TLS 1.3, the server-offered NewSessionTicket lifetime
8773	// is honored.
8774	testCases = append(testCases, testCase{
8775		testType: clientTest,
8776		name:     "TLS13-HonorServerSessionTicketLifetime",
8777		config: Config{
8778			MaxVersion: VersionTLS13,
8779			Bugs: ProtocolBugs{
8780				SendTicketLifetime: 20 * time.Second,
8781			},
8782		},
8783		flags: []string{
8784			"-resumption-delay", "19",
8785		},
8786		resumeSession: true,
8787	})
8788	testCases = append(testCases, testCase{
8789		testType: clientTest,
8790		name:     "TLS13-HonorServerSessionTicketLifetime-2",
8791		config: Config{
8792			MaxVersion: VersionTLS13,
8793			Bugs: ProtocolBugs{
8794				SendTicketLifetime: 20 * time.Second,
8795				// The client should not offer the expired session.
8796				ExpectNoTLS13PSK: true,
8797			},
8798		},
8799		flags: []string{
8800			"-resumption-delay", "21",
8801		},
8802		resumeSession:        true,
8803		expectResumeRejected: true,
8804	})
8805}
8806
8807func addChangeCipherSpecTests() {
8808	// Test missing ChangeCipherSpecs.
8809	testCases = append(testCases, testCase{
8810		name: "SkipChangeCipherSpec-Client",
8811		config: Config{
8812			MaxVersion: VersionTLS12,
8813			Bugs: ProtocolBugs{
8814				SkipChangeCipherSpec: true,
8815			},
8816		},
8817		shouldFail:    true,
8818		expectedError: ":UNEXPECTED_RECORD:",
8819	})
8820	testCases = append(testCases, testCase{
8821		testType: serverTest,
8822		name:     "SkipChangeCipherSpec-Server",
8823		config: Config{
8824			MaxVersion: VersionTLS12,
8825			Bugs: ProtocolBugs{
8826				SkipChangeCipherSpec: true,
8827			},
8828		},
8829		shouldFail:    true,
8830		expectedError: ":UNEXPECTED_RECORD:",
8831	})
8832	testCases = append(testCases, testCase{
8833		testType: serverTest,
8834		name:     "SkipChangeCipherSpec-Server-NPN",
8835		config: Config{
8836			MaxVersion: VersionTLS12,
8837			NextProtos: []string{"bar"},
8838			Bugs: ProtocolBugs{
8839				SkipChangeCipherSpec: true,
8840			},
8841		},
8842		flags: []string{
8843			"-advertise-npn", "\x03foo\x03bar\x03baz",
8844		},
8845		shouldFail:    true,
8846		expectedError: ":UNEXPECTED_RECORD:",
8847	})
8848
8849	// Test synchronization between the handshake and ChangeCipherSpec.
8850	// Partial post-CCS handshake messages before ChangeCipherSpec should be
8851	// rejected. Test both with and without handshake packing to handle both
8852	// when the partial post-CCS message is in its own record and when it is
8853	// attached to the pre-CCS message.
8854	for _, packed := range []bool{false, true} {
8855		var suffix string
8856		if packed {
8857			suffix = "-Packed"
8858		}
8859
8860		testCases = append(testCases, testCase{
8861			name: "FragmentAcrossChangeCipherSpec-Client" + suffix,
8862			config: Config{
8863				MaxVersion: VersionTLS12,
8864				Bugs: ProtocolBugs{
8865					FragmentAcrossChangeCipherSpec: true,
8866					PackHandshakeFlight:            packed,
8867				},
8868			},
8869			shouldFail:    true,
8870			expectedError: ":UNEXPECTED_RECORD:",
8871		})
8872		testCases = append(testCases, testCase{
8873			name: "FragmentAcrossChangeCipherSpec-Client-Resume" + suffix,
8874			config: Config{
8875				MaxVersion: VersionTLS12,
8876			},
8877			resumeSession: true,
8878			resumeConfig: &Config{
8879				MaxVersion: VersionTLS12,
8880				Bugs: ProtocolBugs{
8881					FragmentAcrossChangeCipherSpec: true,
8882					PackHandshakeFlight:            packed,
8883				},
8884			},
8885			shouldFail:    true,
8886			expectedError: ":UNEXPECTED_RECORD:",
8887		})
8888		testCases = append(testCases, testCase{
8889			testType: serverTest,
8890			name:     "FragmentAcrossChangeCipherSpec-Server" + suffix,
8891			config: Config{
8892				MaxVersion: VersionTLS12,
8893				Bugs: ProtocolBugs{
8894					FragmentAcrossChangeCipherSpec: true,
8895					PackHandshakeFlight:            packed,
8896				},
8897			},
8898			shouldFail:    true,
8899			expectedError: ":UNEXPECTED_RECORD:",
8900		})
8901		testCases = append(testCases, testCase{
8902			testType: serverTest,
8903			name:     "FragmentAcrossChangeCipherSpec-Server-Resume" + suffix,
8904			config: Config{
8905				MaxVersion: VersionTLS12,
8906			},
8907			resumeSession: true,
8908			resumeConfig: &Config{
8909				MaxVersion: VersionTLS12,
8910				Bugs: ProtocolBugs{
8911					FragmentAcrossChangeCipherSpec: true,
8912					PackHandshakeFlight:            packed,
8913				},
8914			},
8915			shouldFail:    true,
8916			expectedError: ":UNEXPECTED_RECORD:",
8917		})
8918		testCases = append(testCases, testCase{
8919			testType: serverTest,
8920			name:     "FragmentAcrossChangeCipherSpec-Server-NPN" + suffix,
8921			config: Config{
8922				MaxVersion: VersionTLS12,
8923				NextProtos: []string{"bar"},
8924				Bugs: ProtocolBugs{
8925					FragmentAcrossChangeCipherSpec: true,
8926					PackHandshakeFlight:            packed,
8927				},
8928			},
8929			flags: []string{
8930				"-advertise-npn", "\x03foo\x03bar\x03baz",
8931			},
8932			shouldFail:    true,
8933			expectedError: ":UNEXPECTED_RECORD:",
8934		})
8935	}
8936
8937	// Test that, in DTLS, ChangeCipherSpec is not allowed when there are
8938	// messages in the handshake queue. Do this by testing the server
8939	// reading the client Finished, reversing the flight so Finished comes
8940	// first.
8941	testCases = append(testCases, testCase{
8942		protocol: dtls,
8943		testType: serverTest,
8944		name:     "SendUnencryptedFinished-DTLS",
8945		config: Config{
8946			MaxVersion: VersionTLS12,
8947			Bugs: ProtocolBugs{
8948				SendUnencryptedFinished:   true,
8949				ReverseHandshakeFragments: true,
8950			},
8951		},
8952		shouldFail:    true,
8953		expectedError: ":BUFFERED_MESSAGES_ON_CIPHER_CHANGE:",
8954	})
8955
8956	// Test synchronization between encryption changes and the handshake in
8957	// TLS 1.3, where ChangeCipherSpec is implicit.
8958	testCases = append(testCases, testCase{
8959		name: "PartialEncryptedExtensionsWithServerHello",
8960		config: Config{
8961			MaxVersion: VersionTLS13,
8962			Bugs: ProtocolBugs{
8963				PartialEncryptedExtensionsWithServerHello: true,
8964			},
8965		},
8966		shouldFail:    true,
8967		expectedError: ":BUFFERED_MESSAGES_ON_CIPHER_CHANGE:",
8968	})
8969	testCases = append(testCases, testCase{
8970		testType: serverTest,
8971		name:     "PartialClientFinishedWithClientHello",
8972		config: Config{
8973			MaxVersion: VersionTLS13,
8974			Bugs: ProtocolBugs{
8975				PartialClientFinishedWithClientHello: true,
8976			},
8977		},
8978		shouldFail:    true,
8979		expectedError: ":BUFFERED_MESSAGES_ON_CIPHER_CHANGE:",
8980	})
8981
8982	// Test that early ChangeCipherSpecs are handled correctly.
8983	testCases = append(testCases, testCase{
8984		testType: serverTest,
8985		name:     "EarlyChangeCipherSpec-server-1",
8986		config: Config{
8987			MaxVersion: VersionTLS12,
8988			Bugs: ProtocolBugs{
8989				EarlyChangeCipherSpec: 1,
8990			},
8991		},
8992		shouldFail:    true,
8993		expectedError: ":UNEXPECTED_RECORD:",
8994	})
8995	testCases = append(testCases, testCase{
8996		testType: serverTest,
8997		name:     "EarlyChangeCipherSpec-server-2",
8998		config: Config{
8999			MaxVersion: VersionTLS12,
9000			Bugs: ProtocolBugs{
9001				EarlyChangeCipherSpec: 2,
9002			},
9003		},
9004		shouldFail:    true,
9005		expectedError: ":UNEXPECTED_RECORD:",
9006	})
9007	testCases = append(testCases, testCase{
9008		protocol: dtls,
9009		name:     "StrayChangeCipherSpec",
9010		config: Config{
9011			// TODO(davidben): Once DTLS 1.3 exists, test
9012			// that stray ChangeCipherSpec messages are
9013			// rejected.
9014			MaxVersion: VersionTLS12,
9015			Bugs: ProtocolBugs{
9016				StrayChangeCipherSpec: true,
9017			},
9018		},
9019	})
9020
9021	// Test that the contents of ChangeCipherSpec are checked.
9022	testCases = append(testCases, testCase{
9023		name: "BadChangeCipherSpec-1",
9024		config: Config{
9025			MaxVersion: VersionTLS12,
9026			Bugs: ProtocolBugs{
9027				BadChangeCipherSpec: []byte{2},
9028			},
9029		},
9030		shouldFail:    true,
9031		expectedError: ":BAD_CHANGE_CIPHER_SPEC:",
9032	})
9033	testCases = append(testCases, testCase{
9034		name: "BadChangeCipherSpec-2",
9035		config: Config{
9036			MaxVersion: VersionTLS12,
9037			Bugs: ProtocolBugs{
9038				BadChangeCipherSpec: []byte{1, 1},
9039			},
9040		},
9041		shouldFail:    true,
9042		expectedError: ":BAD_CHANGE_CIPHER_SPEC:",
9043	})
9044	testCases = append(testCases, testCase{
9045		protocol: dtls,
9046		name:     "BadChangeCipherSpec-DTLS-1",
9047		config: Config{
9048			MaxVersion: VersionTLS12,
9049			Bugs: ProtocolBugs{
9050				BadChangeCipherSpec: []byte{2},
9051			},
9052		},
9053		shouldFail:    true,
9054		expectedError: ":BAD_CHANGE_CIPHER_SPEC:",
9055	})
9056	testCases = append(testCases, testCase{
9057		protocol: dtls,
9058		name:     "BadChangeCipherSpec-DTLS-2",
9059		config: Config{
9060			MaxVersion: VersionTLS12,
9061			Bugs: ProtocolBugs{
9062				BadChangeCipherSpec: []byte{1, 1},
9063			},
9064		},
9065		shouldFail:    true,
9066		expectedError: ":BAD_CHANGE_CIPHER_SPEC:",
9067	})
9068}
9069
9070type perMessageTest struct {
9071	messageType uint8
9072	test        testCase
9073}
9074
9075// makePerMessageTests returns a series of test templates which cover each
9076// message in the TLS handshake. These may be used with bugs like
9077// WrongMessageType to fully test a per-message bug.
9078func makePerMessageTests() []perMessageTest {
9079	var ret []perMessageTest
9080	for _, protocol := range []protocol{tls, dtls} {
9081		var suffix string
9082		if protocol == dtls {
9083			suffix = "-DTLS"
9084		}
9085
9086		ret = append(ret, perMessageTest{
9087			messageType: typeClientHello,
9088			test: testCase{
9089				protocol: protocol,
9090				testType: serverTest,
9091				name:     "ClientHello" + suffix,
9092				config: Config{
9093					MaxVersion: VersionTLS12,
9094				},
9095			},
9096		})
9097
9098		if protocol == dtls {
9099			ret = append(ret, perMessageTest{
9100				messageType: typeHelloVerifyRequest,
9101				test: testCase{
9102					protocol: protocol,
9103					name:     "HelloVerifyRequest" + suffix,
9104					config: Config{
9105						MaxVersion: VersionTLS12,
9106					},
9107				},
9108			})
9109		}
9110
9111		ret = append(ret, perMessageTest{
9112			messageType: typeServerHello,
9113			test: testCase{
9114				protocol: protocol,
9115				name:     "ServerHello" + suffix,
9116				config: Config{
9117					MaxVersion: VersionTLS12,
9118				},
9119			},
9120		})
9121
9122		ret = append(ret, perMessageTest{
9123			messageType: typeCertificate,
9124			test: testCase{
9125				protocol: protocol,
9126				name:     "ServerCertificate" + suffix,
9127				config: Config{
9128					MaxVersion: VersionTLS12,
9129				},
9130			},
9131		})
9132
9133		ret = append(ret, perMessageTest{
9134			messageType: typeCertificateStatus,
9135			test: testCase{
9136				protocol: protocol,
9137				name:     "CertificateStatus" + suffix,
9138				config: Config{
9139					MaxVersion: VersionTLS12,
9140				},
9141				flags: []string{"-enable-ocsp-stapling"},
9142			},
9143		})
9144
9145		ret = append(ret, perMessageTest{
9146			messageType: typeServerKeyExchange,
9147			test: testCase{
9148				protocol: protocol,
9149				name:     "ServerKeyExchange" + suffix,
9150				config: Config{
9151					MaxVersion:   VersionTLS12,
9152					CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
9153				},
9154			},
9155		})
9156
9157		ret = append(ret, perMessageTest{
9158			messageType: typeCertificateRequest,
9159			test: testCase{
9160				protocol: protocol,
9161				name:     "CertificateRequest" + suffix,
9162				config: Config{
9163					MaxVersion: VersionTLS12,
9164					ClientAuth: RequireAnyClientCert,
9165				},
9166			},
9167		})
9168
9169		ret = append(ret, perMessageTest{
9170			messageType: typeServerHelloDone,
9171			test: testCase{
9172				protocol: protocol,
9173				name:     "ServerHelloDone" + suffix,
9174				config: Config{
9175					MaxVersion: VersionTLS12,
9176				},
9177			},
9178		})
9179
9180		ret = append(ret, perMessageTest{
9181			messageType: typeCertificate,
9182			test: testCase{
9183				testType: serverTest,
9184				protocol: protocol,
9185				name:     "ClientCertificate" + suffix,
9186				config: Config{
9187					Certificates: []Certificate{rsaCertificate},
9188					MaxVersion:   VersionTLS12,
9189				},
9190				flags: []string{"-require-any-client-certificate"},
9191			},
9192		})
9193
9194		ret = append(ret, perMessageTest{
9195			messageType: typeCertificateVerify,
9196			test: testCase{
9197				testType: serverTest,
9198				protocol: protocol,
9199				name:     "CertificateVerify" + suffix,
9200				config: Config{
9201					Certificates: []Certificate{rsaCertificate},
9202					MaxVersion:   VersionTLS12,
9203				},
9204				flags: []string{"-require-any-client-certificate"},
9205			},
9206		})
9207
9208		ret = append(ret, perMessageTest{
9209			messageType: typeClientKeyExchange,
9210			test: testCase{
9211				testType: serverTest,
9212				protocol: protocol,
9213				name:     "ClientKeyExchange" + suffix,
9214				config: Config{
9215					MaxVersion: VersionTLS12,
9216				},
9217			},
9218		})
9219
9220		if protocol != dtls {
9221			ret = append(ret, perMessageTest{
9222				messageType: typeNextProtocol,
9223				test: testCase{
9224					testType: serverTest,
9225					protocol: protocol,
9226					name:     "NextProtocol" + suffix,
9227					config: Config{
9228						MaxVersion: VersionTLS12,
9229						NextProtos: []string{"bar"},
9230					},
9231					flags: []string{"-advertise-npn", "\x03foo\x03bar\x03baz"},
9232				},
9233			})
9234
9235			ret = append(ret, perMessageTest{
9236				messageType: typeChannelID,
9237				test: testCase{
9238					testType: serverTest,
9239					protocol: protocol,
9240					name:     "ChannelID" + suffix,
9241					config: Config{
9242						MaxVersion: VersionTLS12,
9243						ChannelID:  channelIDKey,
9244					},
9245					flags: []string{
9246						"-expect-channel-id",
9247						base64.StdEncoding.EncodeToString(channelIDBytes),
9248					},
9249				},
9250			})
9251		}
9252
9253		ret = append(ret, perMessageTest{
9254			messageType: typeFinished,
9255			test: testCase{
9256				testType: serverTest,
9257				protocol: protocol,
9258				name:     "ClientFinished" + suffix,
9259				config: Config{
9260					MaxVersion: VersionTLS12,
9261				},
9262			},
9263		})
9264
9265		ret = append(ret, perMessageTest{
9266			messageType: typeNewSessionTicket,
9267			test: testCase{
9268				protocol: protocol,
9269				name:     "NewSessionTicket" + suffix,
9270				config: Config{
9271					MaxVersion: VersionTLS12,
9272				},
9273			},
9274		})
9275
9276		ret = append(ret, perMessageTest{
9277			messageType: typeFinished,
9278			test: testCase{
9279				protocol: protocol,
9280				name:     "ServerFinished" + suffix,
9281				config: Config{
9282					MaxVersion: VersionTLS12,
9283				},
9284			},
9285		})
9286
9287	}
9288
9289	ret = append(ret, perMessageTest{
9290		messageType: typeClientHello,
9291		test: testCase{
9292			testType: serverTest,
9293			name:     "TLS13-ClientHello",
9294			config: Config{
9295				MaxVersion: VersionTLS13,
9296			},
9297		},
9298	})
9299
9300	ret = append(ret, perMessageTest{
9301		messageType: typeServerHello,
9302		test: testCase{
9303			name: "TLS13-ServerHello",
9304			config: Config{
9305				MaxVersion: VersionTLS13,
9306			},
9307		},
9308	})
9309
9310	ret = append(ret, perMessageTest{
9311		messageType: typeEncryptedExtensions,
9312		test: testCase{
9313			name: "TLS13-EncryptedExtensions",
9314			config: Config{
9315				MaxVersion: VersionTLS13,
9316			},
9317		},
9318	})
9319
9320	ret = append(ret, perMessageTest{
9321		messageType: typeCertificateRequest,
9322		test: testCase{
9323			name: "TLS13-CertificateRequest",
9324			config: Config{
9325				MaxVersion: VersionTLS13,
9326				ClientAuth: RequireAnyClientCert,
9327			},
9328		},
9329	})
9330
9331	ret = append(ret, perMessageTest{
9332		messageType: typeCertificate,
9333		test: testCase{
9334			name: "TLS13-ServerCertificate",
9335			config: Config{
9336				MaxVersion: VersionTLS13,
9337			},
9338		},
9339	})
9340
9341	ret = append(ret, perMessageTest{
9342		messageType: typeCertificateVerify,
9343		test: testCase{
9344			name: "TLS13-ServerCertificateVerify",
9345			config: Config{
9346				MaxVersion: VersionTLS13,
9347			},
9348		},
9349	})
9350
9351	ret = append(ret, perMessageTest{
9352		messageType: typeFinished,
9353		test: testCase{
9354			name: "TLS13-ServerFinished",
9355			config: Config{
9356				MaxVersion: VersionTLS13,
9357			},
9358		},
9359	})
9360
9361	ret = append(ret, perMessageTest{
9362		messageType: typeCertificate,
9363		test: testCase{
9364			testType: serverTest,
9365			name:     "TLS13-ClientCertificate",
9366			config: Config{
9367				Certificates: []Certificate{rsaCertificate},
9368				MaxVersion:   VersionTLS13,
9369			},
9370			flags: []string{"-require-any-client-certificate"},
9371		},
9372	})
9373
9374	ret = append(ret, perMessageTest{
9375		messageType: typeCertificateVerify,
9376		test: testCase{
9377			testType: serverTest,
9378			name:     "TLS13-ClientCertificateVerify",
9379			config: Config{
9380				Certificates: []Certificate{rsaCertificate},
9381				MaxVersion:   VersionTLS13,
9382			},
9383			flags: []string{"-require-any-client-certificate"},
9384		},
9385	})
9386
9387	ret = append(ret, perMessageTest{
9388		messageType: typeFinished,
9389		test: testCase{
9390			testType: serverTest,
9391			name:     "TLS13-ClientFinished",
9392			config: Config{
9393				MaxVersion: VersionTLS13,
9394			},
9395		},
9396	})
9397
9398	return ret
9399}
9400
9401func addWrongMessageTypeTests() {
9402	for _, t := range makePerMessageTests() {
9403		t.test.name = "WrongMessageType-" + t.test.name
9404		t.test.config.Bugs.SendWrongMessageType = t.messageType
9405		t.test.shouldFail = true
9406		t.test.expectedError = ":UNEXPECTED_MESSAGE:"
9407		t.test.expectedLocalError = "remote error: unexpected message"
9408
9409		if t.test.config.MaxVersion >= VersionTLS13 && t.messageType == typeServerHello {
9410			// In TLS 1.3, a bad ServerHello means the client sends
9411			// an unencrypted alert while the server expects
9412			// encryption, so the alert is not readable by runner.
9413			t.test.expectedLocalError = "local error: bad record MAC"
9414		}
9415
9416		testCases = append(testCases, t.test)
9417	}
9418}
9419
9420func addTrailingMessageDataTests() {
9421	for _, t := range makePerMessageTests() {
9422		t.test.name = "TrailingMessageData-" + t.test.name
9423		t.test.config.Bugs.SendTrailingMessageData = t.messageType
9424		t.test.shouldFail = true
9425		t.test.expectedError = ":DECODE_ERROR:"
9426		t.test.expectedLocalError = "remote error: error decoding message"
9427
9428		if t.test.config.MaxVersion >= VersionTLS13 && t.messageType == typeServerHello {
9429			// In TLS 1.3, a bad ServerHello means the client sends
9430			// an unencrypted alert while the server expects
9431			// encryption, so the alert is not readable by runner.
9432			t.test.expectedLocalError = "local error: bad record MAC"
9433		}
9434
9435		if t.messageType == typeFinished {
9436			// Bad Finished messages read as the verify data having
9437			// the wrong length.
9438			t.test.expectedError = ":DIGEST_CHECK_FAILED:"
9439			t.test.expectedLocalError = "remote error: error decrypting message"
9440		}
9441
9442		testCases = append(testCases, t.test)
9443	}
9444}
9445
9446func addTLS13HandshakeTests() {
9447	testCases = append(testCases, testCase{
9448		testType: clientTest,
9449		name:     "NegotiatePSKResumption-TLS13",
9450		config: Config{
9451			MaxVersion: VersionTLS13,
9452			Bugs: ProtocolBugs{
9453				NegotiatePSKResumption: true,
9454			},
9455		},
9456		resumeSession: true,
9457		shouldFail:    true,
9458		expectedError: ":MISSING_KEY_SHARE:",
9459	})
9460
9461	testCases = append(testCases, testCase{
9462		testType: clientTest,
9463		name:     "MissingKeyShare-Client",
9464		config: Config{
9465			MaxVersion: VersionTLS13,
9466			Bugs: ProtocolBugs{
9467				MissingKeyShare: true,
9468			},
9469		},
9470		shouldFail:    true,
9471		expectedError: ":MISSING_KEY_SHARE:",
9472	})
9473
9474	testCases = append(testCases, testCase{
9475		testType: serverTest,
9476		name:     "MissingKeyShare-Server",
9477		config: Config{
9478			MaxVersion: VersionTLS13,
9479			Bugs: ProtocolBugs{
9480				MissingKeyShare: true,
9481			},
9482		},
9483		shouldFail:    true,
9484		expectedError: ":MISSING_KEY_SHARE:",
9485	})
9486
9487	testCases = append(testCases, testCase{
9488		testType: serverTest,
9489		name:     "DuplicateKeyShares",
9490		config: Config{
9491			MaxVersion: VersionTLS13,
9492			Bugs: ProtocolBugs{
9493				DuplicateKeyShares: true,
9494			},
9495		},
9496		shouldFail:    true,
9497		expectedError: ":DUPLICATE_KEY_SHARE:",
9498	})
9499
9500	testCases = append(testCases, testCase{
9501		testType: serverTest,
9502		name:     "SkipEarlyData",
9503		config: Config{
9504			MaxVersion: VersionTLS13,
9505			Bugs: ProtocolBugs{
9506				SendFakeEarlyDataLength: 4,
9507			},
9508		},
9509	})
9510
9511	testCases = append(testCases, testCase{
9512		testType: serverTest,
9513		name:     "SkipEarlyData-OmitEarlyDataExtension",
9514		config: Config{
9515			MaxVersion: VersionTLS13,
9516			Bugs: ProtocolBugs{
9517				SendFakeEarlyDataLength: 4,
9518				OmitEarlyDataExtension:  true,
9519			},
9520		},
9521		shouldFail:    true,
9522		expectedError: ":DECRYPTION_FAILED_OR_BAD_RECORD_MAC:",
9523	})
9524
9525	testCases = append(testCases, testCase{
9526		testType: serverTest,
9527		name:     "SkipEarlyData-TooMuchData",
9528		config: Config{
9529			MaxVersion: VersionTLS13,
9530			Bugs: ProtocolBugs{
9531				SendFakeEarlyDataLength: 16384 + 1,
9532			},
9533		},
9534		shouldFail:    true,
9535		expectedError: ":TOO_MUCH_SKIPPED_EARLY_DATA:",
9536	})
9537
9538	testCases = append(testCases, testCase{
9539		testType: serverTest,
9540		name:     "SkipEarlyData-Interleaved",
9541		config: Config{
9542			MaxVersion: VersionTLS13,
9543			Bugs: ProtocolBugs{
9544				SendFakeEarlyDataLength: 4,
9545				InterleaveEarlyData:     true,
9546			},
9547		},
9548		shouldFail:    true,
9549		expectedError: ":DECRYPTION_FAILED_OR_BAD_RECORD_MAC:",
9550	})
9551
9552	testCases = append(testCases, testCase{
9553		testType: serverTest,
9554		name:     "SkipEarlyData-EarlyDataInTLS12",
9555		config: Config{
9556			MaxVersion: VersionTLS13,
9557			Bugs: ProtocolBugs{
9558				SendFakeEarlyDataLength: 4,
9559			},
9560		},
9561		shouldFail:    true,
9562		expectedError: ":UNEXPECTED_RECORD:",
9563		flags:         []string{"-max-version", strconv.Itoa(VersionTLS12)},
9564	})
9565
9566	testCases = append(testCases, testCase{
9567		testType: serverTest,
9568		name:     "SkipEarlyData-HRR",
9569		config: Config{
9570			MaxVersion: VersionTLS13,
9571			Bugs: ProtocolBugs{
9572				SendFakeEarlyDataLength: 4,
9573			},
9574			DefaultCurves: []CurveID{},
9575		},
9576	})
9577
9578	testCases = append(testCases, testCase{
9579		testType: serverTest,
9580		name:     "SkipEarlyData-HRR-Interleaved",
9581		config: Config{
9582			MaxVersion: VersionTLS13,
9583			Bugs: ProtocolBugs{
9584				SendFakeEarlyDataLength: 4,
9585				InterleaveEarlyData:     true,
9586			},
9587			DefaultCurves: []CurveID{},
9588		},
9589		shouldFail:    true,
9590		expectedError: ":UNEXPECTED_RECORD:",
9591	})
9592
9593	testCases = append(testCases, testCase{
9594		testType: serverTest,
9595		name:     "SkipEarlyData-HRR-TooMuchData",
9596		config: Config{
9597			MaxVersion: VersionTLS13,
9598			Bugs: ProtocolBugs{
9599				SendFakeEarlyDataLength: 16384 + 1,
9600			},
9601			DefaultCurves: []CurveID{},
9602		},
9603		shouldFail:    true,
9604		expectedError: ":TOO_MUCH_SKIPPED_EARLY_DATA:",
9605	})
9606
9607	// Test that skipping early data looking for cleartext correctly
9608	// processes an alert record.
9609	testCases = append(testCases, testCase{
9610		testType: serverTest,
9611		name:     "SkipEarlyData-HRR-FatalAlert",
9612		config: Config{
9613			MaxVersion: VersionTLS13,
9614			Bugs: ProtocolBugs{
9615				SendEarlyAlert:          true,
9616				SendFakeEarlyDataLength: 4,
9617			},
9618			DefaultCurves: []CurveID{},
9619		},
9620		shouldFail:    true,
9621		expectedError: ":SSLV3_ALERT_HANDSHAKE_FAILURE:",
9622	})
9623
9624	testCases = append(testCases, testCase{
9625		testType: serverTest,
9626		name:     "SkipEarlyData-SecondClientHelloEarlyData",
9627		config: Config{
9628			MaxVersion: VersionTLS13,
9629			Bugs: ProtocolBugs{
9630				SendEarlyDataOnSecondClientHello: true,
9631			},
9632			DefaultCurves: []CurveID{},
9633		},
9634		shouldFail:         true,
9635		expectedLocalError: "remote error: bad record MAC",
9636	})
9637
9638	testCases = append(testCases, testCase{
9639		testType: clientTest,
9640		name:     "EmptyEncryptedExtensions",
9641		config: Config{
9642			MaxVersion: VersionTLS13,
9643			Bugs: ProtocolBugs{
9644				EmptyEncryptedExtensions: true,
9645			},
9646		},
9647		shouldFail:         true,
9648		expectedLocalError: "remote error: error decoding message",
9649	})
9650
9651	testCases = append(testCases, testCase{
9652		testType: clientTest,
9653		name:     "EncryptedExtensionsWithKeyShare",
9654		config: Config{
9655			MaxVersion: VersionTLS13,
9656			Bugs: ProtocolBugs{
9657				EncryptedExtensionsWithKeyShare: true,
9658			},
9659		},
9660		shouldFail:         true,
9661		expectedLocalError: "remote error: unsupported extension",
9662	})
9663
9664	testCases = append(testCases, testCase{
9665		testType: serverTest,
9666		name:     "SendHelloRetryRequest",
9667		config: Config{
9668			MaxVersion: VersionTLS13,
9669			// Require a HelloRetryRequest for every curve.
9670			DefaultCurves: []CurveID{},
9671		},
9672		expectedCurveID: CurveX25519,
9673	})
9674
9675	testCases = append(testCases, testCase{
9676		testType: serverTest,
9677		name:     "SendHelloRetryRequest-2",
9678		config: Config{
9679			MaxVersion:    VersionTLS13,
9680			DefaultCurves: []CurveID{CurveP384},
9681		},
9682		// Although the ClientHello did not predict our preferred curve,
9683		// we always select it whether it is predicted or not.
9684		expectedCurveID: CurveX25519,
9685	})
9686
9687	testCases = append(testCases, testCase{
9688		name: "UnknownCurve-HelloRetryRequest",
9689		config: Config{
9690			MaxVersion: VersionTLS13,
9691			// P-384 requires HelloRetryRequest in BoringSSL.
9692			CurvePreferences: []CurveID{CurveP384},
9693			Bugs: ProtocolBugs{
9694				SendHelloRetryRequestCurve: bogusCurve,
9695			},
9696		},
9697		shouldFail:    true,
9698		expectedError: ":WRONG_CURVE:",
9699	})
9700
9701	testCases = append(testCases, testCase{
9702		name: "DisabledCurve-HelloRetryRequest",
9703		config: Config{
9704			MaxVersion:       VersionTLS13,
9705			CurvePreferences: []CurveID{CurveP256},
9706			Bugs: ProtocolBugs{
9707				IgnorePeerCurvePreferences: true,
9708			},
9709		},
9710		flags:         []string{"-p384-only"},
9711		shouldFail:    true,
9712		expectedError: ":WRONG_CURVE:",
9713	})
9714
9715	testCases = append(testCases, testCase{
9716		name: "UnnecessaryHelloRetryRequest",
9717		config: Config{
9718			MaxVersion:       VersionTLS13,
9719			CurvePreferences: []CurveID{CurveX25519},
9720			Bugs: ProtocolBugs{
9721				SendHelloRetryRequestCurve: CurveX25519,
9722			},
9723		},
9724		shouldFail:    true,
9725		expectedError: ":WRONG_CURVE:",
9726	})
9727
9728	testCases = append(testCases, testCase{
9729		name: "SecondHelloRetryRequest",
9730		config: Config{
9731			MaxVersion: VersionTLS13,
9732			// P-384 requires HelloRetryRequest in BoringSSL.
9733			CurvePreferences: []CurveID{CurveP384},
9734			Bugs: ProtocolBugs{
9735				SecondHelloRetryRequest: true,
9736			},
9737		},
9738		shouldFail:    true,
9739		expectedError: ":UNEXPECTED_MESSAGE:",
9740	})
9741
9742	testCases = append(testCases, testCase{
9743		name: "HelloRetryRequest-Empty",
9744		config: Config{
9745			MaxVersion: VersionTLS13,
9746			Bugs: ProtocolBugs{
9747				AlwaysSendHelloRetryRequest: true,
9748			},
9749		},
9750		shouldFail:    true,
9751		expectedError: ":DECODE_ERROR:",
9752	})
9753
9754	testCases = append(testCases, testCase{
9755		name: "HelloRetryRequest-DuplicateCurve",
9756		config: Config{
9757			MaxVersion: VersionTLS13,
9758			// P-384 requires a HelloRetryRequest against BoringSSL's default
9759			// configuration. Assert this ExpectMissingKeyShare.
9760			CurvePreferences: []CurveID{CurveP384},
9761			Bugs: ProtocolBugs{
9762				ExpectMissingKeyShare:                true,
9763				DuplicateHelloRetryRequestExtensions: true,
9764			},
9765		},
9766		shouldFail:         true,
9767		expectedError:      ":DUPLICATE_EXTENSION:",
9768		expectedLocalError: "remote error: illegal parameter",
9769	})
9770
9771	testCases = append(testCases, testCase{
9772		name: "HelloRetryRequest-Cookie",
9773		config: Config{
9774			MaxVersion: VersionTLS13,
9775			Bugs: ProtocolBugs{
9776				SendHelloRetryRequestCookie: []byte("cookie"),
9777			},
9778		},
9779	})
9780
9781	testCases = append(testCases, testCase{
9782		name: "HelloRetryRequest-DuplicateCookie",
9783		config: Config{
9784			MaxVersion: VersionTLS13,
9785			Bugs: ProtocolBugs{
9786				SendHelloRetryRequestCookie:          []byte("cookie"),
9787				DuplicateHelloRetryRequestExtensions: true,
9788			},
9789		},
9790		shouldFail:         true,
9791		expectedError:      ":DUPLICATE_EXTENSION:",
9792		expectedLocalError: "remote error: illegal parameter",
9793	})
9794
9795	testCases = append(testCases, testCase{
9796		name: "HelloRetryRequest-EmptyCookie",
9797		config: Config{
9798			MaxVersion: VersionTLS13,
9799			Bugs: ProtocolBugs{
9800				SendHelloRetryRequestCookie: []byte{},
9801			},
9802		},
9803		shouldFail:    true,
9804		expectedError: ":DECODE_ERROR:",
9805	})
9806
9807	testCases = append(testCases, testCase{
9808		name: "HelloRetryRequest-Cookie-Curve",
9809		config: Config{
9810			MaxVersion: VersionTLS13,
9811			// P-384 requires HelloRetryRequest in BoringSSL.
9812			CurvePreferences: []CurveID{CurveP384},
9813			Bugs: ProtocolBugs{
9814				SendHelloRetryRequestCookie: []byte("cookie"),
9815				ExpectMissingKeyShare:       true,
9816			},
9817		},
9818	})
9819
9820	testCases = append(testCases, testCase{
9821		name: "HelloRetryRequest-Unknown",
9822		config: Config{
9823			MaxVersion: VersionTLS13,
9824			Bugs: ProtocolBugs{
9825				CustomHelloRetryRequestExtension: "extension",
9826			},
9827		},
9828		shouldFail:         true,
9829		expectedError:      ":UNEXPECTED_EXTENSION:",
9830		expectedLocalError: "remote error: unsupported extension",
9831	})
9832
9833	testCases = append(testCases, testCase{
9834		testType: serverTest,
9835		name:     "SecondClientHelloMissingKeyShare",
9836		config: Config{
9837			MaxVersion:    VersionTLS13,
9838			DefaultCurves: []CurveID{},
9839			Bugs: ProtocolBugs{
9840				SecondClientHelloMissingKeyShare: true,
9841			},
9842		},
9843		shouldFail:    true,
9844		expectedError: ":MISSING_KEY_SHARE:",
9845	})
9846
9847	testCases = append(testCases, testCase{
9848		testType: serverTest,
9849		name:     "SecondClientHelloWrongCurve",
9850		config: Config{
9851			MaxVersion:    VersionTLS13,
9852			DefaultCurves: []CurveID{},
9853			Bugs: ProtocolBugs{
9854				MisinterpretHelloRetryRequestCurve: CurveP521,
9855			},
9856		},
9857		shouldFail:    true,
9858		expectedError: ":WRONG_CURVE:",
9859	})
9860
9861	testCases = append(testCases, testCase{
9862		name: "HelloRetryRequestVersionMismatch",
9863		config: Config{
9864			MaxVersion: VersionTLS13,
9865			// P-384 requires HelloRetryRequest in BoringSSL.
9866			CurvePreferences: []CurveID{CurveP384},
9867			Bugs: ProtocolBugs{
9868				SendServerHelloVersion: 0x0305,
9869			},
9870		},
9871		shouldFail:    true,
9872		expectedError: ":WRONG_VERSION_NUMBER:",
9873	})
9874
9875	testCases = append(testCases, testCase{
9876		name: "HelloRetryRequestCurveMismatch",
9877		config: Config{
9878			MaxVersion: VersionTLS13,
9879			// P-384 requires HelloRetryRequest in BoringSSL.
9880			CurvePreferences: []CurveID{CurveP384},
9881			Bugs: ProtocolBugs{
9882				// Send P-384 (correct) in the HelloRetryRequest.
9883				SendHelloRetryRequestCurve: CurveP384,
9884				// But send P-256 in the ServerHello.
9885				SendCurve: CurveP256,
9886			},
9887		},
9888		shouldFail:    true,
9889		expectedError: ":WRONG_CURVE:",
9890	})
9891
9892	// Test the server selecting a curve that requires a HelloRetryRequest
9893	// without sending it.
9894	testCases = append(testCases, testCase{
9895		name: "SkipHelloRetryRequest",
9896		config: Config{
9897			MaxVersion: VersionTLS13,
9898			// P-384 requires HelloRetryRequest in BoringSSL.
9899			CurvePreferences: []CurveID{CurveP384},
9900			Bugs: ProtocolBugs{
9901				SkipHelloRetryRequest: true,
9902			},
9903		},
9904		shouldFail:    true,
9905		expectedError: ":WRONG_CURVE:",
9906	})
9907
9908	testCases = append(testCases, testCase{
9909		name: "TLS13-RequestContextInHandshake",
9910		config: Config{
9911			MaxVersion: VersionTLS13,
9912			MinVersion: VersionTLS13,
9913			ClientAuth: RequireAnyClientCert,
9914			Bugs: ProtocolBugs{
9915				SendRequestContext: []byte("request context"),
9916			},
9917		},
9918		flags: []string{
9919			"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
9920			"-key-file", path.Join(*resourceDir, rsaKeyFile),
9921		},
9922		shouldFail:    true,
9923		expectedError: ":DECODE_ERROR:",
9924	})
9925
9926	testCases = append(testCases, testCase{
9927		testType: serverTest,
9928		name:     "TLS13-TrailingKeyShareData",
9929		config: Config{
9930			MaxVersion: VersionTLS13,
9931			Bugs: ProtocolBugs{
9932				TrailingKeyShareData: true,
9933			},
9934		},
9935		shouldFail:    true,
9936		expectedError: ":DECODE_ERROR:",
9937	})
9938
9939	testCases = append(testCases, testCase{
9940		name: "TLS13-AlwaysSelectPSKIdentity",
9941		config: Config{
9942			MaxVersion: VersionTLS13,
9943			Bugs: ProtocolBugs{
9944				AlwaysSelectPSKIdentity: true,
9945			},
9946		},
9947		shouldFail:    true,
9948		expectedError: ":UNEXPECTED_EXTENSION:",
9949	})
9950
9951	testCases = append(testCases, testCase{
9952		name: "TLS13-InvalidPSKIdentity",
9953		config: Config{
9954			MaxVersion: VersionTLS13,
9955			Bugs: ProtocolBugs{
9956				SelectPSKIdentityOnResume: 1,
9957			},
9958		},
9959		resumeSession: true,
9960		shouldFail:    true,
9961		expectedError: ":PSK_IDENTITY_NOT_FOUND:",
9962	})
9963
9964	testCases = append(testCases, testCase{
9965		testType: serverTest,
9966		name:     "TLS13-ExtraPSKIdentity",
9967		config: Config{
9968			MaxVersion: VersionTLS13,
9969			Bugs: ProtocolBugs{
9970				ExtraPSKIdentity:   true,
9971				SendExtraPSKBinder: true,
9972			},
9973		},
9974		resumeSession: true,
9975	})
9976
9977	// Test that unknown NewSessionTicket extensions are tolerated.
9978	testCases = append(testCases, testCase{
9979		name: "TLS13-CustomTicketExtension",
9980		config: Config{
9981			MaxVersion: VersionTLS13,
9982			Bugs: ProtocolBugs{
9983				CustomTicketExtension: "1234",
9984			},
9985		},
9986	})
9987
9988	testCases = append(testCases, testCase{
9989		testType: clientTest,
9990		name:     "TLS13-DataLessEarlyData-Reject-Client",
9991		config: Config{
9992			MaxVersion:       VersionTLS13,
9993			MaxEarlyDataSize: 16384,
9994		},
9995		resumeConfig: &Config{
9996			MaxVersion:       VersionTLS13,
9997			MaxEarlyDataSize: 16384,
9998			Bugs: ProtocolBugs{
9999				AlwaysRejectEarlyData: true,
10000			},
10001		},
10002		resumeSession: true,
10003		flags: []string{
10004			"-enable-early-data",
10005			"-expect-early-data-info",
10006			"-expect-reject-early-data",
10007		},
10008	})
10009
10010	testCases = append(testCases, testCase{
10011		testType: clientTest,
10012		name:     "TLS13-DataLessEarlyData-HRR-Client",
10013		config: Config{
10014			MaxVersion:       VersionTLS13,
10015			MaxEarlyDataSize: 16384,
10016		},
10017		resumeConfig: &Config{
10018			MaxVersion:       VersionTLS13,
10019			MaxEarlyDataSize: 16384,
10020			Bugs: ProtocolBugs{
10021				SendHelloRetryRequestCookie: []byte{1, 2, 3, 4},
10022			},
10023		},
10024		resumeSession: true,
10025		flags: []string{
10026			"-enable-early-data",
10027			"-expect-early-data-info",
10028			"-expect-reject-early-data",
10029		},
10030	})
10031
10032	// The client must check the server does not send the early_data
10033	// extension while rejecting the session.
10034	testCases = append(testCases, testCase{
10035		testType: clientTest,
10036		name:     "TLS13-EarlyDataWithoutResume-Client",
10037		config: Config{
10038			MaxVersion:       VersionTLS13,
10039			MaxEarlyDataSize: 16384,
10040		},
10041		resumeConfig: &Config{
10042			MaxVersion:             VersionTLS13,
10043			SessionTicketsDisabled: true,
10044			Bugs: ProtocolBugs{
10045				SendEarlyDataExtension: true,
10046			},
10047		},
10048		resumeSession: true,
10049		flags: []string{
10050			"-enable-early-data",
10051			"-expect-early-data-info",
10052		},
10053		shouldFail:    true,
10054		expectedError: ":UNEXPECTED_EXTENSION:",
10055	})
10056
10057	// The client must fail with a dedicated error code if the server
10058	// responds with TLS 1.2 when offering 0-RTT.
10059	testCases = append(testCases, testCase{
10060		testType: clientTest,
10061		name:     "TLS13-EarlyDataVersionDowngrade-Client",
10062		config: Config{
10063			MaxVersion:       VersionTLS13,
10064			MaxEarlyDataSize: 16384,
10065		},
10066		resumeConfig: &Config{
10067			MaxVersion: VersionTLS12,
10068		},
10069		resumeSession: true,
10070		flags: []string{
10071			"-enable-early-data",
10072			"-expect-early-data-info",
10073		},
10074		shouldFail:    true,
10075		expectedError: ":WRONG_VERSION_ON_EARLY_DATA:",
10076	})
10077
10078	// Test that the client rejects an (unsolicited) early_data extension if
10079	// the server sent an HRR.
10080	testCases = append(testCases, testCase{
10081		testType: clientTest,
10082		name:     "TLS13-ServerAcceptsEarlyDataOnHRR-Client",
10083		config: Config{
10084			MaxVersion:       VersionTLS13,
10085			MaxEarlyDataSize: 16384,
10086		},
10087		resumeConfig: &Config{
10088			MaxVersion:       VersionTLS13,
10089			MaxEarlyDataSize: 16384,
10090			Bugs: ProtocolBugs{
10091				SendHelloRetryRequestCookie: []byte{1, 2, 3, 4},
10092				SendEarlyDataExtension:      true,
10093			},
10094		},
10095		resumeSession: true,
10096		flags: []string{
10097			"-enable-early-data",
10098			"-expect-early-data-info",
10099		},
10100		shouldFail:    true,
10101		expectedError: ":UNEXPECTED_EXTENSION:",
10102	})
10103
10104	fooString := "foo"
10105	barString := "bar"
10106
10107	// Test that the client reports the correct ALPN after a 0-RTT reject
10108	// that changed it.
10109	testCases = append(testCases, testCase{
10110		testType: clientTest,
10111		name:     "TLS13-DataLessEarlyData-ALPNMismatch-Client",
10112		config: Config{
10113			MaxVersion:       VersionTLS13,
10114			MaxEarlyDataSize: 16384,
10115			Bugs: ProtocolBugs{
10116				ALPNProtocol: &fooString,
10117			},
10118		},
10119		resumeConfig: &Config{
10120			MaxVersion:       VersionTLS13,
10121			MaxEarlyDataSize: 16384,
10122			Bugs: ProtocolBugs{
10123				ALPNProtocol: &barString,
10124			},
10125		},
10126		resumeSession: true,
10127		flags: []string{
10128			"-advertise-alpn", "\x03foo\x03bar",
10129			"-enable-early-data",
10130			"-expect-early-data-info",
10131			"-expect-reject-early-data",
10132			"-expect-alpn", "foo",
10133			"-expect-resume-alpn", "bar",
10134		},
10135	})
10136
10137	// Test that the client reports the correct ALPN after a 0-RTT reject if
10138	// ALPN was omitted from the first connection.
10139	testCases = append(testCases, testCase{
10140		testType: clientTest,
10141		name:     "TLS13-DataLessEarlyData-ALPNOmitted1-Client",
10142		config: Config{
10143			MaxVersion:       VersionTLS13,
10144			MaxEarlyDataSize: 16384,
10145		},
10146		resumeConfig: &Config{
10147			MaxVersion:       VersionTLS13,
10148			MaxEarlyDataSize: 16384,
10149			NextProtos:       []string{"foo"},
10150		},
10151		resumeSession: true,
10152		flags: []string{
10153			"-advertise-alpn", "\x03foo\x03bar",
10154			"-enable-early-data",
10155			"-expect-early-data-info",
10156			"-expect-reject-early-data",
10157			"-expect-no-alpn",
10158			"-expect-resume-alpn", "foo",
10159		},
10160	})
10161
10162	// Test that the client reports the correct ALPN after a 0-RTT reject if
10163	// ALPN was omitted from the second connection.
10164	testCases = append(testCases, testCase{
10165		testType: clientTest,
10166		name:     "TLS13-DataLessEarlyData-ALPNOmitted2-Client",
10167		config: Config{
10168			MaxVersion:       VersionTLS13,
10169			MaxEarlyDataSize: 16384,
10170			NextProtos:       []string{"foo"},
10171		},
10172		resumeConfig: &Config{
10173			MaxVersion:       VersionTLS13,
10174			MaxEarlyDataSize: 16384,
10175		},
10176		resumeSession: true,
10177		flags: []string{
10178			"-advertise-alpn", "\x03foo\x03bar",
10179			"-enable-early-data",
10180			"-expect-early-data-info",
10181			"-expect-reject-early-data",
10182			"-expect-alpn", "foo",
10183			"-expect-no-resume-alpn",
10184		},
10185	})
10186
10187	// Test that the client enforces ALPN match on 0-RTT accept.
10188	testCases = append(testCases, testCase{
10189		testType: clientTest,
10190		name:     "TLS13-DataLessEarlyData-BadALPNMismatch-Client",
10191		config: Config{
10192			MaxVersion:       VersionTLS13,
10193			MaxEarlyDataSize: 16384,
10194			Bugs: ProtocolBugs{
10195				ALPNProtocol: &fooString,
10196			},
10197		},
10198		resumeConfig: &Config{
10199			MaxVersion:       VersionTLS13,
10200			MaxEarlyDataSize: 16384,
10201			Bugs: ProtocolBugs{
10202				AlwaysAcceptEarlyData: true,
10203				ALPNProtocol:          &barString,
10204			},
10205		},
10206		resumeSession: true,
10207		flags: []string{
10208			"-advertise-alpn", "\x03foo\x03bar",
10209			"-enable-early-data",
10210			"-expect-early-data-info",
10211		},
10212		shouldFail:    true,
10213		expectedError: ":ALPN_MISMATCH_ON_EARLY_DATA:",
10214	})
10215
10216	// Test that the server correctly rejects 0-RTT when the previous
10217	// session did not allow early data on resumption.
10218	testCases = append(testCases, testCase{
10219		testType: serverTest,
10220		name:     "TLS13-EarlyData-NonZeroRTTSession-Server",
10221		config: Config{
10222			MaxVersion: VersionTLS13,
10223		},
10224		resumeConfig: &Config{
10225			MaxVersion: VersionTLS13,
10226			Bugs: ProtocolBugs{
10227				SendEarlyData:           [][]byte{{1, 2, 3, 4}},
10228				ExpectEarlyDataAccepted: false,
10229			},
10230		},
10231		resumeSession: true,
10232		flags: []string{
10233			"-enable-resume-early-data",
10234			"-expect-reject-early-data",
10235		},
10236	})
10237
10238	// Test that we reject early data where ALPN is omitted from the first
10239	// connection.
10240	testCases = append(testCases, testCase{
10241		testType: serverTest,
10242		name:     "TLS13-EarlyData-ALPNOmitted1-Server",
10243		config: Config{
10244			MaxVersion: VersionTLS13,
10245			NextProtos: []string{},
10246		},
10247		resumeConfig: &Config{
10248			MaxVersion: VersionTLS13,
10249			NextProtos: []string{"foo"},
10250			Bugs: ProtocolBugs{
10251				SendEarlyData:           [][]byte{{1, 2, 3, 4}},
10252				ExpectEarlyDataAccepted: false,
10253			},
10254		},
10255		resumeSession: true,
10256		flags: []string{
10257			"-enable-early-data",
10258			"-select-alpn", "",
10259			"-select-resume-alpn", "foo",
10260		},
10261	})
10262
10263	// Test that we reject early data where ALPN is omitted from the second
10264	// connection.
10265	testCases = append(testCases, testCase{
10266		testType: serverTest,
10267		name:     "TLS13-EarlyData-ALPNOmitted2-Server",
10268		config: Config{
10269			MaxVersion: VersionTLS13,
10270			NextProtos: []string{"foo"},
10271		},
10272		resumeConfig: &Config{
10273			MaxVersion: VersionTLS13,
10274			NextProtos: []string{},
10275			Bugs: ProtocolBugs{
10276				SendEarlyData:           [][]byte{{1, 2, 3, 4}},
10277				ExpectEarlyDataAccepted: false,
10278			},
10279		},
10280		resumeSession: true,
10281		flags: []string{
10282			"-enable-early-data",
10283			"-select-alpn", "foo",
10284			"-select-resume-alpn", "",
10285		},
10286	})
10287
10288	// Test that we reject early data with mismatched ALPN.
10289	testCases = append(testCases, testCase{
10290		testType: serverTest,
10291		name:     "TLS13-EarlyData-ALPNMismatch-Server",
10292		config: Config{
10293			MaxVersion: VersionTLS13,
10294			NextProtos: []string{"foo"},
10295		},
10296		resumeConfig: &Config{
10297			MaxVersion: VersionTLS13,
10298			NextProtos: []string{"bar"},
10299			Bugs: ProtocolBugs{
10300				SendEarlyData:           [][]byte{{1, 2, 3, 4}},
10301				ExpectEarlyDataAccepted: false,
10302			},
10303		},
10304		resumeSession: true,
10305		flags: []string{
10306			"-enable-early-data",
10307			"-select-alpn", "foo",
10308			"-select-resume-alpn", "bar",
10309		},
10310	})
10311
10312	// Test that we fail on early data with Channel ID.
10313	testCases = append(testCases, testCase{
10314		testType: clientTest,
10315		name:     "TLS13-EarlyData-ChannelID-Client",
10316		config: Config{
10317			MaxVersion:       VersionTLS13,
10318			MaxEarlyDataSize: 16384,
10319			RequestChannelID: true,
10320		},
10321		resumeSession:   true,
10322		expectChannelID: true,
10323		shouldFail:      true,
10324		expectedError:   ":CHANNEL_ID_ON_EARLY_DATA:",
10325		flags: []string{
10326			"-enable-early-data",
10327			"-expect-early-data-info",
10328			"-send-channel-id", path.Join(*resourceDir, channelIDKeyFile),
10329		},
10330	})
10331
10332	testCases = append(testCases, testCase{
10333		testType: serverTest,
10334		name:     "TLS13-EarlyData-ChannelID-Server",
10335		config: Config{
10336			MaxVersion: VersionTLS13,
10337			ChannelID:  channelIDKey,
10338			Bugs: ProtocolBugs{
10339				SendEarlyData:           [][]byte{{}},
10340				ExpectEarlyDataAccepted: false,
10341			},
10342		},
10343		resumeSession:   true,
10344		expectChannelID: true,
10345		flags: []string{
10346			"-enable-early-data",
10347			"-expect-reject-early-data",
10348			"-expect-channel-id",
10349			base64.StdEncoding.EncodeToString(channelIDBytes),
10350		},
10351	})
10352
10353	// Test that the server rejects 0-RTT streams without end_of_early_data.
10354	// The subsequent records should fail to decrypt.
10355	testCases = append(testCases, testCase{
10356		testType: serverTest,
10357		name:     "TLS13-EarlyData-SkipEndOfEarlyData",
10358		config: Config{
10359			MaxVersion: VersionTLS13,
10360			Bugs: ProtocolBugs{
10361				SendEarlyData:           [][]byte{{1, 2, 3, 4}},
10362				ExpectEarlyDataAccepted: true,
10363				SkipEndOfEarlyData:      true,
10364			},
10365		},
10366		resumeSession:      true,
10367		flags:              []string{"-enable-early-data"},
10368		shouldFail:         true,
10369		expectedLocalError: "remote error: bad record MAC",
10370		expectedError:      ":BAD_DECRYPT:",
10371	})
10372
10373	testCases = append(testCases, testCase{
10374		testType: serverTest,
10375		name:     "TLS13-EarlyData-UnexpectedHandshake-Server",
10376		config: Config{
10377			MaxVersion: VersionTLS13,
10378		},
10379		resumeConfig: &Config{
10380			MaxVersion: VersionTLS13,
10381			Bugs: ProtocolBugs{
10382				SendEarlyData:           [][]byte{{1, 2, 3, 4}},
10383				SendStrayEarlyHandshake: true,
10384				ExpectEarlyDataAccepted: true},
10385		},
10386		resumeSession:      true,
10387		shouldFail:         true,
10388		expectedError:      ":UNEXPECTED_RECORD:",
10389		expectedLocalError: "remote error: unexpected message",
10390		flags: []string{
10391			"-enable-early-data",
10392		},
10393	})
10394}
10395
10396func addTLS13CipherPreferenceTests() {
10397	// Test that client preference is honored if the shim has AES hardware
10398	// and ChaCha20-Poly1305 is preferred otherwise.
10399	testCases = append(testCases, testCase{
10400		testType: serverTest,
10401		name:     "TLS13-CipherPreference-Server-ChaCha20-AES",
10402		config: Config{
10403			MaxVersion: VersionTLS13,
10404			CipherSuites: []uint16{
10405				TLS_CHACHA20_POLY1305_SHA256,
10406				TLS_AES_128_GCM_SHA256,
10407			},
10408		},
10409		flags: []string{
10410			"-expect-cipher-aes", strconv.Itoa(int(TLS_CHACHA20_POLY1305_SHA256)),
10411			"-expect-cipher-no-aes", strconv.Itoa(int(TLS_CHACHA20_POLY1305_SHA256)),
10412		},
10413	})
10414
10415	testCases = append(testCases, testCase{
10416		testType: serverTest,
10417		name:     "TLS13-CipherPreference-Server-AES-ChaCha20",
10418		config: Config{
10419			MaxVersion: VersionTLS13,
10420			CipherSuites: []uint16{
10421				TLS_AES_128_GCM_SHA256,
10422				TLS_CHACHA20_POLY1305_SHA256,
10423			},
10424		},
10425		flags: []string{
10426			"-expect-cipher-aes", strconv.Itoa(int(TLS_AES_128_GCM_SHA256)),
10427			"-expect-cipher-no-aes", strconv.Itoa(int(TLS_CHACHA20_POLY1305_SHA256)),
10428		},
10429	})
10430
10431	// Test that the client orders ChaCha20-Poly1305 and AES-GCM based on
10432	// whether it has AES hardware.
10433	testCases = append(testCases, testCase{
10434		name: "TLS13-CipherPreference-Client",
10435		config: Config{
10436			MaxVersion: VersionTLS13,
10437			// Use the client cipher order. (This is the default but
10438			// is listed to be explicit.)
10439			PreferServerCipherSuites: false,
10440		},
10441		flags: []string{
10442			"-expect-cipher-aes", strconv.Itoa(int(TLS_AES_128_GCM_SHA256)),
10443			"-expect-cipher-no-aes", strconv.Itoa(int(TLS_CHACHA20_POLY1305_SHA256)),
10444		},
10445	})
10446}
10447
10448func addPeekTests() {
10449	// Test SSL_peek works, including on empty records.
10450	testCases = append(testCases, testCase{
10451		name:             "Peek-Basic",
10452		sendEmptyRecords: 1,
10453		flags:            []string{"-peek-then-read"},
10454	})
10455
10456	// Test SSL_peek can drive the initial handshake.
10457	testCases = append(testCases, testCase{
10458		name: "Peek-ImplicitHandshake",
10459		flags: []string{
10460			"-peek-then-read",
10461			"-implicit-handshake",
10462		},
10463	})
10464
10465	// Test SSL_peek can discover and drive a renegotiation.
10466	testCases = append(testCases, testCase{
10467		name: "Peek-Renegotiate",
10468		config: Config{
10469			MaxVersion: VersionTLS12,
10470		},
10471		renegotiate: 1,
10472		flags: []string{
10473			"-peek-then-read",
10474			"-renegotiate-freely",
10475			"-expect-total-renegotiations", "1",
10476		},
10477	})
10478
10479	// Test SSL_peek can discover a close_notify.
10480	testCases = append(testCases, testCase{
10481		name: "Peek-Shutdown",
10482		config: Config{
10483			Bugs: ProtocolBugs{
10484				ExpectCloseNotify: true,
10485			},
10486		},
10487		flags: []string{
10488			"-peek-then-read",
10489			"-check-close-notify",
10490		},
10491	})
10492
10493	// Test SSL_peek can discover an alert.
10494	testCases = append(testCases, testCase{
10495		name: "Peek-Alert",
10496		config: Config{
10497			Bugs: ProtocolBugs{
10498				SendSpuriousAlert: alertRecordOverflow,
10499			},
10500		},
10501		flags:         []string{"-peek-then-read"},
10502		shouldFail:    true,
10503		expectedError: ":TLSV1_ALERT_RECORD_OVERFLOW:",
10504	})
10505
10506	// Test SSL_peek can handle KeyUpdate.
10507	testCases = append(testCases, testCase{
10508		name: "Peek-KeyUpdate",
10509		config: Config{
10510			MaxVersion: VersionTLS13,
10511		},
10512		sendKeyUpdates:   1,
10513		keyUpdateRequest: keyUpdateNotRequested,
10514		flags:            []string{"-peek-then-read"},
10515	})
10516}
10517
10518func addRecordVersionTests() {
10519	for _, ver := range tlsVersions {
10520		// Test that the record version is enforced.
10521		testCases = append(testCases, testCase{
10522			name: "CheckRecordVersion-" + ver.name,
10523			config: Config{
10524				MinVersion: ver.version,
10525				MaxVersion: ver.version,
10526				Bugs: ProtocolBugs{
10527					SendRecordVersion: 0x03ff,
10528				},
10529			},
10530			shouldFail:    true,
10531			expectedError: ":WRONG_VERSION_NUMBER:",
10532		})
10533
10534		// Test that the ClientHello may use any record version, for
10535		// compatibility reasons.
10536		testCases = append(testCases, testCase{
10537			testType: serverTest,
10538			name:     "LooseInitialRecordVersion-" + ver.name,
10539			config: Config{
10540				MinVersion: ver.version,
10541				MaxVersion: ver.version,
10542				Bugs: ProtocolBugs{
10543					SendInitialRecordVersion: 0x03ff,
10544				},
10545			},
10546		})
10547
10548		// Test that garbage ClientHello record versions are rejected.
10549		testCases = append(testCases, testCase{
10550			testType: serverTest,
10551			name:     "GarbageInitialRecordVersion-" + ver.name,
10552			config: Config{
10553				MinVersion: ver.version,
10554				MaxVersion: ver.version,
10555				Bugs: ProtocolBugs{
10556					SendInitialRecordVersion: 0xffff,
10557				},
10558			},
10559			shouldFail:    true,
10560			expectedError: ":WRONG_VERSION_NUMBER:",
10561		})
10562	}
10563}
10564
10565func addCertificateTests() {
10566	// Test that a certificate chain with intermediate may be sent and
10567	// received as both client and server.
10568	for _, ver := range tlsVersions {
10569		testCases = append(testCases, testCase{
10570			testType: clientTest,
10571			name:     "SendReceiveIntermediate-Client-" + ver.name,
10572			config: Config{
10573				MinVersion:   ver.version,
10574				MaxVersion:   ver.version,
10575				Certificates: []Certificate{rsaChainCertificate},
10576				ClientAuth:   RequireAnyClientCert,
10577			},
10578			expectPeerCertificate: &rsaChainCertificate,
10579			flags: []string{
10580				"-cert-file", path.Join(*resourceDir, rsaChainCertificateFile),
10581				"-key-file", path.Join(*resourceDir, rsaChainKeyFile),
10582				"-expect-peer-cert-file", path.Join(*resourceDir, rsaChainCertificateFile),
10583			},
10584		})
10585
10586		testCases = append(testCases, testCase{
10587			testType: serverTest,
10588			name:     "SendReceiveIntermediate-Server-" + ver.name,
10589			config: Config{
10590				MinVersion:   ver.version,
10591				MaxVersion:   ver.version,
10592				Certificates: []Certificate{rsaChainCertificate},
10593			},
10594			expectPeerCertificate: &rsaChainCertificate,
10595			flags: []string{
10596				"-cert-file", path.Join(*resourceDir, rsaChainCertificateFile),
10597				"-key-file", path.Join(*resourceDir, rsaChainKeyFile),
10598				"-require-any-client-certificate",
10599				"-expect-peer-cert-file", path.Join(*resourceDir, rsaChainCertificateFile),
10600			},
10601		})
10602	}
10603}
10604
10605func addRetainOnlySHA256ClientCertTests() {
10606	for _, ver := range tlsVersions {
10607		// Test that enabling
10608		// SSL_CTX_set_retain_only_sha256_of_client_certs without
10609		// actually requesting a client certificate is a no-op.
10610		testCases = append(testCases, testCase{
10611			testType: serverTest,
10612			name:     "RetainOnlySHA256-NoCert-" + ver.name,
10613			config: Config{
10614				MinVersion: ver.version,
10615				MaxVersion: ver.version,
10616			},
10617			flags: []string{
10618				"-retain-only-sha256-client-cert-initial",
10619				"-retain-only-sha256-client-cert-resume",
10620			},
10621			resumeSession: true,
10622		})
10623
10624		// Test that when retaining only a SHA-256 certificate is
10625		// enabled, the hash appears as expected.
10626		testCases = append(testCases, testCase{
10627			testType: serverTest,
10628			name:     "RetainOnlySHA256-Cert-" + ver.name,
10629			config: Config{
10630				MinVersion:   ver.version,
10631				MaxVersion:   ver.version,
10632				Certificates: []Certificate{rsaCertificate},
10633			},
10634			flags: []string{
10635				"-verify-peer",
10636				"-retain-only-sha256-client-cert-initial",
10637				"-retain-only-sha256-client-cert-resume",
10638				"-expect-sha256-client-cert-initial",
10639				"-expect-sha256-client-cert-resume",
10640			},
10641			resumeSession: true,
10642		})
10643
10644		// Test that when the config changes from on to off, a
10645		// resumption is rejected because the server now wants the full
10646		// certificate chain.
10647		testCases = append(testCases, testCase{
10648			testType: serverTest,
10649			name:     "RetainOnlySHA256-OnOff-" + ver.name,
10650			config: Config{
10651				MinVersion:   ver.version,
10652				MaxVersion:   ver.version,
10653				Certificates: []Certificate{rsaCertificate},
10654			},
10655			flags: []string{
10656				"-verify-peer",
10657				"-retain-only-sha256-client-cert-initial",
10658				"-expect-sha256-client-cert-initial",
10659			},
10660			resumeSession:        true,
10661			expectResumeRejected: true,
10662		})
10663
10664		// Test that when the config changes from off to on, a
10665		// resumption is rejected because the server now wants just the
10666		// hash.
10667		testCases = append(testCases, testCase{
10668			testType: serverTest,
10669			name:     "RetainOnlySHA256-OffOn-" + ver.name,
10670			config: Config{
10671				MinVersion:   ver.version,
10672				MaxVersion:   ver.version,
10673				Certificates: []Certificate{rsaCertificate},
10674			},
10675			flags: []string{
10676				"-verify-peer",
10677				"-retain-only-sha256-client-cert-resume",
10678				"-expect-sha256-client-cert-resume",
10679			},
10680			resumeSession:        true,
10681			expectResumeRejected: true,
10682		})
10683	}
10684}
10685
10686func addECDSAKeyUsageTests() {
10687	p256 := elliptic.P256()
10688	priv, err := ecdsa.GenerateKey(p256, rand.Reader)
10689	if err != nil {
10690		panic(err)
10691	}
10692
10693	serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
10694	serialNumber, err := rand.Int(rand.Reader, serialNumberLimit)
10695	if err != nil {
10696		panic(err)
10697	}
10698
10699	template := x509.Certificate{
10700		SerialNumber: serialNumber,
10701		Subject: pkix.Name{
10702			Organization: []string{"Acme Co"},
10703		},
10704		NotBefore: time.Now(),
10705		NotAfter:  time.Now(),
10706
10707		// An ECC certificate with only the keyAgreement key usgae may
10708		// be used with ECDH, but not ECDSA.
10709		KeyUsage:              x509.KeyUsageKeyAgreement,
10710		ExtKeyUsage:           []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
10711		BasicConstraintsValid: true,
10712	}
10713
10714	derBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, &priv.PublicKey, priv)
10715	if err != nil {
10716		panic(err)
10717	}
10718
10719	cert := Certificate{
10720		Certificate: [][]byte{derBytes},
10721		PrivateKey:  priv,
10722	}
10723
10724	for _, ver := range tlsVersions {
10725		if ver.version < VersionTLS12 {
10726			continue
10727		}
10728
10729		testCases = append(testCases, testCase{
10730			testType: clientTest,
10731			name:     "ECDSAKeyUsage-" + ver.name,
10732			config: Config{
10733				MinVersion:   ver.version,
10734				MaxVersion:   ver.version,
10735				Certificates: []Certificate{cert},
10736			},
10737			shouldFail:    true,
10738			expectedError: ":ECC_CERT_NOT_FOR_SIGNING:",
10739		})
10740	}
10741}
10742
10743func worker(statusChan chan statusMsg, c chan *testCase, shimPath string, wg *sync.WaitGroup) {
10744	defer wg.Done()
10745
10746	for test := range c {
10747		var err error
10748
10749		if *mallocTest >= 0 {
10750			for mallocNumToFail := int64(*mallocTest); ; mallocNumToFail++ {
10751				statusChan <- statusMsg{test: test, started: true}
10752				if err = runTest(test, shimPath, mallocNumToFail); err != errMoreMallocs {
10753					if err != nil {
10754						fmt.Printf("\n\nmalloc test failed at %d: %s\n", mallocNumToFail, err)
10755					}
10756					break
10757				}
10758			}
10759		} else if *repeatUntilFailure {
10760			for err == nil {
10761				statusChan <- statusMsg{test: test, started: true}
10762				err = runTest(test, shimPath, -1)
10763			}
10764		} else {
10765			statusChan <- statusMsg{test: test, started: true}
10766			err = runTest(test, shimPath, -1)
10767		}
10768		statusChan <- statusMsg{test: test, err: err}
10769	}
10770}
10771
10772type statusMsg struct {
10773	test    *testCase
10774	started bool
10775	err     error
10776}
10777
10778func statusPrinter(doneChan chan *testOutput, statusChan chan statusMsg, total int) {
10779	var started, done, failed, unimplemented, lineLen int
10780
10781	testOutput := newTestOutput()
10782	for msg := range statusChan {
10783		if !*pipe {
10784			// Erase the previous status line.
10785			var erase string
10786			for i := 0; i < lineLen; i++ {
10787				erase += "\b \b"
10788			}
10789			fmt.Print(erase)
10790		}
10791
10792		if msg.started {
10793			started++
10794		} else {
10795			done++
10796
10797			if msg.err != nil {
10798				if msg.err == errUnimplemented {
10799					if *pipe {
10800						// Print each test instead of a status line.
10801						fmt.Printf("UNIMPLEMENTED (%s)\n", msg.test.name)
10802					}
10803					unimplemented++
10804					testOutput.addResult(msg.test.name, "UNIMPLEMENTED")
10805				} else {
10806					fmt.Printf("FAILED (%s)\n%s\n", msg.test.name, msg.err)
10807					failed++
10808					testOutput.addResult(msg.test.name, "FAIL")
10809				}
10810			} else {
10811				if *pipe {
10812					// Print each test instead of a status line.
10813					fmt.Printf("PASSED (%s)\n", msg.test.name)
10814				}
10815				testOutput.addResult(msg.test.name, "PASS")
10816			}
10817		}
10818
10819		if !*pipe {
10820			// Print a new status line.
10821			line := fmt.Sprintf("%d/%d/%d/%d/%d", failed, unimplemented, done, started, total)
10822			lineLen = len(line)
10823			os.Stdout.WriteString(line)
10824		}
10825	}
10826
10827	doneChan <- testOutput
10828}
10829
10830func main() {
10831	flag.Parse()
10832	*resourceDir = path.Clean(*resourceDir)
10833	initCertificates()
10834
10835	addBasicTests()
10836	addCipherSuiteTests()
10837	addBadECDSASignatureTests()
10838	addCBCPaddingTests()
10839	addCBCSplittingTests()
10840	addClientAuthTests()
10841	addDDoSCallbackTests()
10842	addVersionNegotiationTests()
10843	addMinimumVersionTests()
10844	addExtensionTests()
10845	addResumptionVersionTests()
10846	addExtendedMasterSecretTests()
10847	addRenegotiationTests()
10848	addDTLSReplayTests()
10849	addSignatureAlgorithmTests()
10850	addDTLSRetransmitTests()
10851	addExportKeyingMaterialTests()
10852	addTLSUniqueTests()
10853	addCustomExtensionTests()
10854	addRSAClientKeyExchangeTests()
10855	addCurveTests()
10856	addSessionTicketTests()
10857	addTLS13RecordTests()
10858	addAllStateMachineCoverageTests()
10859	addChangeCipherSpecTests()
10860	addWrongMessageTypeTests()
10861	addTrailingMessageDataTests()
10862	addTLS13HandshakeTests()
10863	addTLS13CipherPreferenceTests()
10864	addPeekTests()
10865	addRecordVersionTests()
10866	addCertificateTests()
10867	addRetainOnlySHA256ClientCertTests()
10868	addECDSAKeyUsageTests()
10869
10870	var wg sync.WaitGroup
10871
10872	statusChan := make(chan statusMsg, *numWorkers)
10873	testChan := make(chan *testCase, *numWorkers)
10874	doneChan := make(chan *testOutput)
10875
10876	if len(*shimConfigFile) != 0 {
10877		encoded, err := ioutil.ReadFile(*shimConfigFile)
10878		if err != nil {
10879			fmt.Fprintf(os.Stderr, "Couldn't read config file %q: %s\n", *shimConfigFile, err)
10880			os.Exit(1)
10881		}
10882
10883		if err := json.Unmarshal(encoded, &shimConfig); err != nil {
10884			fmt.Fprintf(os.Stderr, "Couldn't decode config file %q: %s\n", *shimConfigFile, err)
10885			os.Exit(1)
10886		}
10887	}
10888
10889	go statusPrinter(doneChan, statusChan, len(testCases))
10890
10891	for i := 0; i < *numWorkers; i++ {
10892		wg.Add(1)
10893		go worker(statusChan, testChan, *shimPath, &wg)
10894	}
10895
10896	var foundTest bool
10897	for i := range testCases {
10898		matched := true
10899		if len(*testToRun) != 0 {
10900			var err error
10901			matched, err = filepath.Match(*testToRun, testCases[i].name)
10902			if err != nil {
10903				fmt.Fprintf(os.Stderr, "Error matching pattern: %s\n", err)
10904				os.Exit(1)
10905			}
10906		}
10907
10908		if !*includeDisabled {
10909			for pattern := range shimConfig.DisabledTests {
10910				isDisabled, err := filepath.Match(pattern, testCases[i].name)
10911				if err != nil {
10912					fmt.Fprintf(os.Stderr, "Error matching pattern %q from config file: %s\n", pattern, err)
10913					os.Exit(1)
10914				}
10915
10916				if isDisabled {
10917					matched = false
10918					break
10919				}
10920			}
10921		}
10922
10923		if matched {
10924			foundTest = true
10925			testChan <- &testCases[i]
10926
10927			// Only run one test if repeating until failure.
10928			if *repeatUntilFailure {
10929				break
10930			}
10931		}
10932	}
10933
10934	if !foundTest {
10935		fmt.Fprintf(os.Stderr, "No tests run\n")
10936		os.Exit(1)
10937	}
10938
10939	close(testChan)
10940	wg.Wait()
10941	close(statusChan)
10942	testOutput := <-doneChan
10943
10944	fmt.Printf("\n")
10945
10946	if *jsonOutput != "" {
10947		if err := testOutput.writeTo(*jsonOutput); err != nil {
10948			fmt.Fprintf(os.Stderr, "Error: %s\n", err)
10949		}
10950	}
10951
10952	if !*allowUnimplemented && testOutput.NumFailuresByType["UNIMPLEMENTED"] > 0 {
10953		os.Exit(1)
10954	}
10955
10956	if !testOutput.noneFailed {
10957		os.Exit(1)
10958	}
10959}
10960