Home | History | Annotate | Download | only in runner
      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 
     15 package runner
     16 
     17 import (
     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 
     47 var (
     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.
     74 type 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.
     93 var shimConfig ShimConfiguration = ShimConfiguration{
     94 	HalfRTTTickets: 2,
     95 }
     96 
     97 type testCert int
     98 
     99 const (
    100 	testCertRSA testCert = iota
    101 	testCertRSA1024
    102 	testCertRSAChain
    103 	testCertECDSAP224
    104 	testCertECDSAP256
    105 	testCertECDSAP384
    106 	testCertECDSAP521
    107 )
    108 
    109 const (
    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 
    119 const (
    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 
    130 var (
    131 	rsaCertificate       Certificate
    132 	rsa1024Certificate   Certificate
    133 	rsaChainCertificate  Certificate
    134 	ecdsaP224Certificate Certificate
    135 	ecdsaP256Certificate Certificate
    136 	ecdsaP384Certificate Certificate
    137 	ecdsaP521Certificate Certificate
    138 )
    139 
    140 var 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 
    189 var channelIDKey *ecdsa.PrivateKey
    190 var channelIDBytes []byte
    191 
    192 var testOCSPResponse = []byte{1, 2, 3, 4}
    193 var testSCTList = []byte{0, 6, 0, 4, 5, 6, 7, 8}
    194 
    195 var testOCSPExtension = append([]byte{byte(extensionStatusRequest) >> 8, byte(extensionStatusRequest), 0, 8, statusTypeOCSP, 0, 0, 4}, testOCSPResponse...)
    196 var testSCTExtension = append([]byte{byte(extensionSignedCertificateTimestamp) >> 8, byte(extensionSignedCertificateTimestamp), 0, byte(len(testSCTList))}, testSCTList...)
    197 
    198 func 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 
    230 func 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 
    239 func 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 
    248 func 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.
    258 func 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 
    270 type testType int
    271 
    272 const (
    273 	clientTest testType = iota
    274 	serverTest
    275 )
    276 
    277 type protocol int
    278 
    279 const (
    280 	tls protocol = iota
    281 	dtls
    282 )
    283 
    284 const (
    285 	alpn = 1
    286 	npn  = 2
    287 )
    288 
    289 type 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 
    420 var testCases []testCase
    421 
    422 func 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.
    450 type timeoutConn struct {
    451 	net.Conn
    452 	timeout time.Duration
    453 }
    454 
    455 func (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 
    462 func (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 
    469 func 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 
    789 func 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 
    800 func 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 
    808 func 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 
    816 var (
    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.
    823 func 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 
    843 func 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 
    855 func 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 
   1091 type tlsVersion struct {
   1092 	name    string
   1093 	version uint16
   1094 	flag    string
   1095 	hasDTLS bool
   1096 }
   1097 
   1098 var 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 
   1106 type testCipherSuite struct {
   1107 	name string
   1108 	id   uint16
   1109 }
   1110 
   1111 var 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 
   1144 func hasComponent(suiteName, component string) bool {
   1145 	return strings.Contains("-"+suiteName+"-", "-"+component+"-")
   1146 }
   1147 
   1148 func isTLS12Only(suiteName string) bool {
   1149 	return hasComponent(suiteName, "GCM") ||
   1150 		hasComponent(suiteName, "SHA256") ||
   1151 		hasComponent(suiteName, "SHA384") ||
   1152 		hasComponent(suiteName, "POLY1305")
   1153 }
   1154 
   1155 func isTLS13Suite(suiteName string) bool {
   1156 	return strings.HasPrefix(suiteName, "AEAD-")
   1157 }
   1158 
   1159 func isDTLSCipher(suiteName string) bool {
   1160 	return !hasComponent(suiteName, "RC4") && !hasComponent(suiteName, "NULL")
   1161 }
   1162 
   1163 func 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 
   1171 func 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 
   2514 func 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 
   2690 func 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 
   2872 func 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 
   2906 func 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 
   2948 func 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 
   2981 func 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 
   3214 func 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 
   3403 type 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.
   3414 func 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 
   3442 func 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 
   4262 func 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 
   4320 func 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 
   4661 func 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 
   4764 func 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 
   5684 func 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 
   6149 func 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 
   6614 func 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 
   6655 var 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 
   6676 const fakeSigAlg1 signatureAlgorithm = 0x2a01
   6677 const fakeSigAlg2 signatureAlgorithm = 0xff01
   6678 
   6679 func 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.
   7518 var 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.
   7536 var 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 
   7552 func 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 
   7693 func 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 
   7790 func 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 
   7845 func 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 
   8110 func 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 
   8145 var 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 
   8155 const bogusCurve = 0x1234
   8156 
   8157 func 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 
   8544 func 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 
   8597 func 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 
   8807 func 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 
   9070 type 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.
   9078 func 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 
   9401 func 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 
   9420 func 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 
   9446 func 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 
   10396 func 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 
   10448 func 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 
   10518 func 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 
   10565 func 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 
   10605 func 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 
   10686 func 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 
   10743 func 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 
   10772 type statusMsg struct {
   10773 	test    *testCase
   10774 	started bool
   10775 	err     error
   10776 }
   10777 
   10778 func 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 
   10830 func 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