blob: 157307b15fdccda78b3bafc669e5f8745de3f9a8 [file] [log] [blame]
Adam Langley7fcfd3b2016-05-20 11:02:50 -07001// 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
David Benjamin0d1b0962016-08-01 09:50:57 -040013// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Adam Langley7fcfd3b2016-05-20 11:02:50 -070014
Adam Langleydc7e9c42015-09-29 15:21:04 -070015package runner
Adam Langley95c29f32014-06-20 12:00:00 -070016
17import (
18 "bytes"
David Benjamina08e49d2014-08-24 01:46:07 -040019 "crypto/ecdsa"
20 "crypto/elliptic"
Adam Langleya4b91982016-12-12 12:05:53 -080021 "crypto/rand"
David Benjamin407a10c2014-07-16 12:58:59 -040022 "crypto/x509"
Adam Langleya4b91982016-12-12 12:05:53 -080023 "crypto/x509/pkix"
David Benjamin2561dc32014-08-24 01:25:27 -040024 "encoding/base64"
Adam Langley2ff79332017-02-28 13:45:39 -080025 "encoding/hex"
EKRf71d7ed2016-08-06 13:25:12 -070026 "encoding/json"
David Benjamina08e49d2014-08-24 01:46:07 -040027 "encoding/pem"
EKR842ae6c2016-07-27 09:22:05 +020028 "errors"
Adam Langley95c29f32014-06-20 12:00:00 -070029 "flag"
30 "fmt"
31 "io"
Kenny Root7fdeaf12014-08-05 15:23:37 -070032 "io/ioutil"
Adam Langleya7997f12015-05-14 17:38:50 -070033 "math/big"
Adam Langley95c29f32014-06-20 12:00:00 -070034 "net"
35 "os"
36 "os/exec"
David Benjamin884fdf12014-08-02 15:28:23 -040037 "path"
David Benjamin17e12922016-07-28 18:04:43 -040038 "path/filepath"
David Benjamin2bc8e6f2014-08-02 15:22:37 -040039 "runtime"
Adam Langley69a01602014-11-17 17:26:55 -080040 "strconv"
Adam Langley95c29f32014-06-20 12:00:00 -070041 "strings"
42 "sync"
43 "syscall"
David Benjamin83f90402015-01-27 01:09:43 -050044 "time"
Adam Langley95c29f32014-06-20 12:00:00 -070045)
46
Adam Langley69a01602014-11-17 17:26:55 -080047var (
EKR842ae6c2016-07-27 09:22:05 +020048 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.")
David Benjamin17e12922016-07-28 18:04:43 -040056 testToRun = flag.String("test", "", "The pattern to filter tests to run, or empty to run all tests")
EKR842ae6c2016-07-27 09:22:05 +020057 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.")
EKR173bf932016-07-29 15:52:49 +020065 looseErrors = flag.Bool("loose-errors", false, "If true, allow shims to report an untranslated error code.")
EKRf71d7ed2016-08-06 13:25:12 -070066 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.")
Matthew Braithwaitecedc6f12017-03-15 19:20:23 -070068 includeDHE = flag.Bool("include-dhe", false, "If true, test DHE ciphersuites.")
David Benjaminba28dfc2016-11-15 17:47:21 +090069 repeatUntilFailure = flag.Bool("repeat-until-failure", false, "If true, the first selected test will be run repeatedly until failure.")
Adam Langley69a01602014-11-17 17:26:55 -080070)
Adam Langley95c29f32014-06-20 12:00:00 -070071
EKRf71d7ed2016-08-06 13:25:12 -070072// ShimConfigurations is used with the “json” package and represents a shim
73// config file.
74type ShimConfiguration struct {
75 // DisabledTests maps from a glob-based pattern to a freeform string.
76 // The glob pattern is used to exclude tests from being run and the
77 // freeform string is unparsed but expected to explain why the test is
78 // disabled.
79 DisabledTests map[string]string
80
81 // ErrorMap maps from expected error strings to the correct error
82 // string for the shim in question. For example, it might map
83 // “:NO_SHARED_CIPHER:” (a BoringSSL error string) to something
84 // like “SSL_ERROR_NO_CYPHER_OVERLAP”.
85 ErrorMap map[string]string
86}
87
88var shimConfig ShimConfiguration
89
David Benjamin33863262016-07-08 17:20:12 -070090type testCert int
91
David Benjamin025b3d32014-07-01 19:53:04 -040092const (
David Benjamin33863262016-07-08 17:20:12 -070093 testCertRSA testCert = iota
David Benjamin7944a9f2016-07-12 22:27:01 -040094 testCertRSA1024
David Benjamin2c516452016-11-15 10:16:54 +090095 testCertRSAChain
Adam Langley898be922017-02-27 12:37:59 -080096 testCertECDSAP224
David Benjamin33863262016-07-08 17:20:12 -070097 testCertECDSAP256
98 testCertECDSAP384
99 testCertECDSAP521
100)
101
102const (
103 rsaCertificateFile = "cert.pem"
David Benjamin7944a9f2016-07-12 22:27:01 -0400104 rsa1024CertificateFile = "rsa_1024_cert.pem"
David Benjamin2c516452016-11-15 10:16:54 +0900105 rsaChainCertificateFile = "rsa_chain_cert.pem"
Adam Langley898be922017-02-27 12:37:59 -0800106 ecdsaP224CertificateFile = "ecdsa_p224_cert.pem"
David Benjamin33863262016-07-08 17:20:12 -0700107 ecdsaP256CertificateFile = "ecdsa_p256_cert.pem"
108 ecdsaP384CertificateFile = "ecdsa_p384_cert.pem"
109 ecdsaP521CertificateFile = "ecdsa_p521_cert.pem"
David Benjamin025b3d32014-07-01 19:53:04 -0400110)
111
112const (
David Benjamina08e49d2014-08-24 01:46:07 -0400113 rsaKeyFile = "key.pem"
David Benjamin7944a9f2016-07-12 22:27:01 -0400114 rsa1024KeyFile = "rsa_1024_key.pem"
David Benjamin2c516452016-11-15 10:16:54 +0900115 rsaChainKeyFile = "rsa_chain_key.pem"
Adam Langley898be922017-02-27 12:37:59 -0800116 ecdsaP224KeyFile = "ecdsa_p224_key.pem"
David Benjamin33863262016-07-08 17:20:12 -0700117 ecdsaP256KeyFile = "ecdsa_p256_key.pem"
118 ecdsaP384KeyFile = "ecdsa_p384_key.pem"
119 ecdsaP521KeyFile = "ecdsa_p521_key.pem"
David Benjamina08e49d2014-08-24 01:46:07 -0400120 channelIDKeyFile = "channel_id_key.pem"
David Benjamin025b3d32014-07-01 19:53:04 -0400121)
122
David Benjamin7944a9f2016-07-12 22:27:01 -0400123var (
124 rsaCertificate Certificate
125 rsa1024Certificate Certificate
David Benjamin2c516452016-11-15 10:16:54 +0900126 rsaChainCertificate Certificate
Adam Langley898be922017-02-27 12:37:59 -0800127 ecdsaP224Certificate Certificate
David Benjamin7944a9f2016-07-12 22:27:01 -0400128 ecdsaP256Certificate Certificate
129 ecdsaP384Certificate Certificate
130 ecdsaP521Certificate Certificate
131)
David Benjamin33863262016-07-08 17:20:12 -0700132
133var testCerts = []struct {
134 id testCert
135 certFile, keyFile string
136 cert *Certificate
137}{
138 {
139 id: testCertRSA,
140 certFile: rsaCertificateFile,
141 keyFile: rsaKeyFile,
142 cert: &rsaCertificate,
143 },
144 {
David Benjamin7944a9f2016-07-12 22:27:01 -0400145 id: testCertRSA1024,
146 certFile: rsa1024CertificateFile,
147 keyFile: rsa1024KeyFile,
148 cert: &rsa1024Certificate,
149 },
150 {
David Benjamin2c516452016-11-15 10:16:54 +0900151 id: testCertRSAChain,
152 certFile: rsaChainCertificateFile,
153 keyFile: rsaChainKeyFile,
154 cert: &rsaChainCertificate,
155 },
156 {
Adam Langley898be922017-02-27 12:37:59 -0800157 id: testCertECDSAP224,
158 certFile: ecdsaP224CertificateFile,
159 keyFile: ecdsaP224KeyFile,
160 cert: &ecdsaP224Certificate,
161 },
162 {
David Benjamin33863262016-07-08 17:20:12 -0700163 id: testCertECDSAP256,
164 certFile: ecdsaP256CertificateFile,
165 keyFile: ecdsaP256KeyFile,
166 cert: &ecdsaP256Certificate,
167 },
168 {
169 id: testCertECDSAP384,
170 certFile: ecdsaP384CertificateFile,
171 keyFile: ecdsaP384KeyFile,
172 cert: &ecdsaP384Certificate,
173 },
174 {
175 id: testCertECDSAP521,
176 certFile: ecdsaP521CertificateFile,
177 keyFile: ecdsaP521KeyFile,
178 cert: &ecdsaP521Certificate,
179 },
180}
181
David Benjamina08e49d2014-08-24 01:46:07 -0400182var channelIDKey *ecdsa.PrivateKey
183var channelIDBytes []byte
Adam Langley95c29f32014-06-20 12:00:00 -0700184
David Benjamin61f95272014-11-25 01:55:35 -0500185var testOCSPResponse = []byte{1, 2, 3, 4}
Adam Langleycfa08c32016-11-17 13:21:27 -0800186var testSCTList = []byte{0, 6, 0, 4, 5, 6, 7, 8}
David Benjamin61f95272014-11-25 01:55:35 -0500187
Steven Valdeza833c352016-11-01 13:39:36 -0400188var testOCSPExtension = append([]byte{byte(extensionStatusRequest) >> 8, byte(extensionStatusRequest), 0, 8, statusTypeOCSP, 0, 0, 4}, testOCSPResponse...)
Adam Langleycfa08c32016-11-17 13:21:27 -0800189var testSCTExtension = append([]byte{byte(extensionSignedCertificateTimestamp) >> 8, byte(extensionSignedCertificateTimestamp), 0, byte(len(testSCTList))}, testSCTList...)
Steven Valdeza833c352016-11-01 13:39:36 -0400190
Adam Langley95c29f32014-06-20 12:00:00 -0700191func initCertificates() {
David Benjamin33863262016-07-08 17:20:12 -0700192 for i := range testCerts {
193 cert, err := LoadX509KeyPair(path.Join(*resourceDir, testCerts[i].certFile), path.Join(*resourceDir, testCerts[i].keyFile))
194 if err != nil {
195 panic(err)
196 }
197 cert.OCSPStaple = testOCSPResponse
198 cert.SignedCertificateTimestampList = testSCTList
199 *testCerts[i].cert = cert
Adam Langley95c29f32014-06-20 12:00:00 -0700200 }
David Benjamina08e49d2014-08-24 01:46:07 -0400201
Adam Langley7c803a62015-06-15 15:35:05 -0700202 channelIDPEMBlock, err := ioutil.ReadFile(path.Join(*resourceDir, channelIDKeyFile))
David Benjamina08e49d2014-08-24 01:46:07 -0400203 if err != nil {
204 panic(err)
205 }
206 channelIDDERBlock, _ := pem.Decode(channelIDPEMBlock)
207 if channelIDDERBlock.Type != "EC PRIVATE KEY" {
208 panic("bad key type")
209 }
210 channelIDKey, err = x509.ParseECPrivateKey(channelIDDERBlock.Bytes)
211 if err != nil {
212 panic(err)
213 }
214 if channelIDKey.Curve != elliptic.P256() {
215 panic("bad curve")
216 }
217
218 channelIDBytes = make([]byte, 64)
219 writeIntPadded(channelIDBytes[:32], channelIDKey.X)
220 writeIntPadded(channelIDBytes[32:], channelIDKey.Y)
Adam Langley95c29f32014-06-20 12:00:00 -0700221}
222
David Benjamin33863262016-07-08 17:20:12 -0700223func getRunnerCertificate(t testCert) Certificate {
224 for _, cert := range testCerts {
225 if cert.id == t {
226 return *cert.cert
227 }
228 }
229 panic("Unknown test certificate")
Adam Langley95c29f32014-06-20 12:00:00 -0700230}
231
David Benjamin33863262016-07-08 17:20:12 -0700232func getShimCertificate(t testCert) string {
233 for _, cert := range testCerts {
234 if cert.id == t {
235 return cert.certFile
236 }
237 }
238 panic("Unknown test certificate")
239}
240
241func getShimKey(t testCert) string {
242 for _, cert := range testCerts {
243 if cert.id == t {
244 return cert.keyFile
245 }
246 }
247 panic("Unknown test certificate")
Adam Langley95c29f32014-06-20 12:00:00 -0700248}
249
Adam Langley2ff79332017-02-28 13:45:39 -0800250// encodeDERValues encodes a series of bytestrings in comma-separated-hex form.
251func encodeDERValues(values [][]byte) string {
252 var ret string
253 for i, v := range values {
254 if i > 0 {
255 ret += ","
256 }
257 ret += hex.EncodeToString(v)
258 }
259
260 return ret
261}
262
David Benjamin025b3d32014-07-01 19:53:04 -0400263type testType int
264
265const (
266 clientTest testType = iota
267 serverTest
268)
269
David Benjamin6fd297b2014-08-11 18:43:38 -0400270type protocol int
271
272const (
273 tls protocol = iota
274 dtls
275)
276
David Benjaminfc7b0862014-09-06 13:21:53 -0400277const (
278 alpn = 1
279 npn = 2
280)
281
Adam Langley95c29f32014-06-20 12:00:00 -0700282type testCase struct {
David Benjamin025b3d32014-07-01 19:53:04 -0400283 testType testType
David Benjamin6fd297b2014-08-11 18:43:38 -0400284 protocol protocol
Adam Langley95c29f32014-06-20 12:00:00 -0700285 name string
286 config Config
287 shouldFail bool
288 expectedError string
Adam Langleyac61fa32014-06-23 12:03:11 -0700289 // expectedLocalError, if not empty, contains a substring that must be
290 // found in the local error.
291 expectedLocalError string
David Benjamin7e2e6cf2014-08-07 17:44:24 -0400292 // expectedVersion, if non-zero, specifies the TLS version that must be
293 // negotiated.
294 expectedVersion uint16
David Benjamin01fe8202014-09-24 15:21:44 -0400295 // expectedResumeVersion, if non-zero, specifies the TLS version that
296 // must be negotiated on resumption. If zero, expectedVersion is used.
297 expectedResumeVersion uint16
David Benjamin90da8c82015-04-20 14:57:57 -0400298 // expectedCipher, if non-zero, specifies the TLS cipher suite that
299 // should be negotiated.
300 expectedCipher uint16
David Benjamina08e49d2014-08-24 01:46:07 -0400301 // expectChannelID controls whether the connection should have
302 // negotiated a Channel ID with channelIDKey.
303 expectChannelID bool
David Benjaminae2888f2014-09-06 12:58:58 -0400304 // expectedNextProto controls whether the connection should
305 // negotiate a next protocol via NPN or ALPN.
306 expectedNextProto string
David Benjaminc7ce9772015-10-09 19:32:41 -0400307 // expectNoNextProto, if true, means that no next protocol should be
308 // negotiated.
309 expectNoNextProto bool
David Benjaminfc7b0862014-09-06 13:21:53 -0400310 // expectedNextProtoType, if non-zero, is the expected next
311 // protocol negotiation mechanism.
312 expectedNextProtoType int
David Benjaminca6c8262014-11-15 19:06:08 -0500313 // expectedSRTPProtectionProfile is the DTLS-SRTP profile that
314 // should be negotiated. If zero, none should be negotiated.
315 expectedSRTPProtectionProfile uint16
Paul Lietaraeeff2c2015-08-12 11:47:11 +0100316 // expectedOCSPResponse, if not nil, is the expected OCSP response to be received.
317 expectedOCSPResponse []uint8
Paul Lietar4fac72e2015-09-09 13:44:55 +0100318 // expectedSCTList, if not nil, is the expected SCT list to be received.
319 expectedSCTList []uint8
Nick Harper60edffd2016-06-21 15:19:24 -0700320 // expectedPeerSignatureAlgorithm, if not zero, is the signature
321 // algorithm that the peer should have used in the handshake.
322 expectedPeerSignatureAlgorithm signatureAlgorithm
Steven Valdez5440fe02016-07-18 12:40:30 -0400323 // expectedCurveID, if not zero, is the curve that the handshake should
324 // have used.
325 expectedCurveID CurveID
Adam Langley80842bd2014-06-20 12:00:00 -0700326 // messageLen is the length, in bytes, of the test message that will be
327 // sent.
328 messageLen int
David Benjamin8e6db492015-07-25 18:29:23 -0400329 // messageCount is the number of test messages that will be sent.
330 messageCount int
David Benjamin025b3d32014-07-01 19:53:04 -0400331 // certFile is the path to the certificate to use for the server.
332 certFile string
333 // keyFile is the path to the private key to use for the server.
334 keyFile string
David Benjamin1d5c83e2014-07-22 19:20:02 -0400335 // resumeSession controls whether a second connection should be tested
David Benjamin01fe8202014-09-24 15:21:44 -0400336 // which attempts to resume the first session.
David Benjamin1d5c83e2014-07-22 19:20:02 -0400337 resumeSession bool
David Benjamin46662482016-08-17 00:51:00 -0400338 // resumeRenewedSession controls whether a third connection should be
339 // tested which attempts to resume the second connection's session.
340 resumeRenewedSession bool
Adam Langleyb0eef0a2015-06-02 10:47:39 -0700341 // expectResumeRejected, if true, specifies that the attempted
342 // resumption must be rejected by the client. This is only valid for a
343 // serverTest.
344 expectResumeRejected bool
David Benjamin01fe8202014-09-24 15:21:44 -0400345 // resumeConfig, if not nil, points to a Config to be used on
David Benjaminfe8eb9a2014-11-17 03:19:02 -0500346 // resumption. Unless newSessionsOnResume is set,
347 // SessionTicketKey, ServerSessionCache, and
348 // ClientSessionCache are copied from the initial connection's
349 // config. If nil, the initial connection's config is used.
David Benjamin01fe8202014-09-24 15:21:44 -0400350 resumeConfig *Config
David Benjaminfe8eb9a2014-11-17 03:19:02 -0500351 // newSessionsOnResume, if true, will cause resumeConfig to
352 // use a different session resumption context.
353 newSessionsOnResume bool
David Benjaminba4594a2015-06-18 18:36:15 -0400354 // noSessionCache, if true, will cause the server to run without a
355 // session cache.
356 noSessionCache bool
David Benjamin98e882e2014-08-08 13:24:34 -0400357 // sendPrefix sends a prefix on the socket before actually performing a
358 // handshake.
359 sendPrefix string
David Benjamine58c4f52014-08-24 03:47:07 -0400360 // shimWritesFirst controls whether the shim sends an initial "hello"
361 // message before doing a roundtrip with the runner.
362 shimWritesFirst bool
David Benjamin30789da2015-08-29 22:56:45 -0400363 // shimShutsDown, if true, runs a test where the shim shuts down the
364 // connection immediately after the handshake rather than echoing
365 // messages from the runner.
366 shimShutsDown bool
David Benjamin1d5ef3b2015-10-12 19:54:18 -0400367 // renegotiate indicates the number of times the connection should be
368 // renegotiated during the exchange.
369 renegotiate int
David Benjamin47921102016-07-28 11:29:18 -0400370 // sendHalfHelloRequest, if true, causes the server to send half a
371 // HelloRequest when the handshake completes.
372 sendHalfHelloRequest bool
Adam Langleycf2d4f42014-10-28 19:06:14 -0700373 // renegotiateCiphers is a list of ciphersuite ids that will be
374 // switched in just before renegotiation.
375 renegotiateCiphers []uint16
David Benjamin5e961c12014-11-07 01:48:35 -0500376 // replayWrites, if true, configures the underlying transport
377 // to replay every write it makes in DTLS tests.
378 replayWrites bool
David Benjamin5fa3eba2015-01-22 16:35:40 -0500379 // damageFirstWrite, if true, configures the underlying transport to
380 // damage the final byte of the first application data write.
381 damageFirstWrite bool
David Benjaminc565ebb2015-04-03 04:06:36 -0400382 // exportKeyingMaterial, if non-zero, configures the test to exchange
383 // keying material and verify they match.
384 exportKeyingMaterial int
385 exportLabel string
386 exportContext string
387 useExportContext bool
David Benjamin325b5c32014-07-01 19:40:31 -0400388 // flags, if not empty, contains a list of command-line flags that will
389 // be passed to the shim program.
390 flags []string
Adam Langleyaf0e32c2015-06-03 09:57:23 -0700391 // testTLSUnique, if true, causes the shim to send the tls-unique value
392 // which will be compared against the expected value.
393 testTLSUnique bool
David Benjamina8ebe222015-06-06 03:04:39 -0400394 // sendEmptyRecords is the number of consecutive empty records to send
395 // before and after the test message.
396 sendEmptyRecords int
David Benjamin24f346d2015-06-06 03:28:08 -0400397 // sendWarningAlerts is the number of consecutive warning alerts to send
398 // before and after the test message.
399 sendWarningAlerts int
Steven Valdez32635b82016-08-16 11:25:03 -0400400 // sendKeyUpdates is the number of consecutive key updates to send
401 // before and after the test message.
402 sendKeyUpdates int
Steven Valdezc4aa7272016-10-03 12:25:56 -0400403 // keyUpdateRequest is the KeyUpdateRequest value to send in KeyUpdate messages.
404 keyUpdateRequest byte
David Benjamin4f75aaf2015-09-01 16:53:10 -0400405 // expectMessageDropped, if true, means the test message is expected to
406 // be dropped by the client rather than echoed back.
407 expectMessageDropped bool
David Benjamin2c516452016-11-15 10:16:54 +0900408 // expectPeerCertificate, if not nil, is the certificate chain the peer
409 // is expected to send.
410 expectPeerCertificate *Certificate
Adam Langley95c29f32014-06-20 12:00:00 -0700411}
412
Adam Langley7c803a62015-06-15 15:35:05 -0700413var testCases []testCase
Adam Langley95c29f32014-06-20 12:00:00 -0700414
David Benjaminc07afb72016-09-22 10:18:58 -0400415func writeTranscript(test *testCase, num int, data []byte) {
David Benjamin9867b7d2016-03-01 23:25:48 -0500416 if len(data) == 0 {
417 return
418 }
419
420 protocol := "tls"
421 if test.protocol == dtls {
422 protocol = "dtls"
423 }
424
425 side := "client"
426 if test.testType == serverTest {
427 side = "server"
428 }
429
430 dir := path.Join(*transcriptDir, protocol, side)
431 if err := os.MkdirAll(dir, 0755); err != nil {
432 fmt.Fprintf(os.Stderr, "Error making %s: %s\n", dir, err)
433 return
434 }
435
David Benjaminc07afb72016-09-22 10:18:58 -0400436 name := fmt.Sprintf("%s-%d", test.name, num)
David Benjamin9867b7d2016-03-01 23:25:48 -0500437 if err := ioutil.WriteFile(path.Join(dir, name), data, 0644); err != nil {
438 fmt.Fprintf(os.Stderr, "Error writing %s: %s\n", name, err)
439 }
440}
441
David Benjamin3ed59772016-03-08 12:50:21 -0500442// A timeoutConn implements an idle timeout on each Read and Write operation.
443type timeoutConn struct {
444 net.Conn
445 timeout time.Duration
446}
447
448func (t *timeoutConn) Read(b []byte) (int, error) {
449 if err := t.SetReadDeadline(time.Now().Add(t.timeout)); err != nil {
450 return 0, err
451 }
452 return t.Conn.Read(b)
453}
454
455func (t *timeoutConn) Write(b []byte) (int, error) {
456 if err := t.SetWriteDeadline(time.Now().Add(t.timeout)); err != nil {
457 return 0, err
458 }
459 return t.Conn.Write(b)
460}
461
David Benjaminc07afb72016-09-22 10:18:58 -0400462func doExchange(test *testCase, config *Config, conn net.Conn, isResume bool, num int) error {
David Benjamine54af062016-08-08 19:21:18 -0400463 if !test.noSessionCache {
464 if config.ClientSessionCache == nil {
465 config.ClientSessionCache = NewLRUClientSessionCache(1)
466 }
467 if config.ServerSessionCache == nil {
468 config.ServerSessionCache = NewLRUServerSessionCache(1)
469 }
470 }
471 if test.testType == clientTest {
472 if len(config.Certificates) == 0 {
473 config.Certificates = []Certificate{rsaCertificate}
474 }
475 } else {
476 // Supply a ServerName to ensure a constant session cache key,
477 // rather than falling back to net.Conn.RemoteAddr.
478 if len(config.ServerName) == 0 {
479 config.ServerName = "test"
480 }
481 }
482 if *fuzzer {
483 config.Bugs.NullAllCiphers = true
484 }
David Benjamin01a90572016-09-22 00:11:43 -0400485 if *deterministic {
486 config.Time = func() time.Time { return time.Unix(1234, 1234) }
487 }
David Benjamine54af062016-08-08 19:21:18 -0400488
David Benjamin01784b42016-06-07 18:00:52 -0400489 conn = &timeoutConn{conn, *idleTimeout}
David Benjamin65ea8ff2014-11-23 03:01:00 -0500490
David Benjamin6fd297b2014-08-11 18:43:38 -0400491 if test.protocol == dtls {
David Benjamin83f90402015-01-27 01:09:43 -0500492 config.Bugs.PacketAdaptor = newPacketAdaptor(conn)
493 conn = config.Bugs.PacketAdaptor
David Benjaminebda9b32015-11-02 15:33:18 -0500494 }
495
David Benjamin9867b7d2016-03-01 23:25:48 -0500496 if *flagDebug || len(*transcriptDir) != 0 {
David Benjaminebda9b32015-11-02 15:33:18 -0500497 local, peer := "client", "server"
498 if test.testType == clientTest {
499 local, peer = peer, local
David Benjamin5e961c12014-11-07 01:48:35 -0500500 }
David Benjaminebda9b32015-11-02 15:33:18 -0500501 connDebug := &recordingConn{
502 Conn: conn,
503 isDatagram: test.protocol == dtls,
504 local: local,
505 peer: peer,
506 }
507 conn = connDebug
David Benjamin9867b7d2016-03-01 23:25:48 -0500508 if *flagDebug {
509 defer connDebug.WriteTo(os.Stdout)
510 }
511 if len(*transcriptDir) != 0 {
512 defer func() {
David Benjaminc07afb72016-09-22 10:18:58 -0400513 writeTranscript(test, num, connDebug.Transcript())
David Benjamin9867b7d2016-03-01 23:25:48 -0500514 }()
515 }
David Benjaminebda9b32015-11-02 15:33:18 -0500516
517 if config.Bugs.PacketAdaptor != nil {
518 config.Bugs.PacketAdaptor.debug = connDebug
519 }
520 }
521
522 if test.replayWrites {
523 conn = newReplayAdaptor(conn)
David Benjamin6fd297b2014-08-11 18:43:38 -0400524 }
525
David Benjamin3ed59772016-03-08 12:50:21 -0500526 var connDamage *damageAdaptor
David Benjamin5fa3eba2015-01-22 16:35:40 -0500527 if test.damageFirstWrite {
528 connDamage = newDamageAdaptor(conn)
529 conn = connDamage
530 }
531
David Benjamin6fd297b2014-08-11 18:43:38 -0400532 if test.sendPrefix != "" {
533 if _, err := conn.Write([]byte(test.sendPrefix)); err != nil {
534 return err
535 }
David Benjamin98e882e2014-08-08 13:24:34 -0400536 }
537
David Benjamin1d5c83e2014-07-22 19:20:02 -0400538 var tlsConn *Conn
David Benjamin7e2e6cf2014-08-07 17:44:24 -0400539 if test.testType == clientTest {
David Benjamin6fd297b2014-08-11 18:43:38 -0400540 if test.protocol == dtls {
541 tlsConn = DTLSServer(conn, config)
542 } else {
543 tlsConn = Server(conn, config)
544 }
David Benjamin1d5c83e2014-07-22 19:20:02 -0400545 } else {
546 config.InsecureSkipVerify = true
David Benjamin6fd297b2014-08-11 18:43:38 -0400547 if test.protocol == dtls {
548 tlsConn = DTLSClient(conn, config)
549 } else {
550 tlsConn = Client(conn, config)
551 }
David Benjamin1d5c83e2014-07-22 19:20:02 -0400552 }
David Benjamin30789da2015-08-29 22:56:45 -0400553 defer tlsConn.Close()
David Benjamin1d5c83e2014-07-22 19:20:02 -0400554
Adam Langley95c29f32014-06-20 12:00:00 -0700555 if err := tlsConn.Handshake(); err != nil {
556 return err
557 }
Kenny Root7fdeaf12014-08-05 15:23:37 -0700558
David Benjamin01fe8202014-09-24 15:21:44 -0400559 // TODO(davidben): move all per-connection expectations into a dedicated
560 // expectations struct that can be specified separately for the two
561 // legs.
562 expectedVersion := test.expectedVersion
563 if isResume && test.expectedResumeVersion != 0 {
564 expectedVersion = test.expectedResumeVersion
565 }
Adam Langleyb0eef0a2015-06-02 10:47:39 -0700566 connState := tlsConn.ConnectionState()
567 if vers := connState.Version; expectedVersion != 0 && vers != expectedVersion {
David Benjamin01fe8202014-09-24 15:21:44 -0400568 return fmt.Errorf("got version %x, expected %x", vers, expectedVersion)
David Benjamin7e2e6cf2014-08-07 17:44:24 -0400569 }
570
Adam Langleyb0eef0a2015-06-02 10:47:39 -0700571 if cipher := connState.CipherSuite; test.expectedCipher != 0 && cipher != test.expectedCipher {
David Benjamin90da8c82015-04-20 14:57:57 -0400572 return fmt.Errorf("got cipher %x, expected %x", cipher, test.expectedCipher)
573 }
Adam Langleyb0eef0a2015-06-02 10:47:39 -0700574 if didResume := connState.DidResume; isResume && didResume == test.expectResumeRejected {
575 return fmt.Errorf("didResume is %t, but we expected the opposite", didResume)
576 }
David Benjamin90da8c82015-04-20 14:57:57 -0400577
David Benjamina08e49d2014-08-24 01:46:07 -0400578 if test.expectChannelID {
Adam Langleyb0eef0a2015-06-02 10:47:39 -0700579 channelID := connState.ChannelID
David Benjamina08e49d2014-08-24 01:46:07 -0400580 if channelID == nil {
581 return fmt.Errorf("no channel ID negotiated")
582 }
583 if channelID.Curve != channelIDKey.Curve ||
584 channelIDKey.X.Cmp(channelIDKey.X) != 0 ||
585 channelIDKey.Y.Cmp(channelIDKey.Y) != 0 {
586 return fmt.Errorf("incorrect channel ID")
587 }
588 }
589
David Benjaminae2888f2014-09-06 12:58:58 -0400590 if expected := test.expectedNextProto; expected != "" {
Adam Langleyb0eef0a2015-06-02 10:47:39 -0700591 if actual := connState.NegotiatedProtocol; actual != expected {
David Benjaminae2888f2014-09-06 12:58:58 -0400592 return fmt.Errorf("next proto mismatch: got %s, wanted %s", actual, expected)
593 }
594 }
595
David Benjaminc7ce9772015-10-09 19:32:41 -0400596 if test.expectNoNextProto {
597 if actual := connState.NegotiatedProtocol; actual != "" {
598 return fmt.Errorf("got unexpected next proto %s", actual)
599 }
600 }
601
David Benjaminfc7b0862014-09-06 13:21:53 -0400602 if test.expectedNextProtoType != 0 {
Adam Langleyb0eef0a2015-06-02 10:47:39 -0700603 if (test.expectedNextProtoType == alpn) != connState.NegotiatedProtocolFromALPN {
David Benjaminfc7b0862014-09-06 13:21:53 -0400604 return fmt.Errorf("next proto type mismatch")
605 }
606 }
607
Adam Langleyb0eef0a2015-06-02 10:47:39 -0700608 if p := connState.SRTPProtectionProfile; p != test.expectedSRTPProtectionProfile {
David Benjaminca6c8262014-11-15 19:06:08 -0500609 return fmt.Errorf("SRTP profile mismatch: got %d, wanted %d", p, test.expectedSRTPProtectionProfile)
610 }
611
Paul Lietaraeeff2c2015-08-12 11:47:11 +0100612 if test.expectedOCSPResponse != nil && !bytes.Equal(test.expectedOCSPResponse, tlsConn.OCSPResponse()) {
David Benjamin942f4ed2016-07-16 19:03:49 +0300613 return fmt.Errorf("OCSP Response mismatch: got %x, wanted %x", tlsConn.OCSPResponse(), test.expectedOCSPResponse)
Paul Lietaraeeff2c2015-08-12 11:47:11 +0100614 }
615
Paul Lietar4fac72e2015-09-09 13:44:55 +0100616 if test.expectedSCTList != nil && !bytes.Equal(test.expectedSCTList, connState.SCTList) {
617 return fmt.Errorf("SCT list mismatch")
618 }
619
Nick Harper60edffd2016-06-21 15:19:24 -0700620 if expected := test.expectedPeerSignatureAlgorithm; expected != 0 && expected != connState.PeerSignatureAlgorithm {
621 return fmt.Errorf("expected peer to use signature algorithm %04x, but got %04x", expected, connState.PeerSignatureAlgorithm)
Steven Valdez0d62f262015-09-04 12:41:04 -0400622 }
623
Steven Valdez5440fe02016-07-18 12:40:30 -0400624 if expected := test.expectedCurveID; expected != 0 && expected != connState.CurveID {
625 return fmt.Errorf("expected peer to use curve %04x, but got %04x", expected, connState.CurveID)
626 }
627
David Benjamin2c516452016-11-15 10:16:54 +0900628 if test.expectPeerCertificate != nil {
629 if len(connState.PeerCertificates) != len(test.expectPeerCertificate.Certificate) {
630 return fmt.Errorf("expected peer to send %d certificates, but got %d", len(connState.PeerCertificates), len(test.expectPeerCertificate.Certificate))
631 }
632 for i, cert := range connState.PeerCertificates {
633 if !bytes.Equal(cert.Raw, test.expectPeerCertificate.Certificate[i]) {
634 return fmt.Errorf("peer certificate %d did not match", i+1)
635 }
636 }
637 }
638
David Benjaminc565ebb2015-04-03 04:06:36 -0400639 if test.exportKeyingMaterial > 0 {
640 actual := make([]byte, test.exportKeyingMaterial)
641 if _, err := io.ReadFull(tlsConn, actual); err != nil {
642 return err
643 }
644 expected, err := tlsConn.ExportKeyingMaterial(test.exportKeyingMaterial, []byte(test.exportLabel), []byte(test.exportContext), test.useExportContext)
645 if err != nil {
646 return err
647 }
648 if !bytes.Equal(actual, expected) {
649 return fmt.Errorf("keying material mismatch")
650 }
651 }
652
Adam Langleyaf0e32c2015-06-03 09:57:23 -0700653 if test.testTLSUnique {
654 var peersValue [12]byte
655 if _, err := io.ReadFull(tlsConn, peersValue[:]); err != nil {
656 return err
657 }
658 expected := tlsConn.ConnectionState().TLSUnique
659 if !bytes.Equal(peersValue[:], expected) {
660 return fmt.Errorf("tls-unique mismatch: peer sent %x, but %x was expected", peersValue[:], expected)
661 }
662 }
663
David Benjamine58c4f52014-08-24 03:47:07 -0400664 if test.shimWritesFirst {
665 var buf [5]byte
666 _, err := io.ReadFull(tlsConn, buf[:])
667 if err != nil {
668 return err
669 }
670 if string(buf[:]) != "hello" {
671 return fmt.Errorf("bad initial message")
672 }
673 }
674
Steven Valdez32635b82016-08-16 11:25:03 -0400675 for i := 0; i < test.sendKeyUpdates; i++ {
Steven Valdezc4aa7272016-10-03 12:25:56 -0400676 if err := tlsConn.SendKeyUpdate(test.keyUpdateRequest); err != nil {
David Benjamin7f0965a2016-09-30 15:14:01 -0400677 return err
678 }
Steven Valdez32635b82016-08-16 11:25:03 -0400679 }
680
David Benjamina8ebe222015-06-06 03:04:39 -0400681 for i := 0; i < test.sendEmptyRecords; i++ {
682 tlsConn.Write(nil)
683 }
684
David Benjamin24f346d2015-06-06 03:28:08 -0400685 for i := 0; i < test.sendWarningAlerts; i++ {
686 tlsConn.SendAlert(alertLevelWarning, alertUnexpectedMessage)
687 }
688
David Benjamin47921102016-07-28 11:29:18 -0400689 if test.sendHalfHelloRequest {
690 tlsConn.SendHalfHelloRequest()
691 }
692
David Benjamin1d5ef3b2015-10-12 19:54:18 -0400693 if test.renegotiate > 0 {
Adam Langleycf2d4f42014-10-28 19:06:14 -0700694 if test.renegotiateCiphers != nil {
695 config.CipherSuites = test.renegotiateCiphers
696 }
David Benjamin1d5ef3b2015-10-12 19:54:18 -0400697 for i := 0; i < test.renegotiate; i++ {
698 if err := tlsConn.Renegotiate(); err != nil {
699 return err
700 }
Adam Langleycf2d4f42014-10-28 19:06:14 -0700701 }
702 } else if test.renegotiateCiphers != nil {
703 panic("renegotiateCiphers without renegotiate")
704 }
705
David Benjamin5fa3eba2015-01-22 16:35:40 -0500706 if test.damageFirstWrite {
707 connDamage.setDamage(true)
708 tlsConn.Write([]byte("DAMAGED WRITE"))
709 connDamage.setDamage(false)
710 }
711
David Benjamin8e6db492015-07-25 18:29:23 -0400712 messageLen := test.messageLen
Kenny Root7fdeaf12014-08-05 15:23:37 -0700713 if messageLen < 0 {
David Benjamin6fd297b2014-08-11 18:43:38 -0400714 if test.protocol == dtls {
715 return fmt.Errorf("messageLen < 0 not supported for DTLS tests")
716 }
Kenny Root7fdeaf12014-08-05 15:23:37 -0700717 // Read until EOF.
718 _, err := io.Copy(ioutil.Discard, tlsConn)
719 return err
720 }
David Benjamin4417d052015-04-05 04:17:25 -0400721 if messageLen == 0 {
722 messageLen = 32
Adam Langley80842bd2014-06-20 12:00:00 -0700723 }
Adam Langley95c29f32014-06-20 12:00:00 -0700724
David Benjamin8e6db492015-07-25 18:29:23 -0400725 messageCount := test.messageCount
726 if messageCount == 0 {
727 messageCount = 1
David Benjamina8ebe222015-06-06 03:04:39 -0400728 }
729
David Benjamin8e6db492015-07-25 18:29:23 -0400730 for j := 0; j < messageCount; j++ {
731 testMessage := make([]byte, messageLen)
732 for i := range testMessage {
733 testMessage[i] = 0x42 ^ byte(j)
David Benjamin6fd297b2014-08-11 18:43:38 -0400734 }
David Benjamin8e6db492015-07-25 18:29:23 -0400735 tlsConn.Write(testMessage)
Adam Langley95c29f32014-06-20 12:00:00 -0700736
Steven Valdez32635b82016-08-16 11:25:03 -0400737 for i := 0; i < test.sendKeyUpdates; i++ {
Steven Valdezc4aa7272016-10-03 12:25:56 -0400738 tlsConn.SendKeyUpdate(test.keyUpdateRequest)
Steven Valdez32635b82016-08-16 11:25:03 -0400739 }
740
David Benjamin8e6db492015-07-25 18:29:23 -0400741 for i := 0; i < test.sendEmptyRecords; i++ {
742 tlsConn.Write(nil)
743 }
744
745 for i := 0; i < test.sendWarningAlerts; i++ {
746 tlsConn.SendAlert(alertLevelWarning, alertUnexpectedMessage)
747 }
748
David Benjamin4f75aaf2015-09-01 16:53:10 -0400749 if test.shimShutsDown || test.expectMessageDropped {
David Benjamin30789da2015-08-29 22:56:45 -0400750 // The shim will not respond.
751 continue
752 }
753
David Benjamin8e6db492015-07-25 18:29:23 -0400754 buf := make([]byte, len(testMessage))
755 if test.protocol == dtls {
756 bufTmp := make([]byte, len(buf)+1)
757 n, err := tlsConn.Read(bufTmp)
758 if err != nil {
759 return err
760 }
761 if n != len(buf) {
762 return fmt.Errorf("bad reply; length mismatch (%d vs %d)", n, len(buf))
763 }
764 copy(buf, bufTmp)
765 } else {
766 _, err := io.ReadFull(tlsConn, buf)
767 if err != nil {
768 return err
769 }
770 }
771
772 for i, v := range buf {
773 if v != testMessage[i]^0xff {
774 return fmt.Errorf("bad reply contents at byte %d", i)
775 }
Adam Langley95c29f32014-06-20 12:00:00 -0700776 }
777 }
778
779 return nil
780}
781
David Benjamin325b5c32014-07-01 19:40:31 -0400782func valgrindOf(dbAttach bool, path string, args ...string) *exec.Cmd {
David Benjamind2ba8892016-09-20 19:41:04 -0400783 valgrindArgs := []string{"--error-exitcode=99", "--track-origins=yes", "--leak-check=full", "--quiet"}
Adam Langley95c29f32014-06-20 12:00:00 -0700784 if dbAttach {
David Benjamin325b5c32014-07-01 19:40:31 -0400785 valgrindArgs = append(valgrindArgs, "--db-attach=yes", "--db-command=xterm -e gdb -nw %f %p")
Adam Langley95c29f32014-06-20 12:00:00 -0700786 }
David Benjamin325b5c32014-07-01 19:40:31 -0400787 valgrindArgs = append(valgrindArgs, path)
788 valgrindArgs = append(valgrindArgs, args...)
Adam Langley95c29f32014-06-20 12:00:00 -0700789
David Benjamin325b5c32014-07-01 19:40:31 -0400790 return exec.Command("valgrind", valgrindArgs...)
Adam Langley95c29f32014-06-20 12:00:00 -0700791}
792
David Benjamin325b5c32014-07-01 19:40:31 -0400793func gdbOf(path string, args ...string) *exec.Cmd {
794 xtermArgs := []string{"-e", "gdb", "--args"}
795 xtermArgs = append(xtermArgs, path)
796 xtermArgs = append(xtermArgs, args...)
Adam Langley95c29f32014-06-20 12:00:00 -0700797
David Benjamin325b5c32014-07-01 19:40:31 -0400798 return exec.Command("xterm", xtermArgs...)
Adam Langley95c29f32014-06-20 12:00:00 -0700799}
800
David Benjamind16bf342015-12-18 00:53:12 -0500801func lldbOf(path string, args ...string) *exec.Cmd {
802 xtermArgs := []string{"-e", "lldb", "--"}
803 xtermArgs = append(xtermArgs, path)
804 xtermArgs = append(xtermArgs, args...)
805
806 return exec.Command("xterm", xtermArgs...)
807}
808
EKR842ae6c2016-07-27 09:22:05 +0200809var (
810 errMoreMallocs = errors.New("child process did not exhaust all allocation calls")
811 errUnimplemented = errors.New("child process does not implement needed flags")
812)
Adam Langley69a01602014-11-17 17:26:55 -0800813
David Benjamin87c8a642015-02-21 01:54:29 -0500814// accept accepts a connection from listener, unless waitChan signals a process
815// exit first.
816func acceptOrWait(listener net.Listener, waitChan chan error) (net.Conn, error) {
817 type connOrError struct {
818 conn net.Conn
819 err error
820 }
821 connChan := make(chan connOrError, 1)
822 go func() {
823 conn, err := listener.Accept()
824 connChan <- connOrError{conn, err}
825 close(connChan)
826 }()
827 select {
828 case result := <-connChan:
829 return result.conn, result.err
830 case childErr := <-waitChan:
831 waitChan <- childErr
832 return nil, fmt.Errorf("child exited early: %s", childErr)
833 }
834}
835
EKRf71d7ed2016-08-06 13:25:12 -0700836func translateExpectedError(errorStr string) string {
837 if translated, ok := shimConfig.ErrorMap[errorStr]; ok {
838 return translated
839 }
840
841 if *looseErrors {
842 return ""
843 }
844
845 return errorStr
846}
847
Adam Langley7c803a62015-06-15 15:35:05 -0700848func runTest(test *testCase, shimPath string, mallocNumToFail int64) error {
Steven Valdez803c77a2016-09-06 14:13:43 -0400849 // Help debugging panics on the Go side.
850 defer func() {
851 if r := recover(); r != nil {
852 fmt.Fprintf(os.Stderr, "Test '%s' panicked.\n", test.name)
853 panic(r)
854 }
855 }()
856
Adam Langley38311732014-10-16 19:04:35 -0700857 if !test.shouldFail && (len(test.expectedError) > 0 || len(test.expectedLocalError) > 0) {
858 panic("Error expected without shouldFail in " + test.name)
859 }
860
Adam Langleyb0eef0a2015-06-02 10:47:39 -0700861 if test.expectResumeRejected && !test.resumeSession {
862 panic("expectResumeRejected without resumeSession in " + test.name)
863 }
864
Adam Langley33b1d4f2016-12-07 15:03:45 -0800865 for _, ver := range tlsVersions {
866 if !strings.Contains("-"+test.name+"-", "-"+ver.name+"-") {
867 continue
868 }
869
870 if test.config.MaxVersion != 0 || test.config.MinVersion != 0 || test.expectedVersion != 0 {
871 continue
872 }
873
874 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))
875 }
876
David Benjamin87c8a642015-02-21 01:54:29 -0500877 listener, err := net.ListenTCP("tcp4", &net.TCPAddr{IP: net.IP{127, 0, 0, 1}})
878 if err != nil {
879 panic(err)
880 }
881 defer func() {
882 if listener != nil {
883 listener.Close()
884 }
885 }()
Adam Langley95c29f32014-06-20 12:00:00 -0700886
David Benjamin87c8a642015-02-21 01:54:29 -0500887 flags := []string{"-port", strconv.Itoa(listener.Addr().(*net.TCPAddr).Port)}
David Benjamin1d5c83e2014-07-22 19:20:02 -0400888 if test.testType == serverTest {
David Benjamin5a593af2014-08-11 19:51:50 -0400889 flags = append(flags, "-server")
890
David Benjamin025b3d32014-07-01 19:53:04 -0400891 flags = append(flags, "-key-file")
892 if test.keyFile == "" {
Adam Langley7c803a62015-06-15 15:35:05 -0700893 flags = append(flags, path.Join(*resourceDir, rsaKeyFile))
David Benjamin025b3d32014-07-01 19:53:04 -0400894 } else {
Adam Langley7c803a62015-06-15 15:35:05 -0700895 flags = append(flags, path.Join(*resourceDir, test.keyFile))
David Benjamin025b3d32014-07-01 19:53:04 -0400896 }
897
898 flags = append(flags, "-cert-file")
899 if test.certFile == "" {
Adam Langley7c803a62015-06-15 15:35:05 -0700900 flags = append(flags, path.Join(*resourceDir, rsaCertificateFile))
David Benjamin025b3d32014-07-01 19:53:04 -0400901 } else {
Adam Langley7c803a62015-06-15 15:35:05 -0700902 flags = append(flags, path.Join(*resourceDir, test.certFile))
David Benjamin025b3d32014-07-01 19:53:04 -0400903 }
904 }
David Benjamin5a593af2014-08-11 19:51:50 -0400905
David Benjamin6fd297b2014-08-11 18:43:38 -0400906 if test.protocol == dtls {
907 flags = append(flags, "-dtls")
908 }
909
David Benjamin46662482016-08-17 00:51:00 -0400910 var resumeCount int
David Benjamin5a593af2014-08-11 19:51:50 -0400911 if test.resumeSession {
David Benjamin46662482016-08-17 00:51:00 -0400912 resumeCount++
913 if test.resumeRenewedSession {
914 resumeCount++
915 }
916 }
917
918 if resumeCount > 0 {
919 flags = append(flags, "-resume-count", strconv.Itoa(resumeCount))
David Benjamin5a593af2014-08-11 19:51:50 -0400920 }
921
David Benjamine58c4f52014-08-24 03:47:07 -0400922 if test.shimWritesFirst {
923 flags = append(flags, "-shim-writes-first")
924 }
925
David Benjamin30789da2015-08-29 22:56:45 -0400926 if test.shimShutsDown {
927 flags = append(flags, "-shim-shuts-down")
928 }
929
David Benjaminc565ebb2015-04-03 04:06:36 -0400930 if test.exportKeyingMaterial > 0 {
931 flags = append(flags, "-export-keying-material", strconv.Itoa(test.exportKeyingMaterial))
932 flags = append(flags, "-export-label", test.exportLabel)
933 flags = append(flags, "-export-context", test.exportContext)
934 if test.useExportContext {
935 flags = append(flags, "-use-export-context")
936 }
937 }
Adam Langleyb0eef0a2015-06-02 10:47:39 -0700938 if test.expectResumeRejected {
939 flags = append(flags, "-expect-session-miss")
940 }
David Benjaminc565ebb2015-04-03 04:06:36 -0400941
Adam Langleyaf0e32c2015-06-03 09:57:23 -0700942 if test.testTLSUnique {
943 flags = append(flags, "-tls-unique")
944 }
945
David Benjamin025b3d32014-07-01 19:53:04 -0400946 flags = append(flags, test.flags...)
947
948 var shim *exec.Cmd
949 if *useValgrind {
Adam Langley7c803a62015-06-15 15:35:05 -0700950 shim = valgrindOf(false, shimPath, flags...)
Adam Langley75712922014-10-10 16:23:43 -0700951 } else if *useGDB {
Adam Langley7c803a62015-06-15 15:35:05 -0700952 shim = gdbOf(shimPath, flags...)
David Benjamind16bf342015-12-18 00:53:12 -0500953 } else if *useLLDB {
954 shim = lldbOf(shimPath, flags...)
David Benjamin025b3d32014-07-01 19:53:04 -0400955 } else {
Adam Langley7c803a62015-06-15 15:35:05 -0700956 shim = exec.Command(shimPath, flags...)
David Benjamin025b3d32014-07-01 19:53:04 -0400957 }
David Benjamin025b3d32014-07-01 19:53:04 -0400958 shim.Stdin = os.Stdin
959 var stdoutBuf, stderrBuf bytes.Buffer
960 shim.Stdout = &stdoutBuf
961 shim.Stderr = &stderrBuf
Adam Langley69a01602014-11-17 17:26:55 -0800962 if mallocNumToFail >= 0 {
David Benjamin9e128b02015-02-09 13:13:09 -0500963 shim.Env = os.Environ()
964 shim.Env = append(shim.Env, "MALLOC_NUMBER_TO_FAIL="+strconv.FormatInt(mallocNumToFail, 10))
Adam Langley69a01602014-11-17 17:26:55 -0800965 if *mallocTestDebug {
David Benjamin184494d2015-06-12 18:23:47 -0400966 shim.Env = append(shim.Env, "MALLOC_BREAK_ON_FAIL=1")
Adam Langley69a01602014-11-17 17:26:55 -0800967 }
968 shim.Env = append(shim.Env, "_MALLOC_CHECK=1")
969 }
David Benjamin025b3d32014-07-01 19:53:04 -0400970
971 if err := shim.Start(); err != nil {
Adam Langley95c29f32014-06-20 12:00:00 -0700972 panic(err)
973 }
David Benjamin87c8a642015-02-21 01:54:29 -0500974 waitChan := make(chan error, 1)
975 go func() { waitChan <- shim.Wait() }()
Adam Langley95c29f32014-06-20 12:00:00 -0700976
977 config := test.config
Adam Langley95c29f32014-06-20 12:00:00 -0700978
David Benjamin7a4aaa42016-09-20 17:58:14 -0400979 if *deterministic {
980 config.Rand = &deterministicRand{}
981 }
982
David Benjamin87c8a642015-02-21 01:54:29 -0500983 conn, err := acceptOrWait(listener, waitChan)
984 if err == nil {
David Benjaminc07afb72016-09-22 10:18:58 -0400985 err = doExchange(test, &config, conn, false /* not a resumption */, 0)
David Benjamin87c8a642015-02-21 01:54:29 -0500986 conn.Close()
987 }
David Benjamin65ea8ff2014-11-23 03:01:00 -0500988
David Benjamin46662482016-08-17 00:51:00 -0400989 for i := 0; err == nil && i < resumeCount; i++ {
David Benjamin01fe8202014-09-24 15:21:44 -0400990 var resumeConfig Config
991 if test.resumeConfig != nil {
992 resumeConfig = *test.resumeConfig
David Benjamine54af062016-08-08 19:21:18 -0400993 if !test.newSessionsOnResume {
David Benjaminfe8eb9a2014-11-17 03:19:02 -0500994 resumeConfig.SessionTicketKey = config.SessionTicketKey
995 resumeConfig.ClientSessionCache = config.ClientSessionCache
996 resumeConfig.ServerSessionCache = config.ServerSessionCache
997 }
David Benjamin2e045a92016-06-08 13:09:56 -0400998 resumeConfig.Rand = config.Rand
David Benjamin01fe8202014-09-24 15:21:44 -0400999 } else {
1000 resumeConfig = config
1001 }
David Benjamin87c8a642015-02-21 01:54:29 -05001002 var connResume net.Conn
1003 connResume, err = acceptOrWait(listener, waitChan)
1004 if err == nil {
David Benjaminc07afb72016-09-22 10:18:58 -04001005 err = doExchange(test, &resumeConfig, connResume, true /* resumption */, i+1)
David Benjamin87c8a642015-02-21 01:54:29 -05001006 connResume.Close()
1007 }
David Benjamin1d5c83e2014-07-22 19:20:02 -04001008 }
1009
David Benjamin87c8a642015-02-21 01:54:29 -05001010 // Close the listener now. This is to avoid hangs should the shim try to
1011 // open more connections than expected.
1012 listener.Close()
1013 listener = nil
1014
1015 childErr := <-waitChan
David Benjamind2ba8892016-09-20 19:41:04 -04001016 var isValgrindError bool
Adam Langley69a01602014-11-17 17:26:55 -08001017 if exitError, ok := childErr.(*exec.ExitError); ok {
EKR842ae6c2016-07-27 09:22:05 +02001018 switch exitError.Sys().(syscall.WaitStatus).ExitStatus() {
1019 case 88:
Adam Langley69a01602014-11-17 17:26:55 -08001020 return errMoreMallocs
EKR842ae6c2016-07-27 09:22:05 +02001021 case 89:
1022 return errUnimplemented
David Benjamind2ba8892016-09-20 19:41:04 -04001023 case 99:
1024 isValgrindError = true
Adam Langley69a01602014-11-17 17:26:55 -08001025 }
1026 }
Adam Langley95c29f32014-06-20 12:00:00 -07001027
David Benjamin9bea3492016-03-02 10:59:16 -05001028 // Account for Windows line endings.
1029 stdout := strings.Replace(string(stdoutBuf.Bytes()), "\r\n", "\n", -1)
1030 stderr := strings.Replace(string(stderrBuf.Bytes()), "\r\n", "\n", -1)
David Benjaminff3a1492016-03-02 10:12:06 -05001031
1032 // Separate the errors from the shim and those from tools like
1033 // AddressSanitizer.
1034 var extraStderr string
1035 if stderrParts := strings.SplitN(stderr, "--- DONE ---\n", 2); len(stderrParts) == 2 {
1036 stderr = stderrParts[0]
1037 extraStderr = stderrParts[1]
1038 }
1039
Adam Langley95c29f32014-06-20 12:00:00 -07001040 failed := err != nil || childErr != nil
EKRf71d7ed2016-08-06 13:25:12 -07001041 expectedError := translateExpectedError(test.expectedError)
1042 correctFailure := len(expectedError) == 0 || strings.Contains(stderr, expectedError)
EKR173bf932016-07-29 15:52:49 +02001043
Adam Langleyac61fa32014-06-23 12:03:11 -07001044 localError := "none"
1045 if err != nil {
1046 localError = err.Error()
1047 }
1048 if len(test.expectedLocalError) != 0 {
1049 correctFailure = correctFailure && strings.Contains(localError, test.expectedLocalError)
1050 }
Adam Langley95c29f32014-06-20 12:00:00 -07001051
1052 if failed != test.shouldFail || failed && !correctFailure {
Adam Langley95c29f32014-06-20 12:00:00 -07001053 childError := "none"
Adam Langley95c29f32014-06-20 12:00:00 -07001054 if childErr != nil {
1055 childError = childErr.Error()
1056 }
1057
1058 var msg string
1059 switch {
1060 case failed && !test.shouldFail:
1061 msg = "unexpected failure"
1062 case !failed && test.shouldFail:
1063 msg = "unexpected success"
1064 case failed && !correctFailure:
EKRf71d7ed2016-08-06 13:25:12 -07001065 msg = "bad error (wanted '" + expectedError + "' / '" + test.expectedLocalError + "')"
Adam Langley95c29f32014-06-20 12:00:00 -07001066 default:
1067 panic("internal error")
1068 }
1069
David Benjamin9aafb642016-09-20 19:36:53 -04001070 return fmt.Errorf("%s: local error '%s', child error '%s', stdout:\n%s\nstderr:\n%s\n%s", msg, localError, childError, stdout, stderr, extraStderr)
Adam Langley95c29f32014-06-20 12:00:00 -07001071 }
1072
David Benjamind2ba8892016-09-20 19:41:04 -04001073 if len(extraStderr) > 0 || (!failed && len(stderr) > 0) {
David Benjaminff3a1492016-03-02 10:12:06 -05001074 return fmt.Errorf("unexpected error output:\n%s\n%s", stderr, extraStderr)
Adam Langley95c29f32014-06-20 12:00:00 -07001075 }
1076
David Benjamind2ba8892016-09-20 19:41:04 -04001077 if *useValgrind && isValgrindError {
1078 return fmt.Errorf("valgrind error:\n%s\n%s", stderr, extraStderr)
1079 }
1080
Adam Langley95c29f32014-06-20 12:00:00 -07001081 return nil
1082}
1083
David Benjaminaa012042016-12-10 13:33:05 -05001084type tlsVersion struct {
Adam Langley95c29f32014-06-20 12:00:00 -07001085 name string
1086 version uint16
David Benjamin7e2e6cf2014-08-07 17:44:24 -04001087 flag string
David Benjamin8b8c0062014-11-23 02:47:52 -05001088 hasDTLS bool
David Benjaminaa012042016-12-10 13:33:05 -05001089}
1090
1091var tlsVersions = []tlsVersion{
David Benjamin8b8c0062014-11-23 02:47:52 -05001092 {"SSL3", VersionSSL30, "-no-ssl3", false},
1093 {"TLS1", VersionTLS10, "-no-tls1", true},
1094 {"TLS11", VersionTLS11, "-no-tls11", false},
1095 {"TLS12", VersionTLS12, "-no-tls12", true},
Steven Valdez143e8b32016-07-11 13:19:03 -04001096 {"TLS13", VersionTLS13, "-no-tls13", false},
Adam Langley95c29f32014-06-20 12:00:00 -07001097}
1098
David Benjaminaa012042016-12-10 13:33:05 -05001099type testCipherSuite struct {
Adam Langley95c29f32014-06-20 12:00:00 -07001100 name string
1101 id uint16
David Benjaminaa012042016-12-10 13:33:05 -05001102}
1103
1104var testCipherSuites = []testCipherSuite{
Adam Langley95c29f32014-06-20 12:00:00 -07001105 {"3DES-SHA", TLS_RSA_WITH_3DES_EDE_CBC_SHA},
David Benjaminf4e5c4e2014-08-02 17:35:45 -04001106 {"AES128-GCM", TLS_RSA_WITH_AES_128_GCM_SHA256},
Adam Langley95c29f32014-06-20 12:00:00 -07001107 {"AES128-SHA", TLS_RSA_WITH_AES_128_CBC_SHA},
David Benjaminf7768e42014-08-31 02:06:47 -04001108 {"AES128-SHA256", TLS_RSA_WITH_AES_128_CBC_SHA256},
David Benjaminf4e5c4e2014-08-02 17:35:45 -04001109 {"AES256-GCM", TLS_RSA_WITH_AES_256_GCM_SHA384},
Adam Langley95c29f32014-06-20 12:00:00 -07001110 {"AES256-SHA", TLS_RSA_WITH_AES_256_CBC_SHA},
David Benjaminf7768e42014-08-31 02:06:47 -04001111 {"AES256-SHA256", TLS_RSA_WITH_AES_256_CBC_SHA256},
Adam Langley95c29f32014-06-20 12:00:00 -07001112 {"ECDHE-ECDSA-AES128-GCM", TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
1113 {"ECDHE-ECDSA-AES128-SHA", TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA},
David Benjaminf7768e42014-08-31 02:06:47 -04001114 {"ECDHE-ECDSA-AES128-SHA256", TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256},
1115 {"ECDHE-ECDSA-AES256-GCM", TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384},
Adam Langley95c29f32014-06-20 12:00:00 -07001116 {"ECDHE-ECDSA-AES256-SHA", TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA},
David Benjaminf7768e42014-08-31 02:06:47 -04001117 {"ECDHE-ECDSA-AES256-SHA384", TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384},
David Benjamin13414b32015-12-09 23:02:39 -05001118 {"ECDHE-ECDSA-CHACHA20-POLY1305", TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256},
Adam Langley95c29f32014-06-20 12:00:00 -07001119 {"ECDHE-RSA-AES128-GCM", TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
Adam Langley95c29f32014-06-20 12:00:00 -07001120 {"ECDHE-RSA-AES128-SHA", TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA},
David Benjaminf7768e42014-08-31 02:06:47 -04001121 {"ECDHE-RSA-AES128-SHA256", TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256},
David Benjaminf4e5c4e2014-08-02 17:35:45 -04001122 {"ECDHE-RSA-AES256-GCM", TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384},
Adam Langley95c29f32014-06-20 12:00:00 -07001123 {"ECDHE-RSA-AES256-SHA", TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA},
David Benjaminf7768e42014-08-31 02:06:47 -04001124 {"ECDHE-RSA-AES256-SHA384", TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384},
David Benjamin13414b32015-12-09 23:02:39 -05001125 {"ECDHE-RSA-CHACHA20-POLY1305", TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256},
David Benjamin48cae082014-10-27 01:06:24 -04001126 {"PSK-AES128-CBC-SHA", TLS_PSK_WITH_AES_128_CBC_SHA},
1127 {"PSK-AES256-CBC-SHA", TLS_PSK_WITH_AES_256_CBC_SHA},
Adam Langley85bc5602015-06-09 09:54:04 -07001128 {"ECDHE-PSK-AES128-CBC-SHA", TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA},
1129 {"ECDHE-PSK-AES256-CBC-SHA", TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA},
David Benjamin13414b32015-12-09 23:02:39 -05001130 {"ECDHE-PSK-CHACHA20-POLY1305", TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256},
Steven Valdez803c77a2016-09-06 14:13:43 -04001131 {"AEAD-CHACHA20-POLY1305", TLS_CHACHA20_POLY1305_SHA256},
1132 {"AEAD-AES128-GCM-SHA256", TLS_AES_128_GCM_SHA256},
1133 {"AEAD-AES256-GCM-SHA384", TLS_AES_256_GCM_SHA384},
Matt Braithwaiteaf096752015-09-02 19:48:16 -07001134 {"NULL-SHA", TLS_RSA_WITH_NULL_SHA},
Adam Langley95c29f32014-06-20 12:00:00 -07001135}
1136
David Benjamin8b8c0062014-11-23 02:47:52 -05001137func hasComponent(suiteName, component string) bool {
1138 return strings.Contains("-"+suiteName+"-", "-"+component+"-")
1139}
1140
David Benjaminf7768e42014-08-31 02:06:47 -04001141func isTLS12Only(suiteName string) bool {
David Benjamin8b8c0062014-11-23 02:47:52 -05001142 return hasComponent(suiteName, "GCM") ||
1143 hasComponent(suiteName, "SHA256") ||
David Benjamine9a80ff2015-04-07 00:46:46 -04001144 hasComponent(suiteName, "SHA384") ||
1145 hasComponent(suiteName, "POLY1305")
David Benjamin8b8c0062014-11-23 02:47:52 -05001146}
1147
Nick Harper1fd39d82016-06-14 18:14:35 -07001148func isTLS13Suite(suiteName string) bool {
Steven Valdez803c77a2016-09-06 14:13:43 -04001149 return strings.HasPrefix(suiteName, "AEAD-")
Nick Harper1fd39d82016-06-14 18:14:35 -07001150}
1151
David Benjamin8b8c0062014-11-23 02:47:52 -05001152func isDTLSCipher(suiteName string) bool {
Matt Braithwaiteaf096752015-09-02 19:48:16 -07001153 return !hasComponent(suiteName, "RC4") && !hasComponent(suiteName, "NULL")
David Benjaminf7768e42014-08-31 02:06:47 -04001154}
1155
Adam Langleya7997f12015-05-14 17:38:50 -07001156func bigFromHex(hex string) *big.Int {
1157 ret, ok := new(big.Int).SetString(hex, 16)
1158 if !ok {
1159 panic("failed to parse hex number 0x" + hex)
1160 }
1161 return ret
1162}
1163
Adam Langley7c803a62015-06-15 15:35:05 -07001164func addBasicTests() {
1165 basicTests := []testCase{
1166 {
Adam Langley7c803a62015-06-15 15:35:05 -07001167 name: "NoFallbackSCSV",
1168 config: Config{
1169 Bugs: ProtocolBugs{
1170 FailIfNotFallbackSCSV: true,
1171 },
1172 },
1173 shouldFail: true,
1174 expectedLocalError: "no fallback SCSV found",
1175 },
1176 {
1177 name: "SendFallbackSCSV",
1178 config: Config{
1179 Bugs: ProtocolBugs{
1180 FailIfNotFallbackSCSV: true,
1181 },
1182 },
1183 flags: []string{"-fallback-scsv"},
1184 },
1185 {
1186 name: "ClientCertificateTypes",
1187 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04001188 MaxVersion: VersionTLS12,
Adam Langley7c803a62015-06-15 15:35:05 -07001189 ClientAuth: RequestClientCert,
1190 ClientCertificateTypes: []byte{
1191 CertTypeDSSSign,
1192 CertTypeRSASign,
1193 CertTypeECDSASign,
1194 },
1195 },
1196 flags: []string{
1197 "-expect-certificate-types",
1198 base64.StdEncoding.EncodeToString([]byte{
1199 CertTypeDSSSign,
1200 CertTypeRSASign,
1201 CertTypeECDSASign,
1202 }),
1203 },
1204 },
1205 {
Adam Langley7c803a62015-06-15 15:35:05 -07001206 name: "UnauthenticatedECDH",
1207 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04001208 MaxVersion: VersionTLS12,
Adam Langley7c803a62015-06-15 15:35:05 -07001209 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
1210 Bugs: ProtocolBugs{
1211 UnauthenticatedECDH: true,
1212 },
1213 },
1214 shouldFail: true,
1215 expectedError: ":UNEXPECTED_MESSAGE:",
1216 },
1217 {
1218 name: "SkipCertificateStatus",
1219 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04001220 MaxVersion: VersionTLS12,
Adam Langley7c803a62015-06-15 15:35:05 -07001221 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
1222 Bugs: ProtocolBugs{
1223 SkipCertificateStatus: true,
1224 },
1225 },
1226 flags: []string{
1227 "-enable-ocsp-stapling",
1228 },
1229 },
1230 {
1231 name: "SkipServerKeyExchange",
1232 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04001233 MaxVersion: VersionTLS12,
Adam Langley7c803a62015-06-15 15:35:05 -07001234 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
1235 Bugs: ProtocolBugs{
1236 SkipServerKeyExchange: true,
1237 },
1238 },
1239 shouldFail: true,
1240 expectedError: ":UNEXPECTED_MESSAGE:",
1241 },
1242 {
Adam Langley7c803a62015-06-15 15:35:05 -07001243 testType: serverTest,
1244 name: "Alert",
1245 config: Config{
1246 Bugs: ProtocolBugs{
1247 SendSpuriousAlert: alertRecordOverflow,
1248 },
1249 },
1250 shouldFail: true,
1251 expectedError: ":TLSV1_ALERT_RECORD_OVERFLOW:",
1252 },
1253 {
1254 protocol: dtls,
1255 testType: serverTest,
1256 name: "Alert-DTLS",
1257 config: Config{
1258 Bugs: ProtocolBugs{
1259 SendSpuriousAlert: alertRecordOverflow,
1260 },
1261 },
1262 shouldFail: true,
1263 expectedError: ":TLSV1_ALERT_RECORD_OVERFLOW:",
1264 },
1265 {
1266 testType: serverTest,
1267 name: "FragmentAlert",
1268 config: Config{
1269 Bugs: ProtocolBugs{
1270 FragmentAlert: true,
1271 SendSpuriousAlert: alertRecordOverflow,
1272 },
1273 },
1274 shouldFail: true,
1275 expectedError: ":BAD_ALERT:",
1276 },
1277 {
1278 protocol: dtls,
1279 testType: serverTest,
1280 name: "FragmentAlert-DTLS",
1281 config: Config{
1282 Bugs: ProtocolBugs{
1283 FragmentAlert: true,
1284 SendSpuriousAlert: alertRecordOverflow,
1285 },
1286 },
1287 shouldFail: true,
1288 expectedError: ":BAD_ALERT:",
1289 },
1290 {
1291 testType: serverTest,
David Benjamin0d3a8c62016-03-11 22:25:18 -05001292 name: "DoubleAlert",
1293 config: Config{
1294 Bugs: ProtocolBugs{
1295 DoubleAlert: true,
1296 SendSpuriousAlert: alertRecordOverflow,
1297 },
1298 },
1299 shouldFail: true,
1300 expectedError: ":BAD_ALERT:",
1301 },
1302 {
1303 protocol: dtls,
1304 testType: serverTest,
1305 name: "DoubleAlert-DTLS",
1306 config: Config{
1307 Bugs: ProtocolBugs{
1308 DoubleAlert: true,
1309 SendSpuriousAlert: alertRecordOverflow,
1310 },
1311 },
1312 shouldFail: true,
1313 expectedError: ":BAD_ALERT:",
1314 },
1315 {
Adam Langley7c803a62015-06-15 15:35:05 -07001316 name: "SkipNewSessionTicket",
1317 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04001318 MaxVersion: VersionTLS12,
Adam Langley7c803a62015-06-15 15:35:05 -07001319 Bugs: ProtocolBugs{
1320 SkipNewSessionTicket: true,
1321 },
1322 },
1323 shouldFail: true,
David Benjamina41280d2015-11-26 02:16:49 -05001324 expectedError: ":UNEXPECTED_RECORD:",
Adam Langley7c803a62015-06-15 15:35:05 -07001325 },
1326 {
1327 testType: serverTest,
1328 name: "FallbackSCSV",
1329 config: Config{
1330 MaxVersion: VersionTLS11,
1331 Bugs: ProtocolBugs{
1332 SendFallbackSCSV: true,
1333 },
1334 },
David Benjamin56cadc32016-12-16 19:54:11 -05001335 shouldFail: true,
1336 expectedError: ":INAPPROPRIATE_FALLBACK:",
1337 expectedLocalError: "remote error: inappropriate fallback",
Adam Langley7c803a62015-06-15 15:35:05 -07001338 },
1339 {
1340 testType: serverTest,
David Benjaminb442dee2016-12-19 22:15:08 -05001341 name: "FallbackSCSV-VersionMatch-TLS13",
Adam Langley7c803a62015-06-15 15:35:05 -07001342 config: Config{
David Benjaminb442dee2016-12-19 22:15:08 -05001343 MaxVersion: VersionTLS13,
Adam Langley7c803a62015-06-15 15:35:05 -07001344 Bugs: ProtocolBugs{
1345 SendFallbackSCSV: true,
1346 },
1347 },
1348 },
1349 {
1350 testType: serverTest,
David Benjamin4c3ddf72016-06-29 18:13:53 -04001351 name: "FallbackSCSV-VersionMatch-TLS12",
1352 config: Config{
1353 MaxVersion: VersionTLS12,
1354 Bugs: ProtocolBugs{
1355 SendFallbackSCSV: true,
1356 },
1357 },
1358 flags: []string{"-max-version", strconv.Itoa(VersionTLS12)},
1359 },
1360 {
1361 testType: serverTest,
Adam Langley7c803a62015-06-15 15:35:05 -07001362 name: "FragmentedClientVersion",
1363 config: Config{
1364 Bugs: ProtocolBugs{
1365 MaxHandshakeRecordLength: 1,
1366 FragmentClientVersion: true,
1367 },
1368 },
Nick Harper1fd39d82016-06-14 18:14:35 -07001369 expectedVersion: VersionTLS13,
Adam Langley7c803a62015-06-15 15:35:05 -07001370 },
1371 {
Adam Langley7c803a62015-06-15 15:35:05 -07001372 testType: serverTest,
1373 name: "HttpGET",
1374 sendPrefix: "GET / HTTP/1.0\n",
1375 shouldFail: true,
1376 expectedError: ":HTTP_REQUEST:",
1377 },
1378 {
1379 testType: serverTest,
1380 name: "HttpPOST",
1381 sendPrefix: "POST / HTTP/1.0\n",
1382 shouldFail: true,
1383 expectedError: ":HTTP_REQUEST:",
1384 },
1385 {
1386 testType: serverTest,
1387 name: "HttpHEAD",
1388 sendPrefix: "HEAD / HTTP/1.0\n",
1389 shouldFail: true,
1390 expectedError: ":HTTP_REQUEST:",
1391 },
1392 {
1393 testType: serverTest,
1394 name: "HttpPUT",
1395 sendPrefix: "PUT / HTTP/1.0\n",
1396 shouldFail: true,
1397 expectedError: ":HTTP_REQUEST:",
1398 },
1399 {
1400 testType: serverTest,
1401 name: "HttpCONNECT",
1402 sendPrefix: "CONNECT www.google.com:443 HTTP/1.0\n",
1403 shouldFail: true,
1404 expectedError: ":HTTPS_PROXY_REQUEST:",
1405 },
1406 {
1407 testType: serverTest,
1408 name: "Garbage",
1409 sendPrefix: "blah",
1410 shouldFail: true,
David Benjamin97760d52015-07-24 23:02:49 -04001411 expectedError: ":WRONG_VERSION_NUMBER:",
Adam Langley7c803a62015-06-15 15:35:05 -07001412 },
1413 {
Adam Langley7c803a62015-06-15 15:35:05 -07001414 name: "RSAEphemeralKey",
1415 config: Config{
Nick Harper1fd39d82016-06-14 18:14:35 -07001416 MaxVersion: VersionTLS12,
Adam Langley7c803a62015-06-15 15:35:05 -07001417 CipherSuites: []uint16{TLS_RSA_WITH_AES_128_CBC_SHA},
1418 Bugs: ProtocolBugs{
1419 RSAEphemeralKey: true,
1420 },
1421 },
1422 shouldFail: true,
1423 expectedError: ":UNEXPECTED_MESSAGE:",
1424 },
1425 {
1426 name: "DisableEverything",
Steven Valdez4f94b1c2016-05-24 12:31:07 -04001427 flags: []string{"-no-tls13", "-no-tls12", "-no-tls11", "-no-tls1", "-no-ssl3"},
Adam Langley7c803a62015-06-15 15:35:05 -07001428 shouldFail: true,
1429 expectedError: ":WRONG_SSL_VERSION:",
1430 },
1431 {
1432 protocol: dtls,
1433 name: "DisableEverything-DTLS",
1434 flags: []string{"-no-tls12", "-no-tls1"},
1435 shouldFail: true,
1436 expectedError: ":WRONG_SSL_VERSION:",
1437 },
1438 {
Adam Langley7c803a62015-06-15 15:35:05 -07001439 protocol: dtls,
1440 testType: serverTest,
1441 name: "MTU",
1442 config: Config{
1443 Bugs: ProtocolBugs{
1444 MaxPacketLength: 256,
1445 },
1446 },
1447 flags: []string{"-mtu", "256"},
1448 },
1449 {
1450 protocol: dtls,
1451 testType: serverTest,
1452 name: "MTUExceeded",
1453 config: Config{
1454 Bugs: ProtocolBugs{
1455 MaxPacketLength: 255,
1456 },
1457 },
1458 flags: []string{"-mtu", "256"},
1459 shouldFail: true,
1460 expectedLocalError: "dtls: exceeded maximum packet length",
1461 },
1462 {
1463 name: "CertMismatchRSA",
1464 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04001465 MaxVersion: VersionTLS12,
Adam Langley7c803a62015-06-15 15:35:05 -07001466 CipherSuites: []uint16{TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
David Benjamin33863262016-07-08 17:20:12 -07001467 Certificates: []Certificate{ecdsaP256Certificate},
Adam Langley7c803a62015-06-15 15:35:05 -07001468 Bugs: ProtocolBugs{
1469 SendCipherSuite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
1470 },
1471 },
1472 shouldFail: true,
1473 expectedError: ":WRONG_CERTIFICATE_TYPE:",
1474 },
1475 {
1476 name: "CertMismatchECDSA",
1477 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04001478 MaxVersion: VersionTLS12,
Adam Langley7c803a62015-06-15 15:35:05 -07001479 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
David Benjamin33863262016-07-08 17:20:12 -07001480 Certificates: []Certificate{rsaCertificate},
Adam Langley7c803a62015-06-15 15:35:05 -07001481 Bugs: ProtocolBugs{
1482 SendCipherSuite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
1483 },
1484 },
1485 shouldFail: true,
1486 expectedError: ":WRONG_CERTIFICATE_TYPE:",
1487 },
1488 {
1489 name: "EmptyCertificateList",
1490 config: Config{
Steven Valdez803c77a2016-09-06 14:13:43 -04001491 MaxVersion: VersionTLS12,
Adam Langley7c803a62015-06-15 15:35:05 -07001492 Bugs: ProtocolBugs{
1493 EmptyCertificateList: true,
1494 },
1495 },
1496 shouldFail: true,
1497 expectedError: ":DECODE_ERROR:",
1498 },
1499 {
David Benjamin9ec1c752016-07-14 12:45:01 -04001500 name: "EmptyCertificateList-TLS13",
1501 config: Config{
Steven Valdez803c77a2016-09-06 14:13:43 -04001502 MaxVersion: VersionTLS13,
David Benjamin9ec1c752016-07-14 12:45:01 -04001503 Bugs: ProtocolBugs{
1504 EmptyCertificateList: true,
1505 },
1506 },
1507 shouldFail: true,
David Benjamin4087df92016-08-01 20:16:31 -04001508 expectedError: ":PEER_DID_NOT_RETURN_A_CERTIFICATE:",
David Benjamin9ec1c752016-07-14 12:45:01 -04001509 },
1510 {
Adam Langley7c803a62015-06-15 15:35:05 -07001511 name: "TLSFatalBadPackets",
1512 damageFirstWrite: true,
1513 shouldFail: true,
1514 expectedError: ":DECRYPTION_FAILED_OR_BAD_RECORD_MAC:",
1515 },
1516 {
1517 protocol: dtls,
1518 name: "DTLSIgnoreBadPackets",
1519 damageFirstWrite: true,
1520 },
1521 {
1522 protocol: dtls,
1523 name: "DTLSIgnoreBadPackets-Async",
1524 damageFirstWrite: true,
1525 flags: []string{"-async"},
1526 },
1527 {
David Benjamin4cf369b2015-08-22 01:35:43 -04001528 name: "AppDataBeforeHandshake",
1529 config: Config{
1530 Bugs: ProtocolBugs{
1531 AppDataBeforeHandshake: []byte("TEST MESSAGE"),
1532 },
1533 },
1534 shouldFail: true,
1535 expectedError: ":UNEXPECTED_RECORD:",
1536 },
1537 {
1538 name: "AppDataBeforeHandshake-Empty",
1539 config: Config{
1540 Bugs: ProtocolBugs{
1541 AppDataBeforeHandshake: []byte{},
1542 },
1543 },
1544 shouldFail: true,
1545 expectedError: ":UNEXPECTED_RECORD:",
1546 },
1547 {
1548 protocol: dtls,
1549 name: "AppDataBeforeHandshake-DTLS",
1550 config: Config{
1551 Bugs: ProtocolBugs{
1552 AppDataBeforeHandshake: []byte("TEST MESSAGE"),
1553 },
1554 },
1555 shouldFail: true,
1556 expectedError: ":UNEXPECTED_RECORD:",
1557 },
1558 {
1559 protocol: dtls,
1560 name: "AppDataBeforeHandshake-DTLS-Empty",
1561 config: Config{
1562 Bugs: ProtocolBugs{
1563 AppDataBeforeHandshake: []byte{},
1564 },
1565 },
1566 shouldFail: true,
1567 expectedError: ":UNEXPECTED_RECORD:",
1568 },
1569 {
Adam Langley7c803a62015-06-15 15:35:05 -07001570 name: "AppDataAfterChangeCipherSpec",
1571 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04001572 MaxVersion: VersionTLS12,
Adam Langley7c803a62015-06-15 15:35:05 -07001573 Bugs: ProtocolBugs{
1574 AppDataAfterChangeCipherSpec: []byte("TEST MESSAGE"),
1575 },
1576 },
1577 shouldFail: true,
David Benjamina41280d2015-11-26 02:16:49 -05001578 expectedError: ":UNEXPECTED_RECORD:",
Adam Langley7c803a62015-06-15 15:35:05 -07001579 },
1580 {
David Benjamin4cf369b2015-08-22 01:35:43 -04001581 name: "AppDataAfterChangeCipherSpec-Empty",
1582 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04001583 MaxVersion: VersionTLS12,
David Benjamin4cf369b2015-08-22 01:35:43 -04001584 Bugs: ProtocolBugs{
1585 AppDataAfterChangeCipherSpec: []byte{},
1586 },
1587 },
1588 shouldFail: true,
David Benjamina41280d2015-11-26 02:16:49 -05001589 expectedError: ":UNEXPECTED_RECORD:",
David Benjamin4cf369b2015-08-22 01:35:43 -04001590 },
1591 {
Adam Langley7c803a62015-06-15 15:35:05 -07001592 protocol: dtls,
1593 name: "AppDataAfterChangeCipherSpec-DTLS",
1594 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04001595 MaxVersion: VersionTLS12,
Adam Langley7c803a62015-06-15 15:35:05 -07001596 Bugs: ProtocolBugs{
1597 AppDataAfterChangeCipherSpec: []byte("TEST MESSAGE"),
1598 },
1599 },
1600 // BoringSSL's DTLS implementation will drop the out-of-order
1601 // application data.
1602 },
1603 {
David Benjamin4cf369b2015-08-22 01:35:43 -04001604 protocol: dtls,
1605 name: "AppDataAfterChangeCipherSpec-DTLS-Empty",
1606 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04001607 MaxVersion: VersionTLS12,
David Benjamin4cf369b2015-08-22 01:35:43 -04001608 Bugs: ProtocolBugs{
1609 AppDataAfterChangeCipherSpec: []byte{},
1610 },
1611 },
1612 // BoringSSL's DTLS implementation will drop the out-of-order
1613 // application data.
1614 },
1615 {
Adam Langley7c803a62015-06-15 15:35:05 -07001616 name: "AlertAfterChangeCipherSpec",
1617 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04001618 MaxVersion: VersionTLS12,
Adam Langley7c803a62015-06-15 15:35:05 -07001619 Bugs: ProtocolBugs{
1620 AlertAfterChangeCipherSpec: alertRecordOverflow,
1621 },
1622 },
1623 shouldFail: true,
1624 expectedError: ":TLSV1_ALERT_RECORD_OVERFLOW:",
1625 },
1626 {
1627 protocol: dtls,
1628 name: "AlertAfterChangeCipherSpec-DTLS",
1629 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04001630 MaxVersion: VersionTLS12,
Adam Langley7c803a62015-06-15 15:35:05 -07001631 Bugs: ProtocolBugs{
1632 AlertAfterChangeCipherSpec: alertRecordOverflow,
1633 },
1634 },
1635 shouldFail: true,
1636 expectedError: ":TLSV1_ALERT_RECORD_OVERFLOW:",
1637 },
1638 {
1639 protocol: dtls,
1640 name: "ReorderHandshakeFragments-Small-DTLS",
1641 config: Config{
1642 Bugs: ProtocolBugs{
1643 ReorderHandshakeFragments: true,
1644 // Small enough that every handshake message is
1645 // fragmented.
1646 MaxHandshakeRecordLength: 2,
1647 },
1648 },
1649 },
1650 {
1651 protocol: dtls,
1652 name: "ReorderHandshakeFragments-Large-DTLS",
1653 config: Config{
1654 Bugs: ProtocolBugs{
1655 ReorderHandshakeFragments: true,
1656 // Large enough that no handshake message is
1657 // fragmented.
1658 MaxHandshakeRecordLength: 2048,
1659 },
1660 },
1661 },
1662 {
1663 protocol: dtls,
1664 name: "MixCompleteMessageWithFragments-DTLS",
1665 config: Config{
1666 Bugs: ProtocolBugs{
1667 ReorderHandshakeFragments: true,
1668 MixCompleteMessageWithFragments: true,
1669 MaxHandshakeRecordLength: 2,
1670 },
1671 },
1672 },
1673 {
1674 name: "SendInvalidRecordType",
1675 config: Config{
1676 Bugs: ProtocolBugs{
1677 SendInvalidRecordType: true,
1678 },
1679 },
1680 shouldFail: true,
1681 expectedError: ":UNEXPECTED_RECORD:",
1682 },
1683 {
1684 protocol: dtls,
1685 name: "SendInvalidRecordType-DTLS",
1686 config: Config{
1687 Bugs: ProtocolBugs{
1688 SendInvalidRecordType: true,
1689 },
1690 },
1691 shouldFail: true,
1692 expectedError: ":UNEXPECTED_RECORD:",
1693 },
1694 {
1695 name: "FalseStart-SkipServerSecondLeg",
1696 config: Config{
Nick Harper1fd39d82016-06-14 18:14:35 -07001697 MaxVersion: VersionTLS12,
Adam Langley7c803a62015-06-15 15:35:05 -07001698 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
1699 NextProtos: []string{"foo"},
1700 Bugs: ProtocolBugs{
1701 SkipNewSessionTicket: true,
1702 SkipChangeCipherSpec: true,
1703 SkipFinished: true,
1704 ExpectFalseStart: true,
1705 },
1706 },
1707 flags: []string{
1708 "-false-start",
1709 "-handshake-never-done",
1710 "-advertise-alpn", "\x03foo",
1711 },
1712 shimWritesFirst: true,
1713 shouldFail: true,
1714 expectedError: ":UNEXPECTED_RECORD:",
1715 },
1716 {
1717 name: "FalseStart-SkipServerSecondLeg-Implicit",
1718 config: Config{
Nick Harper1fd39d82016-06-14 18:14:35 -07001719 MaxVersion: VersionTLS12,
Adam Langley7c803a62015-06-15 15:35:05 -07001720 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
1721 NextProtos: []string{"foo"},
1722 Bugs: ProtocolBugs{
1723 SkipNewSessionTicket: true,
1724 SkipChangeCipherSpec: true,
1725 SkipFinished: true,
1726 },
1727 },
1728 flags: []string{
1729 "-implicit-handshake",
1730 "-false-start",
1731 "-handshake-never-done",
1732 "-advertise-alpn", "\x03foo",
1733 },
1734 shouldFail: true,
1735 expectedError: ":UNEXPECTED_RECORD:",
1736 },
1737 {
1738 testType: serverTest,
1739 name: "FailEarlyCallback",
1740 flags: []string{"-fail-early-callback"},
1741 shouldFail: true,
1742 expectedError: ":CONNECTION_REJECTED:",
David Benjamin2c66e072016-09-16 15:58:00 -04001743 expectedLocalError: "remote error: handshake failure",
Adam Langley7c803a62015-06-15 15:35:05 -07001744 },
1745 {
David Benjaminb8d74f52016-11-14 22:02:50 +09001746 name: "FailCertCallback-Client-TLS12",
1747 config: Config{
1748 MaxVersion: VersionTLS12,
1749 ClientAuth: RequestClientCert,
1750 },
1751 flags: []string{"-fail-cert-callback"},
1752 shouldFail: true,
1753 expectedError: ":CERT_CB_ERROR:",
1754 expectedLocalError: "remote error: internal error",
1755 },
1756 {
1757 testType: serverTest,
1758 name: "FailCertCallback-Server-TLS12",
1759 config: Config{
1760 MaxVersion: VersionTLS12,
1761 },
1762 flags: []string{"-fail-cert-callback"},
1763 shouldFail: true,
1764 expectedError: ":CERT_CB_ERROR:",
1765 expectedLocalError: "remote error: internal error",
1766 },
1767 {
1768 name: "FailCertCallback-Client-TLS13",
1769 config: Config{
1770 MaxVersion: VersionTLS13,
1771 ClientAuth: RequestClientCert,
1772 },
1773 flags: []string{"-fail-cert-callback"},
1774 shouldFail: true,
1775 expectedError: ":CERT_CB_ERROR:",
1776 expectedLocalError: "remote error: internal error",
1777 },
1778 {
1779 testType: serverTest,
1780 name: "FailCertCallback-Server-TLS13",
1781 config: Config{
1782 MaxVersion: VersionTLS13,
1783 },
1784 flags: []string{"-fail-cert-callback"},
1785 shouldFail: true,
1786 expectedError: ":CERT_CB_ERROR:",
1787 expectedLocalError: "remote error: internal error",
1788 },
1789 {
Adam Langley7c803a62015-06-15 15:35:05 -07001790 protocol: dtls,
1791 name: "FragmentMessageTypeMismatch-DTLS",
1792 config: Config{
1793 Bugs: ProtocolBugs{
1794 MaxHandshakeRecordLength: 2,
1795 FragmentMessageTypeMismatch: true,
1796 },
1797 },
1798 shouldFail: true,
1799 expectedError: ":FRAGMENT_MISMATCH:",
1800 },
1801 {
1802 protocol: dtls,
1803 name: "FragmentMessageLengthMismatch-DTLS",
1804 config: Config{
1805 Bugs: ProtocolBugs{
1806 MaxHandshakeRecordLength: 2,
1807 FragmentMessageLengthMismatch: true,
1808 },
1809 },
1810 shouldFail: true,
1811 expectedError: ":FRAGMENT_MISMATCH:",
1812 },
1813 {
1814 protocol: dtls,
1815 name: "SplitFragments-Header-DTLS",
1816 config: Config{
1817 Bugs: ProtocolBugs{
1818 SplitFragments: 2,
1819 },
1820 },
1821 shouldFail: true,
David Benjaminc6604172016-06-02 16:38:35 -04001822 expectedError: ":BAD_HANDSHAKE_RECORD:",
Adam Langley7c803a62015-06-15 15:35:05 -07001823 },
1824 {
1825 protocol: dtls,
1826 name: "SplitFragments-Boundary-DTLS",
1827 config: Config{
1828 Bugs: ProtocolBugs{
1829 SplitFragments: dtlsRecordHeaderLen,
1830 },
1831 },
1832 shouldFail: true,
David Benjaminc6604172016-06-02 16:38:35 -04001833 expectedError: ":BAD_HANDSHAKE_RECORD:",
Adam Langley7c803a62015-06-15 15:35:05 -07001834 },
1835 {
1836 protocol: dtls,
1837 name: "SplitFragments-Body-DTLS",
1838 config: Config{
1839 Bugs: ProtocolBugs{
1840 SplitFragments: dtlsRecordHeaderLen + 1,
1841 },
1842 },
1843 shouldFail: true,
David Benjaminc6604172016-06-02 16:38:35 -04001844 expectedError: ":BAD_HANDSHAKE_RECORD:",
Adam Langley7c803a62015-06-15 15:35:05 -07001845 },
1846 {
1847 protocol: dtls,
1848 name: "SendEmptyFragments-DTLS",
1849 config: Config{
1850 Bugs: ProtocolBugs{
1851 SendEmptyFragments: true,
1852 },
1853 },
1854 },
1855 {
David Benjaminbf82aed2016-03-01 22:57:40 -05001856 name: "BadFinished-Client",
1857 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04001858 MaxVersion: VersionTLS12,
David Benjaminbf82aed2016-03-01 22:57:40 -05001859 Bugs: ProtocolBugs{
1860 BadFinished: true,
1861 },
1862 },
1863 shouldFail: true,
1864 expectedError: ":DIGEST_CHECK_FAILED:",
1865 },
1866 {
Steven Valdez143e8b32016-07-11 13:19:03 -04001867 name: "BadFinished-Client-TLS13",
1868 config: Config{
1869 MaxVersion: VersionTLS13,
1870 Bugs: ProtocolBugs{
1871 BadFinished: true,
1872 },
1873 },
1874 shouldFail: true,
1875 expectedError: ":DIGEST_CHECK_FAILED:",
1876 },
1877 {
David Benjaminbf82aed2016-03-01 22:57:40 -05001878 testType: serverTest,
1879 name: "BadFinished-Server",
Adam Langley7c803a62015-06-15 15:35:05 -07001880 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04001881 MaxVersion: VersionTLS12,
Adam Langley7c803a62015-06-15 15:35:05 -07001882 Bugs: ProtocolBugs{
1883 BadFinished: true,
1884 },
1885 },
1886 shouldFail: true,
1887 expectedError: ":DIGEST_CHECK_FAILED:",
1888 },
1889 {
Steven Valdez143e8b32016-07-11 13:19:03 -04001890 testType: serverTest,
1891 name: "BadFinished-Server-TLS13",
1892 config: Config{
1893 MaxVersion: VersionTLS13,
1894 Bugs: ProtocolBugs{
1895 BadFinished: true,
1896 },
1897 },
1898 shouldFail: true,
1899 expectedError: ":DIGEST_CHECK_FAILED:",
1900 },
1901 {
Adam Langley7c803a62015-06-15 15:35:05 -07001902 name: "FalseStart-BadFinished",
1903 config: Config{
Nick Harper1fd39d82016-06-14 18:14:35 -07001904 MaxVersion: VersionTLS12,
Adam Langley7c803a62015-06-15 15:35:05 -07001905 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
1906 NextProtos: []string{"foo"},
1907 Bugs: ProtocolBugs{
1908 BadFinished: true,
1909 ExpectFalseStart: true,
1910 },
1911 },
1912 flags: []string{
1913 "-false-start",
1914 "-handshake-never-done",
1915 "-advertise-alpn", "\x03foo",
1916 },
1917 shimWritesFirst: true,
1918 shouldFail: true,
1919 expectedError: ":DIGEST_CHECK_FAILED:",
1920 },
1921 {
1922 name: "NoFalseStart-NoALPN",
1923 config: Config{
Nick Harper1fd39d82016-06-14 18:14:35 -07001924 MaxVersion: VersionTLS12,
Adam Langley7c803a62015-06-15 15:35:05 -07001925 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
1926 Bugs: ProtocolBugs{
1927 ExpectFalseStart: true,
1928 AlertBeforeFalseStartTest: alertAccessDenied,
1929 },
1930 },
1931 flags: []string{
1932 "-false-start",
1933 },
1934 shimWritesFirst: true,
1935 shouldFail: true,
1936 expectedError: ":TLSV1_ALERT_ACCESS_DENIED:",
1937 expectedLocalError: "tls: peer did not false start: EOF",
1938 },
1939 {
1940 name: "NoFalseStart-NoAEAD",
1941 config: Config{
Nick Harper1fd39d82016-06-14 18:14:35 -07001942 MaxVersion: VersionTLS12,
Adam Langley7c803a62015-06-15 15:35:05 -07001943 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA},
1944 NextProtos: []string{"foo"},
1945 Bugs: ProtocolBugs{
1946 ExpectFalseStart: true,
1947 AlertBeforeFalseStartTest: alertAccessDenied,
1948 },
1949 },
1950 flags: []string{
1951 "-false-start",
1952 "-advertise-alpn", "\x03foo",
1953 },
1954 shimWritesFirst: true,
1955 shouldFail: true,
1956 expectedError: ":TLSV1_ALERT_ACCESS_DENIED:",
1957 expectedLocalError: "tls: peer did not false start: EOF",
1958 },
1959 {
1960 name: "NoFalseStart-RSA",
1961 config: Config{
Nick Harper1fd39d82016-06-14 18:14:35 -07001962 MaxVersion: VersionTLS12,
Adam Langley7c803a62015-06-15 15:35:05 -07001963 CipherSuites: []uint16{TLS_RSA_WITH_AES_128_GCM_SHA256},
1964 NextProtos: []string{"foo"},
1965 Bugs: ProtocolBugs{
1966 ExpectFalseStart: true,
1967 AlertBeforeFalseStartTest: alertAccessDenied,
1968 },
1969 },
1970 flags: []string{
1971 "-false-start",
1972 "-advertise-alpn", "\x03foo",
1973 },
1974 shimWritesFirst: true,
1975 shouldFail: true,
1976 expectedError: ":TLSV1_ALERT_ACCESS_DENIED:",
1977 expectedLocalError: "tls: peer did not false start: EOF",
1978 },
1979 {
Adam Langley7c803a62015-06-15 15:35:05 -07001980 protocol: dtls,
1981 name: "SendSplitAlert-Sync",
1982 config: Config{
1983 Bugs: ProtocolBugs{
1984 SendSplitAlert: true,
1985 },
1986 },
1987 },
1988 {
1989 protocol: dtls,
1990 name: "SendSplitAlert-Async",
1991 config: Config{
1992 Bugs: ProtocolBugs{
1993 SendSplitAlert: true,
1994 },
1995 },
1996 flags: []string{"-async"},
1997 },
1998 {
1999 protocol: dtls,
2000 name: "PackDTLSHandshake",
2001 config: Config{
2002 Bugs: ProtocolBugs{
2003 MaxHandshakeRecordLength: 2,
2004 PackHandshakeFragments: 20,
2005 PackHandshakeRecords: 200,
2006 },
2007 },
2008 },
2009 {
Adam Langley7c803a62015-06-15 15:35:05 -07002010 name: "SendEmptyRecords-Pass",
2011 sendEmptyRecords: 32,
2012 },
2013 {
2014 name: "SendEmptyRecords",
2015 sendEmptyRecords: 33,
2016 shouldFail: true,
2017 expectedError: ":TOO_MANY_EMPTY_FRAGMENTS:",
2018 },
2019 {
2020 name: "SendEmptyRecords-Async",
2021 sendEmptyRecords: 33,
2022 flags: []string{"-async"},
2023 shouldFail: true,
2024 expectedError: ":TOO_MANY_EMPTY_FRAGMENTS:",
2025 },
2026 {
David Benjamine8e84b92016-08-03 15:39:47 -04002027 name: "SendWarningAlerts-Pass",
2028 config: Config{
2029 MaxVersion: VersionTLS12,
2030 },
Adam Langley7c803a62015-06-15 15:35:05 -07002031 sendWarningAlerts: 4,
2032 },
2033 {
David Benjamine8e84b92016-08-03 15:39:47 -04002034 protocol: dtls,
2035 name: "SendWarningAlerts-DTLS-Pass",
2036 config: Config{
2037 MaxVersion: VersionTLS12,
2038 },
Adam Langley7c803a62015-06-15 15:35:05 -07002039 sendWarningAlerts: 4,
2040 },
2041 {
David Benjamine8e84b92016-08-03 15:39:47 -04002042 name: "SendWarningAlerts-TLS13",
2043 config: Config{
2044 MaxVersion: VersionTLS13,
2045 },
2046 sendWarningAlerts: 4,
2047 shouldFail: true,
2048 expectedError: ":BAD_ALERT:",
2049 expectedLocalError: "remote error: error decoding message",
2050 },
2051 {
2052 name: "SendWarningAlerts",
2053 config: Config{
2054 MaxVersion: VersionTLS12,
2055 },
Adam Langley7c803a62015-06-15 15:35:05 -07002056 sendWarningAlerts: 5,
2057 shouldFail: true,
2058 expectedError: ":TOO_MANY_WARNING_ALERTS:",
2059 },
2060 {
David Benjamine8e84b92016-08-03 15:39:47 -04002061 name: "SendWarningAlerts-Async",
2062 config: Config{
2063 MaxVersion: VersionTLS12,
2064 },
Adam Langley7c803a62015-06-15 15:35:05 -07002065 sendWarningAlerts: 5,
2066 flags: []string{"-async"},
2067 shouldFail: true,
2068 expectedError: ":TOO_MANY_WARNING_ALERTS:",
2069 },
David Benjaminba4594a2015-06-18 18:36:15 -04002070 {
Steven Valdezc4aa7272016-10-03 12:25:56 -04002071 name: "TooManyKeyUpdates",
Steven Valdez32635b82016-08-16 11:25:03 -04002072 config: Config{
2073 MaxVersion: VersionTLS13,
2074 },
Steven Valdezc4aa7272016-10-03 12:25:56 -04002075 sendKeyUpdates: 33,
2076 keyUpdateRequest: keyUpdateNotRequested,
2077 shouldFail: true,
2078 expectedError: ":TOO_MANY_KEY_UPDATES:",
Steven Valdez32635b82016-08-16 11:25:03 -04002079 },
2080 {
David Benjaminba4594a2015-06-18 18:36:15 -04002081 name: "EmptySessionID",
2082 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04002083 MaxVersion: VersionTLS12,
David Benjaminba4594a2015-06-18 18:36:15 -04002084 SessionTicketsDisabled: true,
2085 },
2086 noSessionCache: true,
2087 flags: []string{"-expect-no-session"},
2088 },
David Benjamin30789da2015-08-29 22:56:45 -04002089 {
2090 name: "Unclean-Shutdown",
2091 config: Config{
2092 Bugs: ProtocolBugs{
2093 NoCloseNotify: true,
2094 ExpectCloseNotify: true,
2095 },
2096 },
2097 shimShutsDown: true,
2098 flags: []string{"-check-close-notify"},
2099 shouldFail: true,
2100 expectedError: "Unexpected SSL_shutdown result: -1 != 1",
2101 },
2102 {
2103 name: "Unclean-Shutdown-Ignored",
2104 config: Config{
2105 Bugs: ProtocolBugs{
2106 NoCloseNotify: true,
2107 },
2108 },
2109 shimShutsDown: true,
2110 },
David Benjamin4f75aaf2015-09-01 16:53:10 -04002111 {
David Benjaminfa214e42016-05-10 17:03:10 -04002112 name: "Unclean-Shutdown-Alert",
2113 config: Config{
2114 Bugs: ProtocolBugs{
2115 SendAlertOnShutdown: alertDecompressionFailure,
2116 ExpectCloseNotify: true,
2117 },
2118 },
2119 shimShutsDown: true,
2120 flags: []string{"-check-close-notify"},
2121 shouldFail: true,
2122 expectedError: ":SSLV3_ALERT_DECOMPRESSION_FAILURE:",
2123 },
2124 {
David Benjamin4f75aaf2015-09-01 16:53:10 -04002125 name: "LargePlaintext",
2126 config: Config{
2127 Bugs: ProtocolBugs{
2128 SendLargeRecords: true,
2129 },
2130 },
2131 messageLen: maxPlaintext + 1,
2132 shouldFail: true,
2133 expectedError: ":DATA_LENGTH_TOO_LONG:",
2134 },
2135 {
2136 protocol: dtls,
2137 name: "LargePlaintext-DTLS",
2138 config: Config{
2139 Bugs: ProtocolBugs{
2140 SendLargeRecords: true,
2141 },
2142 },
2143 messageLen: maxPlaintext + 1,
2144 shouldFail: true,
2145 expectedError: ":DATA_LENGTH_TOO_LONG:",
2146 },
2147 {
2148 name: "LargeCiphertext",
2149 config: Config{
2150 Bugs: ProtocolBugs{
2151 SendLargeRecords: true,
2152 },
2153 },
2154 messageLen: maxPlaintext * 2,
2155 shouldFail: true,
2156 expectedError: ":ENCRYPTED_LENGTH_TOO_LONG:",
2157 },
2158 {
2159 protocol: dtls,
2160 name: "LargeCiphertext-DTLS",
2161 config: Config{
2162 Bugs: ProtocolBugs{
2163 SendLargeRecords: true,
2164 },
2165 },
2166 messageLen: maxPlaintext * 2,
2167 // Unlike the other four cases, DTLS drops records which
2168 // are invalid before authentication, so the connection
2169 // does not fail.
2170 expectMessageDropped: true,
2171 },
David Benjamindd6fed92015-10-23 17:41:12 -04002172 {
David Benjaminef5dfd22015-12-06 13:17:07 -05002173 name: "BadHelloRequest-1",
2174 renegotiate: 1,
2175 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04002176 MaxVersion: VersionTLS12,
David Benjaminef5dfd22015-12-06 13:17:07 -05002177 Bugs: ProtocolBugs{
2178 BadHelloRequest: []byte{typeHelloRequest, 0, 0, 1, 1},
2179 },
2180 },
2181 flags: []string{
2182 "-renegotiate-freely",
2183 "-expect-total-renegotiations", "1",
2184 },
2185 shouldFail: true,
David Benjamin163f29a2016-07-28 11:05:58 -04002186 expectedError: ":EXCESSIVE_MESSAGE_SIZE:",
David Benjaminef5dfd22015-12-06 13:17:07 -05002187 },
2188 {
2189 name: "BadHelloRequest-2",
2190 renegotiate: 1,
2191 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04002192 MaxVersion: VersionTLS12,
David Benjaminef5dfd22015-12-06 13:17:07 -05002193 Bugs: ProtocolBugs{
2194 BadHelloRequest: []byte{typeServerKeyExchange, 0, 0, 0},
2195 },
2196 },
2197 flags: []string{
2198 "-renegotiate-freely",
2199 "-expect-total-renegotiations", "1",
2200 },
2201 shouldFail: true,
2202 expectedError: ":BAD_HELLO_REQUEST:",
2203 },
David Benjaminef1b0092015-11-21 14:05:44 -05002204 {
2205 testType: serverTest,
2206 name: "SupportTicketsWithSessionID",
2207 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04002208 MaxVersion: VersionTLS12,
David Benjaminef1b0092015-11-21 14:05:44 -05002209 SessionTicketsDisabled: true,
2210 },
David Benjamin4c3ddf72016-06-29 18:13:53 -04002211 resumeConfig: &Config{
2212 MaxVersion: VersionTLS12,
2213 },
David Benjaminef1b0092015-11-21 14:05:44 -05002214 resumeSession: true,
2215 },
David Benjamin02edcd02016-07-27 17:40:37 -04002216 {
2217 protocol: dtls,
2218 name: "DTLS-SendExtraFinished",
2219 config: Config{
2220 Bugs: ProtocolBugs{
2221 SendExtraFinished: true,
2222 },
2223 },
2224 shouldFail: true,
2225 expectedError: ":UNEXPECTED_RECORD:",
2226 },
2227 {
2228 protocol: dtls,
2229 name: "DTLS-SendExtraFinished-Reordered",
2230 config: Config{
2231 Bugs: ProtocolBugs{
2232 MaxHandshakeRecordLength: 2,
2233 ReorderHandshakeFragments: true,
2234 SendExtraFinished: true,
2235 },
2236 },
2237 shouldFail: true,
2238 expectedError: ":UNEXPECTED_RECORD:",
2239 },
David Benjamine97fb482016-07-29 09:23:07 -04002240 {
2241 testType: serverTest,
2242 name: "V2ClientHello-EmptyRecordPrefix",
2243 config: Config{
2244 // Choose a cipher suite that does not involve
2245 // elliptic curves, so no extensions are
2246 // involved.
2247 MaxVersion: VersionTLS12,
Matt Braithwaite07e78062016-08-21 14:50:43 -07002248 CipherSuites: []uint16{TLS_RSA_WITH_3DES_EDE_CBC_SHA},
David Benjamine97fb482016-07-29 09:23:07 -04002249 Bugs: ProtocolBugs{
2250 SendV2ClientHello: true,
2251 },
2252 },
2253 sendPrefix: string([]byte{
2254 byte(recordTypeHandshake),
2255 3, 1, // version
2256 0, 0, // length
2257 }),
2258 // A no-op empty record may not be sent before V2ClientHello.
2259 shouldFail: true,
2260 expectedError: ":WRONG_VERSION_NUMBER:",
2261 },
2262 {
2263 testType: serverTest,
2264 name: "V2ClientHello-WarningAlertPrefix",
2265 config: Config{
2266 // Choose a cipher suite that does not involve
2267 // elliptic curves, so no extensions are
2268 // involved.
2269 MaxVersion: VersionTLS12,
Matt Braithwaite07e78062016-08-21 14:50:43 -07002270 CipherSuites: []uint16{TLS_RSA_WITH_3DES_EDE_CBC_SHA},
David Benjamine97fb482016-07-29 09:23:07 -04002271 Bugs: ProtocolBugs{
2272 SendV2ClientHello: true,
2273 },
2274 },
2275 sendPrefix: string([]byte{
2276 byte(recordTypeAlert),
2277 3, 1, // version
2278 0, 2, // length
2279 alertLevelWarning, byte(alertDecompressionFailure),
2280 }),
2281 // A no-op warning alert may not be sent before V2ClientHello.
2282 shouldFail: true,
2283 expectedError: ":WRONG_VERSION_NUMBER:",
2284 },
Steven Valdez1dc53d22016-07-26 12:27:38 -04002285 {
David Benjamin7ebe61a2017-02-10 13:14:01 -05002286 name: "KeyUpdate-Client",
2287 config: Config{
2288 MaxVersion: VersionTLS13,
2289 },
2290 sendKeyUpdates: 1,
2291 keyUpdateRequest: keyUpdateNotRequested,
2292 },
2293 {
2294 testType: serverTest,
2295 name: "KeyUpdate-Server",
Steven Valdez1dc53d22016-07-26 12:27:38 -04002296 config: Config{
2297 MaxVersion: VersionTLS13,
Steven Valdez1dc53d22016-07-26 12:27:38 -04002298 },
Steven Valdezc4aa7272016-10-03 12:25:56 -04002299 sendKeyUpdates: 1,
2300 keyUpdateRequest: keyUpdateNotRequested,
2301 },
2302 {
2303 name: "KeyUpdate-InvalidRequestMode",
2304 config: Config{
2305 MaxVersion: VersionTLS13,
2306 },
2307 sendKeyUpdates: 1,
2308 keyUpdateRequest: 42,
2309 shouldFail: true,
2310 expectedError: ":DECODE_ERROR:",
Steven Valdez1dc53d22016-07-26 12:27:38 -04002311 },
David Benjaminabe94e32016-09-04 14:18:58 -04002312 {
2313 name: "SendSNIWarningAlert",
2314 config: Config{
2315 MaxVersion: VersionTLS12,
2316 Bugs: ProtocolBugs{
2317 SendSNIWarningAlert: true,
2318 },
2319 },
2320 },
David Benjaminc241d792016-09-09 10:34:20 -04002321 {
2322 testType: serverTest,
2323 name: "ExtraCompressionMethods-TLS12",
2324 config: Config{
2325 MaxVersion: VersionTLS12,
2326 Bugs: ProtocolBugs{
2327 SendCompressionMethods: []byte{1, 2, 3, compressionNone, 4, 5, 6},
2328 },
2329 },
2330 },
2331 {
2332 testType: serverTest,
2333 name: "ExtraCompressionMethods-TLS13",
2334 config: Config{
2335 MaxVersion: VersionTLS13,
2336 Bugs: ProtocolBugs{
2337 SendCompressionMethods: []byte{1, 2, 3, compressionNone, 4, 5, 6},
2338 },
2339 },
2340 shouldFail: true,
2341 expectedError: ":INVALID_COMPRESSION_LIST:",
2342 expectedLocalError: "remote error: illegal parameter",
2343 },
2344 {
2345 testType: serverTest,
2346 name: "NoNullCompression-TLS12",
2347 config: Config{
2348 MaxVersion: VersionTLS12,
2349 Bugs: ProtocolBugs{
2350 SendCompressionMethods: []byte{1, 2, 3, 4, 5, 6},
2351 },
2352 },
2353 shouldFail: true,
David Benjamindaa05392017-02-02 23:33:21 -05002354 expectedError: ":INVALID_COMPRESSION_LIST:",
David Benjaminc241d792016-09-09 10:34:20 -04002355 expectedLocalError: "remote error: illegal parameter",
2356 },
2357 {
2358 testType: serverTest,
2359 name: "NoNullCompression-TLS13",
2360 config: Config{
2361 MaxVersion: VersionTLS13,
2362 Bugs: ProtocolBugs{
2363 SendCompressionMethods: []byte{1, 2, 3, 4, 5, 6},
2364 },
2365 },
2366 shouldFail: true,
2367 expectedError: ":INVALID_COMPRESSION_LIST:",
2368 expectedLocalError: "remote error: illegal parameter",
2369 },
David Benjamin65ac9972016-09-02 21:35:25 -04002370 {
David Benjamin1a5e8ec2016-10-07 15:19:18 -04002371 name: "GREASE-Client-TLS12",
David Benjamin65ac9972016-09-02 21:35:25 -04002372 config: Config{
2373 MaxVersion: VersionTLS12,
2374 Bugs: ProtocolBugs{
2375 ExpectGREASE: true,
2376 },
2377 },
2378 flags: []string{"-enable-grease"},
2379 },
2380 {
David Benjamin1a5e8ec2016-10-07 15:19:18 -04002381 name: "GREASE-Client-TLS13",
2382 config: Config{
2383 MaxVersion: VersionTLS13,
2384 Bugs: ProtocolBugs{
2385 ExpectGREASE: true,
2386 },
2387 },
2388 flags: []string{"-enable-grease"},
2389 },
2390 {
2391 testType: serverTest,
2392 name: "GREASE-Server-TLS13",
David Benjamin65ac9972016-09-02 21:35:25 -04002393 config: Config{
2394 MaxVersion: VersionTLS13,
2395 Bugs: ProtocolBugs{
David Benjamin079b3942016-10-20 13:19:20 -04002396 // TLS 1.3 servers are expected to
2397 // always enable GREASE. TLS 1.3 is new,
2398 // so there is no existing ecosystem to
2399 // worry about.
David Benjamin65ac9972016-09-02 21:35:25 -04002400 ExpectGREASE: true,
2401 },
2402 },
David Benjamin65ac9972016-09-02 21:35:25 -04002403 },
David Benjamine3fbb362017-01-06 16:19:28 -05002404 {
2405 // Test the server so there is a large certificate as
2406 // well as application data.
2407 testType: serverTest,
2408 name: "MaxSendFragment",
2409 config: Config{
2410 Bugs: ProtocolBugs{
2411 MaxReceivePlaintext: 512,
2412 },
2413 },
2414 messageLen: 1024,
2415 flags: []string{
2416 "-max-send-fragment", "512",
2417 "-read-size", "1024",
2418 },
2419 },
2420 {
2421 // Test the server so there is a large certificate as
2422 // well as application data.
2423 testType: serverTest,
2424 name: "MaxSendFragment-TooLarge",
2425 config: Config{
2426 Bugs: ProtocolBugs{
2427 // Ensure that some of the records are
2428 // 512.
2429 MaxReceivePlaintext: 511,
2430 },
2431 },
2432 messageLen: 1024,
2433 flags: []string{
2434 "-max-send-fragment", "512",
2435 "-read-size", "1024",
2436 },
2437 shouldFail: true,
2438 expectedLocalError: "local error: record overflow",
2439 },
Adam Langley7c803a62015-06-15 15:35:05 -07002440 }
Adam Langley7c803a62015-06-15 15:35:05 -07002441 testCases = append(testCases, basicTests...)
David Benjamina252b342016-09-26 19:57:53 -04002442
Matthew Braithwaitecedc6f12017-03-15 19:20:23 -07002443 if *includeDHE {
2444 testCases = append(testCases, testCase{
2445 name: "NoFalseStart-DHE_RSA",
2446 config: Config{
2447 MaxVersion: VersionTLS12,
2448 CipherSuites: []uint16{TLS_DHE_RSA_WITH_AES_128_GCM_SHA256},
2449 NextProtos: []string{"foo"},
2450 Bugs: ProtocolBugs{
2451 ExpectFalseStart: true,
2452 AlertBeforeFalseStartTest: alertAccessDenied,
2453 },
2454 },
2455 flags: []string{
2456 "-false-start",
2457 "-advertise-alpn", "\x03foo",
2458 },
2459 shimWritesFirst: true,
2460 shouldFail: true,
2461 expectedError: ":TLSV1_ALERT_ACCESS_DENIED:",
2462 expectedLocalError: "tls: peer did not false start: EOF",
2463 })
2464 }
2465
David Benjamina252b342016-09-26 19:57:53 -04002466 // Test that very large messages can be received.
2467 cert := rsaCertificate
2468 for i := 0; i < 50; i++ {
2469 cert.Certificate = append(cert.Certificate, cert.Certificate[0])
2470 }
2471 testCases = append(testCases, testCase{
2472 name: "LargeMessage",
2473 config: Config{
2474 Certificates: []Certificate{cert},
2475 },
2476 })
2477 testCases = append(testCases, testCase{
2478 protocol: dtls,
2479 name: "LargeMessage-DTLS",
2480 config: Config{
2481 Certificates: []Certificate{cert},
2482 },
2483 })
2484
2485 // They are rejected if the maximum certificate chain length is capped.
2486 testCases = append(testCases, testCase{
2487 name: "LargeMessage-Reject",
2488 config: Config{
2489 Certificates: []Certificate{cert},
2490 },
2491 flags: []string{"-max-cert-list", "16384"},
2492 shouldFail: true,
2493 expectedError: ":EXCESSIVE_MESSAGE_SIZE:",
2494 })
2495 testCases = append(testCases, testCase{
2496 protocol: dtls,
2497 name: "LargeMessage-Reject-DTLS",
2498 config: Config{
2499 Certificates: []Certificate{cert},
2500 },
2501 flags: []string{"-max-cert-list", "16384"},
2502 shouldFail: true,
2503 expectedError: ":EXCESSIVE_MESSAGE_SIZE:",
2504 })
Adam Langley7c803a62015-06-15 15:35:05 -07002505}
2506
David Benjaminaa012042016-12-10 13:33:05 -05002507func addTestForCipherSuite(suite testCipherSuite, ver tlsVersion, protocol protocol) {
2508 const psk = "12345"
2509 const pskIdentity = "luggage combo"
2510
2511 var prefix string
2512 if protocol == dtls {
2513 if !ver.hasDTLS {
2514 return
2515 }
2516 prefix = "D"
2517 }
2518
2519 var cert Certificate
2520 var certFile string
2521 var keyFile string
2522 if hasComponent(suite.name, "ECDSA") {
2523 cert = ecdsaP256Certificate
2524 certFile = ecdsaP256CertificateFile
2525 keyFile = ecdsaP256KeyFile
2526 } else {
2527 cert = rsaCertificate
2528 certFile = rsaCertificateFile
2529 keyFile = rsaKeyFile
2530 }
2531
2532 var flags []string
2533 if hasComponent(suite.name, "PSK") {
2534 flags = append(flags,
2535 "-psk", psk,
2536 "-psk-identity", pskIdentity)
2537 }
2538 if hasComponent(suite.name, "NULL") {
2539 // NULL ciphers must be explicitly enabled.
2540 flags = append(flags, "-cipher", "DEFAULT:NULL-SHA")
2541 }
David Benjaminaa012042016-12-10 13:33:05 -05002542
2543 var shouldServerFail, shouldClientFail bool
2544 if hasComponent(suite.name, "ECDHE") && ver.version == VersionSSL30 {
2545 // BoringSSL clients accept ECDHE on SSLv3, but
2546 // a BoringSSL server will never select it
2547 // because the extension is missing.
2548 shouldServerFail = true
2549 }
2550 if isTLS12Only(suite.name) && ver.version < VersionTLS12 {
2551 shouldClientFail = true
2552 shouldServerFail = true
2553 }
2554 if !isTLS13Suite(suite.name) && ver.version >= VersionTLS13 {
2555 shouldClientFail = true
2556 shouldServerFail = true
2557 }
2558 if isTLS13Suite(suite.name) && ver.version < VersionTLS13 {
2559 shouldClientFail = true
2560 shouldServerFail = true
2561 }
2562 if !isDTLSCipher(suite.name) && protocol == dtls {
2563 shouldClientFail = true
2564 shouldServerFail = true
2565 }
2566
2567 var sendCipherSuite uint16
2568 var expectedServerError, expectedClientError string
2569 serverCipherSuites := []uint16{suite.id}
2570 if shouldServerFail {
2571 expectedServerError = ":NO_SHARED_CIPHER:"
2572 }
2573 if shouldClientFail {
2574 expectedClientError = ":WRONG_CIPHER_RETURNED:"
2575 // Configure the server to select ciphers as normal but
2576 // select an incompatible cipher in ServerHello.
2577 serverCipherSuites = nil
2578 sendCipherSuite = suite.id
2579 }
2580
David Benjamincdb6fe92017-02-07 16:06:48 -05002581 // For cipher suites and versions where exporters are defined, verify
2582 // that they interoperate.
2583 var exportKeyingMaterial int
2584 if ver.version > VersionSSL30 {
2585 exportKeyingMaterial = 1024
2586 }
2587
David Benjaminaa012042016-12-10 13:33:05 -05002588 testCases = append(testCases, testCase{
2589 testType: serverTest,
2590 protocol: protocol,
2591 name: prefix + ver.name + "-" + suite.name + "-server",
2592 config: Config{
2593 MinVersion: ver.version,
2594 MaxVersion: ver.version,
2595 CipherSuites: []uint16{suite.id},
2596 Certificates: []Certificate{cert},
2597 PreSharedKey: []byte(psk),
2598 PreSharedKeyIdentity: pskIdentity,
2599 Bugs: ProtocolBugs{
2600 AdvertiseAllConfiguredCiphers: true,
2601 },
2602 },
David Benjamincdb6fe92017-02-07 16:06:48 -05002603 certFile: certFile,
2604 keyFile: keyFile,
2605 flags: flags,
2606 resumeSession: true,
2607 shouldFail: shouldServerFail,
2608 expectedError: expectedServerError,
2609 exportKeyingMaterial: exportKeyingMaterial,
David Benjaminaa012042016-12-10 13:33:05 -05002610 })
2611
2612 testCases = append(testCases, testCase{
2613 testType: clientTest,
2614 protocol: protocol,
2615 name: prefix + ver.name + "-" + suite.name + "-client",
2616 config: Config{
2617 MinVersion: ver.version,
2618 MaxVersion: ver.version,
2619 CipherSuites: serverCipherSuites,
2620 Certificates: []Certificate{cert},
2621 PreSharedKey: []byte(psk),
2622 PreSharedKeyIdentity: pskIdentity,
2623 Bugs: ProtocolBugs{
2624 IgnorePeerCipherPreferences: shouldClientFail,
2625 SendCipherSuite: sendCipherSuite,
2626 },
2627 },
David Benjamincdb6fe92017-02-07 16:06:48 -05002628 flags: flags,
2629 resumeSession: true,
2630 shouldFail: shouldClientFail,
2631 expectedError: expectedClientError,
2632 exportKeyingMaterial: exportKeyingMaterial,
David Benjaminaa012042016-12-10 13:33:05 -05002633 })
2634
David Benjamin6f600d62016-12-21 16:06:54 -05002635 if shouldClientFail {
2636 return
2637 }
2638
2639 // Ensure the maximum record size is accepted.
2640 testCases = append(testCases, testCase{
2641 protocol: protocol,
2642 name: prefix + ver.name + "-" + suite.name + "-LargeRecord",
2643 config: Config{
2644 MinVersion: ver.version,
2645 MaxVersion: ver.version,
2646 CipherSuites: []uint16{suite.id},
2647 Certificates: []Certificate{cert},
2648 PreSharedKey: []byte(psk),
2649 PreSharedKeyIdentity: pskIdentity,
2650 },
2651 flags: flags,
2652 messageLen: maxPlaintext,
2653 })
2654
2655 // Test bad records for all ciphers. Bad records are fatal in TLS
2656 // and ignored in DTLS.
2657 var shouldFail bool
2658 var expectedError string
2659 if protocol == tls {
2660 shouldFail = true
2661 expectedError = ":DECRYPTION_FAILED_OR_BAD_RECORD_MAC:"
2662 }
2663
2664 testCases = append(testCases, testCase{
2665 protocol: protocol,
2666 name: prefix + ver.name + "-" + suite.name + "-BadRecord",
2667 config: Config{
2668 MinVersion: ver.version,
2669 MaxVersion: ver.version,
2670 CipherSuites: []uint16{suite.id},
2671 Certificates: []Certificate{cert},
2672 PreSharedKey: []byte(psk),
2673 PreSharedKeyIdentity: pskIdentity,
2674 },
2675 flags: flags,
2676 damageFirstWrite: true,
2677 messageLen: maxPlaintext,
2678 shouldFail: shouldFail,
2679 expectedError: expectedError,
2680 })
David Benjaminaa012042016-12-10 13:33:05 -05002681}
2682
Adam Langley95c29f32014-06-20 12:00:00 -07002683func addCipherSuiteTests() {
David Benjamine470e662016-07-18 15:47:32 +02002684 const bogusCipher = 0xfe00
2685
Matthew Braithwaitecedc6f12017-03-15 19:20:23 -07002686 if *includeDHE {
2687 testCipherSuites = append(testCipherSuites, []testCipherSuite{
2688 {"DHE-RSA-AES128-GCM", TLS_DHE_RSA_WITH_AES_128_GCM_SHA256},
2689 {"DHE-RSA-AES128-SHA", TLS_DHE_RSA_WITH_AES_128_CBC_SHA},
2690 {"DHE-RSA-AES128-SHA256", TLS_DHE_RSA_WITH_AES_128_CBC_SHA256},
2691 {"DHE-RSA-AES256-GCM", TLS_DHE_RSA_WITH_AES_256_GCM_SHA384},
2692 {"DHE-RSA-AES256-SHA", TLS_DHE_RSA_WITH_AES_256_CBC_SHA},
2693 {"DHE-RSA-AES256-SHA256", TLS_DHE_RSA_WITH_AES_256_CBC_SHA256},
2694 }...)
2695 }
2696
Adam Langley95c29f32014-06-20 12:00:00 -07002697 for _, suite := range testCipherSuites {
Adam Langley95c29f32014-06-20 12:00:00 -07002698 for _, ver := range tlsVersions {
David Benjamin0407e762016-06-17 16:41:18 -04002699 for _, protocol := range []protocol{tls, dtls} {
David Benjaminaa012042016-12-10 13:33:05 -05002700 addTestForCipherSuite(suite, ver, protocol)
Nick Harper1fd39d82016-06-14 18:14:35 -07002701 }
David Benjamin2c99d282015-09-01 10:23:00 -04002702 }
Adam Langley95c29f32014-06-20 12:00:00 -07002703 }
Adam Langleya7997f12015-05-14 17:38:50 -07002704
2705 testCases = append(testCases, testCase{
David Benjamin4c3ddf72016-06-29 18:13:53 -04002706 name: "NoSharedCipher",
2707 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04002708 MaxVersion: VersionTLS12,
2709 CipherSuites: []uint16{},
2710 },
2711 shouldFail: true,
2712 expectedError: ":HANDSHAKE_FAILURE_ON_CLIENT_HELLO:",
2713 })
2714
2715 testCases = append(testCases, testCase{
Steven Valdez143e8b32016-07-11 13:19:03 -04002716 name: "NoSharedCipher-TLS13",
2717 config: Config{
2718 MaxVersion: VersionTLS13,
2719 CipherSuites: []uint16{},
2720 },
2721 shouldFail: true,
2722 expectedError: ":HANDSHAKE_FAILURE_ON_CLIENT_HELLO:",
2723 })
2724
2725 testCases = append(testCases, testCase{
David Benjamin4c3ddf72016-06-29 18:13:53 -04002726 name: "UnsupportedCipherSuite",
2727 config: Config{
2728 MaxVersion: VersionTLS12,
Matt Braithwaite9c8c4182016-08-24 14:36:54 -07002729 CipherSuites: []uint16{TLS_RSA_WITH_AES_128_CBC_SHA},
David Benjamin4c3ddf72016-06-29 18:13:53 -04002730 Bugs: ProtocolBugs{
2731 IgnorePeerCipherPreferences: true,
2732 },
2733 },
Matt Braithwaite9c8c4182016-08-24 14:36:54 -07002734 flags: []string{"-cipher", "DEFAULT:!AES"},
David Benjamin4c3ddf72016-06-29 18:13:53 -04002735 shouldFail: true,
2736 expectedError: ":WRONG_CIPHER_RETURNED:",
2737 })
2738
2739 testCases = append(testCases, testCase{
David Benjamine470e662016-07-18 15:47:32 +02002740 name: "ServerHelloBogusCipher",
2741 config: Config{
2742 MaxVersion: VersionTLS12,
2743 Bugs: ProtocolBugs{
2744 SendCipherSuite: bogusCipher,
2745 },
2746 },
2747 shouldFail: true,
2748 expectedError: ":UNKNOWN_CIPHER_RETURNED:",
2749 })
2750 testCases = append(testCases, testCase{
2751 name: "ServerHelloBogusCipher-TLS13",
2752 config: Config{
2753 MaxVersion: VersionTLS13,
2754 Bugs: ProtocolBugs{
2755 SendCipherSuite: bogusCipher,
2756 },
2757 },
2758 shouldFail: true,
2759 expectedError: ":UNKNOWN_CIPHER_RETURNED:",
2760 })
2761
Matthew Braithwaitecedc6f12017-03-15 19:20:23 -07002762 if *includeDHE {
2763 testCases = append(testCases, testCase{
2764 name: "WeakDH",
2765 config: Config{
2766 MaxVersion: VersionTLS12,
2767 CipherSuites: []uint16{TLS_DHE_RSA_WITH_AES_128_GCM_SHA256},
2768 Bugs: ProtocolBugs{
2769 // This is a 1023-bit prime number, generated
2770 // with:
2771 // openssl gendh 1023 | openssl asn1parse -i
2772 DHGroupPrime: bigFromHex("518E9B7930CE61C6E445C8360584E5FC78D9137C0FFDC880B495D5338ADF7689951A6821C17A76B3ACB8E0156AEA607B7EC406EBEDBB84D8376EB8FE8F8BA1433488BEE0C3EDDFD3A32DBB9481980A7AF6C96BFCF490A094CFFB2B8192C1BB5510B77B658436E27C2D4D023FE3718222AB0CA1273995B51F6D625A4944D0DD4B"),
2773 },
Adam Langleya7997f12015-05-14 17:38:50 -07002774 },
Matthew Braithwaitecedc6f12017-03-15 19:20:23 -07002775 shouldFail: true,
2776 expectedError: ":BAD_DH_P_LENGTH:",
2777 })
Adam Langleycef75832015-09-03 14:51:12 -07002778
Matthew Braithwaitecedc6f12017-03-15 19:20:23 -07002779 testCases = append(testCases, testCase{
2780 name: "SillyDH",
2781 config: Config{
2782 MaxVersion: VersionTLS12,
2783 CipherSuites: []uint16{TLS_DHE_RSA_WITH_AES_128_GCM_SHA256},
2784 Bugs: ProtocolBugs{
2785 // This is a 4097-bit prime number, generated
2786 // with:
2787 // openssl gendh 4097 | openssl asn1parse -i
2788 DHGroupPrime: bigFromHex("01D366FA64A47419B0CD4A45918E8D8C8430F674621956A9F52B0CA592BC104C6E38D60C58F2CA66792A2B7EBDC6F8FFE75AB7D6862C261F34E96A2AEEF53AB7C21365C2E8FB0582F71EB57B1C227C0E55AE859E9904A25EFECD7B435C4D4357BD840B03649D4A1F8037D89EA4E1967DBEEF1CC17A6111C48F12E9615FFF336D3F07064CB17C0B765A012C850B9E3AA7A6984B96D8C867DDC6D0F4AB52042572244796B7ECFF681CD3B3E2E29AAECA391A775BEE94E502FB15881B0F4AC60314EA947C0C82541C3D16FD8C0E09BB7F8F786582032859D9C13187CE6C0CB6F2D3EE6C3C9727C15F14B21D3CD2E02BDB9D119959B0E03DC9E5A91E2578762300B1517D2352FC1D0BB934A4C3E1B20CE9327DB102E89A6C64A8C3148EDFC5A94913933853442FA84451B31FD21E492F92DD5488E0D871AEBFE335A4B92431DEC69591548010E76A5B365D346786E9A2D3E589867D796AA5E25211201D757560D318A87DFB27F3E625BC373DB48BF94A63161C674C3D4265CB737418441B7650EABC209CF675A439BEB3E9D1AA1B79F67198A40CEFD1C89144F7D8BAF61D6AD36F466DA546B4174A0E0CAF5BD788C8243C7C2DDDCC3DB6FC89F12F17D19FBD9B0BC76FE92891CD6BA07BEA3B66EF12D0D85E788FD58675C1B0FBD16029DCC4D34E7A1A41471BDEDF78BF591A8B4E96D88BEC8EDC093E616292BFC096E69A916E8D624B"),
2789 },
David Benjamincd24a392015-11-11 13:23:05 -08002790 },
Matthew Braithwaitecedc6f12017-03-15 19:20:23 -07002791 shouldFail: true,
2792 expectedError: ":DH_P_TOO_LONG:",
2793 })
David Benjamincd24a392015-11-11 13:23:05 -08002794
Matthew Braithwaitecedc6f12017-03-15 19:20:23 -07002795 // This test ensures that Diffie-Hellman public values are padded with
2796 // zeros so that they're the same length as the prime. This is to avoid
2797 // hitting a bug in yaSSL.
2798 testCases = append(testCases, testCase{
2799 testType: serverTest,
2800 name: "DHPublicValuePadded",
2801 config: Config{
2802 MaxVersion: VersionTLS12,
2803 CipherSuites: []uint16{TLS_DHE_RSA_WITH_AES_128_GCM_SHA256},
2804 Bugs: ProtocolBugs{
2805 RequireDHPublicValueLen: (1025 + 7) / 8,
2806 },
Adam Langleyc4f25ce2015-11-26 16:39:08 -08002807 },
Matthew Braithwaitecedc6f12017-03-15 19:20:23 -07002808 flags: []string{"-use-sparse-dh-prime"},
2809 })
2810 }
David Benjamincd24a392015-11-11 13:23:05 -08002811
David Benjamin241ae832016-01-15 03:04:54 -05002812 // The server must be tolerant to bogus ciphers.
David Benjamin241ae832016-01-15 03:04:54 -05002813 testCases = append(testCases, testCase{
2814 testType: serverTest,
2815 name: "UnknownCipher",
2816 config: Config{
Steven Valdez803c77a2016-09-06 14:13:43 -04002817 MaxVersion: VersionTLS12,
David Benjamin241ae832016-01-15 03:04:54 -05002818 CipherSuites: []uint16{bogusCipher, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
David Benjamin5ecb88b2016-10-04 17:51:35 -04002819 Bugs: ProtocolBugs{
2820 AdvertiseAllConfiguredCiphers: true,
2821 },
2822 },
2823 })
Steven Valdez803c77a2016-09-06 14:13:43 -04002824
2825 // The server must be tolerant to bogus ciphers.
David Benjamin5ecb88b2016-10-04 17:51:35 -04002826 testCases = append(testCases, testCase{
2827 testType: serverTest,
2828 name: "UnknownCipher-TLS13",
2829 config: Config{
2830 MaxVersion: VersionTLS13,
Steven Valdez803c77a2016-09-06 14:13:43 -04002831 CipherSuites: []uint16{bogusCipher, TLS_AES_128_GCM_SHA256},
David Benjamin5ecb88b2016-10-04 17:51:35 -04002832 Bugs: ProtocolBugs{
2833 AdvertiseAllConfiguredCiphers: true,
2834 },
David Benjamin241ae832016-01-15 03:04:54 -05002835 },
2836 })
2837
David Benjamin78679342016-09-16 19:42:05 -04002838 // Test empty ECDHE_PSK identity hints work as expected.
2839 testCases = append(testCases, testCase{
2840 name: "EmptyECDHEPSKHint",
2841 config: Config{
2842 MaxVersion: VersionTLS12,
2843 CipherSuites: []uint16{TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA},
2844 PreSharedKey: []byte("secret"),
2845 },
2846 flags: []string{"-psk", "secret"},
2847 })
2848
2849 // Test empty PSK identity hints work as expected, even if an explicit
2850 // ServerKeyExchange is sent.
2851 testCases = append(testCases, testCase{
2852 name: "ExplicitEmptyPSKHint",
2853 config: Config{
2854 MaxVersion: VersionTLS12,
2855 CipherSuites: []uint16{TLS_PSK_WITH_AES_128_CBC_SHA},
2856 PreSharedKey: []byte("secret"),
2857 Bugs: ProtocolBugs{
2858 AlwaysSendPreSharedKeyIdentityHint: true,
2859 },
2860 },
2861 flags: []string{"-psk", "secret"},
2862 })
Adam Langley95c29f32014-06-20 12:00:00 -07002863}
2864
2865func addBadECDSASignatureTests() {
2866 for badR := BadValue(1); badR < NumBadValues; badR++ {
2867 for badS := BadValue(1); badS < NumBadValues; badS++ {
David Benjamin025b3d32014-07-01 19:53:04 -04002868 testCases = append(testCases, testCase{
Adam Langley95c29f32014-06-20 12:00:00 -07002869 name: fmt.Sprintf("BadECDSA-%d-%d", badR, badS),
2870 config: Config{
Steven Valdez803c77a2016-09-06 14:13:43 -04002871 MaxVersion: VersionTLS12,
Adam Langley95c29f32014-06-20 12:00:00 -07002872 CipherSuites: []uint16{TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
David Benjamin33863262016-07-08 17:20:12 -07002873 Certificates: []Certificate{ecdsaP256Certificate},
Adam Langley95c29f32014-06-20 12:00:00 -07002874 Bugs: ProtocolBugs{
2875 BadECDSAR: badR,
2876 BadECDSAS: badS,
2877 },
2878 },
2879 shouldFail: true,
David Benjamin11d50f92016-03-10 15:55:45 -05002880 expectedError: ":BAD_SIGNATURE:",
Adam Langley95c29f32014-06-20 12:00:00 -07002881 })
Steven Valdez803c77a2016-09-06 14:13:43 -04002882 testCases = append(testCases, testCase{
2883 name: fmt.Sprintf("BadECDSA-%d-%d-TLS13", badR, badS),
2884 config: Config{
2885 MaxVersion: VersionTLS13,
2886 Certificates: []Certificate{ecdsaP256Certificate},
2887 Bugs: ProtocolBugs{
2888 BadECDSAR: badR,
2889 BadECDSAS: badS,
2890 },
2891 },
2892 shouldFail: true,
2893 expectedError: ":BAD_SIGNATURE:",
2894 })
Adam Langley95c29f32014-06-20 12:00:00 -07002895 }
2896 }
2897}
2898
Adam Langley80842bd2014-06-20 12:00:00 -07002899func addCBCPaddingTests() {
David Benjamin025b3d32014-07-01 19:53:04 -04002900 testCases = append(testCases, testCase{
Adam Langley80842bd2014-06-20 12:00:00 -07002901 name: "MaxCBCPadding",
2902 config: Config{
Nick Harper1fd39d82016-06-14 18:14:35 -07002903 MaxVersion: VersionTLS12,
Adam Langley80842bd2014-06-20 12:00:00 -07002904 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA},
2905 Bugs: ProtocolBugs{
2906 MaxPadding: true,
2907 },
2908 },
2909 messageLen: 12, // 20 bytes of SHA-1 + 12 == 0 % block size
2910 })
David Benjamin025b3d32014-07-01 19:53:04 -04002911 testCases = append(testCases, testCase{
Adam Langley80842bd2014-06-20 12:00:00 -07002912 name: "BadCBCPadding",
2913 config: Config{
Nick Harper1fd39d82016-06-14 18:14:35 -07002914 MaxVersion: VersionTLS12,
Adam Langley80842bd2014-06-20 12:00:00 -07002915 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA},
2916 Bugs: ProtocolBugs{
2917 PaddingFirstByteBad: true,
2918 },
2919 },
2920 shouldFail: true,
David Benjamin11d50f92016-03-10 15:55:45 -05002921 expectedError: ":DECRYPTION_FAILED_OR_BAD_RECORD_MAC:",
Adam Langley80842bd2014-06-20 12:00:00 -07002922 })
2923 // OpenSSL previously had an issue where the first byte of padding in
2924 // 255 bytes of padding wasn't checked.
David Benjamin025b3d32014-07-01 19:53:04 -04002925 testCases = append(testCases, testCase{
Adam Langley80842bd2014-06-20 12:00:00 -07002926 name: "BadCBCPadding255",
2927 config: Config{
Nick Harper1fd39d82016-06-14 18:14:35 -07002928 MaxVersion: VersionTLS12,
Adam Langley80842bd2014-06-20 12:00:00 -07002929 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA},
2930 Bugs: ProtocolBugs{
2931 MaxPadding: true,
2932 PaddingFirstByteBadIf255: true,
2933 },
2934 },
2935 messageLen: 12, // 20 bytes of SHA-1 + 12 == 0 % block size
2936 shouldFail: true,
David Benjamin11d50f92016-03-10 15:55:45 -05002937 expectedError: ":DECRYPTION_FAILED_OR_BAD_RECORD_MAC:",
Adam Langley80842bd2014-06-20 12:00:00 -07002938 })
2939}
2940
Kenny Root7fdeaf12014-08-05 15:23:37 -07002941func addCBCSplittingTests() {
2942 testCases = append(testCases, testCase{
2943 name: "CBCRecordSplitting",
2944 config: Config{
2945 MaxVersion: VersionTLS10,
2946 MinVersion: VersionTLS10,
2947 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA},
2948 },
David Benjaminac8302a2015-09-01 17:18:15 -04002949 messageLen: -1, // read until EOF
2950 resumeSession: true,
Kenny Root7fdeaf12014-08-05 15:23:37 -07002951 flags: []string{
2952 "-async",
2953 "-write-different-record-sizes",
2954 "-cbc-record-splitting",
2955 },
David Benjamina8e3e0e2014-08-06 22:11:10 -04002956 })
2957 testCases = append(testCases, testCase{
Kenny Root7fdeaf12014-08-05 15:23:37 -07002958 name: "CBCRecordSplittingPartialWrite",
2959 config: Config{
2960 MaxVersion: VersionTLS10,
2961 MinVersion: VersionTLS10,
2962 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA},
2963 },
2964 messageLen: -1, // read until EOF
2965 flags: []string{
2966 "-async",
2967 "-write-different-record-sizes",
2968 "-cbc-record-splitting",
2969 "-partial-write",
2970 },
2971 })
2972}
2973
David Benjamin636293b2014-07-08 17:59:18 -04002974func addClientAuthTests() {
David Benjamin407a10c2014-07-16 12:58:59 -04002975 // Add a dummy cert pool to stress certificate authority parsing.
David Benjamin407a10c2014-07-16 12:58:59 -04002976 certPool := x509.NewCertPool()
Adam Langley2ff79332017-02-28 13:45:39 -08002977 for _, cert := range []Certificate{rsaCertificate, rsa1024Certificate} {
2978 cert, err := x509.ParseCertificate(cert.Certificate[0])
2979 if err != nil {
2980 panic(err)
2981 }
2982 certPool.AddCert(cert)
David Benjamin407a10c2014-07-16 12:58:59 -04002983 }
Adam Langley2ff79332017-02-28 13:45:39 -08002984 caNames := certPool.Subjects()
David Benjamin407a10c2014-07-16 12:58:59 -04002985
David Benjamin636293b2014-07-08 17:59:18 -04002986 for _, ver := range tlsVersions {
David Benjamin636293b2014-07-08 17:59:18 -04002987 testCases = append(testCases, testCase{
2988 testType: clientTest,
David Benjamin67666e72014-07-12 15:47:52 -04002989 name: ver.name + "-Client-ClientAuth-RSA",
David Benjamin636293b2014-07-08 17:59:18 -04002990 config: Config{
David Benjamine098ec22014-08-27 23:13:20 -04002991 MinVersion: ver.version,
2992 MaxVersion: ver.version,
2993 ClientAuth: RequireAnyClientCert,
2994 ClientCAs: certPool,
David Benjamin636293b2014-07-08 17:59:18 -04002995 },
2996 flags: []string{
Adam Langley7c803a62015-06-15 15:35:05 -07002997 "-cert-file", path.Join(*resourceDir, rsaCertificateFile),
2998 "-key-file", path.Join(*resourceDir, rsaKeyFile),
David Benjamin636293b2014-07-08 17:59:18 -04002999 },
3000 })
3001 testCases = append(testCases, testCase{
David Benjamin67666e72014-07-12 15:47:52 -04003002 testType: serverTest,
3003 name: ver.name + "-Server-ClientAuth-RSA",
3004 config: Config{
David Benjamine098ec22014-08-27 23:13:20 -04003005 MinVersion: ver.version,
3006 MaxVersion: ver.version,
David Benjamin67666e72014-07-12 15:47:52 -04003007 Certificates: []Certificate{rsaCertificate},
3008 },
3009 flags: []string{"-require-any-client-certificate"},
3010 })
David Benjamine098ec22014-08-27 23:13:20 -04003011 if ver.version != VersionSSL30 {
3012 testCases = append(testCases, testCase{
3013 testType: serverTest,
3014 name: ver.name + "-Server-ClientAuth-ECDSA",
3015 config: Config{
3016 MinVersion: ver.version,
3017 MaxVersion: ver.version,
David Benjamin33863262016-07-08 17:20:12 -07003018 Certificates: []Certificate{ecdsaP256Certificate},
David Benjamine098ec22014-08-27 23:13:20 -04003019 },
3020 flags: []string{"-require-any-client-certificate"},
3021 })
3022 testCases = append(testCases, testCase{
3023 testType: clientTest,
3024 name: ver.name + "-Client-ClientAuth-ECDSA",
3025 config: Config{
3026 MinVersion: ver.version,
3027 MaxVersion: ver.version,
3028 ClientAuth: RequireAnyClientCert,
3029 ClientCAs: certPool,
3030 },
3031 flags: []string{
David Benjamin33863262016-07-08 17:20:12 -07003032 "-cert-file", path.Join(*resourceDir, ecdsaP256CertificateFile),
3033 "-key-file", path.Join(*resourceDir, ecdsaP256KeyFile),
David Benjamine098ec22014-08-27 23:13:20 -04003034 },
3035 })
3036 }
Adam Langley37646832016-08-01 16:16:46 -07003037
3038 testCases = append(testCases, testCase{
3039 name: "NoClientCertificate-" + ver.name,
3040 config: Config{
3041 MinVersion: ver.version,
3042 MaxVersion: ver.version,
3043 ClientAuth: RequireAnyClientCert,
3044 },
3045 shouldFail: true,
3046 expectedLocalError: "client didn't provide a certificate",
3047 })
3048
3049 testCases = append(testCases, testCase{
3050 // Even if not configured to expect a certificate, OpenSSL will
3051 // return X509_V_OK as the verify_result.
3052 testType: serverTest,
3053 name: "NoClientCertificateRequested-Server-" + ver.name,
3054 config: Config{
3055 MinVersion: ver.version,
3056 MaxVersion: ver.version,
3057 },
3058 flags: []string{
3059 "-expect-verify-result",
3060 },
David Benjamin5d9ba812016-10-07 20:51:20 -04003061 resumeSession: true,
Adam Langley37646832016-08-01 16:16:46 -07003062 })
3063
3064 testCases = append(testCases, testCase{
3065 // If a client certificate is not provided, OpenSSL will still
3066 // return X509_V_OK as the verify_result.
3067 testType: serverTest,
3068 name: "NoClientCertificate-Server-" + ver.name,
3069 config: Config{
3070 MinVersion: ver.version,
3071 MaxVersion: ver.version,
3072 },
3073 flags: []string{
3074 "-expect-verify-result",
3075 "-verify-peer",
3076 },
David Benjamin5d9ba812016-10-07 20:51:20 -04003077 resumeSession: true,
Adam Langley37646832016-08-01 16:16:46 -07003078 })
3079
David Benjamin1db9e1b2016-10-07 20:51:43 -04003080 certificateRequired := "remote error: certificate required"
3081 if ver.version < VersionTLS13 {
3082 // Prior to TLS 1.3, the generic handshake_failure alert
3083 // was used.
3084 certificateRequired = "remote error: handshake failure"
3085 }
Adam Langley37646832016-08-01 16:16:46 -07003086 testCases = append(testCases, testCase{
3087 testType: serverTest,
3088 name: "RequireAnyClientCertificate-" + ver.name,
3089 config: Config{
3090 MinVersion: ver.version,
3091 MaxVersion: ver.version,
3092 },
David Benjamin1db9e1b2016-10-07 20:51:43 -04003093 flags: []string{"-require-any-client-certificate"},
3094 shouldFail: true,
3095 expectedError: ":PEER_DID_NOT_RETURN_A_CERTIFICATE:",
3096 expectedLocalError: certificateRequired,
Adam Langley37646832016-08-01 16:16:46 -07003097 })
3098
3099 if ver.version != VersionSSL30 {
3100 testCases = append(testCases, testCase{
3101 testType: serverTest,
3102 name: "SkipClientCertificate-" + ver.name,
3103 config: Config{
3104 MinVersion: ver.version,
3105 MaxVersion: ver.version,
3106 Bugs: ProtocolBugs{
3107 SkipClientCertificate: true,
3108 },
3109 },
3110 // Setting SSL_VERIFY_PEER allows anonymous clients.
3111 flags: []string{"-verify-peer"},
3112 shouldFail: true,
3113 expectedError: ":UNEXPECTED_MESSAGE:",
3114 })
3115 }
Adam Langley2ff79332017-02-28 13:45:39 -08003116
3117 testCases = append(testCases, testCase{
3118 testType: serverTest,
3119 name: ver.name + "-Server-CertReq-CA-List",
3120 config: Config{
3121 MinVersion: ver.version,
3122 MaxVersion: ver.version,
3123 Certificates: []Certificate{rsaCertificate},
3124 Bugs: ProtocolBugs{
3125 ExpectCertificateReqNames: caNames,
3126 },
3127 },
3128 flags: []string{
3129 "-require-any-client-certificate",
3130 "-use-client-ca-list", encodeDERValues(caNames),
3131 },
3132 })
3133
3134 testCases = append(testCases, testCase{
3135 testType: clientTest,
3136 name: ver.name + "-Client-CertReq-CA-List",
3137 config: Config{
3138 MinVersion: ver.version,
3139 MaxVersion: ver.version,
3140 Certificates: []Certificate{rsaCertificate},
3141 ClientAuth: RequireAnyClientCert,
3142 ClientCAs: certPool,
3143 },
3144 flags: []string{
3145 "-cert-file", path.Join(*resourceDir, rsaCertificateFile),
3146 "-key-file", path.Join(*resourceDir, rsaKeyFile),
3147 "-expect-client-ca-list", encodeDERValues(caNames),
3148 },
3149 })
David Benjamin636293b2014-07-08 17:59:18 -04003150 }
David Benjamin0b7ca7d2016-03-10 15:44:22 -05003151
David Benjaminc032dfa2016-05-12 14:54:57 -04003152 // Client auth is only legal in certificate-based ciphers.
3153 testCases = append(testCases, testCase{
3154 testType: clientTest,
3155 name: "ClientAuth-PSK",
3156 config: Config{
Nick Harper1fd39d82016-06-14 18:14:35 -07003157 MaxVersion: VersionTLS12,
David Benjaminc032dfa2016-05-12 14:54:57 -04003158 CipherSuites: []uint16{TLS_PSK_WITH_AES_128_CBC_SHA},
3159 PreSharedKey: []byte("secret"),
3160 ClientAuth: RequireAnyClientCert,
3161 },
3162 flags: []string{
3163 "-cert-file", path.Join(*resourceDir, rsaCertificateFile),
3164 "-key-file", path.Join(*resourceDir, rsaKeyFile),
3165 "-psk", "secret",
3166 },
3167 shouldFail: true,
3168 expectedError: ":UNEXPECTED_MESSAGE:",
3169 })
3170 testCases = append(testCases, testCase{
3171 testType: clientTest,
3172 name: "ClientAuth-ECDHE_PSK",
3173 config: Config{
Nick Harper1fd39d82016-06-14 18:14:35 -07003174 MaxVersion: VersionTLS12,
David Benjaminc032dfa2016-05-12 14:54:57 -04003175 CipherSuites: []uint16{TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA},
3176 PreSharedKey: []byte("secret"),
3177 ClientAuth: RequireAnyClientCert,
3178 },
3179 flags: []string{
3180 "-cert-file", path.Join(*resourceDir, rsaCertificateFile),
3181 "-key-file", path.Join(*resourceDir, rsaKeyFile),
3182 "-psk", "secret",
3183 },
3184 shouldFail: true,
3185 expectedError: ":UNEXPECTED_MESSAGE:",
3186 })
David Benjamin2f8935d2016-07-13 19:47:39 -04003187
3188 // Regression test for a bug where the client CA list, if explicitly
3189 // set to NULL, was mis-encoded.
3190 testCases = append(testCases, testCase{
3191 testType: serverTest,
3192 name: "Null-Client-CA-List",
3193 config: Config{
3194 MaxVersion: VersionTLS12,
3195 Certificates: []Certificate{rsaCertificate},
Adam Langley2ff79332017-02-28 13:45:39 -08003196 Bugs: ProtocolBugs{
3197 ExpectCertificateReqNames: [][]byte{},
3198 },
David Benjamin2f8935d2016-07-13 19:47:39 -04003199 },
3200 flags: []string{
3201 "-require-any-client-certificate",
Adam Langley2ff79332017-02-28 13:45:39 -08003202 "-use-client-ca-list", "<NULL>",
David Benjamin2f8935d2016-07-13 19:47:39 -04003203 },
3204 })
David Benjamin636293b2014-07-08 17:59:18 -04003205}
3206
Adam Langley75712922014-10-10 16:23:43 -07003207func addExtendedMasterSecretTests() {
3208 const expectEMSFlag = "-expect-extended-master-secret"
3209
3210 for _, with := range []bool{false, true} {
3211 prefix := "No"
Adam Langley75712922014-10-10 16:23:43 -07003212 if with {
3213 prefix = ""
Adam Langley75712922014-10-10 16:23:43 -07003214 }
3215
3216 for _, isClient := range []bool{false, true} {
3217 suffix := "-Server"
3218 testType := serverTest
3219 if isClient {
3220 suffix = "-Client"
3221 testType = clientTest
3222 }
3223
3224 for _, ver := range tlsVersions {
Steven Valdez143e8b32016-07-11 13:19:03 -04003225 // In TLS 1.3, the extension is irrelevant and
3226 // always reports as enabled.
3227 var flags []string
3228 if with || ver.version >= VersionTLS13 {
3229 flags = []string{expectEMSFlag}
3230 }
3231
Adam Langley75712922014-10-10 16:23:43 -07003232 test := testCase{
3233 testType: testType,
3234 name: prefix + "ExtendedMasterSecret-" + ver.name + suffix,
3235 config: Config{
3236 MinVersion: ver.version,
3237 MaxVersion: ver.version,
3238 Bugs: ProtocolBugs{
3239 NoExtendedMasterSecret: !with,
3240 RequireExtendedMasterSecret: with,
3241 },
3242 },
David Benjamin48cae082014-10-27 01:06:24 -04003243 flags: flags,
3244 shouldFail: ver.version == VersionSSL30 && with,
Adam Langley75712922014-10-10 16:23:43 -07003245 }
3246 if test.shouldFail {
3247 test.expectedLocalError = "extended master secret required but not supported by peer"
3248 }
3249 testCases = append(testCases, test)
3250 }
3251 }
3252 }
3253
Adam Langleyba5934b2015-06-02 10:50:35 -07003254 for _, isClient := range []bool{false, true} {
3255 for _, supportedInFirstConnection := range []bool{false, true} {
3256 for _, supportedInResumeConnection := range []bool{false, true} {
3257 boolToWord := func(b bool) string {
3258 if b {
3259 return "Yes"
3260 }
3261 return "No"
3262 }
3263 suffix := boolToWord(supportedInFirstConnection) + "To" + boolToWord(supportedInResumeConnection) + "-"
3264 if isClient {
3265 suffix += "Client"
3266 } else {
3267 suffix += "Server"
3268 }
3269
3270 supportedConfig := Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04003271 MaxVersion: VersionTLS12,
Adam Langleyba5934b2015-06-02 10:50:35 -07003272 Bugs: ProtocolBugs{
3273 RequireExtendedMasterSecret: true,
3274 },
3275 }
3276
3277 noSupportConfig := Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04003278 MaxVersion: VersionTLS12,
Adam Langleyba5934b2015-06-02 10:50:35 -07003279 Bugs: ProtocolBugs{
3280 NoExtendedMasterSecret: true,
3281 },
3282 }
3283
3284 test := testCase{
3285 name: "ExtendedMasterSecret-" + suffix,
3286 resumeSession: true,
3287 }
3288
3289 if !isClient {
3290 test.testType = serverTest
3291 }
3292
3293 if supportedInFirstConnection {
3294 test.config = supportedConfig
3295 } else {
3296 test.config = noSupportConfig
3297 }
3298
3299 if supportedInResumeConnection {
3300 test.resumeConfig = &supportedConfig
3301 } else {
3302 test.resumeConfig = &noSupportConfig
3303 }
3304
3305 switch suffix {
3306 case "YesToYes-Client", "YesToYes-Server":
3307 // When a session is resumed, it should
3308 // still be aware that its master
3309 // secret was generated via EMS and
3310 // thus it's safe to use tls-unique.
3311 test.flags = []string{expectEMSFlag}
3312 case "NoToYes-Server":
3313 // If an original connection did not
3314 // contain EMS, but a resumption
3315 // handshake does, then a server should
3316 // not resume the session.
3317 test.expectResumeRejected = true
3318 case "YesToNo-Server":
3319 // Resuming an EMS session without the
3320 // EMS extension should cause the
3321 // server to abort the connection.
3322 test.shouldFail = true
3323 test.expectedError = ":RESUMED_EMS_SESSION_WITHOUT_EMS_EXTENSION:"
3324 case "NoToYes-Client":
3325 // A client should abort a connection
3326 // where the server resumed a non-EMS
3327 // session but echoed the EMS
3328 // extension.
3329 test.shouldFail = true
3330 test.expectedError = ":RESUMED_NON_EMS_SESSION_WITH_EMS_EXTENSION:"
3331 case "YesToNo-Client":
3332 // A client should abort a connection
3333 // where the server didn't echo EMS
3334 // when the session used it.
3335 test.shouldFail = true
3336 test.expectedError = ":RESUMED_EMS_SESSION_WITHOUT_EMS_EXTENSION:"
3337 }
3338
3339 testCases = append(testCases, test)
3340 }
3341 }
3342 }
David Benjamin163c9562016-08-29 23:14:17 -04003343
3344 // Switching EMS on renegotiation is forbidden.
3345 testCases = append(testCases, testCase{
3346 name: "ExtendedMasterSecret-Renego-NoEMS",
3347 config: Config{
3348 MaxVersion: VersionTLS12,
3349 Bugs: ProtocolBugs{
3350 NoExtendedMasterSecret: true,
3351 NoExtendedMasterSecretOnRenegotiation: true,
3352 },
3353 },
3354 renegotiate: 1,
3355 flags: []string{
3356 "-renegotiate-freely",
3357 "-expect-total-renegotiations", "1",
3358 },
3359 })
3360
3361 testCases = append(testCases, testCase{
3362 name: "ExtendedMasterSecret-Renego-Upgrade",
3363 config: Config{
3364 MaxVersion: VersionTLS12,
3365 Bugs: ProtocolBugs{
3366 NoExtendedMasterSecret: true,
3367 },
3368 },
3369 renegotiate: 1,
3370 flags: []string{
3371 "-renegotiate-freely",
3372 "-expect-total-renegotiations", "1",
3373 },
3374 shouldFail: true,
3375 expectedError: ":RENEGOTIATION_EMS_MISMATCH:",
3376 })
3377
3378 testCases = append(testCases, testCase{
3379 name: "ExtendedMasterSecret-Renego-Downgrade",
3380 config: Config{
3381 MaxVersion: VersionTLS12,
3382 Bugs: ProtocolBugs{
3383 NoExtendedMasterSecretOnRenegotiation: true,
3384 },
3385 },
3386 renegotiate: 1,
3387 flags: []string{
3388 "-renegotiate-freely",
3389 "-expect-total-renegotiations", "1",
3390 },
3391 shouldFail: true,
3392 expectedError: ":RENEGOTIATION_EMS_MISMATCH:",
3393 })
Adam Langley75712922014-10-10 16:23:43 -07003394}
3395
David Benjamin582ba042016-07-07 12:33:25 -07003396type stateMachineTestConfig struct {
3397 protocol protocol
3398 async bool
3399 splitHandshake, packHandshakeFlight bool
3400}
3401
David Benjamin43ec06f2014-08-05 02:28:57 -04003402// Adds tests that try to cover the range of the handshake state machine, under
3403// various conditions. Some of these are redundant with other tests, but they
3404// only cover the synchronous case.
David Benjamin582ba042016-07-07 12:33:25 -07003405func addAllStateMachineCoverageTests() {
3406 for _, async := range []bool{false, true} {
3407 for _, protocol := range []protocol{tls, dtls} {
3408 addStateMachineCoverageTests(stateMachineTestConfig{
3409 protocol: protocol,
3410 async: async,
3411 })
3412 addStateMachineCoverageTests(stateMachineTestConfig{
3413 protocol: protocol,
3414 async: async,
3415 splitHandshake: true,
3416 })
3417 if protocol == tls {
3418 addStateMachineCoverageTests(stateMachineTestConfig{
3419 protocol: protocol,
3420 async: async,
3421 packHandshakeFlight: true,
3422 })
3423 }
3424 }
3425 }
3426}
3427
3428func addStateMachineCoverageTests(config stateMachineTestConfig) {
David Benjamin760b1dd2015-05-15 23:33:48 -04003429 var tests []testCase
3430
3431 // Basic handshake, with resumption. Client and server,
3432 // session ID and session ticket.
3433 tests = append(tests, testCase{
David Benjamin4c3ddf72016-06-29 18:13:53 -04003434 name: "Basic-Client",
3435 config: Config{
3436 MaxVersion: VersionTLS12,
3437 },
David Benjamin760b1dd2015-05-15 23:33:48 -04003438 resumeSession: true,
David Benjaminef1b0092015-11-21 14:05:44 -05003439 // Ensure session tickets are used, not session IDs.
3440 noSessionCache: true,
David Benjamin760b1dd2015-05-15 23:33:48 -04003441 })
3442 tests = append(tests, testCase{
3443 name: "Basic-Client-RenewTicket",
3444 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04003445 MaxVersion: VersionTLS12,
David Benjamin760b1dd2015-05-15 23:33:48 -04003446 Bugs: ProtocolBugs{
3447 RenewTicketOnResume: true,
3448 },
3449 },
David Benjamin46662482016-08-17 00:51:00 -04003450 flags: []string{"-expect-ticket-renewal"},
3451 resumeSession: true,
3452 resumeRenewedSession: true,
David Benjamin760b1dd2015-05-15 23:33:48 -04003453 })
3454 tests = append(tests, testCase{
3455 name: "Basic-Client-NoTicket",
3456 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04003457 MaxVersion: VersionTLS12,
David Benjamin760b1dd2015-05-15 23:33:48 -04003458 SessionTicketsDisabled: true,
3459 },
3460 resumeSession: true,
3461 })
3462 tests = append(tests, testCase{
David Benjamin4c3ddf72016-06-29 18:13:53 -04003463 name: "Basic-Client-Implicit",
3464 config: Config{
3465 MaxVersion: VersionTLS12,
3466 },
David Benjamin760b1dd2015-05-15 23:33:48 -04003467 flags: []string{"-implicit-handshake"},
3468 resumeSession: true,
3469 })
3470 tests = append(tests, testCase{
David Benjaminef1b0092015-11-21 14:05:44 -05003471 testType: serverTest,
3472 name: "Basic-Server",
3473 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04003474 MaxVersion: VersionTLS12,
David Benjaminef1b0092015-11-21 14:05:44 -05003475 Bugs: ProtocolBugs{
3476 RequireSessionTickets: true,
3477 },
3478 },
David Benjamin760b1dd2015-05-15 23:33:48 -04003479 resumeSession: true,
David Benjaminb5c58db2017-01-28 01:39:29 -05003480 flags: []string{"-expect-no-session-id"},
David Benjamin760b1dd2015-05-15 23:33:48 -04003481 })
3482 tests = append(tests, testCase{
3483 testType: serverTest,
3484 name: "Basic-Server-NoTickets",
3485 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04003486 MaxVersion: VersionTLS12,
David Benjamin760b1dd2015-05-15 23:33:48 -04003487 SessionTicketsDisabled: true,
3488 },
3489 resumeSession: true,
David Benjaminb5c58db2017-01-28 01:39:29 -05003490 flags: []string{"-expect-session-id"},
David Benjamin760b1dd2015-05-15 23:33:48 -04003491 })
3492 tests = append(tests, testCase{
David Benjamin4c3ddf72016-06-29 18:13:53 -04003493 testType: serverTest,
3494 name: "Basic-Server-Implicit",
3495 config: Config{
3496 MaxVersion: VersionTLS12,
3497 },
David Benjamin760b1dd2015-05-15 23:33:48 -04003498 flags: []string{"-implicit-handshake"},
3499 resumeSession: true,
3500 })
3501 tests = append(tests, testCase{
David Benjamin4c3ddf72016-06-29 18:13:53 -04003502 testType: serverTest,
3503 name: "Basic-Server-EarlyCallback",
3504 config: Config{
3505 MaxVersion: VersionTLS12,
3506 },
David Benjamin760b1dd2015-05-15 23:33:48 -04003507 flags: []string{"-use-early-callback"},
3508 resumeSession: true,
3509 })
3510
Steven Valdez143e8b32016-07-11 13:19:03 -04003511 // TLS 1.3 basic handshake shapes.
David Benjamine73c7f42016-08-17 00:29:33 -04003512 if config.protocol == tls {
3513 tests = append(tests, testCase{
3514 name: "TLS13-1RTT-Client",
3515 config: Config{
3516 MaxVersion: VersionTLS13,
3517 MinVersion: VersionTLS13,
3518 },
David Benjamin46662482016-08-17 00:51:00 -04003519 resumeSession: true,
3520 resumeRenewedSession: true,
David Benjamine73c7f42016-08-17 00:29:33 -04003521 })
3522
3523 tests = append(tests, testCase{
3524 testType: serverTest,
3525 name: "TLS13-1RTT-Server",
3526 config: Config{
3527 MaxVersion: VersionTLS13,
3528 MinVersion: VersionTLS13,
3529 },
David Benjamin46662482016-08-17 00:51:00 -04003530 resumeSession: true,
3531 resumeRenewedSession: true,
David Benjaminb5c58db2017-01-28 01:39:29 -05003532 // TLS 1.3 uses tickets, so the session should not be
3533 // cached statefully.
3534 flags: []string{"-expect-no-session-id"},
David Benjamine73c7f42016-08-17 00:29:33 -04003535 })
3536
3537 tests = append(tests, testCase{
3538 name: "TLS13-HelloRetryRequest-Client",
3539 config: Config{
3540 MaxVersion: VersionTLS13,
3541 MinVersion: VersionTLS13,
David Benjamin3baa6e12016-10-07 21:10:38 -04003542 // P-384 requires a HelloRetryRequest against BoringSSL's default
3543 // configuration. Assert this with ExpectMissingKeyShare.
David Benjamine73c7f42016-08-17 00:29:33 -04003544 CurvePreferences: []CurveID{CurveP384},
3545 Bugs: ProtocolBugs{
3546 ExpectMissingKeyShare: true,
3547 },
3548 },
3549 // Cover HelloRetryRequest during an ECDHE-PSK resumption.
3550 resumeSession: true,
3551 })
3552
3553 tests = append(tests, testCase{
3554 testType: serverTest,
3555 name: "TLS13-HelloRetryRequest-Server",
3556 config: Config{
3557 MaxVersion: VersionTLS13,
3558 MinVersion: VersionTLS13,
3559 // Require a HelloRetryRequest for every curve.
3560 DefaultCurves: []CurveID{},
3561 },
3562 // Cover HelloRetryRequest during an ECDHE-PSK resumption.
3563 resumeSession: true,
3564 })
Steven Valdez2d850622017-01-11 11:34:52 -05003565
3566 // TODO(svaldez): Send data on early data once implemented.
3567 tests = append(tests, testCase{
3568 testType: clientTest,
3569 name: "TLS13-EarlyData-Client",
3570 config: Config{
3571 MaxVersion: VersionTLS13,
3572 MinVersion: VersionTLS13,
3573 MaxEarlyDataSize: 16384,
3574 },
3575 resumeSession: true,
3576 flags: []string{
3577 "-enable-early-data",
3578 "-expect-early-data-info",
3579 "-expect-accept-early-data",
3580 },
3581 })
3582
3583 tests = append(tests, testCase{
3584 testType: serverTest,
3585 name: "TLS13-EarlyData-Server",
3586 config: Config{
3587 MaxVersion: VersionTLS13,
3588 MinVersion: VersionTLS13,
3589 Bugs: ProtocolBugs{
3590 SendEarlyData: [][]byte{},
3591 ExpectEarlyDataAccepted: true,
3592 },
3593 },
3594 resumeSession: true,
3595 flags: []string{
3596 "-enable-early-data",
3597 },
3598 })
David Benjamine73c7f42016-08-17 00:29:33 -04003599 }
Steven Valdez143e8b32016-07-11 13:19:03 -04003600
David Benjamin760b1dd2015-05-15 23:33:48 -04003601 // TLS client auth.
3602 tests = append(tests, testCase{
3603 testType: clientTest,
David Benjamin0b7ca7d2016-03-10 15:44:22 -05003604 name: "ClientAuth-NoCertificate-Client",
David Benjaminacb6dcc2016-03-10 09:15:01 -05003605 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04003606 MaxVersion: VersionTLS12,
David Benjaminacb6dcc2016-03-10 09:15:01 -05003607 ClientAuth: RequestClientCert,
3608 },
3609 })
3610 tests = append(tests, testCase{
David Benjamin0b7ca7d2016-03-10 15:44:22 -05003611 testType: serverTest,
3612 name: "ClientAuth-NoCertificate-Server",
David Benjamin4c3ddf72016-06-29 18:13:53 -04003613 config: Config{
3614 MaxVersion: VersionTLS12,
3615 },
David Benjamin0b7ca7d2016-03-10 15:44:22 -05003616 // Setting SSL_VERIFY_PEER allows anonymous clients.
3617 flags: []string{"-verify-peer"},
3618 })
David Benjamin582ba042016-07-07 12:33:25 -07003619 if config.protocol == tls {
David Benjamin0b7ca7d2016-03-10 15:44:22 -05003620 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 })
Steven Valdez143e8b32016-07-11 13:19:03 -04003637 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 })
David Benjamin0b7ca7d2016-03-10 15:44:22 -05003654 }
3655 tests = append(tests, testCase{
David Benjaminacb6dcc2016-03-10 09:15:01 -05003656 testType: clientTest,
nagendra modadugu3398dbf2015-08-07 14:07:52 -07003657 name: "ClientAuth-RSA-Client",
David Benjamin760b1dd2015-05-15 23:33:48 -04003658 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04003659 MaxVersion: VersionTLS12,
David Benjamin760b1dd2015-05-15 23:33:48 -04003660 ClientAuth: RequireAnyClientCert,
3661 },
3662 flags: []string{
Adam Langley7c803a62015-06-15 15:35:05 -07003663 "-cert-file", path.Join(*resourceDir, rsaCertificateFile),
3664 "-key-file", path.Join(*resourceDir, rsaKeyFile),
David Benjamin760b1dd2015-05-15 23:33:48 -04003665 },
3666 })
nagendra modadugu3398dbf2015-08-07 14:07:52 -07003667 tests = append(tests, testCase{
3668 testType: clientTest,
Steven Valdez143e8b32016-07-11 13:19:03 -04003669 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,
nagendra modadugu3398dbf2015-08-07 14:07:52 -07003681 name: "ClientAuth-ECDSA-Client",
3682 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04003683 MaxVersion: VersionTLS12,
nagendra modadugu3398dbf2015-08-07 14:07:52 -07003684 ClientAuth: RequireAnyClientCert,
3685 },
3686 flags: []string{
David Benjamin33863262016-07-08 17:20:12 -07003687 "-cert-file", path.Join(*resourceDir, ecdsaP256CertificateFile),
3688 "-key-file", path.Join(*resourceDir, ecdsaP256KeyFile),
nagendra modadugu3398dbf2015-08-07 14:07:52 -07003689 },
3690 })
David Benjaminacb6dcc2016-03-10 09:15:01 -05003691 tests = append(tests, testCase{
3692 testType: clientTest,
Steven Valdez143e8b32016-07-11 13:19:03 -04003693 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,
David Benjamin4c3ddf72016-06-29 18:13:53 -04003705 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,
Steven Valdez143e8b32016-07-11 13:19:03 -04003714 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,
David Benjaminacb6dcc2016-03-10 09:15:01 -05003723 name: "ClientAuth-OldCallback",
3724 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04003725 MaxVersion: VersionTLS12,
David Benjaminacb6dcc2016-03-10 09:15:01 -05003726 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 })
David Benjamin760b1dd2015-05-15 23:33:48 -04003734 tests = append(tests, testCase{
Steven Valdez143e8b32016-07-11 13:19:03 -04003735 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{
David Benjamin760b1dd2015-05-15 23:33:48 -04003748 testType: serverTest,
3749 name: "ClientAuth-Server",
3750 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04003751 MaxVersion: VersionTLS12,
David Benjamin760b1dd2015-05-15 23:33:48 -04003752 Certificates: []Certificate{rsaCertificate},
3753 },
3754 flags: []string{"-require-any-client-certificate"},
3755 })
Steven Valdez143e8b32016-07-11 13:19:03 -04003756 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 })
David Benjamin760b1dd2015-05-15 23:33:48 -04003765
David Benjamin4c3ddf72016-06-29 18:13:53 -04003766 // Test each key exchange on the server side for async keys.
David Benjamin4c3ddf72016-06-29 18:13:53 -04003767 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{
David Benjamin33863262016-07-08 17:20:12 -07003799 "-cert-file", path.Join(*resourceDir, ecdsaP256CertificateFile),
3800 "-key-file", path.Join(*resourceDir, ecdsaP256KeyFile),
David Benjamin4c3ddf72016-06-29 18:13:53 -04003801 },
3802 })
3803
David Benjamin760b1dd2015-05-15 23:33:48 -04003804 // No session ticket support; server doesn't send NewSessionTicket.
3805 tests = append(tests, testCase{
3806 name: "SessionTicketsDisabled-Client",
3807 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04003808 MaxVersion: VersionTLS12,
David Benjamin760b1dd2015-05-15 23:33:48 -04003809 SessionTicketsDisabled: true,
3810 },
3811 })
3812 tests = append(tests, testCase{
3813 testType: serverTest,
3814 name: "SessionTicketsDisabled-Server",
3815 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04003816 MaxVersion: VersionTLS12,
David Benjamin760b1dd2015-05-15 23:33:48 -04003817 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{
Nick Harper1fd39d82016-06-14 18:14:35 -07003826 MaxVersion: VersionTLS12,
David Benjamin760b1dd2015-05-15 23:33:48 -04003827 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{
Nick Harper1fd39d82016-06-14 18:14:35 -07003836 MaxVersion: VersionTLS12,
David Benjamin760b1dd2015-05-15 23:33:48 -04003837 CipherSuites: []uint16{TLS_PSK_WITH_AES_128_CBC_SHA},
3838 PreSharedKey: []byte("secret"),
3839 },
3840 flags: []string{"-psk", "secret"},
3841 })
3842
David Benjamin4c3ddf72016-06-29 18:13:53 -04003843 // OCSP stapling tests.
Paul Lietaraeeff2c2015-08-12 11:47:11 +01003844 tests = append(tests, testCase{
3845 testType: clientTest,
3846 name: "OCSPStapling-Client",
David Benjamin4c3ddf72016-06-29 18:13:53 -04003847 config: Config{
3848 MaxVersion: VersionTLS12,
3849 },
Paul Lietaraeeff2c2015-08-12 11:47:11 +01003850 flags: []string{
3851 "-enable-ocsp-stapling",
3852 "-expect-ocsp-response",
3853 base64.StdEncoding.EncodeToString(testOCSPResponse),
Paul Lietar8f1c2682015-08-18 12:21:54 +01003854 "-verify-peer",
Paul Lietaraeeff2c2015-08-12 11:47:11 +01003855 },
Paul Lietar62be8ac2015-09-16 10:03:30 +01003856 resumeSession: true,
Paul Lietaraeeff2c2015-08-12 11:47:11 +01003857 })
Paul Lietaraeeff2c2015-08-12 11:47:11 +01003858 tests = append(tests, testCase{
David Benjamin4c3ddf72016-06-29 18:13:53 -04003859 testType: serverTest,
3860 name: "OCSPStapling-Server",
3861 config: Config{
3862 MaxVersion: VersionTLS12,
3863 },
Paul Lietaraeeff2c2015-08-12 11:47:11 +01003864 expectedOCSPResponse: testOCSPResponse,
3865 flags: []string{
3866 "-ocsp-response",
3867 base64.StdEncoding.EncodeToString(testOCSPResponse),
3868 },
Paul Lietar62be8ac2015-09-16 10:03:30 +01003869 resumeSession: true,
Paul Lietaraeeff2c2015-08-12 11:47:11 +01003870 })
David Benjamin942f4ed2016-07-16 19:03:49 +03003871 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 },
Steven Valdez4aa154e2016-07-29 14:32:55 -04003883 resumeSession: true,
David Benjamin942f4ed2016-07-16 19:03:49 +03003884 })
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 },
Steven Valdez4aa154e2016-07-29 14:32:55 -04003896 resumeSession: true,
David Benjamin942f4ed2016-07-16 19:03:49 +03003897 })
Paul Lietaraeeff2c2015-08-12 11:47:11 +01003898
David Benjamin4c3ddf72016-06-29 18:13:53 -04003899 // Certificate verification tests.
Steven Valdez143e8b32016-07-11 13:19:03 -04003900 for _, vers := range tlsVersions {
3901 if config.protocol == dtls && !vers.hasDTLS {
3902 continue
3903 }
David Benjaminbb9e36e2016-08-03 14:14:47 -04003904 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 },
Steven Valdez4aa154e2016-07-29 14:32:55 -04003927 resumeSession: true,
David Benjaminbb9e36e2016-08-03 14:14:47 -04003928 })
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.
Steven Valdez143e8b32016-07-11 13:19:03 -04003947 tests = append(tests, testCase{
3948 testType: clientTest,
3949 name: "CertificateVerificationSoftFail-" + vers.name,
3950 config: Config{
David Benjaminbb9e36e2016-08-03 14:14:47 -04003951 MaxVersion: vers.version,
3952 Certificates: []Certificate{rsaCertificate},
Steven Valdez143e8b32016-07-11 13:19:03 -04003953 },
3954 flags: []string{
3955 "-verify-fail",
3956 "-expect-verify-result",
3957 },
Steven Valdez4aa154e2016-07-29 14:32:55 -04003958 resumeSession: true,
Steven Valdez143e8b32016-07-11 13:19:03 -04003959 })
3960 }
Paul Lietar8f1c2682015-08-18 12:21:54 +01003961
David Benjamin1d4f4c02016-07-26 18:03:08 -04003962 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
David Benjamin582ba042016-07-07 12:33:25 -07003970 if config.protocol == tls {
David Benjamin760b1dd2015-05-15 23:33:48 -04003971 tests = append(tests, testCase{
David Benjamin4c3ddf72016-06-29 18:13:53 -04003972 name: "Renegotiate-Client",
3973 config: Config{
3974 MaxVersion: VersionTLS12,
3975 },
David Benjamin1d5ef3b2015-10-12 19:54:18 -04003976 renegotiate: 1,
3977 flags: []string{
3978 "-renegotiate-freely",
3979 "-expect-total-renegotiations", "1",
3980 },
David Benjamin760b1dd2015-05-15 23:33:48 -04003981 })
David Benjamin4c3ddf72016-06-29 18:13:53 -04003982
David Benjamin47921102016-07-28 11:29:18 -04003983 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
David Benjamin760b1dd2015-05-15 23:33:48 -04003997 // NPN on client and server; results in post-handshake message.
3998 tests = append(tests, testCase{
3999 name: "NPN-Client",
4000 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04004001 MaxVersion: VersionTLS12,
David Benjamin760b1dd2015-05-15 23:33:48 -04004002 NextProtos: []string{"foo"},
4003 },
4004 flags: []string{"-select-next-proto", "foo"},
David Benjaminf8fcdf32016-06-08 15:56:13 -04004005 resumeSession: true,
David Benjamin760b1dd2015-05-15 23:33:48 -04004006 expectedNextProto: "foo",
4007 expectedNextProtoType: npn,
4008 })
4009 tests = append(tests, testCase{
4010 testType: serverTest,
4011 name: "NPN-Server",
4012 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04004013 MaxVersion: VersionTLS12,
David Benjamin760b1dd2015-05-15 23:33:48 -04004014 NextProtos: []string{"bar"},
4015 },
4016 flags: []string{
4017 "-advertise-npn", "\x03foo\x03bar\x03baz",
4018 "-expect-next-proto", "bar",
4019 },
David Benjaminf8fcdf32016-06-08 15:56:13 -04004020 resumeSession: true,
David Benjamin760b1dd2015-05-15 23:33:48 -04004021 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{
Nick Harper1fd39d82016-06-14 18:14:35 -07004031 MaxVersion: VersionTLS12,
David Benjamin760b1dd2015-05-15 23:33:48 -04004032 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{
Nick Harper1fd39d82016-06-14 18:14:35 -07004050 MaxVersion: VersionTLS12,
David Benjamin760b1dd2015-05-15 23:33:48 -04004051 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 // Client does False Start but doesn't explicitly call
4066 // SSL_connect.
4067 tests = append(tests, testCase{
4068 name: "FalseStart-Implicit",
4069 config: Config{
Nick Harper1fd39d82016-06-14 18:14:35 -07004070 MaxVersion: VersionTLS12,
David Benjamin760b1dd2015-05-15 23:33:48 -04004071 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
4072 NextProtos: []string{"foo"},
4073 },
4074 flags: []string{
4075 "-implicit-handshake",
4076 "-false-start",
4077 "-advertise-alpn", "\x03foo",
4078 },
4079 })
4080
4081 // False Start without session tickets.
4082 tests = append(tests, testCase{
4083 name: "FalseStart-SessionTicketsDisabled",
4084 config: Config{
Nick Harper1fd39d82016-06-14 18:14:35 -07004085 MaxVersion: VersionTLS12,
David Benjamin760b1dd2015-05-15 23:33:48 -04004086 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
4087 NextProtos: []string{"foo"},
4088 SessionTicketsDisabled: true,
4089 Bugs: ProtocolBugs{
4090 ExpectFalseStart: true,
4091 },
4092 },
4093 flags: []string{
4094 "-false-start",
4095 "-select-next-proto", "foo",
4096 },
4097 shimWritesFirst: true,
4098 })
4099
4100 // Server parses a V2ClientHello.
4101 tests = append(tests, testCase{
4102 testType: serverTest,
4103 name: "SendV2ClientHello",
4104 config: Config{
4105 // Choose a cipher suite that does not involve
4106 // elliptic curves, so no extensions are
4107 // involved.
Nick Harper1fd39d82016-06-14 18:14:35 -07004108 MaxVersion: VersionTLS12,
Matt Braithwaite07e78062016-08-21 14:50:43 -07004109 CipherSuites: []uint16{TLS_RSA_WITH_3DES_EDE_CBC_SHA},
David Benjamin760b1dd2015-05-15 23:33:48 -04004110 Bugs: ProtocolBugs{
4111 SendV2ClientHello: true,
4112 },
4113 },
4114 })
4115
Nick Harper60a85cb2016-09-23 16:25:11 -07004116 // Test Channel ID
4117 for _, ver := range tlsVersions {
Nick Harperc9846112016-10-17 15:05:35 -07004118 if ver.version < VersionTLS10 {
Nick Harper60a85cb2016-09-23 16:25:11 -07004119 continue
4120 }
4121 // Client sends a Channel ID.
4122 tests = append(tests, testCase{
4123 name: "ChannelID-Client-" + ver.name,
4124 config: Config{
4125 MaxVersion: ver.version,
4126 RequestChannelID: true,
4127 },
4128 flags: []string{"-send-channel-id", path.Join(*resourceDir, channelIDKeyFile)},
4129 resumeSession: true,
4130 expectChannelID: true,
4131 })
David Benjamin760b1dd2015-05-15 23:33:48 -04004132
Nick Harper60a85cb2016-09-23 16:25:11 -07004133 // Server accepts a Channel ID.
4134 tests = append(tests, testCase{
4135 testType: serverTest,
4136 name: "ChannelID-Server-" + ver.name,
4137 config: Config{
4138 MaxVersion: ver.version,
4139 ChannelID: channelIDKey,
4140 },
4141 flags: []string{
4142 "-expect-channel-id",
4143 base64.StdEncoding.EncodeToString(channelIDBytes),
4144 },
4145 resumeSession: true,
4146 expectChannelID: true,
4147 })
4148
4149 tests = append(tests, testCase{
4150 testType: serverTest,
4151 name: "InvalidChannelIDSignature-" + ver.name,
4152 config: Config{
4153 MaxVersion: ver.version,
4154 ChannelID: channelIDKey,
4155 Bugs: ProtocolBugs{
4156 InvalidChannelIDSignature: true,
4157 },
4158 },
4159 flags: []string{"-enable-channel-id"},
4160 shouldFail: true,
4161 expectedError: ":CHANNEL_ID_SIGNATURE_INVALID:",
4162 })
4163 }
David Benjamin30789da2015-08-29 22:56:45 -04004164
David Benjaminf8fcdf32016-06-08 15:56:13 -04004165 // Channel ID and NPN at the same time, to ensure their relative
4166 // ordering is correct.
4167 tests = append(tests, testCase{
4168 name: "ChannelID-NPN-Client",
4169 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04004170 MaxVersion: VersionTLS12,
David Benjaminf8fcdf32016-06-08 15:56:13 -04004171 RequestChannelID: true,
4172 NextProtos: []string{"foo"},
4173 },
4174 flags: []string{
4175 "-send-channel-id", path.Join(*resourceDir, channelIDKeyFile),
4176 "-select-next-proto", "foo",
4177 },
4178 resumeSession: true,
4179 expectChannelID: true,
4180 expectedNextProto: "foo",
4181 expectedNextProtoType: npn,
4182 })
4183 tests = append(tests, testCase{
4184 testType: serverTest,
4185 name: "ChannelID-NPN-Server",
4186 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04004187 MaxVersion: VersionTLS12,
David Benjaminf8fcdf32016-06-08 15:56:13 -04004188 ChannelID: channelIDKey,
4189 NextProtos: []string{"bar"},
4190 },
4191 flags: []string{
4192 "-expect-channel-id",
4193 base64.StdEncoding.EncodeToString(channelIDBytes),
4194 "-advertise-npn", "\x03foo\x03bar\x03baz",
4195 "-expect-next-proto", "bar",
4196 },
4197 resumeSession: true,
4198 expectChannelID: true,
4199 expectedNextProto: "bar",
4200 expectedNextProtoType: npn,
4201 })
4202
David Benjamin30789da2015-08-29 22:56:45 -04004203 // Bidirectional shutdown with the runner initiating.
4204 tests = append(tests, testCase{
4205 name: "Shutdown-Runner",
4206 config: Config{
4207 Bugs: ProtocolBugs{
4208 ExpectCloseNotify: true,
4209 },
4210 },
4211 flags: []string{"-check-close-notify"},
4212 })
4213
4214 // Bidirectional shutdown with the shim initiating. The runner,
4215 // in the meantime, sends garbage before the close_notify which
4216 // the shim must ignore.
4217 tests = append(tests, testCase{
4218 name: "Shutdown-Shim",
4219 config: Config{
David Benjamine8e84b92016-08-03 15:39:47 -04004220 MaxVersion: VersionTLS12,
David Benjamin30789da2015-08-29 22:56:45 -04004221 Bugs: ProtocolBugs{
4222 ExpectCloseNotify: true,
4223 },
4224 },
4225 shimShutsDown: true,
4226 sendEmptyRecords: 1,
4227 sendWarningAlerts: 1,
4228 flags: []string{"-check-close-notify"},
4229 })
David Benjamin760b1dd2015-05-15 23:33:48 -04004230 } else {
David Benjamin4c3ddf72016-06-29 18:13:53 -04004231 // TODO(davidben): DTLS 1.3 will want a similar thing for
4232 // HelloRetryRequest.
David Benjamin760b1dd2015-05-15 23:33:48 -04004233 tests = append(tests, testCase{
4234 name: "SkipHelloVerifyRequest",
4235 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04004236 MaxVersion: VersionTLS12,
David Benjamin760b1dd2015-05-15 23:33:48 -04004237 Bugs: ProtocolBugs{
4238 SkipHelloVerifyRequest: true,
4239 },
4240 },
4241 })
4242 }
4243
David Benjamin760b1dd2015-05-15 23:33:48 -04004244 for _, test := range tests {
David Benjamin582ba042016-07-07 12:33:25 -07004245 test.protocol = config.protocol
4246 if config.protocol == dtls {
David Benjamin16285ea2015-11-03 15:39:45 -05004247 test.name += "-DTLS"
4248 }
David Benjamin582ba042016-07-07 12:33:25 -07004249 if config.async {
David Benjamin16285ea2015-11-03 15:39:45 -05004250 test.name += "-Async"
4251 test.flags = append(test.flags, "-async")
4252 } else {
4253 test.name += "-Sync"
4254 }
David Benjamin582ba042016-07-07 12:33:25 -07004255 if config.splitHandshake {
David Benjamin16285ea2015-11-03 15:39:45 -05004256 test.name += "-SplitHandshakeRecords"
4257 test.config.Bugs.MaxHandshakeRecordLength = 1
David Benjamin582ba042016-07-07 12:33:25 -07004258 if config.protocol == dtls {
David Benjamin16285ea2015-11-03 15:39:45 -05004259 test.config.Bugs.MaxPacketLength = 256
4260 test.flags = append(test.flags, "-mtu", "256")
4261 }
4262 }
David Benjamin582ba042016-07-07 12:33:25 -07004263 if config.packHandshakeFlight {
4264 test.name += "-PackHandshakeFlight"
4265 test.config.Bugs.PackHandshakeFlight = true
4266 }
David Benjamin760b1dd2015-05-15 23:33:48 -04004267 testCases = append(testCases, test)
David Benjamin6fd297b2014-08-11 18:43:38 -04004268 }
David Benjamin43ec06f2014-08-05 02:28:57 -04004269}
4270
Adam Langley524e7172015-02-20 16:04:00 -08004271func addDDoSCallbackTests() {
4272 // DDoS callback.
Adam Langley524e7172015-02-20 16:04:00 -08004273 for _, resume := range []bool{false, true} {
4274 suffix := "Resume"
4275 if resume {
4276 suffix = "No" + suffix
4277 }
4278
4279 testCases = append(testCases, testCase{
David Benjamin4c3ddf72016-06-29 18:13:53 -04004280 testType: serverTest,
4281 name: "Server-DDoS-OK-" + suffix,
4282 config: Config{
4283 MaxVersion: VersionTLS12,
4284 },
Adam Langley524e7172015-02-20 16:04:00 -08004285 flags: []string{"-install-ddos-callback"},
4286 resumeSession: resume,
4287 })
Steven Valdez4aa154e2016-07-29 14:32:55 -04004288 testCases = append(testCases, testCase{
4289 testType: serverTest,
4290 name: "Server-DDoS-OK-" + suffix + "-TLS13",
4291 config: Config{
4292 MaxVersion: VersionTLS13,
4293 },
4294 flags: []string{"-install-ddos-callback"},
4295 resumeSession: resume,
4296 })
Adam Langley524e7172015-02-20 16:04:00 -08004297
4298 failFlag := "-fail-ddos-callback"
4299 if resume {
4300 failFlag = "-fail-second-ddos-callback"
4301 }
4302 testCases = append(testCases, testCase{
David Benjamin4c3ddf72016-06-29 18:13:53 -04004303 testType: serverTest,
4304 name: "Server-DDoS-Reject-" + suffix,
4305 config: Config{
4306 MaxVersion: VersionTLS12,
4307 },
David Benjamin2c66e072016-09-16 15:58:00 -04004308 flags: []string{"-install-ddos-callback", failFlag},
4309 resumeSession: resume,
4310 shouldFail: true,
4311 expectedError: ":CONNECTION_REJECTED:",
4312 expectedLocalError: "remote error: internal error",
Adam Langley524e7172015-02-20 16:04:00 -08004313 })
Steven Valdez4aa154e2016-07-29 14:32:55 -04004314 testCases = append(testCases, testCase{
4315 testType: serverTest,
4316 name: "Server-DDoS-Reject-" + suffix + "-TLS13",
4317 config: Config{
4318 MaxVersion: VersionTLS13,
4319 },
David Benjamin2c66e072016-09-16 15:58:00 -04004320 flags: []string{"-install-ddos-callback", failFlag},
4321 resumeSession: resume,
4322 shouldFail: true,
4323 expectedError: ":CONNECTION_REJECTED:",
4324 expectedLocalError: "remote error: internal error",
Steven Valdez4aa154e2016-07-29 14:32:55 -04004325 })
Adam Langley524e7172015-02-20 16:04:00 -08004326 }
4327}
4328
David Benjamin7e2e6cf2014-08-07 17:44:24 -04004329func addVersionNegotiationTests() {
4330 for i, shimVers := range tlsVersions {
4331 // Assemble flags to disable all newer versions on the shim.
4332 var flags []string
4333 for _, vers := range tlsVersions[i+1:] {
4334 flags = append(flags, vers.flag)
4335 }
4336
Steven Valdezfdd10992016-09-15 16:27:05 -04004337 // Test configuring the runner's maximum version.
David Benjamin7e2e6cf2014-08-07 17:44:24 -04004338 for _, runnerVers := range tlsVersions {
David Benjamin8b8c0062014-11-23 02:47:52 -05004339 protocols := []protocol{tls}
4340 if runnerVers.hasDTLS && shimVers.hasDTLS {
4341 protocols = append(protocols, dtls)
David Benjamin7e2e6cf2014-08-07 17:44:24 -04004342 }
David Benjamin8b8c0062014-11-23 02:47:52 -05004343 for _, protocol := range protocols {
4344 expectedVersion := shimVers.version
4345 if runnerVers.version < shimVers.version {
4346 expectedVersion = runnerVers.version
4347 }
David Benjamin7e2e6cf2014-08-07 17:44:24 -04004348
David Benjamin8b8c0062014-11-23 02:47:52 -05004349 suffix := shimVers.name + "-" + runnerVers.name
4350 if protocol == dtls {
4351 suffix += "-DTLS"
4352 }
David Benjamin7e2e6cf2014-08-07 17:44:24 -04004353
David Benjamin1eb367c2014-12-12 18:17:51 -05004354 shimVersFlag := strconv.Itoa(int(versionToWire(shimVers.version, protocol == dtls)))
4355
David Benjaminb1dd8cd2016-09-26 19:20:48 -04004356 // Determine the expected initial record-layer versions.
David Benjamin1e29a6b2014-12-10 02:27:24 -05004357 clientVers := shimVers.version
4358 if clientVers > VersionTLS10 {
4359 clientVers = VersionTLS10
4360 }
David Benjaminb1dd8cd2016-09-26 19:20:48 -04004361 clientVers = versionToWire(clientVers, protocol == dtls)
Nick Harper1fd39d82016-06-14 18:14:35 -07004362 serverVers := expectedVersion
4363 if expectedVersion >= VersionTLS13 {
4364 serverVers = VersionTLS10
4365 }
David Benjaminb1dd8cd2016-09-26 19:20:48 -04004366 serverVers = versionToWire(serverVers, protocol == dtls)
4367
David Benjamin8b8c0062014-11-23 02:47:52 -05004368 testCases = append(testCases, testCase{
4369 protocol: protocol,
4370 testType: clientTest,
4371 name: "VersionNegotiation-Client-" + suffix,
4372 config: Config{
4373 MaxVersion: runnerVers.version,
David Benjamin1e29a6b2014-12-10 02:27:24 -05004374 Bugs: ProtocolBugs{
4375 ExpectInitialRecordVersion: clientVers,
4376 },
David Benjamin8b8c0062014-11-23 02:47:52 -05004377 },
4378 flags: flags,
4379 expectedVersion: expectedVersion,
4380 })
David Benjamin1eb367c2014-12-12 18:17:51 -05004381 testCases = append(testCases, testCase{
4382 protocol: protocol,
4383 testType: clientTest,
4384 name: "VersionNegotiation-Client2-" + suffix,
4385 config: Config{
4386 MaxVersion: runnerVers.version,
4387 Bugs: ProtocolBugs{
4388 ExpectInitialRecordVersion: clientVers,
4389 },
4390 },
4391 flags: []string{"-max-version", shimVersFlag},
4392 expectedVersion: expectedVersion,
4393 })
David Benjamin8b8c0062014-11-23 02:47:52 -05004394
4395 testCases = append(testCases, testCase{
4396 protocol: protocol,
4397 testType: serverTest,
4398 name: "VersionNegotiation-Server-" + suffix,
4399 config: Config{
4400 MaxVersion: runnerVers.version,
David Benjamin1e29a6b2014-12-10 02:27:24 -05004401 Bugs: ProtocolBugs{
Nick Harper1fd39d82016-06-14 18:14:35 -07004402 ExpectInitialRecordVersion: serverVers,
David Benjamin1e29a6b2014-12-10 02:27:24 -05004403 },
David Benjamin8b8c0062014-11-23 02:47:52 -05004404 },
4405 flags: flags,
4406 expectedVersion: expectedVersion,
4407 })
David Benjamin1eb367c2014-12-12 18:17:51 -05004408 testCases = append(testCases, testCase{
4409 protocol: protocol,
4410 testType: serverTest,
4411 name: "VersionNegotiation-Server2-" + suffix,
4412 config: Config{
4413 MaxVersion: runnerVers.version,
4414 Bugs: ProtocolBugs{
Nick Harper1fd39d82016-06-14 18:14:35 -07004415 ExpectInitialRecordVersion: serverVers,
David Benjamin1eb367c2014-12-12 18:17:51 -05004416 },
4417 },
4418 flags: []string{"-max-version", shimVersFlag},
4419 expectedVersion: expectedVersion,
4420 })
David Benjamin8b8c0062014-11-23 02:47:52 -05004421 }
David Benjamin7e2e6cf2014-08-07 17:44:24 -04004422 }
4423 }
David Benjamin95c69562016-06-29 18:15:03 -04004424
Steven Valdezfdd10992016-09-15 16:27:05 -04004425 // Test the version extension at all versions.
4426 for _, vers := range tlsVersions {
4427 protocols := []protocol{tls}
4428 if vers.hasDTLS {
4429 protocols = append(protocols, dtls)
4430 }
4431 for _, protocol := range protocols {
4432 suffix := vers.name
4433 if protocol == dtls {
4434 suffix += "-DTLS"
4435 }
4436
4437 wireVersion := versionToWire(vers.version, protocol == dtls)
4438 testCases = append(testCases, testCase{
4439 protocol: protocol,
4440 testType: serverTest,
4441 name: "VersionNegotiationExtension-" + suffix,
4442 config: Config{
4443 Bugs: ProtocolBugs{
4444 SendSupportedVersions: []uint16{0x1111, wireVersion, 0x2222},
4445 },
4446 },
4447 expectedVersion: vers.version,
4448 })
4449 }
4450
4451 }
4452
4453 // If all versions are unknown, negotiation fails.
4454 testCases = append(testCases, testCase{
4455 testType: serverTest,
4456 name: "NoSupportedVersions",
4457 config: Config{
4458 Bugs: ProtocolBugs{
4459 SendSupportedVersions: []uint16{0x1111},
4460 },
4461 },
4462 shouldFail: true,
4463 expectedError: ":UNSUPPORTED_PROTOCOL:",
4464 })
4465 testCases = append(testCases, testCase{
4466 protocol: dtls,
4467 testType: serverTest,
4468 name: "NoSupportedVersions-DTLS",
4469 config: Config{
4470 Bugs: ProtocolBugs{
4471 SendSupportedVersions: []uint16{0x1111},
4472 },
4473 },
4474 shouldFail: true,
4475 expectedError: ":UNSUPPORTED_PROTOCOL:",
4476 })
4477
4478 testCases = append(testCases, testCase{
4479 testType: serverTest,
4480 name: "ClientHelloVersionTooHigh",
4481 config: Config{
4482 MaxVersion: VersionTLS13,
4483 Bugs: ProtocolBugs{
4484 SendClientVersion: 0x0304,
4485 OmitSupportedVersions: true,
4486 },
4487 },
4488 expectedVersion: VersionTLS12,
4489 })
4490
4491 testCases = append(testCases, testCase{
4492 testType: serverTest,
4493 name: "ConflictingVersionNegotiation",
4494 config: Config{
Steven Valdezfdd10992016-09-15 16:27:05 -04004495 Bugs: ProtocolBugs{
David Benjaminad75a662016-09-30 15:42:59 -04004496 SendClientVersion: VersionTLS12,
4497 SendSupportedVersions: []uint16{VersionTLS11},
Steven Valdezfdd10992016-09-15 16:27:05 -04004498 },
4499 },
David Benjaminad75a662016-09-30 15:42:59 -04004500 // The extension takes precedence over the ClientHello version.
4501 expectedVersion: VersionTLS11,
4502 })
4503
4504 testCases = append(testCases, testCase{
4505 testType: serverTest,
4506 name: "ConflictingVersionNegotiation-2",
4507 config: Config{
4508 Bugs: ProtocolBugs{
4509 SendClientVersion: VersionTLS11,
4510 SendSupportedVersions: []uint16{VersionTLS12},
4511 },
4512 },
4513 // The extension takes precedence over the ClientHello version.
4514 expectedVersion: VersionTLS12,
4515 })
4516
4517 testCases = append(testCases, testCase{
4518 testType: serverTest,
4519 name: "RejectFinalTLS13",
4520 config: Config{
4521 Bugs: ProtocolBugs{
4522 SendSupportedVersions: []uint16{VersionTLS13, VersionTLS12},
4523 },
4524 },
4525 // We currently implement a draft TLS 1.3 version. Ensure that
4526 // the true TLS 1.3 value is ignored for now.
Steven Valdezfdd10992016-09-15 16:27:05 -04004527 expectedVersion: VersionTLS12,
4528 })
4529
Brian Smithf85d3232016-10-28 10:34:06 -10004530 // Test that the maximum version is selected regardless of the
4531 // client-sent order.
4532 testCases = append(testCases, testCase{
4533 testType: serverTest,
4534 name: "IgnoreClientVersionOrder",
4535 config: Config{
4536 Bugs: ProtocolBugs{
4537 SendSupportedVersions: []uint16{VersionTLS12, tls13DraftVersion},
4538 },
4539 },
4540 expectedVersion: VersionTLS13,
4541 })
4542
David Benjamin95c69562016-06-29 18:15:03 -04004543 // Test for version tolerance.
4544 testCases = append(testCases, testCase{
4545 testType: serverTest,
4546 name: "MinorVersionTolerance",
4547 config: Config{
4548 Bugs: ProtocolBugs{
Steven Valdezfdd10992016-09-15 16:27:05 -04004549 SendClientVersion: 0x03ff,
4550 OmitSupportedVersions: true,
David Benjamin95c69562016-06-29 18:15:03 -04004551 },
4552 },
Steven Valdezfdd10992016-09-15 16:27:05 -04004553 expectedVersion: VersionTLS12,
David Benjamin95c69562016-06-29 18:15:03 -04004554 })
4555 testCases = append(testCases, testCase{
4556 testType: serverTest,
4557 name: "MajorVersionTolerance",
4558 config: Config{
4559 Bugs: ProtocolBugs{
Steven Valdezfdd10992016-09-15 16:27:05 -04004560 SendClientVersion: 0x0400,
4561 OmitSupportedVersions: true,
David Benjamin95c69562016-06-29 18:15:03 -04004562 },
4563 },
David Benjaminad75a662016-09-30 15:42:59 -04004564 // TLS 1.3 must be negotiated with the supported_versions
4565 // extension, not ClientHello.version.
Steven Valdezfdd10992016-09-15 16:27:05 -04004566 expectedVersion: VersionTLS12,
David Benjamin95c69562016-06-29 18:15:03 -04004567 })
David Benjaminad75a662016-09-30 15:42:59 -04004568 testCases = append(testCases, testCase{
4569 testType: serverTest,
4570 name: "VersionTolerance-TLS13",
4571 config: Config{
4572 Bugs: ProtocolBugs{
4573 // Although TLS 1.3 does not use
4574 // ClientHello.version, it still tolerates high
4575 // values there.
4576 SendClientVersion: 0x0400,
4577 },
4578 },
4579 expectedVersion: VersionTLS13,
4580 })
Steven Valdezfdd10992016-09-15 16:27:05 -04004581
David Benjamin95c69562016-06-29 18:15:03 -04004582 testCases = append(testCases, testCase{
4583 protocol: dtls,
4584 testType: serverTest,
4585 name: "MinorVersionTolerance-DTLS",
4586 config: Config{
4587 Bugs: ProtocolBugs{
Steven Valdezfdd10992016-09-15 16:27:05 -04004588 SendClientVersion: 0xfe00,
4589 OmitSupportedVersions: true,
David Benjamin95c69562016-06-29 18:15:03 -04004590 },
4591 },
4592 expectedVersion: VersionTLS12,
4593 })
4594 testCases = append(testCases, testCase{
4595 protocol: dtls,
4596 testType: serverTest,
4597 name: "MajorVersionTolerance-DTLS",
4598 config: Config{
4599 Bugs: ProtocolBugs{
Steven Valdezfdd10992016-09-15 16:27:05 -04004600 SendClientVersion: 0xfdff,
4601 OmitSupportedVersions: true,
David Benjamin95c69562016-06-29 18:15:03 -04004602 },
4603 },
4604 expectedVersion: VersionTLS12,
4605 })
4606
4607 // Test that versions below 3.0 are rejected.
4608 testCases = append(testCases, testCase{
4609 testType: serverTest,
4610 name: "VersionTooLow",
4611 config: Config{
4612 Bugs: ProtocolBugs{
Steven Valdezfdd10992016-09-15 16:27:05 -04004613 SendClientVersion: 0x0200,
4614 OmitSupportedVersions: true,
David Benjamin95c69562016-06-29 18:15:03 -04004615 },
4616 },
4617 shouldFail: true,
4618 expectedError: ":UNSUPPORTED_PROTOCOL:",
4619 })
4620 testCases = append(testCases, testCase{
4621 protocol: dtls,
4622 testType: serverTest,
4623 name: "VersionTooLow-DTLS",
4624 config: Config{
4625 Bugs: ProtocolBugs{
David Benjamin3c6a1ea2016-09-26 18:30:05 -04004626 SendClientVersion: 0xffff,
David Benjamin95c69562016-06-29 18:15:03 -04004627 },
4628 },
4629 shouldFail: true,
4630 expectedError: ":UNSUPPORTED_PROTOCOL:",
4631 })
David Benjamin1f61f0d2016-07-10 12:20:35 -04004632
David Benjamin2dc02042016-09-19 19:57:37 -04004633 testCases = append(testCases, testCase{
4634 name: "ServerBogusVersion",
4635 config: Config{
4636 Bugs: ProtocolBugs{
4637 SendServerHelloVersion: 0x1234,
4638 },
4639 },
4640 shouldFail: true,
4641 expectedError: ":UNSUPPORTED_PROTOCOL:",
4642 })
4643
David Benjamin1f61f0d2016-07-10 12:20:35 -04004644 // Test TLS 1.3's downgrade signal.
4645 testCases = append(testCases, testCase{
4646 name: "Downgrade-TLS12-Client",
4647 config: Config{
4648 Bugs: ProtocolBugs{
4649 NegotiateVersion: VersionTLS12,
4650 },
4651 },
David Benjamin592b5322016-09-30 15:15:01 -04004652 expectedVersion: VersionTLS12,
David Benjamin55108632016-08-11 22:01:18 -04004653 // TODO(davidben): This test should fail once TLS 1.3 is final
4654 // and the fallback signal restored.
David Benjamin1f61f0d2016-07-10 12:20:35 -04004655 })
4656 testCases = append(testCases, testCase{
4657 testType: serverTest,
4658 name: "Downgrade-TLS12-Server",
4659 config: Config{
4660 Bugs: ProtocolBugs{
David Benjamin592b5322016-09-30 15:15:01 -04004661 SendSupportedVersions: []uint16{VersionTLS12},
David Benjamin1f61f0d2016-07-10 12:20:35 -04004662 },
4663 },
David Benjamin592b5322016-09-30 15:15:01 -04004664 expectedVersion: VersionTLS12,
David Benjamin55108632016-08-11 22:01:18 -04004665 // TODO(davidben): This test should fail once TLS 1.3 is final
4666 // and the fallback signal restored.
David Benjamin1f61f0d2016-07-10 12:20:35 -04004667 })
David Benjamin7e2e6cf2014-08-07 17:44:24 -04004668}
4669
David Benjaminaccb4542014-12-12 23:44:33 -05004670func addMinimumVersionTests() {
4671 for i, shimVers := range tlsVersions {
4672 // Assemble flags to disable all older versions on the shim.
4673 var flags []string
4674 for _, vers := range tlsVersions[:i] {
4675 flags = append(flags, vers.flag)
4676 }
4677
4678 for _, runnerVers := range tlsVersions {
4679 protocols := []protocol{tls}
4680 if runnerVers.hasDTLS && shimVers.hasDTLS {
4681 protocols = append(protocols, dtls)
4682 }
4683 for _, protocol := range protocols {
4684 suffix := shimVers.name + "-" + runnerVers.name
4685 if protocol == dtls {
4686 suffix += "-DTLS"
4687 }
4688 shimVersFlag := strconv.Itoa(int(versionToWire(shimVers.version, protocol == dtls)))
4689
David Benjaminaccb4542014-12-12 23:44:33 -05004690 var expectedVersion uint16
4691 var shouldFail bool
David Benjamin6dbde982016-10-03 19:11:14 -04004692 var expectedError, expectedLocalError string
David Benjaminaccb4542014-12-12 23:44:33 -05004693 if runnerVers.version >= shimVers.version {
4694 expectedVersion = runnerVers.version
4695 } else {
4696 shouldFail = true
David Benjamin6dbde982016-10-03 19:11:14 -04004697 expectedError = ":UNSUPPORTED_PROTOCOL:"
4698 expectedLocalError = "remote error: protocol version not supported"
David Benjaminaccb4542014-12-12 23:44:33 -05004699 }
4700
4701 testCases = append(testCases, testCase{
4702 protocol: protocol,
4703 testType: clientTest,
4704 name: "MinimumVersion-Client-" + suffix,
4705 config: Config{
4706 MaxVersion: runnerVers.version,
Steven Valdezfdd10992016-09-15 16:27:05 -04004707 Bugs: ProtocolBugs{
David Benjamin6dbde982016-10-03 19:11:14 -04004708 // Ensure the server does not decline to
4709 // select a version (versions extension) or
4710 // cipher (some ciphers depend on versions).
4711 NegotiateVersion: runnerVers.version,
4712 IgnorePeerCipherPreferences: shouldFail,
Steven Valdezfdd10992016-09-15 16:27:05 -04004713 },
David Benjaminaccb4542014-12-12 23:44:33 -05004714 },
David Benjamin87909c02014-12-13 01:55:01 -05004715 flags: flags,
4716 expectedVersion: expectedVersion,
4717 shouldFail: shouldFail,
David Benjamin6dbde982016-10-03 19:11:14 -04004718 expectedError: expectedError,
4719 expectedLocalError: expectedLocalError,
David Benjaminaccb4542014-12-12 23:44:33 -05004720 })
4721 testCases = append(testCases, testCase{
4722 protocol: protocol,
4723 testType: clientTest,
4724 name: "MinimumVersion-Client2-" + suffix,
4725 config: Config{
4726 MaxVersion: runnerVers.version,
Steven Valdezfdd10992016-09-15 16:27:05 -04004727 Bugs: ProtocolBugs{
David Benjamin6dbde982016-10-03 19:11:14 -04004728 // Ensure the server does not decline to
4729 // select a version (versions extension) or
4730 // cipher (some ciphers depend on versions).
4731 NegotiateVersion: runnerVers.version,
4732 IgnorePeerCipherPreferences: shouldFail,
Steven Valdezfdd10992016-09-15 16:27:05 -04004733 },
David Benjaminaccb4542014-12-12 23:44:33 -05004734 },
David Benjamin87909c02014-12-13 01:55:01 -05004735 flags: []string{"-min-version", shimVersFlag},
4736 expectedVersion: expectedVersion,
4737 shouldFail: shouldFail,
David Benjamin6dbde982016-10-03 19:11:14 -04004738 expectedError: expectedError,
4739 expectedLocalError: expectedLocalError,
David Benjaminaccb4542014-12-12 23:44:33 -05004740 })
4741
4742 testCases = append(testCases, testCase{
4743 protocol: protocol,
4744 testType: serverTest,
4745 name: "MinimumVersion-Server-" + suffix,
4746 config: Config{
4747 MaxVersion: runnerVers.version,
4748 },
David Benjamin87909c02014-12-13 01:55:01 -05004749 flags: flags,
4750 expectedVersion: expectedVersion,
4751 shouldFail: shouldFail,
David Benjamin6dbde982016-10-03 19:11:14 -04004752 expectedError: expectedError,
4753 expectedLocalError: expectedLocalError,
David Benjaminaccb4542014-12-12 23:44:33 -05004754 })
4755 testCases = append(testCases, testCase{
4756 protocol: protocol,
4757 testType: serverTest,
4758 name: "MinimumVersion-Server2-" + suffix,
4759 config: Config{
4760 MaxVersion: runnerVers.version,
4761 },
David Benjamin87909c02014-12-13 01:55:01 -05004762 flags: []string{"-min-version", shimVersFlag},
4763 expectedVersion: expectedVersion,
4764 shouldFail: shouldFail,
David Benjamin6dbde982016-10-03 19:11:14 -04004765 expectedError: expectedError,
4766 expectedLocalError: expectedLocalError,
David Benjaminaccb4542014-12-12 23:44:33 -05004767 })
4768 }
4769 }
4770 }
4771}
4772
David Benjamine78bfde2014-09-06 12:45:15 -04004773func addExtensionTests() {
David Benjamin4c3ddf72016-06-29 18:13:53 -04004774 // TODO(davidben): Extensions, where applicable, all move their server
4775 // halves to EncryptedExtensions in TLS 1.3. Duplicate each of these
4776 // tests for both. Also test interaction with 0-RTT when implemented.
4777
David Benjamin97d17d92016-07-14 16:12:00 -04004778 // Repeat extensions tests all versions except SSL 3.0.
4779 for _, ver := range tlsVersions {
4780 if ver.version == VersionSSL30 {
4781 continue
4782 }
4783
David Benjamin97d17d92016-07-14 16:12:00 -04004784 // Test that duplicate extensions are rejected.
4785 testCases = append(testCases, testCase{
4786 testType: clientTest,
4787 name: "DuplicateExtensionClient-" + ver.name,
4788 config: Config{
4789 MaxVersion: ver.version,
4790 Bugs: ProtocolBugs{
4791 DuplicateExtension: true,
4792 },
David Benjamine78bfde2014-09-06 12:45:15 -04004793 },
David Benjamin97d17d92016-07-14 16:12:00 -04004794 shouldFail: true,
4795 expectedLocalError: "remote error: error decoding message",
4796 })
4797 testCases = append(testCases, testCase{
4798 testType: serverTest,
4799 name: "DuplicateExtensionServer-" + ver.name,
4800 config: Config{
4801 MaxVersion: ver.version,
4802 Bugs: ProtocolBugs{
4803 DuplicateExtension: true,
4804 },
David Benjamine78bfde2014-09-06 12:45:15 -04004805 },
David Benjamin97d17d92016-07-14 16:12:00 -04004806 shouldFail: true,
4807 expectedLocalError: "remote error: error decoding message",
4808 })
4809
4810 // Test SNI.
4811 testCases = append(testCases, testCase{
4812 testType: clientTest,
4813 name: "ServerNameExtensionClient-" + ver.name,
4814 config: Config{
4815 MaxVersion: ver.version,
4816 Bugs: ProtocolBugs{
4817 ExpectServerName: "example.com",
4818 },
David Benjamine78bfde2014-09-06 12:45:15 -04004819 },
David Benjamin97d17d92016-07-14 16:12:00 -04004820 flags: []string{"-host-name", "example.com"},
4821 })
4822 testCases = append(testCases, testCase{
4823 testType: clientTest,
4824 name: "ServerNameExtensionClientMismatch-" + ver.name,
4825 config: Config{
4826 MaxVersion: ver.version,
4827 Bugs: ProtocolBugs{
4828 ExpectServerName: "mismatch.com",
4829 },
David Benjamine78bfde2014-09-06 12:45:15 -04004830 },
David Benjamin97d17d92016-07-14 16:12:00 -04004831 flags: []string{"-host-name", "example.com"},
4832 shouldFail: true,
4833 expectedLocalError: "tls: unexpected server name",
4834 })
4835 testCases = append(testCases, testCase{
4836 testType: clientTest,
4837 name: "ServerNameExtensionClientMissing-" + ver.name,
4838 config: Config{
4839 MaxVersion: ver.version,
4840 Bugs: ProtocolBugs{
4841 ExpectServerName: "missing.com",
4842 },
David Benjamine78bfde2014-09-06 12:45:15 -04004843 },
David Benjamin97d17d92016-07-14 16:12:00 -04004844 shouldFail: true,
4845 expectedLocalError: "tls: unexpected server name",
4846 })
4847 testCases = append(testCases, testCase{
David Benjamin023d4192017-02-06 13:49:07 -05004848 testType: clientTest,
4849 name: "TolerateServerNameAck-" + ver.name,
4850 config: Config{
4851 MaxVersion: ver.version,
4852 Bugs: ProtocolBugs{
4853 SendServerNameAck: true,
4854 },
4855 },
4856 flags: []string{"-host-name", "example.com"},
4857 resumeSession: true,
4858 })
4859 testCases = append(testCases, testCase{
4860 testType: clientTest,
4861 name: "UnsolicitedServerNameAck-" + ver.name,
4862 config: Config{
4863 MaxVersion: ver.version,
4864 Bugs: ProtocolBugs{
4865 SendServerNameAck: true,
4866 },
4867 },
4868 shouldFail: true,
4869 expectedError: ":UNEXPECTED_EXTENSION:",
4870 expectedLocalError: "remote error: unsupported extension",
4871 })
4872 testCases = append(testCases, testCase{
David Benjamin97d17d92016-07-14 16:12:00 -04004873 testType: serverTest,
4874 name: "ServerNameExtensionServer-" + ver.name,
4875 config: Config{
4876 MaxVersion: ver.version,
4877 ServerName: "example.com",
David Benjaminfc7b0862014-09-06 13:21:53 -04004878 },
David Benjamin97d17d92016-07-14 16:12:00 -04004879 flags: []string{"-expect-server-name", "example.com"},
Steven Valdez4aa154e2016-07-29 14:32:55 -04004880 resumeSession: true,
David Benjamin97d17d92016-07-14 16:12:00 -04004881 })
4882
4883 // Test ALPN.
4884 testCases = append(testCases, testCase{
4885 testType: clientTest,
4886 name: "ALPNClient-" + ver.name,
4887 config: Config{
4888 MaxVersion: ver.version,
4889 NextProtos: []string{"foo"},
4890 },
4891 flags: []string{
4892 "-advertise-alpn", "\x03foo\x03bar\x03baz",
4893 "-expect-alpn", "foo",
4894 },
4895 expectedNextProto: "foo",
4896 expectedNextProtoType: alpn,
Steven Valdez4aa154e2016-07-29 14:32:55 -04004897 resumeSession: true,
David Benjamin97d17d92016-07-14 16:12:00 -04004898 })
4899 testCases = append(testCases, testCase{
David Benjamin3e517572016-08-11 11:52:23 -04004900 testType: clientTest,
4901 name: "ALPNClient-Mismatch-" + ver.name,
4902 config: Config{
4903 MaxVersion: ver.version,
4904 Bugs: ProtocolBugs{
4905 SendALPN: "baz",
4906 },
4907 },
4908 flags: []string{
4909 "-advertise-alpn", "\x03foo\x03bar",
4910 },
4911 shouldFail: true,
4912 expectedError: ":INVALID_ALPN_PROTOCOL:",
4913 expectedLocalError: "remote error: illegal parameter",
4914 })
4915 testCases = append(testCases, testCase{
David Benjamin97d17d92016-07-14 16:12:00 -04004916 testType: serverTest,
4917 name: "ALPNServer-" + ver.name,
4918 config: Config{
4919 MaxVersion: ver.version,
4920 NextProtos: []string{"foo", "bar", "baz"},
4921 },
4922 flags: []string{
4923 "-expect-advertised-alpn", "\x03foo\x03bar\x03baz",
4924 "-select-alpn", "foo",
4925 },
4926 expectedNextProto: "foo",
4927 expectedNextProtoType: alpn,
Steven Valdez4aa154e2016-07-29 14:32:55 -04004928 resumeSession: true,
David Benjamin97d17d92016-07-14 16:12:00 -04004929 })
4930 testCases = append(testCases, testCase{
4931 testType: serverTest,
4932 name: "ALPNServer-Decline-" + ver.name,
4933 config: Config{
4934 MaxVersion: ver.version,
4935 NextProtos: []string{"foo", "bar", "baz"},
4936 },
4937 flags: []string{"-decline-alpn"},
4938 expectNoNextProto: true,
Steven Valdez4aa154e2016-07-29 14:32:55 -04004939 resumeSession: true,
David Benjamin97d17d92016-07-14 16:12:00 -04004940 })
4941
David Benjamin25fe85b2016-08-09 20:00:32 -04004942 // Test ALPN in async mode as well to ensure that extensions callbacks are only
4943 // called once.
4944 testCases = append(testCases, testCase{
4945 testType: serverTest,
4946 name: "ALPNServer-Async-" + ver.name,
4947 config: Config{
4948 MaxVersion: ver.version,
4949 NextProtos: []string{"foo", "bar", "baz"},
David Benjamin4eb95cc2016-11-16 17:08:23 +09004950 // Prior to TLS 1.3, exercise the asynchronous session callback.
4951 SessionTicketsDisabled: ver.version < VersionTLS13,
David Benjamin25fe85b2016-08-09 20:00:32 -04004952 },
4953 flags: []string{
4954 "-expect-advertised-alpn", "\x03foo\x03bar\x03baz",
4955 "-select-alpn", "foo",
4956 "-async",
4957 },
4958 expectedNextProto: "foo",
4959 expectedNextProtoType: alpn,
Steven Valdez4aa154e2016-07-29 14:32:55 -04004960 resumeSession: true,
David Benjamin25fe85b2016-08-09 20:00:32 -04004961 })
4962
David Benjamin97d17d92016-07-14 16:12:00 -04004963 var emptyString string
4964 testCases = append(testCases, testCase{
4965 testType: clientTest,
4966 name: "ALPNClient-EmptyProtocolName-" + ver.name,
4967 config: Config{
4968 MaxVersion: ver.version,
4969 NextProtos: []string{""},
4970 Bugs: ProtocolBugs{
4971 // A server returning an empty ALPN protocol
4972 // should be rejected.
4973 ALPNProtocol: &emptyString,
4974 },
4975 },
4976 flags: []string{
4977 "-advertise-alpn", "\x03foo",
4978 },
4979 shouldFail: true,
4980 expectedError: ":PARSE_TLSEXT:",
4981 })
4982 testCases = append(testCases, testCase{
4983 testType: serverTest,
4984 name: "ALPNServer-EmptyProtocolName-" + ver.name,
4985 config: Config{
4986 MaxVersion: ver.version,
4987 // A ClientHello containing an empty ALPN protocol
Adam Langleyefb0e162015-07-09 11:35:04 -07004988 // should be rejected.
David Benjamin97d17d92016-07-14 16:12:00 -04004989 NextProtos: []string{"foo", "", "baz"},
Adam Langleyefb0e162015-07-09 11:35:04 -07004990 },
David Benjamin97d17d92016-07-14 16:12:00 -04004991 flags: []string{
4992 "-select-alpn", "foo",
David Benjamin76c2efc2015-08-31 14:24:29 -04004993 },
David Benjamin97d17d92016-07-14 16:12:00 -04004994 shouldFail: true,
4995 expectedError: ":PARSE_TLSEXT:",
4996 })
4997
4998 // Test NPN and the interaction with ALPN.
4999 if ver.version < VersionTLS13 {
5000 // Test that the server prefers ALPN over NPN.
5001 testCases = append(testCases, testCase{
5002 testType: serverTest,
5003 name: "ALPNServer-Preferred-" + ver.name,
5004 config: Config{
5005 MaxVersion: ver.version,
5006 NextProtos: []string{"foo", "bar", "baz"},
5007 },
5008 flags: []string{
5009 "-expect-advertised-alpn", "\x03foo\x03bar\x03baz",
5010 "-select-alpn", "foo",
5011 "-advertise-npn", "\x03foo\x03bar\x03baz",
5012 },
5013 expectedNextProto: "foo",
5014 expectedNextProtoType: alpn,
Steven Valdez4aa154e2016-07-29 14:32:55 -04005015 resumeSession: true,
David Benjamin97d17d92016-07-14 16:12:00 -04005016 })
5017 testCases = append(testCases, testCase{
5018 testType: serverTest,
5019 name: "ALPNServer-Preferred-Swapped-" + ver.name,
5020 config: Config{
5021 MaxVersion: ver.version,
5022 NextProtos: []string{"foo", "bar", "baz"},
5023 Bugs: ProtocolBugs{
5024 SwapNPNAndALPN: true,
5025 },
5026 },
5027 flags: []string{
5028 "-expect-advertised-alpn", "\x03foo\x03bar\x03baz",
5029 "-select-alpn", "foo",
5030 "-advertise-npn", "\x03foo\x03bar\x03baz",
5031 },
5032 expectedNextProto: "foo",
5033 expectedNextProtoType: alpn,
Steven Valdez4aa154e2016-07-29 14:32:55 -04005034 resumeSession: true,
David Benjamin97d17d92016-07-14 16:12:00 -04005035 })
5036
5037 // Test that negotiating both NPN and ALPN is forbidden.
5038 testCases = append(testCases, testCase{
5039 name: "NegotiateALPNAndNPN-" + ver.name,
5040 config: Config{
5041 MaxVersion: ver.version,
5042 NextProtos: []string{"foo", "bar", "baz"},
5043 Bugs: ProtocolBugs{
5044 NegotiateALPNAndNPN: true,
5045 },
5046 },
5047 flags: []string{
5048 "-advertise-alpn", "\x03foo",
5049 "-select-next-proto", "foo",
5050 },
5051 shouldFail: true,
5052 expectedError: ":NEGOTIATED_BOTH_NPN_AND_ALPN:",
5053 })
5054 testCases = append(testCases, testCase{
5055 name: "NegotiateALPNAndNPN-Swapped-" + ver.name,
5056 config: Config{
5057 MaxVersion: ver.version,
5058 NextProtos: []string{"foo", "bar", "baz"},
5059 Bugs: ProtocolBugs{
5060 NegotiateALPNAndNPN: true,
5061 SwapNPNAndALPN: true,
5062 },
5063 },
5064 flags: []string{
5065 "-advertise-alpn", "\x03foo",
5066 "-select-next-proto", "foo",
5067 },
5068 shouldFail: true,
5069 expectedError: ":NEGOTIATED_BOTH_NPN_AND_ALPN:",
5070 })
David Benjamin97d17d92016-07-14 16:12:00 -04005071 }
5072
5073 // Test ticket behavior.
Steven Valdez4aa154e2016-07-29 14:32:55 -04005074
5075 // Resume with a corrupt ticket.
5076 testCases = append(testCases, testCase{
5077 testType: serverTest,
5078 name: "CorruptTicket-" + ver.name,
5079 config: Config{
5080 MaxVersion: ver.version,
5081 Bugs: ProtocolBugs{
David Benjamin4199b0d2016-11-01 13:58:25 -04005082 FilterTicket: func(in []byte) ([]byte, error) {
5083 in[len(in)-1] ^= 1
5084 return in, nil
5085 },
Steven Valdez4aa154e2016-07-29 14:32:55 -04005086 },
5087 },
5088 resumeSession: true,
5089 expectResumeRejected: true,
5090 })
5091 // Test the ticket callback, with and without renewal.
5092 testCases = append(testCases, testCase{
5093 testType: serverTest,
5094 name: "TicketCallback-" + ver.name,
5095 config: Config{
5096 MaxVersion: ver.version,
5097 },
5098 resumeSession: true,
5099 flags: []string{"-use-ticket-callback"},
5100 })
5101 testCases = append(testCases, testCase{
5102 testType: serverTest,
5103 name: "TicketCallback-Renew-" + ver.name,
5104 config: Config{
5105 MaxVersion: ver.version,
5106 Bugs: ProtocolBugs{
5107 ExpectNewTicket: true,
5108 },
5109 },
5110 flags: []string{"-use-ticket-callback", "-renew-ticket"},
5111 resumeSession: true,
5112 })
5113
5114 // Test that the ticket callback is only called once when everything before
5115 // it in the ClientHello is asynchronous. This corrupts the ticket so
5116 // certificate selection callbacks run.
5117 testCases = append(testCases, testCase{
5118 testType: serverTest,
5119 name: "TicketCallback-SingleCall-" + ver.name,
5120 config: Config{
5121 MaxVersion: ver.version,
5122 Bugs: ProtocolBugs{
David Benjamin4199b0d2016-11-01 13:58:25 -04005123 FilterTicket: func(in []byte) ([]byte, error) {
5124 in[len(in)-1] ^= 1
5125 return in, nil
5126 },
Steven Valdez4aa154e2016-07-29 14:32:55 -04005127 },
5128 },
5129 resumeSession: true,
5130 expectResumeRejected: true,
5131 flags: []string{
5132 "-use-ticket-callback",
5133 "-async",
5134 },
5135 })
5136
David Benjamind4c349b2017-02-09 14:07:17 -05005137 // Resume with various lengths of ticket session id.
David Benjamin97d17d92016-07-14 16:12:00 -04005138 if ver.version < VersionTLS13 {
David Benjamin97d17d92016-07-14 16:12:00 -04005139 testCases = append(testCases, testCase{
5140 testType: serverTest,
David Benjamind4c349b2017-02-09 14:07:17 -05005141 name: "TicketSessionIDLength-0-" + ver.name,
David Benjamin97d17d92016-07-14 16:12:00 -04005142 config: Config{
5143 MaxVersion: ver.version,
5144 Bugs: ProtocolBugs{
David Benjamind4c349b2017-02-09 14:07:17 -05005145 EmptyTicketSessionID: true,
5146 },
5147 },
5148 resumeSession: true,
5149 })
5150 testCases = append(testCases, testCase{
5151 testType: serverTest,
5152 name: "TicketSessionIDLength-16-" + ver.name,
5153 config: Config{
5154 MaxVersion: ver.version,
5155 Bugs: ProtocolBugs{
5156 TicketSessionIDLength: 16,
5157 },
5158 },
5159 resumeSession: true,
5160 })
5161 testCases = append(testCases, testCase{
5162 testType: serverTest,
5163 name: "TicketSessionIDLength-32-" + ver.name,
5164 config: Config{
5165 MaxVersion: ver.version,
5166 Bugs: ProtocolBugs{
5167 TicketSessionIDLength: 32,
5168 },
5169 },
5170 resumeSession: true,
5171 })
5172 testCases = append(testCases, testCase{
5173 testType: serverTest,
5174 name: "TicketSessionIDLength-33-" + ver.name,
5175 config: Config{
5176 MaxVersion: ver.version,
5177 Bugs: ProtocolBugs{
5178 TicketSessionIDLength: 33,
David Benjamin97d17d92016-07-14 16:12:00 -04005179 },
5180 },
5181 resumeSession: true,
5182 shouldFail: true,
David Benjamind4c349b2017-02-09 14:07:17 -05005183 // The maximum session ID length is 32.
David Benjamin97d17d92016-07-14 16:12:00 -04005184 expectedError: ":DECODE_ERROR:",
5185 })
5186 }
5187
5188 // Basic DTLS-SRTP tests. Include fake profiles to ensure they
5189 // are ignored.
5190 if ver.hasDTLS {
5191 testCases = append(testCases, testCase{
5192 protocol: dtls,
5193 name: "SRTP-Client-" + ver.name,
5194 config: Config{
5195 MaxVersion: ver.version,
5196 SRTPProtectionProfiles: []uint16{40, SRTP_AES128_CM_HMAC_SHA1_80, 42},
5197 },
5198 flags: []string{
5199 "-srtp-profiles",
5200 "SRTP_AES128_CM_SHA1_80:SRTP_AES128_CM_SHA1_32",
5201 },
5202 expectedSRTPProtectionProfile: SRTP_AES128_CM_HMAC_SHA1_80,
5203 })
5204 testCases = append(testCases, testCase{
5205 protocol: dtls,
5206 testType: serverTest,
5207 name: "SRTP-Server-" + ver.name,
5208 config: Config{
5209 MaxVersion: ver.version,
5210 SRTPProtectionProfiles: []uint16{40, SRTP_AES128_CM_HMAC_SHA1_80, 42},
5211 },
5212 flags: []string{
5213 "-srtp-profiles",
5214 "SRTP_AES128_CM_SHA1_80:SRTP_AES128_CM_SHA1_32",
5215 },
5216 expectedSRTPProtectionProfile: SRTP_AES128_CM_HMAC_SHA1_80,
5217 })
5218 // Test that the MKI is ignored.
5219 testCases = append(testCases, testCase{
5220 protocol: dtls,
5221 testType: serverTest,
5222 name: "SRTP-Server-IgnoreMKI-" + ver.name,
5223 config: Config{
5224 MaxVersion: ver.version,
5225 SRTPProtectionProfiles: []uint16{SRTP_AES128_CM_HMAC_SHA1_80},
5226 Bugs: ProtocolBugs{
5227 SRTPMasterKeyIdentifer: "bogus",
5228 },
5229 },
5230 flags: []string{
5231 "-srtp-profiles",
5232 "SRTP_AES128_CM_SHA1_80:SRTP_AES128_CM_SHA1_32",
5233 },
5234 expectedSRTPProtectionProfile: SRTP_AES128_CM_HMAC_SHA1_80,
5235 })
5236 // Test that SRTP isn't negotiated on the server if there were
5237 // no matching profiles.
5238 testCases = append(testCases, testCase{
5239 protocol: dtls,
5240 testType: serverTest,
5241 name: "SRTP-Server-NoMatch-" + ver.name,
5242 config: Config{
5243 MaxVersion: ver.version,
5244 SRTPProtectionProfiles: []uint16{100, 101, 102},
5245 },
5246 flags: []string{
5247 "-srtp-profiles",
5248 "SRTP_AES128_CM_SHA1_80:SRTP_AES128_CM_SHA1_32",
5249 },
5250 expectedSRTPProtectionProfile: 0,
5251 })
5252 // Test that the server returning an invalid SRTP profile is
5253 // flagged as an error by the client.
5254 testCases = append(testCases, testCase{
5255 protocol: dtls,
5256 name: "SRTP-Client-NoMatch-" + ver.name,
5257 config: Config{
5258 MaxVersion: ver.version,
5259 Bugs: ProtocolBugs{
5260 SendSRTPProtectionProfile: SRTP_AES128_CM_HMAC_SHA1_32,
5261 },
5262 },
5263 flags: []string{
5264 "-srtp-profiles",
5265 "SRTP_AES128_CM_SHA1_80",
5266 },
5267 shouldFail: true,
5268 expectedError: ":BAD_SRTP_PROTECTION_PROFILE_LIST:",
5269 })
5270 }
5271
5272 // Test SCT list.
5273 testCases = append(testCases, testCase{
5274 name: "SignedCertificateTimestampList-Client-" + ver.name,
5275 testType: clientTest,
5276 config: Config{
5277 MaxVersion: ver.version,
David Benjamin76c2efc2015-08-31 14:24:29 -04005278 },
David Benjamin97d17d92016-07-14 16:12:00 -04005279 flags: []string{
5280 "-enable-signed-cert-timestamps",
5281 "-expect-signed-cert-timestamps",
5282 base64.StdEncoding.EncodeToString(testSCTList),
Adam Langley38311732014-10-16 19:04:35 -07005283 },
Steven Valdez4aa154e2016-07-29 14:32:55 -04005284 resumeSession: true,
David Benjamin97d17d92016-07-14 16:12:00 -04005285 })
David Benjamindaa88502016-10-04 16:32:16 -04005286
Adam Langleycfa08c32016-11-17 13:21:27 -08005287 var differentSCTList []byte
5288 differentSCTList = append(differentSCTList, testSCTList...)
5289 differentSCTList[len(differentSCTList)-1] ^= 1
5290
David Benjamindaa88502016-10-04 16:32:16 -04005291 // The SCT extension did not specify that it must only be sent on resumption as it
5292 // should have, so test that we tolerate but ignore it.
David Benjamin97d17d92016-07-14 16:12:00 -04005293 testCases = append(testCases, testCase{
5294 name: "SendSCTListOnResume-" + ver.name,
5295 config: Config{
5296 MaxVersion: ver.version,
5297 Bugs: ProtocolBugs{
Adam Langleycfa08c32016-11-17 13:21:27 -08005298 SendSCTListOnResume: differentSCTList,
David Benjamin97d17d92016-07-14 16:12:00 -04005299 },
David Benjamind98452d2015-06-16 14:16:23 -04005300 },
David Benjamin97d17d92016-07-14 16:12:00 -04005301 flags: []string{
5302 "-enable-signed-cert-timestamps",
5303 "-expect-signed-cert-timestamps",
5304 base64.StdEncoding.EncodeToString(testSCTList),
Adam Langley38311732014-10-16 19:04:35 -07005305 },
Steven Valdez4aa154e2016-07-29 14:32:55 -04005306 resumeSession: true,
David Benjamin97d17d92016-07-14 16:12:00 -04005307 })
David Benjamindaa88502016-10-04 16:32:16 -04005308
David Benjamin97d17d92016-07-14 16:12:00 -04005309 testCases = append(testCases, testCase{
5310 name: "SignedCertificateTimestampList-Server-" + ver.name,
5311 testType: serverTest,
5312 config: Config{
5313 MaxVersion: ver.version,
David Benjaminca6c8262014-11-15 19:06:08 -05005314 },
David Benjamin97d17d92016-07-14 16:12:00 -04005315 flags: []string{
5316 "-signed-cert-timestamps",
5317 base64.StdEncoding.EncodeToString(testSCTList),
David Benjaminca6c8262014-11-15 19:06:08 -05005318 },
David Benjamin97d17d92016-07-14 16:12:00 -04005319 expectedSCTList: testSCTList,
Steven Valdez4aa154e2016-07-29 14:32:55 -04005320 resumeSession: true,
David Benjamin97d17d92016-07-14 16:12:00 -04005321 })
David Benjamin53210cb2016-11-16 09:01:48 +09005322
Adam Langleycfa08c32016-11-17 13:21:27 -08005323 emptySCTListCert := *testCerts[0].cert
5324 emptySCTListCert.SignedCertificateTimestampList = []byte{0, 0}
5325
5326 // Test empty SCT list.
5327 testCases = append(testCases, testCase{
5328 name: "SignedCertificateTimestampListEmpty-Client-" + ver.name,
5329 testType: clientTest,
5330 config: Config{
5331 MaxVersion: ver.version,
5332 Certificates: []Certificate{emptySCTListCert},
5333 },
5334 flags: []string{
5335 "-enable-signed-cert-timestamps",
5336 },
5337 shouldFail: true,
5338 expectedError: ":ERROR_PARSING_EXTENSION:",
5339 })
5340
5341 emptySCTCert := *testCerts[0].cert
5342 emptySCTCert.SignedCertificateTimestampList = []byte{0, 6, 0, 2, 1, 2, 0, 0}
5343
5344 // Test empty SCT in non-empty list.
5345 testCases = append(testCases, testCase{
5346 name: "SignedCertificateTimestampListEmptySCT-Client-" + ver.name,
5347 testType: clientTest,
5348 config: Config{
5349 MaxVersion: ver.version,
5350 Certificates: []Certificate{emptySCTCert},
5351 },
5352 flags: []string{
5353 "-enable-signed-cert-timestamps",
5354 },
5355 shouldFail: true,
5356 expectedError: ":ERROR_PARSING_EXTENSION:",
5357 })
5358
David Benjamin53210cb2016-11-16 09:01:48 +09005359 // Test that certificate-related extensions are not sent unsolicited.
5360 testCases = append(testCases, testCase{
5361 testType: serverTest,
5362 name: "UnsolicitedCertificateExtensions-" + ver.name,
5363 config: Config{
5364 MaxVersion: ver.version,
5365 Bugs: ProtocolBugs{
5366 NoOCSPStapling: true,
5367 NoSignedCertificateTimestamps: true,
5368 },
5369 },
5370 flags: []string{
5371 "-ocsp-response",
5372 base64.StdEncoding.EncodeToString(testOCSPResponse),
5373 "-signed-cert-timestamps",
5374 base64.StdEncoding.EncodeToString(testSCTList),
5375 },
5376 })
David Benjamin97d17d92016-07-14 16:12:00 -04005377 }
David Benjamin4c3ddf72016-06-29 18:13:53 -04005378
Paul Lietar4fac72e2015-09-09 13:44:55 +01005379 testCases = append(testCases, testCase{
Adam Langley33ad2b52015-07-20 17:43:53 -07005380 testType: clientTest,
5381 name: "ClientHelloPadding",
5382 config: Config{
5383 Bugs: ProtocolBugs{
5384 RequireClientHelloSize: 512,
5385 },
5386 },
5387 // This hostname just needs to be long enough to push the
5388 // ClientHello into F5's danger zone between 256 and 511 bytes
5389 // long.
5390 flags: []string{"-host-name", "01234567890123456789012345678901234567890123456789012345678901234567890123456789.com"},
5391 })
David Benjaminc7ce9772015-10-09 19:32:41 -04005392
5393 // Extensions should not function in SSL 3.0.
5394 testCases = append(testCases, testCase{
5395 testType: serverTest,
5396 name: "SSLv3Extensions-NoALPN",
5397 config: Config{
5398 MaxVersion: VersionSSL30,
5399 NextProtos: []string{"foo", "bar", "baz"},
5400 },
5401 flags: []string{
5402 "-select-alpn", "foo",
5403 },
5404 expectNoNextProto: true,
5405 })
5406
5407 // Test session tickets separately as they follow a different codepath.
5408 testCases = append(testCases, testCase{
5409 testType: serverTest,
5410 name: "SSLv3Extensions-NoTickets",
5411 config: Config{
5412 MaxVersion: VersionSSL30,
5413 Bugs: ProtocolBugs{
5414 // Historically, session tickets in SSL 3.0
5415 // failed in different ways depending on whether
5416 // the client supported renegotiation_info.
5417 NoRenegotiationInfo: true,
5418 },
5419 },
5420 resumeSession: true,
5421 })
5422 testCases = append(testCases, testCase{
5423 testType: serverTest,
5424 name: "SSLv3Extensions-NoTickets2",
5425 config: Config{
5426 MaxVersion: VersionSSL30,
5427 },
5428 resumeSession: true,
5429 })
5430
5431 // But SSL 3.0 does send and process renegotiation_info.
5432 testCases = append(testCases, testCase{
5433 testType: serverTest,
5434 name: "SSLv3Extensions-RenegotiationInfo",
5435 config: Config{
5436 MaxVersion: VersionSSL30,
5437 Bugs: ProtocolBugs{
5438 RequireRenegotiationInfo: true,
5439 },
5440 },
David Benjamind2610042017-01-03 10:49:28 -05005441 flags: []string{"-expect-secure-renegotiation"},
David Benjaminc7ce9772015-10-09 19:32:41 -04005442 })
5443 testCases = append(testCases, testCase{
5444 testType: serverTest,
5445 name: "SSLv3Extensions-RenegotiationInfo-SCSV",
5446 config: Config{
5447 MaxVersion: VersionSSL30,
5448 Bugs: ProtocolBugs{
5449 NoRenegotiationInfo: true,
5450 SendRenegotiationSCSV: true,
5451 RequireRenegotiationInfo: true,
5452 },
5453 },
David Benjamind2610042017-01-03 10:49:28 -05005454 flags: []string{"-expect-secure-renegotiation"},
David Benjaminc7ce9772015-10-09 19:32:41 -04005455 })
Steven Valdez143e8b32016-07-11 13:19:03 -04005456
5457 // Test that illegal extensions in TLS 1.3 are rejected by the client if
5458 // in ServerHello.
5459 testCases = append(testCases, testCase{
5460 name: "NPN-Forbidden-TLS13",
5461 config: Config{
5462 MaxVersion: VersionTLS13,
5463 NextProtos: []string{"foo"},
5464 Bugs: ProtocolBugs{
5465 NegotiateNPNAtAllVersions: true,
5466 },
5467 },
5468 flags: []string{"-select-next-proto", "foo"},
5469 shouldFail: true,
5470 expectedError: ":ERROR_PARSING_EXTENSION:",
5471 })
5472 testCases = append(testCases, testCase{
5473 name: "EMS-Forbidden-TLS13",
5474 config: Config{
5475 MaxVersion: VersionTLS13,
5476 Bugs: ProtocolBugs{
5477 NegotiateEMSAtAllVersions: true,
5478 },
5479 },
5480 shouldFail: true,
5481 expectedError: ":ERROR_PARSING_EXTENSION:",
5482 })
5483 testCases = append(testCases, testCase{
5484 name: "RenegotiationInfo-Forbidden-TLS13",
5485 config: Config{
5486 MaxVersion: VersionTLS13,
5487 Bugs: ProtocolBugs{
5488 NegotiateRenegotiationInfoAtAllVersions: true,
5489 },
5490 },
5491 shouldFail: true,
5492 expectedError: ":ERROR_PARSING_EXTENSION:",
5493 })
5494 testCases = append(testCases, testCase{
Steven Valdez143e8b32016-07-11 13:19:03 -04005495 name: "Ticket-Forbidden-TLS13",
5496 config: Config{
5497 MaxVersion: VersionTLS12,
5498 },
5499 resumeConfig: &Config{
5500 MaxVersion: VersionTLS13,
5501 Bugs: ProtocolBugs{
5502 AdvertiseTicketExtension: true,
5503 },
5504 },
5505 resumeSession: true,
5506 shouldFail: true,
5507 expectedError: ":ERROR_PARSING_EXTENSION:",
5508 })
5509
5510 // Test that illegal extensions in TLS 1.3 are declined by the server if
5511 // offered in ClientHello. The runner's server will fail if this occurs,
5512 // so we exercise the offering path. (EMS and Renegotiation Info are
5513 // implicit in every test.)
5514 testCases = append(testCases, testCase{
5515 testType: serverTest,
David Benjamin73647192016-09-22 16:24:04 -04005516 name: "NPN-Declined-TLS13",
Steven Valdez143e8b32016-07-11 13:19:03 -04005517 config: Config{
5518 MaxVersion: VersionTLS13,
5519 NextProtos: []string{"bar"},
5520 },
5521 flags: []string{"-advertise-npn", "\x03foo\x03bar\x03baz"},
5522 })
David Benjamin196df5b2016-09-21 16:23:27 -04005523
David Benjamindaa88502016-10-04 16:32:16 -04005524 // OpenSSL sends the status_request extension on resumption in TLS 1.2. Test that this is
5525 // tolerated.
5526 testCases = append(testCases, testCase{
5527 name: "SendOCSPResponseOnResume-TLS12",
5528 config: Config{
5529 MaxVersion: VersionTLS12,
5530 Bugs: ProtocolBugs{
5531 SendOCSPResponseOnResume: []byte("bogus"),
5532 },
5533 },
5534 flags: []string{
5535 "-enable-ocsp-stapling",
5536 "-expect-ocsp-response",
5537 base64.StdEncoding.EncodeToString(testOCSPResponse),
5538 },
5539 resumeSession: true,
5540 })
5541
David Benjamindaa88502016-10-04 16:32:16 -04005542 testCases = append(testCases, testCase{
Steven Valdeza833c352016-11-01 13:39:36 -04005543 name: "SendUnsolicitedOCSPOnCertificate-TLS13",
David Benjamindaa88502016-10-04 16:32:16 -04005544 config: Config{
5545 MaxVersion: VersionTLS13,
5546 Bugs: ProtocolBugs{
Steven Valdeza833c352016-11-01 13:39:36 -04005547 SendExtensionOnCertificate: testOCSPExtension,
5548 },
5549 },
5550 shouldFail: true,
5551 expectedError: ":UNEXPECTED_EXTENSION:",
5552 })
5553
5554 testCases = append(testCases, testCase{
5555 name: "SendUnsolicitedSCTOnCertificate-TLS13",
5556 config: Config{
5557 MaxVersion: VersionTLS13,
5558 Bugs: ProtocolBugs{
5559 SendExtensionOnCertificate: testSCTExtension,
5560 },
5561 },
5562 shouldFail: true,
5563 expectedError: ":UNEXPECTED_EXTENSION:",
5564 })
5565
5566 // Test that extensions on client certificates are never accepted.
5567 testCases = append(testCases, testCase{
5568 name: "SendExtensionOnClientCertificate-TLS13",
5569 testType: serverTest,
5570 config: Config{
5571 MaxVersion: VersionTLS13,
5572 Certificates: []Certificate{rsaCertificate},
5573 Bugs: ProtocolBugs{
5574 SendExtensionOnCertificate: testOCSPExtension,
5575 },
5576 },
5577 flags: []string{
5578 "-enable-ocsp-stapling",
5579 "-require-any-client-certificate",
5580 },
5581 shouldFail: true,
5582 expectedError: ":UNEXPECTED_EXTENSION:",
5583 })
5584
5585 testCases = append(testCases, testCase{
5586 name: "SendUnknownExtensionOnCertificate-TLS13",
5587 config: Config{
5588 MaxVersion: VersionTLS13,
5589 Bugs: ProtocolBugs{
5590 SendExtensionOnCertificate: []byte{0x00, 0x7f, 0, 0},
5591 },
5592 },
5593 shouldFail: true,
5594 expectedError: ":UNEXPECTED_EXTENSION:",
5595 })
5596
Adam Langleycfa08c32016-11-17 13:21:27 -08005597 var differentSCTList []byte
5598 differentSCTList = append(differentSCTList, testSCTList...)
5599 differentSCTList[len(differentSCTList)-1] ^= 1
5600
Steven Valdeza833c352016-11-01 13:39:36 -04005601 // Test that extensions on intermediates are allowed but ignored.
5602 testCases = append(testCases, testCase{
5603 name: "IgnoreExtensionsOnIntermediates-TLS13",
5604 config: Config{
5605 MaxVersion: VersionTLS13,
5606 Certificates: []Certificate{rsaChainCertificate},
5607 Bugs: ProtocolBugs{
5608 // Send different values on the intermediate. This tests
5609 // the intermediate's extensions do not override the
5610 // leaf's.
5611 SendOCSPOnIntermediates: []byte{1, 3, 3, 7},
Adam Langleycfa08c32016-11-17 13:21:27 -08005612 SendSCTOnIntermediates: differentSCTList,
David Benjamindaa88502016-10-04 16:32:16 -04005613 },
5614 },
5615 flags: []string{
5616 "-enable-ocsp-stapling",
5617 "-expect-ocsp-response",
5618 base64.StdEncoding.EncodeToString(testOCSPResponse),
Steven Valdeza833c352016-11-01 13:39:36 -04005619 "-enable-signed-cert-timestamps",
5620 "-expect-signed-cert-timestamps",
5621 base64.StdEncoding.EncodeToString(testSCTList),
5622 },
5623 resumeSession: true,
5624 })
5625
5626 // Test that extensions are not sent on intermediates when configured
5627 // only for a leaf.
5628 testCases = append(testCases, testCase{
5629 testType: serverTest,
5630 name: "SendNoExtensionsOnIntermediate-TLS13",
5631 config: Config{
5632 MaxVersion: VersionTLS13,
5633 Bugs: ProtocolBugs{
5634 ExpectNoExtensionsOnIntermediate: true,
5635 },
5636 },
5637 flags: []string{
5638 "-cert-file", path.Join(*resourceDir, rsaChainCertificateFile),
5639 "-key-file", path.Join(*resourceDir, rsaChainKeyFile),
5640 "-ocsp-response",
5641 base64.StdEncoding.EncodeToString(testOCSPResponse),
5642 "-signed-cert-timestamps",
5643 base64.StdEncoding.EncodeToString(testSCTList),
5644 },
5645 })
5646
5647 // Test that extensions are not sent on client certificates.
5648 testCases = append(testCases, testCase{
5649 name: "SendNoClientCertificateExtensions-TLS13",
5650 config: Config{
5651 MaxVersion: VersionTLS13,
5652 ClientAuth: RequireAnyClientCert,
5653 },
5654 flags: []string{
5655 "-cert-file", path.Join(*resourceDir, rsaCertificateFile),
5656 "-key-file", path.Join(*resourceDir, rsaKeyFile),
5657 "-ocsp-response",
5658 base64.StdEncoding.EncodeToString(testOCSPResponse),
5659 "-signed-cert-timestamps",
5660 base64.StdEncoding.EncodeToString(testSCTList),
5661 },
5662 })
5663
5664 testCases = append(testCases, testCase{
5665 name: "SendDuplicateExtensionsOnCerts-TLS13",
5666 config: Config{
5667 MaxVersion: VersionTLS13,
5668 Bugs: ProtocolBugs{
5669 SendDuplicateCertExtensions: true,
5670 },
5671 },
5672 flags: []string{
5673 "-enable-ocsp-stapling",
5674 "-enable-signed-cert-timestamps",
David Benjamindaa88502016-10-04 16:32:16 -04005675 },
5676 resumeSession: true,
5677 shouldFail: true,
Steven Valdeza833c352016-11-01 13:39:36 -04005678 expectedError: ":DUPLICATE_EXTENSION:",
David Benjamindaa88502016-10-04 16:32:16 -04005679 })
Adam Langley9b885c52016-11-18 14:21:03 -08005680
5681 testCases = append(testCases, testCase{
5682 name: "SignedCertificateTimestampListInvalid-Server",
5683 testType: serverTest,
5684 flags: []string{
5685 "-signed-cert-timestamps",
5686 base64.StdEncoding.EncodeToString([]byte{0, 0}),
5687 },
Steven Valdeza4ee74d2016-11-29 13:36:45 -05005688 shouldFail: true,
Adam Langley9b885c52016-11-18 14:21:03 -08005689 expectedError: ":INVALID_SCT_LIST:",
5690 })
David Benjamine78bfde2014-09-06 12:45:15 -04005691}
5692
David Benjamin01fe8202014-09-24 15:21:44 -04005693func addResumptionVersionTests() {
David Benjamin01fe8202014-09-24 15:21:44 -04005694 for _, sessionVers := range tlsVersions {
David Benjamin01fe8202014-09-24 15:21:44 -04005695 for _, resumeVers := range tlsVersions {
Steven Valdez803c77a2016-09-06 14:13:43 -04005696 // SSL 3.0 does not have tickets and TLS 1.3 does not
5697 // have session IDs, so skip their cross-resumption
5698 // tests.
5699 if (sessionVers.version >= VersionTLS13 && resumeVers.version == VersionSSL30) ||
5700 (resumeVers.version >= VersionTLS13 && sessionVers.version == VersionSSL30) {
5701 continue
Nick Harper1fd39d82016-06-14 18:14:35 -07005702 }
5703
David Benjamin8b8c0062014-11-23 02:47:52 -05005704 protocols := []protocol{tls}
5705 if sessionVers.hasDTLS && resumeVers.hasDTLS {
5706 protocols = append(protocols, dtls)
David Benjaminbdf5e722014-11-11 00:52:15 -05005707 }
David Benjamin8b8c0062014-11-23 02:47:52 -05005708 for _, protocol := range protocols {
5709 suffix := "-" + sessionVers.name + "-" + resumeVers.name
5710 if protocol == dtls {
5711 suffix += "-DTLS"
5712 }
5713
David Benjaminece3de92015-03-16 18:02:20 -04005714 if sessionVers.version == resumeVers.version {
5715 testCases = append(testCases, testCase{
5716 protocol: protocol,
5717 name: "Resume-Client" + suffix,
5718 resumeSession: true,
5719 config: Config{
Steven Valdez803c77a2016-09-06 14:13:43 -04005720 MaxVersion: sessionVers.version,
David Benjamin405da482016-08-08 17:25:07 -04005721 Bugs: ProtocolBugs{
5722 ExpectNoTLS12Session: sessionVers.version >= VersionTLS13,
5723 ExpectNoTLS13PSK: sessionVers.version < VersionTLS13,
5724 },
David Benjamin8b8c0062014-11-23 02:47:52 -05005725 },
David Benjaminece3de92015-03-16 18:02:20 -04005726 expectedVersion: sessionVers.version,
5727 expectedResumeVersion: resumeVers.version,
5728 })
5729 } else {
David Benjamin405da482016-08-08 17:25:07 -04005730 error := ":OLD_SESSION_VERSION_NOT_RETURNED:"
5731
5732 // Offering a TLS 1.3 session sends an empty session ID, so
5733 // there is no way to convince a non-lookahead client the
5734 // session was resumed. It will appear to the client that a
5735 // stray ChangeCipherSpec was sent.
5736 if resumeVers.version < VersionTLS13 && sessionVers.version >= VersionTLS13 {
5737 error = ":UNEXPECTED_RECORD:"
Steven Valdez4aa154e2016-07-29 14:32:55 -04005738 }
5739
David Benjaminece3de92015-03-16 18:02:20 -04005740 testCases = append(testCases, testCase{
5741 protocol: protocol,
5742 name: "Resume-Client-Mismatch" + suffix,
5743 resumeSession: true,
5744 config: Config{
Steven Valdez803c77a2016-09-06 14:13:43 -04005745 MaxVersion: sessionVers.version,
David Benjamin8b8c0062014-11-23 02:47:52 -05005746 },
David Benjaminece3de92015-03-16 18:02:20 -04005747 expectedVersion: sessionVers.version,
5748 resumeConfig: &Config{
Steven Valdez803c77a2016-09-06 14:13:43 -04005749 MaxVersion: resumeVers.version,
David Benjaminece3de92015-03-16 18:02:20 -04005750 Bugs: ProtocolBugs{
David Benjamin405da482016-08-08 17:25:07 -04005751 AcceptAnySession: true,
David Benjaminece3de92015-03-16 18:02:20 -04005752 },
5753 },
5754 expectedResumeVersion: resumeVers.version,
5755 shouldFail: true,
Steven Valdez4aa154e2016-07-29 14:32:55 -04005756 expectedError: error,
David Benjaminece3de92015-03-16 18:02:20 -04005757 })
5758 }
David Benjamin8b8c0062014-11-23 02:47:52 -05005759
5760 testCases = append(testCases, testCase{
5761 protocol: protocol,
5762 name: "Resume-Client-NoResume" + suffix,
David Benjamin8b8c0062014-11-23 02:47:52 -05005763 resumeSession: true,
5764 config: Config{
Steven Valdez803c77a2016-09-06 14:13:43 -04005765 MaxVersion: sessionVers.version,
David Benjamin8b8c0062014-11-23 02:47:52 -05005766 },
5767 expectedVersion: sessionVers.version,
5768 resumeConfig: &Config{
Steven Valdez803c77a2016-09-06 14:13:43 -04005769 MaxVersion: resumeVers.version,
David Benjamin8b8c0062014-11-23 02:47:52 -05005770 },
5771 newSessionsOnResume: true,
Adam Langleyb0eef0a2015-06-02 10:47:39 -07005772 expectResumeRejected: true,
David Benjamin8b8c0062014-11-23 02:47:52 -05005773 expectedResumeVersion: resumeVers.version,
5774 })
5775
David Benjamin8b8c0062014-11-23 02:47:52 -05005776 testCases = append(testCases, testCase{
5777 protocol: protocol,
5778 testType: serverTest,
5779 name: "Resume-Server" + suffix,
David Benjamin8b8c0062014-11-23 02:47:52 -05005780 resumeSession: true,
5781 config: Config{
Steven Valdez803c77a2016-09-06 14:13:43 -04005782 MaxVersion: sessionVers.version,
David Benjamin8b8c0062014-11-23 02:47:52 -05005783 },
Adam Langleyb0eef0a2015-06-02 10:47:39 -07005784 expectedVersion: sessionVers.version,
5785 expectResumeRejected: sessionVers.version != resumeVers.version,
David Benjamin8b8c0062014-11-23 02:47:52 -05005786 resumeConfig: &Config{
Steven Valdez803c77a2016-09-06 14:13:43 -04005787 MaxVersion: resumeVers.version,
David Benjamin405da482016-08-08 17:25:07 -04005788 Bugs: ProtocolBugs{
5789 SendBothTickets: true,
5790 },
David Benjamin8b8c0062014-11-23 02:47:52 -05005791 },
5792 expectedResumeVersion: resumeVers.version,
5793 })
5794 }
David Benjamin01fe8202014-09-24 15:21:44 -04005795 }
5796 }
David Benjaminece3de92015-03-16 18:02:20 -04005797
David Benjamin4199b0d2016-11-01 13:58:25 -04005798 // Make sure shim ticket mutations are functional.
Steven Valdezb6b6ff32016-10-26 11:56:35 -04005799 testCases = append(testCases, testCase{
5800 testType: serverTest,
David Benjamin4199b0d2016-11-01 13:58:25 -04005801 name: "ShimTicketRewritable",
5802 resumeSession: true,
5803 config: Config{
5804 MaxVersion: VersionTLS12,
5805 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
5806 Bugs: ProtocolBugs{
5807 FilterTicket: func(in []byte) ([]byte, error) {
5808 in, err := SetShimTicketVersion(in, VersionTLS12)
5809 if err != nil {
5810 return nil, err
5811 }
5812 return SetShimTicketCipherSuite(in, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256)
5813 },
5814 },
5815 },
5816 flags: []string{
5817 "-ticket-key",
5818 base64.StdEncoding.EncodeToString(TestShimTicketKey),
5819 },
5820 })
5821
5822 // Resumptions are declined if the version does not match.
5823 testCases = append(testCases, testCase{
5824 testType: serverTest,
5825 name: "Resume-Server-DeclineCrossVersion",
Steven Valdezb6b6ff32016-10-26 11:56:35 -04005826 resumeSession: true,
5827 config: Config{
5828 MaxVersion: VersionTLS12,
David Benjamin4199b0d2016-11-01 13:58:25 -04005829 Bugs: ProtocolBugs{
David Benjamin75f99142016-11-12 12:36:06 +09005830 ExpectNewTicket: true,
David Benjamin4199b0d2016-11-01 13:58:25 -04005831 FilterTicket: func(in []byte) ([]byte, error) {
5832 return SetShimTicketVersion(in, VersionTLS13)
5833 },
5834 },
Steven Valdezb6b6ff32016-10-26 11:56:35 -04005835 },
David Benjamin4199b0d2016-11-01 13:58:25 -04005836 flags: []string{
5837 "-ticket-key",
5838 base64.StdEncoding.EncodeToString(TestShimTicketKey),
5839 },
Steven Valdezb6b6ff32016-10-26 11:56:35 -04005840 expectResumeRejected: true,
5841 })
5842
5843 testCases = append(testCases, testCase{
5844 testType: serverTest,
David Benjamin4199b0d2016-11-01 13:58:25 -04005845 name: "Resume-Server-DeclineCrossVersion-TLS13",
Steven Valdezb6b6ff32016-10-26 11:56:35 -04005846 resumeSession: true,
5847 config: Config{
5848 MaxVersion: VersionTLS13,
David Benjamin4199b0d2016-11-01 13:58:25 -04005849 Bugs: ProtocolBugs{
5850 FilterTicket: func(in []byte) ([]byte, error) {
5851 return SetShimTicketVersion(in, VersionTLS12)
5852 },
5853 },
Steven Valdezb6b6ff32016-10-26 11:56:35 -04005854 },
David Benjamin4199b0d2016-11-01 13:58:25 -04005855 flags: []string{
5856 "-ticket-key",
5857 base64.StdEncoding.EncodeToString(TestShimTicketKey),
5858 },
Steven Valdezb6b6ff32016-10-26 11:56:35 -04005859 expectResumeRejected: true,
5860 })
5861
David Benjamin4199b0d2016-11-01 13:58:25 -04005862 // Resumptions are declined if the cipher is invalid or disabled.
5863 testCases = append(testCases, testCase{
5864 testType: serverTest,
5865 name: "Resume-Server-DeclineBadCipher",
5866 resumeSession: true,
5867 config: Config{
5868 MaxVersion: VersionTLS12,
5869 Bugs: ProtocolBugs{
David Benjamin75f99142016-11-12 12:36:06 +09005870 ExpectNewTicket: true,
David Benjamin4199b0d2016-11-01 13:58:25 -04005871 FilterTicket: func(in []byte) ([]byte, error) {
5872 return SetShimTicketCipherSuite(in, TLS_AES_128_GCM_SHA256)
5873 },
5874 },
5875 },
5876 flags: []string{
5877 "-ticket-key",
5878 base64.StdEncoding.EncodeToString(TestShimTicketKey),
5879 },
5880 expectResumeRejected: true,
5881 })
5882
5883 testCases = append(testCases, testCase{
5884 testType: serverTest,
5885 name: "Resume-Server-DeclineBadCipher-2",
5886 resumeSession: true,
5887 config: Config{
5888 MaxVersion: VersionTLS12,
5889 Bugs: ProtocolBugs{
David Benjamin75f99142016-11-12 12:36:06 +09005890 ExpectNewTicket: true,
David Benjamin4199b0d2016-11-01 13:58:25 -04005891 FilterTicket: func(in []byte) ([]byte, error) {
5892 return SetShimTicketCipherSuite(in, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384)
5893 },
5894 },
5895 },
5896 flags: []string{
5897 "-cipher", "AES128",
5898 "-ticket-key",
5899 base64.StdEncoding.EncodeToString(TestShimTicketKey),
5900 },
5901 expectResumeRejected: true,
5902 })
5903
David Benjaminf01f42a2016-11-16 19:05:33 +09005904 // Sessions are not resumed if they do not use the preferred cipher.
5905 testCases = append(testCases, testCase{
5906 testType: serverTest,
5907 name: "Resume-Server-CipherNotPreferred",
5908 resumeSession: true,
5909 config: Config{
5910 MaxVersion: VersionTLS12,
5911 Bugs: ProtocolBugs{
5912 ExpectNewTicket: true,
5913 FilterTicket: func(in []byte) ([]byte, error) {
5914 return SetShimTicketCipherSuite(in, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA)
5915 },
5916 },
5917 },
5918 flags: []string{
5919 "-ticket-key",
5920 base64.StdEncoding.EncodeToString(TestShimTicketKey),
5921 },
5922 shouldFail: false,
5923 expectResumeRejected: true,
5924 })
5925
5926 // TLS 1.3 allows sessions to be resumed at a different cipher if their
5927 // PRF hashes match, but BoringSSL will always decline such resumptions.
5928 testCases = append(testCases, testCase{
5929 testType: serverTest,
5930 name: "Resume-Server-CipherNotPreferred-TLS13",
5931 resumeSession: true,
5932 config: Config{
5933 MaxVersion: VersionTLS13,
5934 CipherSuites: []uint16{TLS_CHACHA20_POLY1305_SHA256, TLS_AES_128_GCM_SHA256},
5935 Bugs: ProtocolBugs{
5936 FilterTicket: func(in []byte) ([]byte, error) {
5937 // If the client (runner) offers ChaCha20-Poly1305 first, the
5938 // server (shim) always prefers it. Switch it to AES-GCM.
5939 return SetShimTicketCipherSuite(in, TLS_AES_128_GCM_SHA256)
5940 },
5941 },
5942 },
5943 flags: []string{
5944 "-ticket-key",
5945 base64.StdEncoding.EncodeToString(TestShimTicketKey),
5946 },
5947 shouldFail: false,
5948 expectResumeRejected: true,
5949 })
5950
5951 // Sessions may not be resumed if they contain another version's cipher.
David Benjamin4199b0d2016-11-01 13:58:25 -04005952 testCases = append(testCases, testCase{
5953 testType: serverTest,
5954 name: "Resume-Server-DeclineBadCipher-TLS13",
5955 resumeSession: true,
5956 config: Config{
5957 MaxVersion: VersionTLS13,
5958 Bugs: ProtocolBugs{
5959 FilterTicket: func(in []byte) ([]byte, error) {
5960 return SetShimTicketCipherSuite(in, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256)
5961 },
5962 },
5963 },
5964 flags: []string{
5965 "-ticket-key",
5966 base64.StdEncoding.EncodeToString(TestShimTicketKey),
5967 },
5968 expectResumeRejected: true,
5969 })
5970
David Benjaminf01f42a2016-11-16 19:05:33 +09005971 // If the client does not offer the cipher from the session, decline to
5972 // resume. Clients are forbidden from doing this, but BoringSSL selects
5973 // the cipher first, so we only decline.
David Benjamin75f99142016-11-12 12:36:06 +09005974 testCases = append(testCases, testCase{
5975 testType: serverTest,
5976 name: "Resume-Server-UnofferedCipher",
5977 resumeSession: true,
5978 config: Config{
5979 MaxVersion: VersionTLS12,
5980 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256},
5981 },
5982 resumeConfig: &Config{
5983 MaxVersion: VersionTLS12,
5984 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256},
5985 Bugs: ProtocolBugs{
5986 SendCipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
5987 },
5988 },
David Benjaminf01f42a2016-11-16 19:05:33 +09005989 expectResumeRejected: true,
David Benjamin75f99142016-11-12 12:36:06 +09005990 })
5991
David Benjaminf01f42a2016-11-16 19:05:33 +09005992 // In TLS 1.3, clients may advertise a cipher list which does not
5993 // include the selected cipher. Test that we tolerate this. Servers may
Steven Valdez2d850622017-01-11 11:34:52 -05005994 // resume at another cipher if the PRF matches and are not doing 0-RTT, but
5995 // BoringSSL will always decline.
David Benjamin75f99142016-11-12 12:36:06 +09005996 testCases = append(testCases, testCase{
5997 testType: serverTest,
5998 name: "Resume-Server-UnofferedCipher-TLS13",
5999 resumeSession: true,
6000 config: Config{
6001 MaxVersion: VersionTLS13,
6002 CipherSuites: []uint16{TLS_CHACHA20_POLY1305_SHA256},
6003 },
6004 resumeConfig: &Config{
6005 MaxVersion: VersionTLS13,
6006 CipherSuites: []uint16{TLS_CHACHA20_POLY1305_SHA256},
6007 Bugs: ProtocolBugs{
6008 SendCipherSuites: []uint16{TLS_AES_128_GCM_SHA256},
6009 },
6010 },
David Benjaminf01f42a2016-11-16 19:05:33 +09006011 expectResumeRejected: true,
David Benjamin75f99142016-11-12 12:36:06 +09006012 })
6013
David Benjamin4199b0d2016-11-01 13:58:25 -04006014 // Sessions may not be resumed at a different cipher.
David Benjaminece3de92015-03-16 18:02:20 -04006015 testCases = append(testCases, testCase{
6016 name: "Resume-Client-CipherMismatch",
6017 resumeSession: true,
6018 config: Config{
Nick Harper1fd39d82016-06-14 18:14:35 -07006019 MaxVersion: VersionTLS12,
David Benjaminece3de92015-03-16 18:02:20 -04006020 CipherSuites: []uint16{TLS_RSA_WITH_AES_128_GCM_SHA256},
6021 },
6022 resumeConfig: &Config{
Nick Harper1fd39d82016-06-14 18:14:35 -07006023 MaxVersion: VersionTLS12,
David Benjaminece3de92015-03-16 18:02:20 -04006024 CipherSuites: []uint16{TLS_RSA_WITH_AES_128_GCM_SHA256},
6025 Bugs: ProtocolBugs{
6026 SendCipherSuite: TLS_RSA_WITH_AES_128_CBC_SHA,
6027 },
6028 },
6029 shouldFail: true,
6030 expectedError: ":OLD_SESSION_CIPHER_NOT_RETURNED:",
6031 })
Steven Valdez4aa154e2016-07-29 14:32:55 -04006032
David Benjamine1cc35e2016-11-16 16:25:58 +09006033 // Session resumption in TLS 1.3 may change the cipher suite if the PRF
6034 // matches.
Steven Valdez4aa154e2016-07-29 14:32:55 -04006035 testCases = append(testCases, testCase{
6036 name: "Resume-Client-CipherMismatch-TLS13",
6037 resumeSession: true,
6038 config: Config{
6039 MaxVersion: VersionTLS13,
Steven Valdez803c77a2016-09-06 14:13:43 -04006040 CipherSuites: []uint16{TLS_AES_128_GCM_SHA256},
Steven Valdez4aa154e2016-07-29 14:32:55 -04006041 },
6042 resumeConfig: &Config{
6043 MaxVersion: VersionTLS13,
David Benjamine1cc35e2016-11-16 16:25:58 +09006044 CipherSuites: []uint16{TLS_CHACHA20_POLY1305_SHA256},
6045 },
6046 })
6047
6048 // Session resumption in TLS 1.3 is forbidden if the PRF does not match.
6049 testCases = append(testCases, testCase{
6050 name: "Resume-Client-PRFMismatch-TLS13",
6051 resumeSession: true,
6052 config: Config{
6053 MaxVersion: VersionTLS13,
6054 CipherSuites: []uint16{TLS_AES_128_GCM_SHA256},
6055 },
6056 resumeConfig: &Config{
6057 MaxVersion: VersionTLS13,
Steven Valdez803c77a2016-09-06 14:13:43 -04006058 CipherSuites: []uint16{TLS_AES_128_GCM_SHA256},
Steven Valdez4aa154e2016-07-29 14:32:55 -04006059 Bugs: ProtocolBugs{
Steven Valdez803c77a2016-09-06 14:13:43 -04006060 SendCipherSuite: TLS_AES_256_GCM_SHA384,
Steven Valdez4aa154e2016-07-29 14:32:55 -04006061 },
6062 },
6063 shouldFail: true,
David Benjamine1cc35e2016-11-16 16:25:58 +09006064 expectedError: ":OLD_SESSION_PRF_HASH_MISMATCH:",
Steven Valdez4aa154e2016-07-29 14:32:55 -04006065 })
Steven Valdeza833c352016-11-01 13:39:36 -04006066
6067 testCases = append(testCases, testCase{
6068 testType: serverTest,
6069 name: "Resume-Server-BinderWrongLength",
6070 resumeSession: true,
6071 config: Config{
6072 MaxVersion: VersionTLS13,
6073 Bugs: ProtocolBugs{
6074 SendShortPSKBinder: true,
6075 },
6076 },
6077 shouldFail: true,
6078 expectedLocalError: "remote error: error decrypting message",
6079 expectedError: ":DIGEST_CHECK_FAILED:",
6080 })
6081
6082 testCases = append(testCases, testCase{
6083 testType: serverTest,
6084 name: "Resume-Server-NoPSKBinder",
6085 resumeSession: true,
6086 config: Config{
6087 MaxVersion: VersionTLS13,
6088 Bugs: ProtocolBugs{
6089 SendNoPSKBinder: true,
6090 },
6091 },
6092 shouldFail: true,
6093 expectedLocalError: "remote error: error decoding message",
6094 expectedError: ":DECODE_ERROR:",
6095 })
6096
6097 testCases = append(testCases, testCase{
6098 testType: serverTest,
David Benjaminaedf3032016-12-01 16:47:56 -05006099 name: "Resume-Server-ExtraPSKBinder",
6100 resumeSession: true,
6101 config: Config{
6102 MaxVersion: VersionTLS13,
6103 Bugs: ProtocolBugs{
6104 SendExtraPSKBinder: true,
6105 },
6106 },
6107 shouldFail: true,
6108 expectedLocalError: "remote error: illegal parameter",
6109 expectedError: ":PSK_IDENTITY_BINDER_COUNT_MISMATCH:",
6110 })
6111
6112 testCases = append(testCases, testCase{
6113 testType: serverTest,
6114 name: "Resume-Server-ExtraIdentityNoBinder",
6115 resumeSession: true,
6116 config: Config{
6117 MaxVersion: VersionTLS13,
6118 Bugs: ProtocolBugs{
6119 ExtraPSKIdentity: true,
6120 },
6121 },
6122 shouldFail: true,
6123 expectedLocalError: "remote error: illegal parameter",
6124 expectedError: ":PSK_IDENTITY_BINDER_COUNT_MISMATCH:",
6125 })
6126
6127 testCases = append(testCases, testCase{
6128 testType: serverTest,
Steven Valdeza833c352016-11-01 13:39:36 -04006129 name: "Resume-Server-InvalidPSKBinder",
6130 resumeSession: true,
6131 config: Config{
6132 MaxVersion: VersionTLS13,
6133 Bugs: ProtocolBugs{
6134 SendInvalidPSKBinder: true,
6135 },
6136 },
6137 shouldFail: true,
6138 expectedLocalError: "remote error: error decrypting message",
6139 expectedError: ":DIGEST_CHECK_FAILED:",
6140 })
6141
6142 testCases = append(testCases, testCase{
6143 testType: serverTest,
6144 name: "Resume-Server-PSKBinderFirstExtension",
6145 resumeSession: true,
6146 config: Config{
6147 MaxVersion: VersionTLS13,
6148 Bugs: ProtocolBugs{
6149 PSKBinderFirst: true,
6150 },
6151 },
6152 shouldFail: true,
6153 expectedLocalError: "remote error: illegal parameter",
6154 expectedError: ":PRE_SHARED_KEY_MUST_BE_LAST:",
6155 })
David Benjamin01fe8202014-09-24 15:21:44 -04006156}
6157
Adam Langley2ae77d22014-10-28 17:29:33 -07006158func addRenegotiationTests() {
David Benjamin44d3eed2015-05-21 01:29:55 -04006159 // Servers cannot renegotiate.
David Benjaminb16346b2015-04-08 19:16:58 -04006160 testCases = append(testCases, testCase{
David Benjamin4c3ddf72016-06-29 18:13:53 -04006161 testType: serverTest,
6162 name: "Renegotiate-Server-Forbidden",
6163 config: Config{
6164 MaxVersion: VersionTLS12,
6165 },
David Benjamin1d5ef3b2015-10-12 19:54:18 -04006166 renegotiate: 1,
David Benjaminb16346b2015-04-08 19:16:58 -04006167 shouldFail: true,
6168 expectedError: ":NO_RENEGOTIATION:",
6169 expectedLocalError: "remote error: no renegotiation",
6170 })
Adam Langley5021b222015-06-12 18:27:58 -07006171 // The server shouldn't echo the renegotiation extension unless
6172 // requested by the client.
6173 testCases = append(testCases, testCase{
6174 testType: serverTest,
6175 name: "Renegotiate-Server-NoExt",
6176 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04006177 MaxVersion: VersionTLS12,
Adam Langley5021b222015-06-12 18:27:58 -07006178 Bugs: ProtocolBugs{
6179 NoRenegotiationInfo: true,
6180 RequireRenegotiationInfo: true,
6181 },
6182 },
6183 shouldFail: true,
6184 expectedLocalError: "renegotiation extension missing",
6185 })
6186 // The renegotiation SCSV should be sufficient for the server to echo
6187 // the extension.
6188 testCases = append(testCases, testCase{
6189 testType: serverTest,
6190 name: "Renegotiate-Server-NoExt-SCSV",
6191 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04006192 MaxVersion: VersionTLS12,
Adam Langley5021b222015-06-12 18:27:58 -07006193 Bugs: ProtocolBugs{
6194 NoRenegotiationInfo: true,
6195 SendRenegotiationSCSV: true,
6196 RequireRenegotiationInfo: true,
6197 },
6198 },
6199 })
Adam Langleycf2d4f42014-10-28 19:06:14 -07006200 testCases = append(testCases, testCase{
David Benjamin4b27d9f2015-05-12 22:42:52 -04006201 name: "Renegotiate-Client",
David Benjamincdea40c2015-03-19 14:09:43 -04006202 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04006203 MaxVersion: VersionTLS12,
David Benjamincdea40c2015-03-19 14:09:43 -04006204 Bugs: ProtocolBugs{
David Benjamin4b27d9f2015-05-12 22:42:52 -04006205 FailIfResumeOnRenego: true,
David Benjamincdea40c2015-03-19 14:09:43 -04006206 },
6207 },
David Benjamin1d5ef3b2015-10-12 19:54:18 -04006208 renegotiate: 1,
6209 flags: []string{
6210 "-renegotiate-freely",
6211 "-expect-total-renegotiations", "1",
David Benjamind2610042017-01-03 10:49:28 -05006212 "-expect-secure-renegotiation",
David Benjamin1d5ef3b2015-10-12 19:54:18 -04006213 },
David Benjamincdea40c2015-03-19 14:09:43 -04006214 })
6215 testCases = append(testCases, testCase{
Adam Langleycf2d4f42014-10-28 19:06:14 -07006216 name: "Renegotiate-Client-EmptyExt",
David Benjamin1d5ef3b2015-10-12 19:54:18 -04006217 renegotiate: 1,
Adam Langleycf2d4f42014-10-28 19:06:14 -07006218 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04006219 MaxVersion: VersionTLS12,
Adam Langleycf2d4f42014-10-28 19:06:14 -07006220 Bugs: ProtocolBugs{
6221 EmptyRenegotiationInfo: true,
6222 },
6223 },
David Benjamin1d5ef3b2015-10-12 19:54:18 -04006224 flags: []string{"-renegotiate-freely"},
Adam Langleycf2d4f42014-10-28 19:06:14 -07006225 shouldFail: true,
6226 expectedError: ":RENEGOTIATION_MISMATCH:",
6227 })
6228 testCases = append(testCases, testCase{
6229 name: "Renegotiate-Client-BadExt",
David Benjamin1d5ef3b2015-10-12 19:54:18 -04006230 renegotiate: 1,
Adam Langleycf2d4f42014-10-28 19:06:14 -07006231 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04006232 MaxVersion: VersionTLS12,
Adam Langleycf2d4f42014-10-28 19:06:14 -07006233 Bugs: ProtocolBugs{
6234 BadRenegotiationInfo: true,
6235 },
6236 },
David Benjamin1d5ef3b2015-10-12 19:54:18 -04006237 flags: []string{"-renegotiate-freely"},
Adam Langleycf2d4f42014-10-28 19:06:14 -07006238 shouldFail: true,
6239 expectedError: ":RENEGOTIATION_MISMATCH:",
6240 })
6241 testCases = append(testCases, testCase{
David Benjamin3e052de2015-11-25 20:10:31 -05006242 name: "Renegotiate-Client-Downgrade",
6243 renegotiate: 1,
6244 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04006245 MaxVersion: VersionTLS12,
David Benjamin3e052de2015-11-25 20:10:31 -05006246 Bugs: ProtocolBugs{
6247 NoRenegotiationInfoAfterInitial: true,
6248 },
6249 },
6250 flags: []string{"-renegotiate-freely"},
6251 shouldFail: true,
6252 expectedError: ":RENEGOTIATION_MISMATCH:",
6253 })
6254 testCases = append(testCases, testCase{
6255 name: "Renegotiate-Client-Upgrade",
6256 renegotiate: 1,
6257 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04006258 MaxVersion: VersionTLS12,
David Benjamin3e052de2015-11-25 20:10:31 -05006259 Bugs: ProtocolBugs{
6260 NoRenegotiationInfoInInitial: true,
6261 },
6262 },
6263 flags: []string{"-renegotiate-freely"},
6264 shouldFail: true,
6265 expectedError: ":RENEGOTIATION_MISMATCH:",
6266 })
6267 testCases = append(testCases, testCase{
David Benjamincff0b902015-05-15 23:09:47 -04006268 name: "Renegotiate-Client-NoExt-Allowed",
David Benjamin1d5ef3b2015-10-12 19:54:18 -04006269 renegotiate: 1,
David Benjamincff0b902015-05-15 23:09:47 -04006270 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04006271 MaxVersion: VersionTLS12,
David Benjamincff0b902015-05-15 23:09:47 -04006272 Bugs: ProtocolBugs{
6273 NoRenegotiationInfo: true,
6274 },
6275 },
David Benjamin1d5ef3b2015-10-12 19:54:18 -04006276 flags: []string{
6277 "-renegotiate-freely",
6278 "-expect-total-renegotiations", "1",
David Benjamind2610042017-01-03 10:49:28 -05006279 "-expect-no-secure-renegotiation",
David Benjamin1d5ef3b2015-10-12 19:54:18 -04006280 },
David Benjamincff0b902015-05-15 23:09:47 -04006281 })
David Benjamine7e36aa2016-08-08 12:39:41 -04006282
6283 // Test that the server may switch ciphers on renegotiation without
6284 // problems.
David Benjamincff0b902015-05-15 23:09:47 -04006285 testCases = append(testCases, testCase{
Adam Langleycf2d4f42014-10-28 19:06:14 -07006286 name: "Renegotiate-Client-SwitchCiphers",
David Benjamin1d5ef3b2015-10-12 19:54:18 -04006287 renegotiate: 1,
Adam Langleycf2d4f42014-10-28 19:06:14 -07006288 config: Config{
Nick Harper1fd39d82016-06-14 18:14:35 -07006289 MaxVersion: VersionTLS12,
Matt Braithwaite07e78062016-08-21 14:50:43 -07006290 CipherSuites: []uint16{TLS_RSA_WITH_3DES_EDE_CBC_SHA},
Adam Langleycf2d4f42014-10-28 19:06:14 -07006291 },
6292 renegotiateCiphers: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
David Benjamin1d5ef3b2015-10-12 19:54:18 -04006293 flags: []string{
6294 "-renegotiate-freely",
6295 "-expect-total-renegotiations", "1",
6296 },
Adam Langleycf2d4f42014-10-28 19:06:14 -07006297 })
6298 testCases = append(testCases, testCase{
6299 name: "Renegotiate-Client-SwitchCiphers2",
David Benjamin1d5ef3b2015-10-12 19:54:18 -04006300 renegotiate: 1,
Adam Langleycf2d4f42014-10-28 19:06:14 -07006301 config: Config{
Nick Harper1fd39d82016-06-14 18:14:35 -07006302 MaxVersion: VersionTLS12,
Adam Langleycf2d4f42014-10-28 19:06:14 -07006303 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
6304 },
Matt Braithwaite07e78062016-08-21 14:50:43 -07006305 renegotiateCiphers: []uint16{TLS_RSA_WITH_3DES_EDE_CBC_SHA},
David Benjamin1d5ef3b2015-10-12 19:54:18 -04006306 flags: []string{
6307 "-renegotiate-freely",
6308 "-expect-total-renegotiations", "1",
6309 },
David Benjaminb16346b2015-04-08 19:16:58 -04006310 })
David Benjamine7e36aa2016-08-08 12:39:41 -04006311
6312 // Test that the server may not switch versions on renegotiation.
6313 testCases = append(testCases, testCase{
6314 name: "Renegotiate-Client-SwitchVersion",
6315 config: Config{
6316 MaxVersion: VersionTLS12,
6317 // Pick a cipher which exists at both versions.
6318 CipherSuites: []uint16{TLS_RSA_WITH_AES_128_CBC_SHA},
6319 Bugs: ProtocolBugs{
6320 NegotiateVersionOnRenego: VersionTLS11,
David Benjamine6f22212016-11-08 14:28:24 -05006321 // Avoid failing early at the record layer.
6322 SendRecordVersion: VersionTLS12,
David Benjamine7e36aa2016-08-08 12:39:41 -04006323 },
6324 },
6325 renegotiate: 1,
6326 flags: []string{
6327 "-renegotiate-freely",
6328 "-expect-total-renegotiations", "1",
6329 },
6330 shouldFail: true,
6331 expectedError: ":WRONG_SSL_VERSION:",
6332 })
6333
David Benjaminb16346b2015-04-08 19:16:58 -04006334 testCases = append(testCases, testCase{
David Benjaminc44b1df2014-11-23 12:11:01 -05006335 name: "Renegotiate-SameClientVersion",
David Benjamin1d5ef3b2015-10-12 19:54:18 -04006336 renegotiate: 1,
David Benjaminc44b1df2014-11-23 12:11:01 -05006337 config: Config{
6338 MaxVersion: VersionTLS10,
6339 Bugs: ProtocolBugs{
6340 RequireSameRenegoClientVersion: true,
6341 },
6342 },
David Benjamin1d5ef3b2015-10-12 19:54:18 -04006343 flags: []string{
6344 "-renegotiate-freely",
6345 "-expect-total-renegotiations", "1",
6346 },
David Benjaminc44b1df2014-11-23 12:11:01 -05006347 })
Adam Langleyb558c4c2015-07-08 12:16:38 -07006348 testCases = append(testCases, testCase{
6349 name: "Renegotiate-FalseStart",
David Benjamin1d5ef3b2015-10-12 19:54:18 -04006350 renegotiate: 1,
Adam Langleyb558c4c2015-07-08 12:16:38 -07006351 config: Config{
Nick Harper1fd39d82016-06-14 18:14:35 -07006352 MaxVersion: VersionTLS12,
Adam Langleyb558c4c2015-07-08 12:16:38 -07006353 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
6354 NextProtos: []string{"foo"},
6355 },
6356 flags: []string{
6357 "-false-start",
6358 "-select-next-proto", "foo",
David Benjamin1d5ef3b2015-10-12 19:54:18 -04006359 "-renegotiate-freely",
David Benjamin324dce42015-10-12 19:49:00 -04006360 "-expect-total-renegotiations", "1",
Adam Langleyb558c4c2015-07-08 12:16:38 -07006361 },
6362 shimWritesFirst: true,
6363 })
David Benjamin1d5ef3b2015-10-12 19:54:18 -04006364
6365 // Client-side renegotiation controls.
6366 testCases = append(testCases, testCase{
David Benjamin4c3ddf72016-06-29 18:13:53 -04006367 name: "Renegotiate-Client-Forbidden-1",
6368 config: Config{
6369 MaxVersion: VersionTLS12,
6370 },
David Benjamin1d5ef3b2015-10-12 19:54:18 -04006371 renegotiate: 1,
6372 shouldFail: true,
6373 expectedError: ":NO_RENEGOTIATION:",
6374 expectedLocalError: "remote error: no renegotiation",
6375 })
6376 testCases = append(testCases, testCase{
David Benjamin4c3ddf72016-06-29 18:13:53 -04006377 name: "Renegotiate-Client-Once-1",
6378 config: Config{
6379 MaxVersion: VersionTLS12,
6380 },
David Benjamin1d5ef3b2015-10-12 19:54:18 -04006381 renegotiate: 1,
6382 flags: []string{
6383 "-renegotiate-once",
6384 "-expect-total-renegotiations", "1",
6385 },
6386 })
6387 testCases = append(testCases, testCase{
David Benjamin4c3ddf72016-06-29 18:13:53 -04006388 name: "Renegotiate-Client-Freely-1",
6389 config: Config{
6390 MaxVersion: VersionTLS12,
6391 },
David Benjamin1d5ef3b2015-10-12 19:54:18 -04006392 renegotiate: 1,
6393 flags: []string{
6394 "-renegotiate-freely",
6395 "-expect-total-renegotiations", "1",
6396 },
6397 })
6398 testCases = append(testCases, testCase{
David Benjamin4c3ddf72016-06-29 18:13:53 -04006399 name: "Renegotiate-Client-Once-2",
6400 config: Config{
6401 MaxVersion: VersionTLS12,
6402 },
David Benjamin1d5ef3b2015-10-12 19:54:18 -04006403 renegotiate: 2,
6404 flags: []string{"-renegotiate-once"},
6405 shouldFail: true,
6406 expectedError: ":NO_RENEGOTIATION:",
6407 expectedLocalError: "remote error: no renegotiation",
6408 })
6409 testCases = append(testCases, testCase{
David Benjamin4c3ddf72016-06-29 18:13:53 -04006410 name: "Renegotiate-Client-Freely-2",
6411 config: Config{
6412 MaxVersion: VersionTLS12,
6413 },
David Benjamin1d5ef3b2015-10-12 19:54:18 -04006414 renegotiate: 2,
6415 flags: []string{
6416 "-renegotiate-freely",
6417 "-expect-total-renegotiations", "2",
6418 },
6419 })
Adam Langley27a0d082015-11-03 13:34:10 -08006420 testCases = append(testCases, testCase{
6421 name: "Renegotiate-Client-NoIgnore",
6422 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04006423 MaxVersion: VersionTLS12,
Adam Langley27a0d082015-11-03 13:34:10 -08006424 Bugs: ProtocolBugs{
6425 SendHelloRequestBeforeEveryAppDataRecord: true,
6426 },
6427 },
6428 shouldFail: true,
6429 expectedError: ":NO_RENEGOTIATION:",
6430 })
6431 testCases = append(testCases, testCase{
6432 name: "Renegotiate-Client-Ignore",
6433 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04006434 MaxVersion: VersionTLS12,
Adam Langley27a0d082015-11-03 13:34:10 -08006435 Bugs: ProtocolBugs{
6436 SendHelloRequestBeforeEveryAppDataRecord: true,
6437 },
6438 },
6439 flags: []string{
6440 "-renegotiate-ignore",
6441 "-expect-total-renegotiations", "0",
6442 },
6443 })
David Benjamin4c3ddf72016-06-29 18:13:53 -04006444
David Benjamin34941c02016-10-08 11:45:31 -04006445 // Renegotiation is not allowed at SSL 3.0.
6446 testCases = append(testCases, testCase{
6447 name: "Renegotiate-Client-SSL3",
6448 config: Config{
6449 MaxVersion: VersionSSL30,
6450 },
6451 renegotiate: 1,
6452 flags: []string{
6453 "-renegotiate-freely",
6454 "-expect-total-renegotiations", "1",
6455 },
6456 shouldFail: true,
6457 expectedError: ":NO_RENEGOTIATION:",
6458 expectedLocalError: "remote error: no renegotiation",
6459 })
6460
David Benjamina1eaba12017-01-01 23:19:22 -05006461 // Renegotiation is not allowed when there is an unfinished write.
6462 testCases = append(testCases, testCase{
6463 name: "Renegotiate-Client-UnfinishedWrite",
6464 config: Config{
6465 MaxVersion: VersionTLS12,
6466 },
6467 renegotiate: 1,
6468 flags: []string{
6469 "-async",
6470 "-renegotiate-freely",
6471 "-read-with-unfinished-write",
6472 },
6473 shouldFail: true,
6474 expectedError: ":NO_RENEGOTIATION:",
6475 // We do not successfully send the no_renegotiation alert in
6476 // this case. https://crbug.com/boringssl/130
6477 })
6478
David Benjamin07ab5d42017-02-09 20:11:41 -05006479 // We reject stray HelloRequests during the handshake in TLS 1.2.
David Benjamin71dd6662016-07-08 14:10:48 -07006480 testCases = append(testCases, testCase{
6481 name: "StrayHelloRequest",
6482 config: Config{
6483 MaxVersion: VersionTLS12,
6484 Bugs: ProtocolBugs{
6485 SendHelloRequestBeforeEveryHandshakeMessage: true,
6486 },
6487 },
David Benjamin07ab5d42017-02-09 20:11:41 -05006488 shouldFail: true,
6489 expectedError: ":UNEXPECTED_MESSAGE:",
David Benjamin71dd6662016-07-08 14:10:48 -07006490 })
6491 testCases = append(testCases, testCase{
6492 name: "StrayHelloRequest-Packed",
6493 config: Config{
6494 MaxVersion: VersionTLS12,
6495 Bugs: ProtocolBugs{
6496 PackHandshakeFlight: true,
6497 SendHelloRequestBeforeEveryHandshakeMessage: true,
6498 },
6499 },
David Benjamin07ab5d42017-02-09 20:11:41 -05006500 shouldFail: true,
6501 expectedError: ":UNEXPECTED_MESSAGE:",
David Benjamin71dd6662016-07-08 14:10:48 -07006502 })
6503
David Benjamin12d2c482016-07-24 10:56:51 -04006504 // Test renegotiation works if HelloRequest and server Finished come in
6505 // the same record.
6506 testCases = append(testCases, testCase{
6507 name: "Renegotiate-Client-Packed",
6508 config: Config{
6509 MaxVersion: VersionTLS12,
6510 Bugs: ProtocolBugs{
6511 PackHandshakeFlight: true,
6512 PackHelloRequestWithFinished: true,
6513 },
6514 },
6515 renegotiate: 1,
6516 flags: []string{
6517 "-renegotiate-freely",
6518 "-expect-total-renegotiations", "1",
6519 },
6520 })
6521
David Benjamin397c8e62016-07-08 14:14:36 -07006522 // Renegotiation is forbidden in TLS 1.3.
6523 testCases = append(testCases, testCase{
6524 name: "Renegotiate-Client-TLS13",
6525 config: Config{
6526 MaxVersion: VersionTLS13,
Steven Valdez143e8b32016-07-11 13:19:03 -04006527 Bugs: ProtocolBugs{
6528 SendHelloRequestBeforeEveryAppDataRecord: true,
6529 },
David Benjamin397c8e62016-07-08 14:14:36 -07006530 },
David Benjamin397c8e62016-07-08 14:14:36 -07006531 flags: []string{
6532 "-renegotiate-freely",
6533 },
Steven Valdez8e1c7be2016-07-26 12:39:22 -04006534 shouldFail: true,
6535 expectedError: ":UNEXPECTED_MESSAGE:",
David Benjamin397c8e62016-07-08 14:14:36 -07006536 })
6537
6538 // Stray HelloRequests during the handshake are forbidden in TLS 1.3.
6539 testCases = append(testCases, testCase{
6540 name: "StrayHelloRequest-TLS13",
6541 config: Config{
6542 MaxVersion: VersionTLS13,
6543 Bugs: ProtocolBugs{
6544 SendHelloRequestBeforeEveryHandshakeMessage: true,
6545 },
6546 },
6547 shouldFail: true,
6548 expectedError: ":UNEXPECTED_MESSAGE:",
6549 })
David Benjamind2610042017-01-03 10:49:28 -05006550
6551 // The renegotiation_info extension is not sent in TLS 1.3, but TLS 1.3
6552 // always reads as supporting it, regardless of whether it was
6553 // negotiated.
6554 testCases = append(testCases, testCase{
6555 name: "AlwaysReportRenegotiationInfo-TLS13",
6556 config: Config{
6557 MaxVersion: VersionTLS13,
6558 Bugs: ProtocolBugs{
6559 NoRenegotiationInfo: true,
6560 },
6561 },
6562 flags: []string{
6563 "-expect-secure-renegotiation",
6564 },
6565 })
David Benjamina58baaf2017-02-28 20:54:28 -05006566
6567 // Certificates may not change on renegotiation.
6568 testCases = append(testCases, testCase{
6569 name: "Renegotiation-CertificateChange",
6570 config: Config{
6571 MaxVersion: VersionTLS12,
6572 Certificates: []Certificate{rsaCertificate},
6573 Bugs: ProtocolBugs{
6574 RenegotiationCertificate: &rsaChainCertificate,
6575 },
6576 },
6577 renegotiate: 1,
6578 flags: []string{"-renegotiate-freely"},
6579 shouldFail: true,
6580 expectedError: ":SERVER_CERT_CHANGED:",
6581 })
6582 testCases = append(testCases, testCase{
6583 name: "Renegotiation-CertificateChange-2",
6584 config: Config{
6585 MaxVersion: VersionTLS12,
6586 Certificates: []Certificate{rsaCertificate},
6587 Bugs: ProtocolBugs{
6588 RenegotiationCertificate: &rsa1024Certificate,
6589 },
6590 },
6591 renegotiate: 1,
6592 flags: []string{"-renegotiate-freely"},
6593 shouldFail: true,
6594 expectedError: ":SERVER_CERT_CHANGED:",
6595 })
David Benjaminbbf42462017-03-14 21:27:10 -04006596
6597 // We do not negotiate ALPN after the initial handshake. This is
6598 // error-prone and only risks bugs in consumers.
6599 testCases = append(testCases, testCase{
6600 testType: clientTest,
6601 name: "Renegotiation-ForbidALPN",
6602 config: Config{
6603 MaxVersion: VersionTLS12,
6604 Bugs: ProtocolBugs{
6605 // Forcibly negotiate ALPN on both initial and
6606 // renegotiation handshakes. The test stack will
6607 // internally check the client does not offer
6608 // it.
6609 SendALPN: "foo",
6610 },
6611 },
6612 flags: []string{
6613 "-advertise-alpn", "\x03foo\x03bar\x03baz",
6614 "-expect-alpn", "foo",
6615 "-renegotiate-freely",
6616 },
6617 renegotiate: 1,
6618 shouldFail: true,
6619 expectedError: ":UNEXPECTED_EXTENSION:",
6620 })
Adam Langley2ae77d22014-10-28 17:29:33 -07006621}
6622
David Benjamin5e961c12014-11-07 01:48:35 -05006623func addDTLSReplayTests() {
6624 // Test that sequence number replays are detected.
6625 testCases = append(testCases, testCase{
6626 protocol: dtls,
6627 name: "DTLS-Replay",
David Benjamin8e6db492015-07-25 18:29:23 -04006628 messageCount: 200,
David Benjamin5e961c12014-11-07 01:48:35 -05006629 replayWrites: true,
6630 })
6631
David Benjamin8e6db492015-07-25 18:29:23 -04006632 // Test the incoming sequence number skipping by values larger
David Benjamin5e961c12014-11-07 01:48:35 -05006633 // than the retransmit window.
6634 testCases = append(testCases, testCase{
6635 protocol: dtls,
6636 name: "DTLS-Replay-LargeGaps",
6637 config: Config{
6638 Bugs: ProtocolBugs{
David Benjamin8e6db492015-07-25 18:29:23 -04006639 SequenceNumberMapping: func(in uint64) uint64 {
6640 return in * 127
6641 },
David Benjamin5e961c12014-11-07 01:48:35 -05006642 },
6643 },
David Benjamin8e6db492015-07-25 18:29:23 -04006644 messageCount: 200,
6645 replayWrites: true,
6646 })
6647
6648 // Test the incoming sequence number changing non-monotonically.
6649 testCases = append(testCases, testCase{
6650 protocol: dtls,
6651 name: "DTLS-Replay-NonMonotonic",
6652 config: Config{
6653 Bugs: ProtocolBugs{
6654 SequenceNumberMapping: func(in uint64) uint64 {
6655 return in ^ 31
6656 },
6657 },
6658 },
6659 messageCount: 200,
David Benjamin5e961c12014-11-07 01:48:35 -05006660 replayWrites: true,
6661 })
6662}
6663
Nick Harper60edffd2016-06-21 15:19:24 -07006664var testSignatureAlgorithms = []struct {
David Benjamin000800a2014-11-14 01:43:59 -05006665 name string
Nick Harper60edffd2016-06-21 15:19:24 -07006666 id signatureAlgorithm
6667 cert testCert
David Benjamin000800a2014-11-14 01:43:59 -05006668}{
Nick Harper60edffd2016-06-21 15:19:24 -07006669 {"RSA-PKCS1-SHA1", signatureRSAPKCS1WithSHA1, testCertRSA},
6670 {"RSA-PKCS1-SHA256", signatureRSAPKCS1WithSHA256, testCertRSA},
6671 {"RSA-PKCS1-SHA384", signatureRSAPKCS1WithSHA384, testCertRSA},
6672 {"RSA-PKCS1-SHA512", signatureRSAPKCS1WithSHA512, testCertRSA},
David Benjamin33863262016-07-08 17:20:12 -07006673 {"ECDSA-SHA1", signatureECDSAWithSHA1, testCertECDSAP256},
David Benjamin33863262016-07-08 17:20:12 -07006674 {"ECDSA-P256-SHA256", signatureECDSAWithP256AndSHA256, testCertECDSAP256},
6675 {"ECDSA-P384-SHA384", signatureECDSAWithP384AndSHA384, testCertECDSAP384},
6676 {"ECDSA-P521-SHA512", signatureECDSAWithP521AndSHA512, testCertECDSAP521},
Steven Valdezeff1e8d2016-07-06 14:24:47 -04006677 {"RSA-PSS-SHA256", signatureRSAPSSWithSHA256, testCertRSA},
6678 {"RSA-PSS-SHA384", signatureRSAPSSWithSHA384, testCertRSA},
6679 {"RSA-PSS-SHA512", signatureRSAPSSWithSHA512, testCertRSA},
David Benjamin5208fd42016-07-13 21:43:25 -04006680 // Tests for key types prior to TLS 1.2.
6681 {"RSA", 0, testCertRSA},
6682 {"ECDSA", 0, testCertECDSAP256},
David Benjamin000800a2014-11-14 01:43:59 -05006683}
6684
Nick Harper60edffd2016-06-21 15:19:24 -07006685const fakeSigAlg1 signatureAlgorithm = 0x2a01
6686const fakeSigAlg2 signatureAlgorithm = 0xff01
6687
6688func addSignatureAlgorithmTests() {
David Benjamin5208fd42016-07-13 21:43:25 -04006689 // Not all ciphers involve a signature. Advertise a list which gives all
6690 // versions a signing cipher.
6691 signingCiphers := []uint16{
Steven Valdez803c77a2016-09-06 14:13:43 -04006692 TLS_AES_128_GCM_SHA256,
David Benjamin5208fd42016-07-13 21:43:25 -04006693 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
6694 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
6695 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
6696 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
Matthew Braithwaitecedc6f12017-03-15 19:20:23 -07006697 }
6698 if *includeDHE {
6699 signingCiphers = append(signingCiphers, TLS_DHE_RSA_WITH_AES_128_CBC_SHA)
David Benjamin5208fd42016-07-13 21:43:25 -04006700 }
6701
David Benjaminca3d5452016-07-14 12:51:01 -04006702 var allAlgorithms []signatureAlgorithm
6703 for _, alg := range testSignatureAlgorithms {
6704 if alg.id != 0 {
6705 allAlgorithms = append(allAlgorithms, alg.id)
6706 }
6707 }
6708
Nick Harper60edffd2016-06-21 15:19:24 -07006709 // Make sure each signature algorithm works. Include some fake values in
6710 // the list and ensure they're ignored.
6711 for _, alg := range testSignatureAlgorithms {
David Benjamin1fb125c2016-07-08 18:52:12 -07006712 for _, ver := range tlsVersions {
David Benjamin5208fd42016-07-13 21:43:25 -04006713 if (ver.version < VersionTLS12) != (alg.id == 0) {
6714 continue
6715 }
6716
6717 // TODO(davidben): Support ECDSA in SSL 3.0 in Go for testing
6718 // or remove it in C.
6719 if ver.version == VersionSSL30 && alg.cert != testCertRSA {
David Benjamin1fb125c2016-07-08 18:52:12 -07006720 continue
6721 }
Nick Harper60edffd2016-06-21 15:19:24 -07006722
David Benjamin3ef76972016-10-17 17:59:54 -04006723 var shouldSignFail, shouldVerifyFail bool
David Benjamin1fb125c2016-07-08 18:52:12 -07006724 // ecdsa_sha1 does not exist in TLS 1.3.
Steven Valdezeff1e8d2016-07-06 14:24:47 -04006725 if ver.version >= VersionTLS13 && alg.id == signatureECDSAWithSHA1 {
David Benjamin3ef76972016-10-17 17:59:54 -04006726 shouldSignFail = true
6727 shouldVerifyFail = true
Steven Valdezeff1e8d2016-07-06 14:24:47 -04006728 }
Steven Valdez54ed58e2016-08-18 14:03:49 -04006729 // RSA-PKCS1 does not exist in TLS 1.3.
6730 if ver.version == VersionTLS13 && hasComponent(alg.name, "PKCS1") {
David Benjamin3ef76972016-10-17 17:59:54 -04006731 shouldSignFail = true
6732 shouldVerifyFail = true
6733 }
6734
6735 // BoringSSL will sign SHA-1 and SHA-512 with ECDSA but not accept them.
6736 if alg.id == signatureECDSAWithSHA1 || alg.id == signatureECDSAWithP521AndSHA512 {
6737 shouldVerifyFail = true
Steven Valdez54ed58e2016-08-18 14:03:49 -04006738 }
Steven Valdezeff1e8d2016-07-06 14:24:47 -04006739
6740 var signError, verifyError string
David Benjamin3ef76972016-10-17 17:59:54 -04006741 if shouldSignFail {
Steven Valdezeff1e8d2016-07-06 14:24:47 -04006742 signError = ":NO_COMMON_SIGNATURE_ALGORITHMS:"
David Benjamin3ef76972016-10-17 17:59:54 -04006743 }
6744 if shouldVerifyFail {
Steven Valdezeff1e8d2016-07-06 14:24:47 -04006745 verifyError = ":WRONG_SIGNATURE_TYPE:"
David Benjamin1fb125c2016-07-08 18:52:12 -07006746 }
David Benjamin000800a2014-11-14 01:43:59 -05006747
David Benjamin1fb125c2016-07-08 18:52:12 -07006748 suffix := "-" + alg.name + "-" + ver.name
David Benjamin6e807652015-11-02 12:02:20 -05006749
David Benjamin7a41d372016-07-09 11:21:54 -07006750 testCases = append(testCases, testCase{
David Benjaminbbfff7c2016-07-13 21:08:33 -04006751 name: "ClientAuth-Sign" + suffix,
David Benjamin7a41d372016-07-09 11:21:54 -07006752 config: Config{
6753 MaxVersion: ver.version,
6754 ClientAuth: RequireAnyClientCert,
6755 VerifySignatureAlgorithms: []signatureAlgorithm{
6756 fakeSigAlg1,
6757 alg.id,
6758 fakeSigAlg2,
David Benjamin1fb125c2016-07-08 18:52:12 -07006759 },
David Benjamin7a41d372016-07-09 11:21:54 -07006760 },
6761 flags: []string{
6762 "-cert-file", path.Join(*resourceDir, getShimCertificate(alg.cert)),
6763 "-key-file", path.Join(*resourceDir, getShimKey(alg.cert)),
6764 "-enable-all-curves",
6765 },
David Benjamin3ef76972016-10-17 17:59:54 -04006766 shouldFail: shouldSignFail,
David Benjamin7a41d372016-07-09 11:21:54 -07006767 expectedError: signError,
6768 expectedPeerSignatureAlgorithm: alg.id,
6769 })
Steven Valdezeff1e8d2016-07-06 14:24:47 -04006770
David Benjamin7a41d372016-07-09 11:21:54 -07006771 testCases = append(testCases, testCase{
6772 testType: serverTest,
David Benjaminbbfff7c2016-07-13 21:08:33 -04006773 name: "ClientAuth-Verify" + suffix,
David Benjamin7a41d372016-07-09 11:21:54 -07006774 config: Config{
6775 MaxVersion: ver.version,
6776 Certificates: []Certificate{getRunnerCertificate(alg.cert)},
6777 SignSignatureAlgorithms: []signatureAlgorithm{
6778 alg.id,
Steven Valdezeff1e8d2016-07-06 14:24:47 -04006779 },
David Benjamin7a41d372016-07-09 11:21:54 -07006780 Bugs: ProtocolBugs{
David Benjamin3ef76972016-10-17 17:59:54 -04006781 SkipECDSACurveCheck: shouldVerifyFail,
6782 IgnoreSignatureVersionChecks: shouldVerifyFail,
6783 // Some signature algorithms may not be advertised.
6784 IgnorePeerSignatureAlgorithmPreferences: shouldVerifyFail,
Steven Valdezeff1e8d2016-07-06 14:24:47 -04006785 },
David Benjamin7a41d372016-07-09 11:21:54 -07006786 },
6787 flags: []string{
6788 "-require-any-client-certificate",
6789 "-expect-peer-signature-algorithm", strconv.Itoa(int(alg.id)),
6790 "-enable-all-curves",
6791 },
David Benjaminf1050fd2016-12-13 20:05:36 -05006792 // Resume the session to assert the peer signature
6793 // algorithm is reported on both handshakes.
6794 resumeSession: !shouldVerifyFail,
David Benjamin3ef76972016-10-17 17:59:54 -04006795 shouldFail: shouldVerifyFail,
David Benjamin7a41d372016-07-09 11:21:54 -07006796 expectedError: verifyError,
6797 })
David Benjamin1fb125c2016-07-08 18:52:12 -07006798
Matthew Braithwaitecedc6f12017-03-15 19:20:23 -07006799 // No signing cipher for SSL 3.0.
6800 if *includeDHE || ver.version > VersionSSL30 {
6801 testCases = append(testCases, testCase{
6802 testType: serverTest,
6803 name: "ServerAuth-Sign" + suffix,
6804 config: Config{
6805 MaxVersion: ver.version,
6806 CipherSuites: signingCiphers,
6807 VerifySignatureAlgorithms: []signatureAlgorithm{
6808 fakeSigAlg1,
6809 alg.id,
6810 fakeSigAlg2,
6811 },
David Benjamin1fb125c2016-07-08 18:52:12 -07006812 },
Matthew Braithwaitecedc6f12017-03-15 19:20:23 -07006813 flags: []string{
6814 "-cert-file", path.Join(*resourceDir, getShimCertificate(alg.cert)),
6815 "-key-file", path.Join(*resourceDir, getShimKey(alg.cert)),
6816 "-enable-all-curves",
6817 },
6818 shouldFail: shouldSignFail,
6819 expectedError: signError,
6820 expectedPeerSignatureAlgorithm: alg.id,
6821 })
6822 }
David Benjamin1fb125c2016-07-08 18:52:12 -07006823
6824 testCases = append(testCases, testCase{
David Benjaminbbfff7c2016-07-13 21:08:33 -04006825 name: "ServerAuth-Verify" + suffix,
David Benjamin1fb125c2016-07-08 18:52:12 -07006826 config: Config{
6827 MaxVersion: ver.version,
6828 Certificates: []Certificate{getRunnerCertificate(alg.cert)},
David Benjamin5208fd42016-07-13 21:43:25 -04006829 CipherSuites: signingCiphers,
David Benjamin7a41d372016-07-09 11:21:54 -07006830 SignSignatureAlgorithms: []signatureAlgorithm{
David Benjamin1fb125c2016-07-08 18:52:12 -07006831 alg.id,
6832 },
Steven Valdezeff1e8d2016-07-06 14:24:47 -04006833 Bugs: ProtocolBugs{
David Benjamin3ef76972016-10-17 17:59:54 -04006834 SkipECDSACurveCheck: shouldVerifyFail,
6835 IgnoreSignatureVersionChecks: shouldVerifyFail,
6836 // Some signature algorithms may not be advertised.
6837 IgnorePeerSignatureAlgorithmPreferences: shouldVerifyFail,
Steven Valdezeff1e8d2016-07-06 14:24:47 -04006838 },
David Benjamin1fb125c2016-07-08 18:52:12 -07006839 },
6840 flags: []string{
6841 "-expect-peer-signature-algorithm", strconv.Itoa(int(alg.id)),
6842 "-enable-all-curves",
6843 },
David Benjaminf1050fd2016-12-13 20:05:36 -05006844 // Resume the session to assert the peer signature
6845 // algorithm is reported on both handshakes.
6846 resumeSession: !shouldVerifyFail,
David Benjamin3ef76972016-10-17 17:59:54 -04006847 shouldFail: shouldVerifyFail,
Steven Valdezeff1e8d2016-07-06 14:24:47 -04006848 expectedError: verifyError,
David Benjamin1fb125c2016-07-08 18:52:12 -07006849 })
David Benjamin5208fd42016-07-13 21:43:25 -04006850
David Benjamin3ef76972016-10-17 17:59:54 -04006851 if !shouldVerifyFail {
David Benjamin5208fd42016-07-13 21:43:25 -04006852 testCases = append(testCases, testCase{
6853 testType: serverTest,
6854 name: "ClientAuth-InvalidSignature" + suffix,
6855 config: Config{
6856 MaxVersion: ver.version,
6857 Certificates: []Certificate{getRunnerCertificate(alg.cert)},
6858 SignSignatureAlgorithms: []signatureAlgorithm{
6859 alg.id,
6860 },
6861 Bugs: ProtocolBugs{
6862 InvalidSignature: true,
6863 },
6864 },
6865 flags: []string{
6866 "-require-any-client-certificate",
6867 "-enable-all-curves",
6868 },
6869 shouldFail: true,
6870 expectedError: ":BAD_SIGNATURE:",
6871 })
6872
6873 testCases = append(testCases, testCase{
6874 name: "ServerAuth-InvalidSignature" + suffix,
6875 config: Config{
6876 MaxVersion: ver.version,
6877 Certificates: []Certificate{getRunnerCertificate(alg.cert)},
6878 CipherSuites: signingCiphers,
6879 SignSignatureAlgorithms: []signatureAlgorithm{
6880 alg.id,
6881 },
6882 Bugs: ProtocolBugs{
6883 InvalidSignature: true,
6884 },
6885 },
6886 flags: []string{"-enable-all-curves"},
6887 shouldFail: true,
6888 expectedError: ":BAD_SIGNATURE:",
6889 })
6890 }
David Benjaminca3d5452016-07-14 12:51:01 -04006891
David Benjamin3ef76972016-10-17 17:59:54 -04006892 if ver.version >= VersionTLS12 && !shouldSignFail {
David Benjaminca3d5452016-07-14 12:51:01 -04006893 testCases = append(testCases, testCase{
6894 name: "ClientAuth-Sign-Negotiate" + suffix,
6895 config: Config{
6896 MaxVersion: ver.version,
6897 ClientAuth: RequireAnyClientCert,
6898 VerifySignatureAlgorithms: allAlgorithms,
6899 },
6900 flags: []string{
6901 "-cert-file", path.Join(*resourceDir, getShimCertificate(alg.cert)),
6902 "-key-file", path.Join(*resourceDir, getShimKey(alg.cert)),
6903 "-enable-all-curves",
6904 "-signing-prefs", strconv.Itoa(int(alg.id)),
6905 },
6906 expectedPeerSignatureAlgorithm: alg.id,
6907 })
6908
6909 testCases = append(testCases, testCase{
6910 testType: serverTest,
6911 name: "ServerAuth-Sign-Negotiate" + suffix,
6912 config: Config{
6913 MaxVersion: ver.version,
6914 CipherSuites: signingCiphers,
6915 VerifySignatureAlgorithms: allAlgorithms,
6916 },
6917 flags: []string{
6918 "-cert-file", path.Join(*resourceDir, getShimCertificate(alg.cert)),
6919 "-key-file", path.Join(*resourceDir, getShimKey(alg.cert)),
6920 "-enable-all-curves",
6921 "-signing-prefs", strconv.Itoa(int(alg.id)),
6922 },
6923 expectedPeerSignatureAlgorithm: alg.id,
6924 })
6925 }
David Benjamin1fb125c2016-07-08 18:52:12 -07006926 }
David Benjamin000800a2014-11-14 01:43:59 -05006927 }
6928
Nick Harper60edffd2016-06-21 15:19:24 -07006929 // Test that algorithm selection takes the key type into account.
David Benjamin000800a2014-11-14 01:43:59 -05006930 testCases = append(testCases, testCase{
David Benjaminbbfff7c2016-07-13 21:08:33 -04006931 name: "ClientAuth-SignatureType",
David Benjamin000800a2014-11-14 01:43:59 -05006932 config: Config{
6933 ClientAuth: RequireAnyClientCert,
David Benjamin4c3ddf72016-06-29 18:13:53 -04006934 MaxVersion: VersionTLS12,
David Benjamin7a41d372016-07-09 11:21:54 -07006935 VerifySignatureAlgorithms: []signatureAlgorithm{
Nick Harper60edffd2016-06-21 15:19:24 -07006936 signatureECDSAWithP521AndSHA512,
6937 signatureRSAPKCS1WithSHA384,
6938 signatureECDSAWithSHA1,
David Benjamin000800a2014-11-14 01:43:59 -05006939 },
6940 },
6941 flags: []string{
Adam Langley7c803a62015-06-15 15:35:05 -07006942 "-cert-file", path.Join(*resourceDir, rsaCertificateFile),
6943 "-key-file", path.Join(*resourceDir, rsaKeyFile),
David Benjamin000800a2014-11-14 01:43:59 -05006944 },
Nick Harper60edffd2016-06-21 15:19:24 -07006945 expectedPeerSignatureAlgorithm: signatureRSAPKCS1WithSHA384,
David Benjamin000800a2014-11-14 01:43:59 -05006946 })
6947
6948 testCases = append(testCases, testCase{
Steven Valdez143e8b32016-07-11 13:19:03 -04006949 name: "ClientAuth-SignatureType-TLS13",
6950 config: Config{
6951 ClientAuth: RequireAnyClientCert,
6952 MaxVersion: VersionTLS13,
6953 VerifySignatureAlgorithms: []signatureAlgorithm{
6954 signatureECDSAWithP521AndSHA512,
6955 signatureRSAPKCS1WithSHA384,
6956 signatureRSAPSSWithSHA384,
6957 signatureECDSAWithSHA1,
6958 },
6959 },
6960 flags: []string{
6961 "-cert-file", path.Join(*resourceDir, rsaCertificateFile),
6962 "-key-file", path.Join(*resourceDir, rsaKeyFile),
6963 },
6964 expectedPeerSignatureAlgorithm: signatureRSAPSSWithSHA384,
6965 })
6966
6967 testCases = append(testCases, testCase{
David Benjamin000800a2014-11-14 01:43:59 -05006968 testType: serverTest,
David Benjaminbbfff7c2016-07-13 21:08:33 -04006969 name: "ServerAuth-SignatureType",
David Benjamin000800a2014-11-14 01:43:59 -05006970 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04006971 MaxVersion: VersionTLS12,
David Benjamin000800a2014-11-14 01:43:59 -05006972 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
David Benjamin7a41d372016-07-09 11:21:54 -07006973 VerifySignatureAlgorithms: []signatureAlgorithm{
Nick Harper60edffd2016-06-21 15:19:24 -07006974 signatureECDSAWithP521AndSHA512,
6975 signatureRSAPKCS1WithSHA384,
6976 signatureECDSAWithSHA1,
David Benjamin000800a2014-11-14 01:43:59 -05006977 },
6978 },
Nick Harper60edffd2016-06-21 15:19:24 -07006979 expectedPeerSignatureAlgorithm: signatureRSAPKCS1WithSHA384,
David Benjamin000800a2014-11-14 01:43:59 -05006980 })
6981
Steven Valdez143e8b32016-07-11 13:19:03 -04006982 testCases = append(testCases, testCase{
6983 testType: serverTest,
6984 name: "ServerAuth-SignatureType-TLS13",
6985 config: Config{
Steven Valdez803c77a2016-09-06 14:13:43 -04006986 MaxVersion: VersionTLS13,
Steven Valdez143e8b32016-07-11 13:19:03 -04006987 VerifySignatureAlgorithms: []signatureAlgorithm{
6988 signatureECDSAWithP521AndSHA512,
6989 signatureRSAPKCS1WithSHA384,
6990 signatureRSAPSSWithSHA384,
6991 signatureECDSAWithSHA1,
6992 },
6993 },
6994 expectedPeerSignatureAlgorithm: signatureRSAPSSWithSHA384,
6995 })
6996
David Benjamina95e9f32016-07-08 16:28:04 -07006997 // Test that signature verification takes the key type into account.
David Benjamina95e9f32016-07-08 16:28:04 -07006998 testCases = append(testCases, testCase{
6999 testType: serverTest,
7000 name: "Verify-ClientAuth-SignatureType",
7001 config: Config{
7002 MaxVersion: VersionTLS12,
7003 Certificates: []Certificate{rsaCertificate},
David Benjamin7a41d372016-07-09 11:21:54 -07007004 SignSignatureAlgorithms: []signatureAlgorithm{
David Benjamina95e9f32016-07-08 16:28:04 -07007005 signatureRSAPKCS1WithSHA256,
7006 },
7007 Bugs: ProtocolBugs{
7008 SendSignatureAlgorithm: signatureECDSAWithP256AndSHA256,
7009 },
7010 },
7011 flags: []string{
7012 "-require-any-client-certificate",
7013 },
7014 shouldFail: true,
7015 expectedError: ":WRONG_SIGNATURE_TYPE:",
7016 })
7017
7018 testCases = append(testCases, testCase{
Steven Valdez143e8b32016-07-11 13:19:03 -04007019 testType: serverTest,
7020 name: "Verify-ClientAuth-SignatureType-TLS13",
7021 config: Config{
7022 MaxVersion: VersionTLS13,
7023 Certificates: []Certificate{rsaCertificate},
7024 SignSignatureAlgorithms: []signatureAlgorithm{
7025 signatureRSAPSSWithSHA256,
7026 },
7027 Bugs: ProtocolBugs{
7028 SendSignatureAlgorithm: signatureECDSAWithP256AndSHA256,
7029 },
7030 },
7031 flags: []string{
7032 "-require-any-client-certificate",
7033 },
7034 shouldFail: true,
7035 expectedError: ":WRONG_SIGNATURE_TYPE:",
7036 })
7037
7038 testCases = append(testCases, testCase{
David Benjaminbbfff7c2016-07-13 21:08:33 -04007039 name: "Verify-ServerAuth-SignatureType",
David Benjamina95e9f32016-07-08 16:28:04 -07007040 config: Config{
7041 MaxVersion: VersionTLS12,
7042 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
David Benjamin7a41d372016-07-09 11:21:54 -07007043 SignSignatureAlgorithms: []signatureAlgorithm{
David Benjamina95e9f32016-07-08 16:28:04 -07007044 signatureRSAPKCS1WithSHA256,
7045 },
7046 Bugs: ProtocolBugs{
7047 SendSignatureAlgorithm: signatureECDSAWithP256AndSHA256,
7048 },
7049 },
7050 shouldFail: true,
7051 expectedError: ":WRONG_SIGNATURE_TYPE:",
7052 })
7053
Steven Valdez143e8b32016-07-11 13:19:03 -04007054 testCases = append(testCases, testCase{
7055 name: "Verify-ServerAuth-SignatureType-TLS13",
7056 config: Config{
Steven Valdez803c77a2016-09-06 14:13:43 -04007057 MaxVersion: VersionTLS13,
Steven Valdez143e8b32016-07-11 13:19:03 -04007058 SignSignatureAlgorithms: []signatureAlgorithm{
7059 signatureRSAPSSWithSHA256,
7060 },
7061 Bugs: ProtocolBugs{
7062 SendSignatureAlgorithm: signatureECDSAWithP256AndSHA256,
7063 },
7064 },
7065 shouldFail: true,
7066 expectedError: ":WRONG_SIGNATURE_TYPE:",
7067 })
7068
David Benjamin51dd7d62016-07-08 16:07:01 -07007069 // Test that, if the list is missing, the peer falls back to SHA-1 in
7070 // TLS 1.2, but not TLS 1.3.
David Benjamin000800a2014-11-14 01:43:59 -05007071 testCases = append(testCases, testCase{
David Benjaminee32bea2016-08-17 13:36:44 -04007072 name: "ClientAuth-SHA1-Fallback-RSA",
David Benjamin000800a2014-11-14 01:43:59 -05007073 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04007074 MaxVersion: VersionTLS12,
David Benjamin000800a2014-11-14 01:43:59 -05007075 ClientAuth: RequireAnyClientCert,
David Benjamin7a41d372016-07-09 11:21:54 -07007076 VerifySignatureAlgorithms: []signatureAlgorithm{
Nick Harper60edffd2016-06-21 15:19:24 -07007077 signatureRSAPKCS1WithSHA1,
David Benjamin000800a2014-11-14 01:43:59 -05007078 },
7079 Bugs: ProtocolBugs{
Nick Harper60edffd2016-06-21 15:19:24 -07007080 NoSignatureAlgorithms: true,
David Benjamin000800a2014-11-14 01:43:59 -05007081 },
7082 },
7083 flags: []string{
Adam Langley7c803a62015-06-15 15:35:05 -07007084 "-cert-file", path.Join(*resourceDir, rsaCertificateFile),
7085 "-key-file", path.Join(*resourceDir, rsaKeyFile),
David Benjamin000800a2014-11-14 01:43:59 -05007086 },
7087 })
7088
7089 testCases = append(testCases, testCase{
7090 testType: serverTest,
David Benjaminee32bea2016-08-17 13:36:44 -04007091 name: "ServerAuth-SHA1-Fallback-RSA",
David Benjamin000800a2014-11-14 01:43:59 -05007092 config: Config{
David Benjaminee32bea2016-08-17 13:36:44 -04007093 MaxVersion: VersionTLS12,
David Benjamin7a41d372016-07-09 11:21:54 -07007094 VerifySignatureAlgorithms: []signatureAlgorithm{
Nick Harper60edffd2016-06-21 15:19:24 -07007095 signatureRSAPKCS1WithSHA1,
David Benjamin000800a2014-11-14 01:43:59 -05007096 },
7097 Bugs: ProtocolBugs{
Nick Harper60edffd2016-06-21 15:19:24 -07007098 NoSignatureAlgorithms: true,
David Benjamin000800a2014-11-14 01:43:59 -05007099 },
7100 },
David Benjaminee32bea2016-08-17 13:36:44 -04007101 flags: []string{
7102 "-cert-file", path.Join(*resourceDir, rsaCertificateFile),
7103 "-key-file", path.Join(*resourceDir, rsaKeyFile),
7104 },
7105 })
7106
7107 testCases = append(testCases, testCase{
7108 name: "ClientAuth-SHA1-Fallback-ECDSA",
7109 config: Config{
7110 MaxVersion: VersionTLS12,
7111 ClientAuth: RequireAnyClientCert,
7112 VerifySignatureAlgorithms: []signatureAlgorithm{
7113 signatureECDSAWithSHA1,
7114 },
7115 Bugs: ProtocolBugs{
7116 NoSignatureAlgorithms: true,
7117 },
7118 },
7119 flags: []string{
7120 "-cert-file", path.Join(*resourceDir, ecdsaP256CertificateFile),
7121 "-key-file", path.Join(*resourceDir, ecdsaP256KeyFile),
7122 },
7123 })
7124
7125 testCases = append(testCases, testCase{
7126 testType: serverTest,
7127 name: "ServerAuth-SHA1-Fallback-ECDSA",
7128 config: Config{
7129 MaxVersion: VersionTLS12,
7130 VerifySignatureAlgorithms: []signatureAlgorithm{
7131 signatureECDSAWithSHA1,
7132 },
7133 Bugs: ProtocolBugs{
7134 NoSignatureAlgorithms: true,
7135 },
7136 },
7137 flags: []string{
7138 "-cert-file", path.Join(*resourceDir, ecdsaP256CertificateFile),
7139 "-key-file", path.Join(*resourceDir, ecdsaP256KeyFile),
7140 },
David Benjamin000800a2014-11-14 01:43:59 -05007141 })
David Benjamin72dc7832015-03-16 17:49:43 -04007142
David Benjamin51dd7d62016-07-08 16:07:01 -07007143 testCases = append(testCases, testCase{
David Benjaminbbfff7c2016-07-13 21:08:33 -04007144 name: "ClientAuth-NoFallback-TLS13",
David Benjamin51dd7d62016-07-08 16:07:01 -07007145 config: Config{
7146 MaxVersion: VersionTLS13,
7147 ClientAuth: RequireAnyClientCert,
David Benjamin7a41d372016-07-09 11:21:54 -07007148 VerifySignatureAlgorithms: []signatureAlgorithm{
David Benjamin51dd7d62016-07-08 16:07:01 -07007149 signatureRSAPKCS1WithSHA1,
7150 },
7151 Bugs: ProtocolBugs{
7152 NoSignatureAlgorithms: true,
7153 },
7154 },
7155 flags: []string{
7156 "-cert-file", path.Join(*resourceDir, rsaCertificateFile),
7157 "-key-file", path.Join(*resourceDir, rsaKeyFile),
7158 },
David Benjamin48901652016-08-01 12:12:47 -04007159 shouldFail: true,
7160 // An empty CertificateRequest signature algorithm list is a
7161 // syntax error in TLS 1.3.
7162 expectedError: ":DECODE_ERROR:",
7163 expectedLocalError: "remote error: error decoding message",
David Benjamin51dd7d62016-07-08 16:07:01 -07007164 })
7165
7166 testCases = append(testCases, testCase{
7167 testType: serverTest,
David Benjaminbbfff7c2016-07-13 21:08:33 -04007168 name: "ServerAuth-NoFallback-TLS13",
David Benjamin51dd7d62016-07-08 16:07:01 -07007169 config: Config{
Steven Valdez803c77a2016-09-06 14:13:43 -04007170 MaxVersion: VersionTLS13,
David Benjamin7a41d372016-07-09 11:21:54 -07007171 VerifySignatureAlgorithms: []signatureAlgorithm{
David Benjamin51dd7d62016-07-08 16:07:01 -07007172 signatureRSAPKCS1WithSHA1,
7173 },
7174 Bugs: ProtocolBugs{
7175 NoSignatureAlgorithms: true,
7176 },
7177 },
7178 shouldFail: true,
7179 expectedError: ":NO_COMMON_SIGNATURE_ALGORITHMS:",
7180 })
7181
David Benjaminb62d2872016-07-18 14:55:02 +02007182 // Test that hash preferences are enforced. BoringSSL does not implement
7183 // MD5 signatures.
David Benjamin72dc7832015-03-16 17:49:43 -04007184 testCases = append(testCases, testCase{
7185 testType: serverTest,
David Benjaminbbfff7c2016-07-13 21:08:33 -04007186 name: "ClientAuth-Enforced",
David Benjamin72dc7832015-03-16 17:49:43 -04007187 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04007188 MaxVersion: VersionTLS12,
David Benjamin72dc7832015-03-16 17:49:43 -04007189 Certificates: []Certificate{rsaCertificate},
David Benjamin7a41d372016-07-09 11:21:54 -07007190 SignSignatureAlgorithms: []signatureAlgorithm{
Nick Harper60edffd2016-06-21 15:19:24 -07007191 signatureRSAPKCS1WithMD5,
David Benjamin72dc7832015-03-16 17:49:43 -04007192 },
7193 Bugs: ProtocolBugs{
7194 IgnorePeerSignatureAlgorithmPreferences: true,
7195 },
7196 },
7197 flags: []string{"-require-any-client-certificate"},
7198 shouldFail: true,
7199 expectedError: ":WRONG_SIGNATURE_TYPE:",
7200 })
7201
7202 testCases = append(testCases, testCase{
David Benjaminbbfff7c2016-07-13 21:08:33 -04007203 name: "ServerAuth-Enforced",
David Benjamin72dc7832015-03-16 17:49:43 -04007204 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04007205 MaxVersion: VersionTLS12,
David Benjamin72dc7832015-03-16 17:49:43 -04007206 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
David Benjamin7a41d372016-07-09 11:21:54 -07007207 SignSignatureAlgorithms: []signatureAlgorithm{
Nick Harper60edffd2016-06-21 15:19:24 -07007208 signatureRSAPKCS1WithMD5,
David Benjamin72dc7832015-03-16 17:49:43 -04007209 },
7210 Bugs: ProtocolBugs{
7211 IgnorePeerSignatureAlgorithmPreferences: true,
7212 },
7213 },
7214 shouldFail: true,
7215 expectedError: ":WRONG_SIGNATURE_TYPE:",
7216 })
David Benjaminb62d2872016-07-18 14:55:02 +02007217 testCases = append(testCases, testCase{
7218 testType: serverTest,
7219 name: "ClientAuth-Enforced-TLS13",
7220 config: Config{
7221 MaxVersion: VersionTLS13,
7222 Certificates: []Certificate{rsaCertificate},
7223 SignSignatureAlgorithms: []signatureAlgorithm{
7224 signatureRSAPKCS1WithMD5,
7225 },
7226 Bugs: ProtocolBugs{
7227 IgnorePeerSignatureAlgorithmPreferences: true,
7228 IgnoreSignatureVersionChecks: true,
7229 },
7230 },
7231 flags: []string{"-require-any-client-certificate"},
7232 shouldFail: true,
7233 expectedError: ":WRONG_SIGNATURE_TYPE:",
7234 })
7235
7236 testCases = append(testCases, testCase{
7237 name: "ServerAuth-Enforced-TLS13",
7238 config: Config{
Steven Valdez803c77a2016-09-06 14:13:43 -04007239 MaxVersion: VersionTLS13,
David Benjaminb62d2872016-07-18 14:55:02 +02007240 SignSignatureAlgorithms: []signatureAlgorithm{
7241 signatureRSAPKCS1WithMD5,
7242 },
7243 Bugs: ProtocolBugs{
7244 IgnorePeerSignatureAlgorithmPreferences: true,
7245 IgnoreSignatureVersionChecks: true,
7246 },
7247 },
7248 shouldFail: true,
7249 expectedError: ":WRONG_SIGNATURE_TYPE:",
7250 })
Steven Valdez0d62f262015-09-04 12:41:04 -04007251
7252 // Test that the agreed upon digest respects the client preferences and
7253 // the server digests.
7254 testCases = append(testCases, testCase{
David Benjaminca3d5452016-07-14 12:51:01 -04007255 name: "NoCommonAlgorithms-Digests",
7256 config: Config{
7257 MaxVersion: VersionTLS12,
7258 ClientAuth: RequireAnyClientCert,
7259 VerifySignatureAlgorithms: []signatureAlgorithm{
7260 signatureRSAPKCS1WithSHA512,
7261 signatureRSAPKCS1WithSHA1,
7262 },
7263 },
7264 flags: []string{
7265 "-cert-file", path.Join(*resourceDir, rsaCertificateFile),
7266 "-key-file", path.Join(*resourceDir, rsaKeyFile),
7267 "-digest-prefs", "SHA256",
7268 },
7269 shouldFail: true,
7270 expectedError: ":NO_COMMON_SIGNATURE_ALGORITHMS:",
7271 })
7272 testCases = append(testCases, testCase{
David Benjaminea9a0d52016-07-08 15:52:59 -07007273 name: "NoCommonAlgorithms",
Steven Valdez0d62f262015-09-04 12:41:04 -04007274 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04007275 MaxVersion: VersionTLS12,
Steven Valdez0d62f262015-09-04 12:41:04 -04007276 ClientAuth: RequireAnyClientCert,
David Benjamin7a41d372016-07-09 11:21:54 -07007277 VerifySignatureAlgorithms: []signatureAlgorithm{
Nick Harper60edffd2016-06-21 15:19:24 -07007278 signatureRSAPKCS1WithSHA512,
7279 signatureRSAPKCS1WithSHA1,
Steven Valdez0d62f262015-09-04 12:41:04 -04007280 },
7281 },
7282 flags: []string{
7283 "-cert-file", path.Join(*resourceDir, rsaCertificateFile),
7284 "-key-file", path.Join(*resourceDir, rsaKeyFile),
David Benjaminca3d5452016-07-14 12:51:01 -04007285 "-signing-prefs", strconv.Itoa(int(signatureRSAPKCS1WithSHA256)),
Steven Valdez0d62f262015-09-04 12:41:04 -04007286 },
David Benjaminca3d5452016-07-14 12:51:01 -04007287 shouldFail: true,
7288 expectedError: ":NO_COMMON_SIGNATURE_ALGORITHMS:",
7289 })
7290 testCases = append(testCases, testCase{
7291 name: "NoCommonAlgorithms-TLS13",
7292 config: Config{
7293 MaxVersion: VersionTLS13,
7294 ClientAuth: RequireAnyClientCert,
7295 VerifySignatureAlgorithms: []signatureAlgorithm{
7296 signatureRSAPSSWithSHA512,
7297 signatureRSAPSSWithSHA384,
7298 },
7299 },
7300 flags: []string{
7301 "-cert-file", path.Join(*resourceDir, rsaCertificateFile),
7302 "-key-file", path.Join(*resourceDir, rsaKeyFile),
7303 "-signing-prefs", strconv.Itoa(int(signatureRSAPSSWithSHA256)),
7304 },
David Benjaminea9a0d52016-07-08 15:52:59 -07007305 shouldFail: true,
7306 expectedError: ":NO_COMMON_SIGNATURE_ALGORITHMS:",
Steven Valdez0d62f262015-09-04 12:41:04 -04007307 })
7308 testCases = append(testCases, testCase{
7309 name: "Agree-Digest-SHA256",
7310 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04007311 MaxVersion: VersionTLS12,
Steven Valdez0d62f262015-09-04 12:41:04 -04007312 ClientAuth: RequireAnyClientCert,
David Benjamin7a41d372016-07-09 11:21:54 -07007313 VerifySignatureAlgorithms: []signatureAlgorithm{
Nick Harper60edffd2016-06-21 15:19:24 -07007314 signatureRSAPKCS1WithSHA1,
7315 signatureRSAPKCS1WithSHA256,
Steven Valdez0d62f262015-09-04 12:41:04 -04007316 },
7317 },
7318 flags: []string{
7319 "-cert-file", path.Join(*resourceDir, rsaCertificateFile),
7320 "-key-file", path.Join(*resourceDir, rsaKeyFile),
David Benjaminca3d5452016-07-14 12:51:01 -04007321 "-digest-prefs", "SHA256,SHA1",
Steven Valdez0d62f262015-09-04 12:41:04 -04007322 },
Nick Harper60edffd2016-06-21 15:19:24 -07007323 expectedPeerSignatureAlgorithm: signatureRSAPKCS1WithSHA256,
Steven Valdez0d62f262015-09-04 12:41:04 -04007324 })
7325 testCases = append(testCases, testCase{
7326 name: "Agree-Digest-SHA1",
7327 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04007328 MaxVersion: VersionTLS12,
Steven Valdez0d62f262015-09-04 12:41:04 -04007329 ClientAuth: RequireAnyClientCert,
David Benjamin7a41d372016-07-09 11:21:54 -07007330 VerifySignatureAlgorithms: []signatureAlgorithm{
Nick Harper60edffd2016-06-21 15:19:24 -07007331 signatureRSAPKCS1WithSHA1,
Steven Valdez0d62f262015-09-04 12:41:04 -04007332 },
7333 },
7334 flags: []string{
7335 "-cert-file", path.Join(*resourceDir, rsaCertificateFile),
7336 "-key-file", path.Join(*resourceDir, rsaKeyFile),
David Benjaminca3d5452016-07-14 12:51:01 -04007337 "-digest-prefs", "SHA512,SHA256,SHA1",
Steven Valdez0d62f262015-09-04 12:41:04 -04007338 },
Nick Harper60edffd2016-06-21 15:19:24 -07007339 expectedPeerSignatureAlgorithm: signatureRSAPKCS1WithSHA1,
Steven Valdez0d62f262015-09-04 12:41:04 -04007340 })
7341 testCases = append(testCases, testCase{
7342 name: "Agree-Digest-Default",
7343 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04007344 MaxVersion: VersionTLS12,
Steven Valdez0d62f262015-09-04 12:41:04 -04007345 ClientAuth: RequireAnyClientCert,
David Benjamin7a41d372016-07-09 11:21:54 -07007346 VerifySignatureAlgorithms: []signatureAlgorithm{
Nick Harper60edffd2016-06-21 15:19:24 -07007347 signatureRSAPKCS1WithSHA256,
7348 signatureECDSAWithP256AndSHA256,
7349 signatureRSAPKCS1WithSHA1,
7350 signatureECDSAWithSHA1,
Steven Valdez0d62f262015-09-04 12:41:04 -04007351 },
7352 },
7353 flags: []string{
7354 "-cert-file", path.Join(*resourceDir, rsaCertificateFile),
7355 "-key-file", path.Join(*resourceDir, rsaKeyFile),
7356 },
Nick Harper60edffd2016-06-21 15:19:24 -07007357 expectedPeerSignatureAlgorithm: signatureRSAPKCS1WithSHA256,
Steven Valdez0d62f262015-09-04 12:41:04 -04007358 })
David Benjamin4c3ddf72016-06-29 18:13:53 -04007359
David Benjaminca3d5452016-07-14 12:51:01 -04007360 // Test that the signing preference list may include extra algorithms
7361 // without negotiation problems.
7362 testCases = append(testCases, testCase{
7363 testType: serverTest,
7364 name: "FilterExtraAlgorithms",
7365 config: Config{
7366 MaxVersion: VersionTLS12,
7367 VerifySignatureAlgorithms: []signatureAlgorithm{
7368 signatureRSAPKCS1WithSHA256,
7369 },
7370 },
7371 flags: []string{
7372 "-cert-file", path.Join(*resourceDir, rsaCertificateFile),
7373 "-key-file", path.Join(*resourceDir, rsaKeyFile),
7374 "-signing-prefs", strconv.Itoa(int(fakeSigAlg1)),
7375 "-signing-prefs", strconv.Itoa(int(signatureECDSAWithP256AndSHA256)),
7376 "-signing-prefs", strconv.Itoa(int(signatureRSAPKCS1WithSHA256)),
7377 "-signing-prefs", strconv.Itoa(int(fakeSigAlg2)),
7378 },
7379 expectedPeerSignatureAlgorithm: signatureRSAPKCS1WithSHA256,
7380 })
7381
David Benjamin4c3ddf72016-06-29 18:13:53 -04007382 // In TLS 1.2 and below, ECDSA uses the curve list rather than the
7383 // signature algorithms.
David Benjamin4c3ddf72016-06-29 18:13:53 -04007384 testCases = append(testCases, testCase{
7385 name: "CheckLeafCurve",
7386 config: Config{
7387 MaxVersion: VersionTLS12,
7388 CipherSuites: []uint16{TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
David Benjamin33863262016-07-08 17:20:12 -07007389 Certificates: []Certificate{ecdsaP256Certificate},
David Benjamin4c3ddf72016-06-29 18:13:53 -04007390 },
7391 flags: []string{"-p384-only"},
7392 shouldFail: true,
7393 expectedError: ":BAD_ECC_CERT:",
7394 })
David Benjamin75ea5bb2016-07-08 17:43:29 -07007395
7396 // In TLS 1.3, ECDSA does not use the ECDHE curve list.
7397 testCases = append(testCases, testCase{
7398 name: "CheckLeafCurve-TLS13",
7399 config: Config{
7400 MaxVersion: VersionTLS13,
David Benjamin75ea5bb2016-07-08 17:43:29 -07007401 Certificates: []Certificate{ecdsaP256Certificate},
7402 },
7403 flags: []string{"-p384-only"},
7404 })
David Benjamin1fb125c2016-07-08 18:52:12 -07007405
7406 // In TLS 1.2, the ECDSA curve is not in the signature algorithm.
7407 testCases = append(testCases, testCase{
7408 name: "ECDSACurveMismatch-Verify-TLS12",
7409 config: Config{
7410 MaxVersion: VersionTLS12,
7411 CipherSuites: []uint16{TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
7412 Certificates: []Certificate{ecdsaP256Certificate},
David Benjamin7a41d372016-07-09 11:21:54 -07007413 SignSignatureAlgorithms: []signatureAlgorithm{
David Benjamin1fb125c2016-07-08 18:52:12 -07007414 signatureECDSAWithP384AndSHA384,
7415 },
7416 },
7417 })
7418
7419 // In TLS 1.3, the ECDSA curve comes from the signature algorithm.
7420 testCases = append(testCases, testCase{
7421 name: "ECDSACurveMismatch-Verify-TLS13",
7422 config: Config{
7423 MaxVersion: VersionTLS13,
David Benjamin1fb125c2016-07-08 18:52:12 -07007424 Certificates: []Certificate{ecdsaP256Certificate},
David Benjamin7a41d372016-07-09 11:21:54 -07007425 SignSignatureAlgorithms: []signatureAlgorithm{
David Benjamin1fb125c2016-07-08 18:52:12 -07007426 signatureECDSAWithP384AndSHA384,
7427 },
7428 Bugs: ProtocolBugs{
7429 SkipECDSACurveCheck: true,
7430 },
7431 },
7432 shouldFail: true,
7433 expectedError: ":WRONG_SIGNATURE_TYPE:",
7434 })
7435
7436 // Signature algorithm selection in TLS 1.3 should take the curve into
7437 // account.
7438 testCases = append(testCases, testCase{
7439 testType: serverTest,
7440 name: "ECDSACurveMismatch-Sign-TLS13",
7441 config: Config{
Steven Valdez803c77a2016-09-06 14:13:43 -04007442 MaxVersion: VersionTLS13,
David Benjamin7a41d372016-07-09 11:21:54 -07007443 VerifySignatureAlgorithms: []signatureAlgorithm{
David Benjamin1fb125c2016-07-08 18:52:12 -07007444 signatureECDSAWithP384AndSHA384,
7445 signatureECDSAWithP256AndSHA256,
7446 },
7447 },
7448 flags: []string{
7449 "-cert-file", path.Join(*resourceDir, ecdsaP256CertificateFile),
7450 "-key-file", path.Join(*resourceDir, ecdsaP256KeyFile),
7451 },
7452 expectedPeerSignatureAlgorithm: signatureECDSAWithP256AndSHA256,
7453 })
David Benjamin7944a9f2016-07-12 22:27:01 -04007454
7455 // RSASSA-PSS with SHA-512 is too large for 1024-bit RSA. Test that the
7456 // server does not attempt to sign in that case.
7457 testCases = append(testCases, testCase{
7458 testType: serverTest,
7459 name: "RSA-PSS-Large",
7460 config: Config{
7461 MaxVersion: VersionTLS13,
7462 VerifySignatureAlgorithms: []signatureAlgorithm{
7463 signatureRSAPSSWithSHA512,
7464 },
7465 },
7466 flags: []string{
7467 "-cert-file", path.Join(*resourceDir, rsa1024CertificateFile),
7468 "-key-file", path.Join(*resourceDir, rsa1024KeyFile),
7469 },
7470 shouldFail: true,
7471 expectedError: ":NO_COMMON_SIGNATURE_ALGORITHMS:",
7472 })
David Benjamin57e929f2016-08-30 00:30:38 -04007473
7474 // Test that RSA-PSS is enabled by default for TLS 1.2.
7475 testCases = append(testCases, testCase{
7476 testType: clientTest,
7477 name: "RSA-PSS-Default-Verify",
7478 config: Config{
7479 MaxVersion: VersionTLS12,
7480 SignSignatureAlgorithms: []signatureAlgorithm{
7481 signatureRSAPSSWithSHA256,
7482 },
7483 },
7484 flags: []string{"-max-version", strconv.Itoa(VersionTLS12)},
7485 })
7486
7487 testCases = append(testCases, testCase{
7488 testType: serverTest,
7489 name: "RSA-PSS-Default-Sign",
7490 config: Config{
7491 MaxVersion: VersionTLS12,
7492 VerifySignatureAlgorithms: []signatureAlgorithm{
7493 signatureRSAPSSWithSHA256,
7494 },
7495 },
7496 flags: []string{"-max-version", strconv.Itoa(VersionTLS12)},
7497 })
Adam Langley898be922017-02-27 12:37:59 -08007498
7499 // A server certificate with a P-224 key will only work up to TLS 1.2
7500 // and we only test it with BoringSSL acting as a server because that's
7501 // all Alphabet requires with it.
7502 testCases = append(testCases, testCase{
7503 testType: serverTest,
7504 name: "P224-Server",
7505 config: Config{
7506 VerifySignatureAlgorithms: []signatureAlgorithm{
7507 // TLS 1.2 does not require that the curve
7508 // match the hash, thus P-256 with SHA-256 is
7509 // the same signature algorithm value as P-224
7510 // with SHA-256.
7511 signatureECDSAWithP256AndSHA256,
7512 },
7513 // P-256 must be offered as well because ECDHE requires
7514 // it.
7515 CurvePreferences: []CurveID{CurveP224, CurveP256},
7516 },
7517 flags: []string{
7518 "-max-version", strconv.Itoa(VersionTLS12),
7519 "-cert-file", path.Join(*resourceDir, ecdsaP224CertificateFile),
7520 "-key-file", path.Join(*resourceDir, ecdsaP224KeyFile),
7521 },
7522 })
David Benjamin000800a2014-11-14 01:43:59 -05007523}
7524
David Benjamin83f90402015-01-27 01:09:43 -05007525// timeouts is the retransmit schedule for BoringSSL. It doubles and
7526// caps at 60 seconds. On the 13th timeout, it gives up.
7527var timeouts = []time.Duration{
7528 1 * time.Second,
7529 2 * time.Second,
7530 4 * time.Second,
7531 8 * time.Second,
7532 16 * time.Second,
7533 32 * time.Second,
7534 60 * time.Second,
7535 60 * time.Second,
7536 60 * time.Second,
7537 60 * time.Second,
7538 60 * time.Second,
7539 60 * time.Second,
7540 60 * time.Second,
7541}
7542
Taylor Brandstetter376a0fe2016-05-10 19:30:28 -07007543// shortTimeouts is an alternate set of timeouts which would occur if the
7544// initial timeout duration was set to 250ms.
7545var shortTimeouts = []time.Duration{
7546 250 * time.Millisecond,
7547 500 * time.Millisecond,
7548 1 * time.Second,
7549 2 * time.Second,
7550 4 * time.Second,
7551 8 * time.Second,
7552 16 * time.Second,
7553 32 * time.Second,
7554 60 * time.Second,
7555 60 * time.Second,
7556 60 * time.Second,
7557 60 * time.Second,
7558 60 * time.Second,
7559}
7560
David Benjamin83f90402015-01-27 01:09:43 -05007561func addDTLSRetransmitTests() {
David Benjamin585d7a42016-06-02 14:58:00 -04007562 // These tests work by coordinating some behavior on both the shim and
7563 // the runner.
7564 //
7565 // TimeoutSchedule configures the runner to send a series of timeout
7566 // opcodes to the shim (see packetAdaptor) immediately before reading
7567 // each peer handshake flight N. The timeout opcode both simulates a
7568 // timeout in the shim and acts as a synchronization point to help the
7569 // runner bracket each handshake flight.
7570 //
7571 // We assume the shim does not read from the channel eagerly. It must
7572 // first wait until it has sent flight N and is ready to receive
7573 // handshake flight N+1. At this point, it will process the timeout
7574 // opcode. It must then immediately respond with a timeout ACK and act
7575 // as if the shim was idle for the specified amount of time.
7576 //
7577 // The runner then drops all packets received before the ACK and
7578 // continues waiting for flight N. This ordering results in one attempt
7579 // at sending flight N to be dropped. For the test to complete, the
7580 // shim must send flight N again, testing that the shim implements DTLS
7581 // retransmit on a timeout.
7582
Steven Valdez143e8b32016-07-11 13:19:03 -04007583 // TODO(davidben): Add DTLS 1.3 versions of these tests. There will
David Benjamin4c3ddf72016-06-29 18:13:53 -04007584 // likely be more epochs to cross and the final message's retransmit may
7585 // be more complex.
7586
David Benjamin11c82892017-02-23 20:40:31 -05007587 // Test that this is indeed the timeout schedule. Stress all
7588 // four patterns of handshake.
7589 for i := 1; i < len(timeouts); i++ {
7590 number := strconv.Itoa(i)
7591 testCases = append(testCases, testCase{
David Benjamin83f90402015-01-27 01:09:43 -05007592 protocol: dtls,
David Benjamin11c82892017-02-23 20:40:31 -05007593 name: "DTLS-Retransmit-Client-" + number,
David Benjamin83f90402015-01-27 01:09:43 -05007594 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04007595 MaxVersion: VersionTLS12,
David Benjamin83f90402015-01-27 01:09:43 -05007596 Bugs: ProtocolBugs{
David Benjamin11c82892017-02-23 20:40:31 -05007597 TimeoutSchedule: timeouts[:i],
David Benjamin83f90402015-01-27 01:09:43 -05007598 },
7599 },
7600 resumeSession: true,
David Benjamin11c82892017-02-23 20:40:31 -05007601 flags: []string{"-async"},
David Benjamin83f90402015-01-27 01:09:43 -05007602 })
David Benjamin11c82892017-02-23 20:40:31 -05007603 testCases = append(testCases, testCase{
David Benjamin83f90402015-01-27 01:09:43 -05007604 protocol: dtls,
7605 testType: serverTest,
David Benjamin11c82892017-02-23 20:40:31 -05007606 name: "DTLS-Retransmit-Server-" + number,
David Benjamin83f90402015-01-27 01:09:43 -05007607 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04007608 MaxVersion: VersionTLS12,
David Benjamin83f90402015-01-27 01:09:43 -05007609 Bugs: ProtocolBugs{
David Benjamin11c82892017-02-23 20:40:31 -05007610 TimeoutSchedule: timeouts[:i],
David Benjamin83f90402015-01-27 01:09:43 -05007611 },
7612 },
7613 resumeSession: true,
David Benjamin11c82892017-02-23 20:40:31 -05007614 flags: []string{"-async"},
David Benjamin83f90402015-01-27 01:09:43 -05007615 })
7616 }
David Benjamin11c82892017-02-23 20:40:31 -05007617
7618 // Test that exceeding the timeout schedule hits a read
7619 // timeout.
7620 testCases = append(testCases, testCase{
7621 protocol: dtls,
7622 name: "DTLS-Retransmit-Timeout",
7623 config: Config{
7624 MaxVersion: VersionTLS12,
7625 Bugs: ProtocolBugs{
7626 TimeoutSchedule: timeouts,
7627 },
7628 },
7629 resumeSession: true,
7630 flags: []string{"-async"},
7631 shouldFail: true,
7632 expectedError: ":READ_TIMEOUT_EXPIRED:",
7633 })
7634
7635 // Test that timeout handling has a fudge factor, due to API
7636 // problems.
7637 testCases = append(testCases, testCase{
7638 protocol: dtls,
7639 name: "DTLS-Retransmit-Fudge",
7640 config: Config{
7641 MaxVersion: VersionTLS12,
7642 Bugs: ProtocolBugs{
7643 TimeoutSchedule: []time.Duration{
7644 timeouts[0] - 10*time.Millisecond,
7645 },
7646 },
7647 },
7648 resumeSession: true,
7649 flags: []string{"-async"},
7650 })
7651
7652 // Test that the final Finished retransmitting isn't
7653 // duplicated if the peer badly fragments everything.
7654 testCases = append(testCases, testCase{
7655 testType: serverTest,
7656 protocol: dtls,
7657 name: "DTLS-Retransmit-Fragmented",
7658 config: Config{
7659 MaxVersion: VersionTLS12,
7660 Bugs: ProtocolBugs{
7661 TimeoutSchedule: []time.Duration{timeouts[0]},
7662 MaxHandshakeRecordLength: 2,
7663 },
7664 },
7665 flags: []string{"-async"},
7666 })
7667
7668 // Test the timeout schedule when a shorter initial timeout duration is set.
7669 testCases = append(testCases, testCase{
7670 protocol: dtls,
7671 name: "DTLS-Retransmit-Short-Client",
7672 config: Config{
7673 MaxVersion: VersionTLS12,
7674 Bugs: ProtocolBugs{
7675 TimeoutSchedule: shortTimeouts[:len(shortTimeouts)-1],
7676 },
7677 },
7678 resumeSession: true,
7679 flags: []string{
7680 "-async",
7681 "-initial-timeout-duration-ms", "250",
7682 },
7683 })
7684 testCases = append(testCases, testCase{
7685 protocol: dtls,
7686 testType: serverTest,
7687 name: "DTLS-Retransmit-Short-Server",
7688 config: Config{
7689 MaxVersion: VersionTLS12,
7690 Bugs: ProtocolBugs{
7691 TimeoutSchedule: shortTimeouts[:len(shortTimeouts)-1],
7692 },
7693 },
7694 resumeSession: true,
7695 flags: []string{
7696 "-async",
7697 "-initial-timeout-duration-ms", "250",
7698 },
7699 })
David Benjamin83f90402015-01-27 01:09:43 -05007700}
7701
David Benjaminc565ebb2015-04-03 04:06:36 -04007702func addExportKeyingMaterialTests() {
7703 for _, vers := range tlsVersions {
7704 if vers.version == VersionSSL30 {
7705 continue
7706 }
7707 testCases = append(testCases, testCase{
7708 name: "ExportKeyingMaterial-" + vers.name,
7709 config: Config{
7710 MaxVersion: vers.version,
7711 },
7712 exportKeyingMaterial: 1024,
7713 exportLabel: "label",
7714 exportContext: "context",
7715 useExportContext: true,
7716 })
7717 testCases = append(testCases, testCase{
7718 name: "ExportKeyingMaterial-NoContext-" + vers.name,
7719 config: Config{
7720 MaxVersion: vers.version,
7721 },
7722 exportKeyingMaterial: 1024,
7723 })
7724 testCases = append(testCases, testCase{
7725 name: "ExportKeyingMaterial-EmptyContext-" + vers.name,
7726 config: Config{
7727 MaxVersion: vers.version,
7728 },
7729 exportKeyingMaterial: 1024,
7730 useExportContext: true,
7731 })
7732 testCases = append(testCases, testCase{
7733 name: "ExportKeyingMaterial-Small-" + vers.name,
7734 config: Config{
7735 MaxVersion: vers.version,
7736 },
7737 exportKeyingMaterial: 1,
7738 exportLabel: "label",
7739 exportContext: "context",
7740 useExportContext: true,
7741 })
7742 }
David Benjamin7bb1d292016-11-01 19:45:06 -04007743
David Benjaminc565ebb2015-04-03 04:06:36 -04007744 testCases = append(testCases, testCase{
7745 name: "ExportKeyingMaterial-SSL3",
7746 config: Config{
7747 MaxVersion: VersionSSL30,
7748 },
7749 exportKeyingMaterial: 1024,
7750 exportLabel: "label",
7751 exportContext: "context",
7752 useExportContext: true,
7753 shouldFail: true,
7754 expectedError: "failed to export keying material",
7755 })
David Benjamin7bb1d292016-11-01 19:45:06 -04007756
7757 // Exporters work during a False Start.
7758 testCases = append(testCases, testCase{
7759 name: "ExportKeyingMaterial-FalseStart",
7760 config: Config{
7761 MaxVersion: VersionTLS12,
7762 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
7763 NextProtos: []string{"foo"},
7764 Bugs: ProtocolBugs{
7765 ExpectFalseStart: true,
7766 },
7767 },
7768 flags: []string{
7769 "-false-start",
7770 "-advertise-alpn", "\x03foo",
7771 },
7772 shimWritesFirst: true,
7773 exportKeyingMaterial: 1024,
7774 exportLabel: "label",
7775 exportContext: "context",
7776 useExportContext: true,
7777 })
7778
7779 // Exporters do not work in the middle of a renegotiation. Test this by
7780 // triggering the exporter after every SSL_read call and configuring the
7781 // shim to run asynchronously.
7782 testCases = append(testCases, testCase{
7783 name: "ExportKeyingMaterial-Renegotiate",
7784 config: Config{
7785 MaxVersion: VersionTLS12,
7786 },
7787 renegotiate: 1,
7788 flags: []string{
7789 "-async",
7790 "-use-exporter-between-reads",
7791 "-renegotiate-freely",
7792 "-expect-total-renegotiations", "1",
7793 },
7794 shouldFail: true,
7795 expectedError: "failed to export keying material",
7796 })
David Benjaminc565ebb2015-04-03 04:06:36 -04007797}
7798
Adam Langleyaf0e32c2015-06-03 09:57:23 -07007799func addTLSUniqueTests() {
7800 for _, isClient := range []bool{false, true} {
7801 for _, isResumption := range []bool{false, true} {
7802 for _, hasEMS := range []bool{false, true} {
7803 var suffix string
7804 if isResumption {
7805 suffix = "Resume-"
7806 } else {
7807 suffix = "Full-"
7808 }
7809
7810 if hasEMS {
7811 suffix += "EMS-"
7812 } else {
7813 suffix += "NoEMS-"
7814 }
7815
7816 if isClient {
7817 suffix += "Client"
7818 } else {
7819 suffix += "Server"
7820 }
7821
7822 test := testCase{
7823 name: "TLSUnique-" + suffix,
7824 testTLSUnique: true,
7825 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04007826 MaxVersion: VersionTLS12,
Adam Langleyaf0e32c2015-06-03 09:57:23 -07007827 Bugs: ProtocolBugs{
7828 NoExtendedMasterSecret: !hasEMS,
7829 },
7830 },
7831 }
7832
7833 if isResumption {
7834 test.resumeSession = true
7835 test.resumeConfig = &Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04007836 MaxVersion: VersionTLS12,
Adam Langleyaf0e32c2015-06-03 09:57:23 -07007837 Bugs: ProtocolBugs{
7838 NoExtendedMasterSecret: !hasEMS,
7839 },
7840 }
7841 }
7842
7843 if isResumption && !hasEMS {
7844 test.shouldFail = true
7845 test.expectedError = "failed to get tls-unique"
7846 }
7847
7848 testCases = append(testCases, test)
7849 }
7850 }
7851 }
7852}
7853
Adam Langley09505632015-07-30 18:10:13 -07007854func addCustomExtensionTests() {
7855 expectedContents := "custom extension"
7856 emptyString := ""
7857
7858 for _, isClient := range []bool{false, true} {
7859 suffix := "Server"
7860 flag := "-enable-server-custom-extension"
7861 testType := serverTest
7862 if isClient {
7863 suffix = "Client"
7864 flag = "-enable-client-custom-extension"
7865 testType = clientTest
7866 }
7867
7868 testCases = append(testCases, testCase{
7869 testType: testType,
David Benjamin399e7c92015-07-30 23:01:27 -04007870 name: "CustomExtensions-" + suffix,
Adam Langley09505632015-07-30 18:10:13 -07007871 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04007872 MaxVersion: VersionTLS12,
David Benjamin399e7c92015-07-30 23:01:27 -04007873 Bugs: ProtocolBugs{
7874 CustomExtension: expectedContents,
Adam Langley09505632015-07-30 18:10:13 -07007875 ExpectedCustomExtension: &expectedContents,
7876 },
7877 },
7878 flags: []string{flag},
7879 })
Steven Valdez143e8b32016-07-11 13:19:03 -04007880 testCases = append(testCases, testCase{
7881 testType: testType,
7882 name: "CustomExtensions-" + suffix + "-TLS13",
7883 config: Config{
7884 MaxVersion: VersionTLS13,
7885 Bugs: ProtocolBugs{
7886 CustomExtension: expectedContents,
7887 ExpectedCustomExtension: &expectedContents,
7888 },
7889 },
7890 flags: []string{flag},
7891 })
Adam Langley09505632015-07-30 18:10:13 -07007892
7893 // If the parse callback fails, the handshake should also fail.
7894 testCases = append(testCases, testCase{
7895 testType: testType,
David Benjamin399e7c92015-07-30 23:01:27 -04007896 name: "CustomExtensions-ParseError-" + suffix,
Adam Langley09505632015-07-30 18:10:13 -07007897 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04007898 MaxVersion: VersionTLS12,
David Benjamin399e7c92015-07-30 23:01:27 -04007899 Bugs: ProtocolBugs{
7900 CustomExtension: expectedContents + "foo",
Adam Langley09505632015-07-30 18:10:13 -07007901 ExpectedCustomExtension: &expectedContents,
7902 },
7903 },
David Benjamin399e7c92015-07-30 23:01:27 -04007904 flags: []string{flag},
7905 shouldFail: true,
Adam Langley09505632015-07-30 18:10:13 -07007906 expectedError: ":CUSTOM_EXTENSION_ERROR:",
7907 })
Steven Valdez143e8b32016-07-11 13:19:03 -04007908 testCases = append(testCases, testCase{
7909 testType: testType,
7910 name: "CustomExtensions-ParseError-" + suffix + "-TLS13",
7911 config: Config{
7912 MaxVersion: VersionTLS13,
7913 Bugs: ProtocolBugs{
7914 CustomExtension: expectedContents + "foo",
7915 ExpectedCustomExtension: &expectedContents,
7916 },
7917 },
7918 flags: []string{flag},
7919 shouldFail: true,
7920 expectedError: ":CUSTOM_EXTENSION_ERROR:",
7921 })
Adam Langley09505632015-07-30 18:10:13 -07007922
7923 // If the add callback fails, the handshake should also fail.
7924 testCases = append(testCases, testCase{
7925 testType: testType,
David Benjamin399e7c92015-07-30 23:01:27 -04007926 name: "CustomExtensions-FailAdd-" + suffix,
Adam Langley09505632015-07-30 18:10:13 -07007927 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04007928 MaxVersion: VersionTLS12,
David Benjamin399e7c92015-07-30 23:01:27 -04007929 Bugs: ProtocolBugs{
7930 CustomExtension: expectedContents,
Adam Langley09505632015-07-30 18:10:13 -07007931 ExpectedCustomExtension: &expectedContents,
7932 },
7933 },
David Benjamin399e7c92015-07-30 23:01:27 -04007934 flags: []string{flag, "-custom-extension-fail-add"},
7935 shouldFail: true,
Adam Langley09505632015-07-30 18:10:13 -07007936 expectedError: ":CUSTOM_EXTENSION_ERROR:",
7937 })
Steven Valdez143e8b32016-07-11 13:19:03 -04007938 testCases = append(testCases, testCase{
7939 testType: testType,
7940 name: "CustomExtensions-FailAdd-" + suffix + "-TLS13",
7941 config: Config{
7942 MaxVersion: VersionTLS13,
7943 Bugs: ProtocolBugs{
7944 CustomExtension: expectedContents,
7945 ExpectedCustomExtension: &expectedContents,
7946 },
7947 },
7948 flags: []string{flag, "-custom-extension-fail-add"},
7949 shouldFail: true,
7950 expectedError: ":CUSTOM_EXTENSION_ERROR:",
7951 })
Adam Langley09505632015-07-30 18:10:13 -07007952
7953 // If the add callback returns zero, no extension should be
7954 // added.
7955 skipCustomExtension := expectedContents
7956 if isClient {
7957 // For the case where the client skips sending the
7958 // custom extension, the server must not “echo” it.
7959 skipCustomExtension = ""
7960 }
7961 testCases = append(testCases, testCase{
7962 testType: testType,
David Benjamin399e7c92015-07-30 23:01:27 -04007963 name: "CustomExtensions-Skip-" + suffix,
Adam Langley09505632015-07-30 18:10:13 -07007964 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04007965 MaxVersion: VersionTLS12,
David Benjamin399e7c92015-07-30 23:01:27 -04007966 Bugs: ProtocolBugs{
7967 CustomExtension: skipCustomExtension,
Adam Langley09505632015-07-30 18:10:13 -07007968 ExpectedCustomExtension: &emptyString,
7969 },
7970 },
7971 flags: []string{flag, "-custom-extension-skip"},
7972 })
Steven Valdez143e8b32016-07-11 13:19:03 -04007973 testCases = append(testCases, testCase{
7974 testType: testType,
7975 name: "CustomExtensions-Skip-" + suffix + "-TLS13",
7976 config: Config{
7977 MaxVersion: VersionTLS13,
7978 Bugs: ProtocolBugs{
7979 CustomExtension: skipCustomExtension,
7980 ExpectedCustomExtension: &emptyString,
7981 },
7982 },
7983 flags: []string{flag, "-custom-extension-skip"},
7984 })
Adam Langley09505632015-07-30 18:10:13 -07007985 }
7986
7987 // The custom extension add callback should not be called if the client
7988 // doesn't send the extension.
7989 testCases = append(testCases, testCase{
7990 testType: serverTest,
David Benjamin399e7c92015-07-30 23:01:27 -04007991 name: "CustomExtensions-NotCalled-Server",
Adam Langley09505632015-07-30 18:10:13 -07007992 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04007993 MaxVersion: VersionTLS12,
David Benjamin399e7c92015-07-30 23:01:27 -04007994 Bugs: ProtocolBugs{
Adam Langley09505632015-07-30 18:10:13 -07007995 ExpectedCustomExtension: &emptyString,
7996 },
7997 },
7998 flags: []string{"-enable-server-custom-extension", "-custom-extension-fail-add"},
7999 })
Adam Langley2deb9842015-08-07 11:15:37 -07008000
Steven Valdez143e8b32016-07-11 13:19:03 -04008001 testCases = append(testCases, testCase{
8002 testType: serverTest,
8003 name: "CustomExtensions-NotCalled-Server-TLS13",
8004 config: Config{
8005 MaxVersion: VersionTLS13,
8006 Bugs: ProtocolBugs{
8007 ExpectedCustomExtension: &emptyString,
8008 },
8009 },
8010 flags: []string{"-enable-server-custom-extension", "-custom-extension-fail-add"},
8011 })
8012
Adam Langley2deb9842015-08-07 11:15:37 -07008013 // Test an unknown extension from the server.
8014 testCases = append(testCases, testCase{
8015 testType: clientTest,
8016 name: "UnknownExtension-Client",
8017 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04008018 MaxVersion: VersionTLS12,
Adam Langley2deb9842015-08-07 11:15:37 -07008019 Bugs: ProtocolBugs{
8020 CustomExtension: expectedContents,
8021 },
8022 },
David Benjamin0c40a962016-08-01 12:05:50 -04008023 shouldFail: true,
8024 expectedError: ":UNEXPECTED_EXTENSION:",
8025 expectedLocalError: "remote error: unsupported extension",
Adam Langley2deb9842015-08-07 11:15:37 -07008026 })
Steven Valdez143e8b32016-07-11 13:19:03 -04008027 testCases = append(testCases, testCase{
8028 testType: clientTest,
8029 name: "UnknownExtension-Client-TLS13",
8030 config: Config{
8031 MaxVersion: VersionTLS13,
8032 Bugs: ProtocolBugs{
8033 CustomExtension: expectedContents,
8034 },
8035 },
David Benjamin0c40a962016-08-01 12:05:50 -04008036 shouldFail: true,
8037 expectedError: ":UNEXPECTED_EXTENSION:",
8038 expectedLocalError: "remote error: unsupported extension",
8039 })
David Benjamin490469f2016-10-05 22:44:38 -04008040 testCases = append(testCases, testCase{
8041 testType: clientTest,
8042 name: "UnknownUnencryptedExtension-Client-TLS13",
8043 config: Config{
8044 MaxVersion: VersionTLS13,
8045 Bugs: ProtocolBugs{
8046 CustomUnencryptedExtension: expectedContents,
8047 },
8048 },
8049 shouldFail: true,
8050 expectedError: ":UNEXPECTED_EXTENSION:",
8051 // The shim must send an alert, but alerts at this point do not
8052 // get successfully decrypted by the runner.
8053 expectedLocalError: "local error: bad record MAC",
8054 })
8055 testCases = append(testCases, testCase{
8056 testType: clientTest,
8057 name: "UnexpectedUnencryptedExtension-Client-TLS13",
8058 config: Config{
8059 MaxVersion: VersionTLS13,
8060 Bugs: ProtocolBugs{
8061 SendUnencryptedALPN: "foo",
8062 },
8063 },
8064 flags: []string{
8065 "-advertise-alpn", "\x03foo\x03bar",
8066 },
8067 shouldFail: true,
8068 expectedError: ":UNEXPECTED_EXTENSION:",
8069 // The shim must send an alert, but alerts at this point do not
8070 // get successfully decrypted by the runner.
8071 expectedLocalError: "local error: bad record MAC",
8072 })
David Benjamin0c40a962016-08-01 12:05:50 -04008073
8074 // Test a known but unoffered extension from the server.
8075 testCases = append(testCases, testCase{
8076 testType: clientTest,
8077 name: "UnofferedExtension-Client",
8078 config: Config{
8079 MaxVersion: VersionTLS12,
8080 Bugs: ProtocolBugs{
8081 SendALPN: "alpn",
8082 },
8083 },
8084 shouldFail: true,
8085 expectedError: ":UNEXPECTED_EXTENSION:",
8086 expectedLocalError: "remote error: unsupported extension",
8087 })
8088 testCases = append(testCases, testCase{
8089 testType: clientTest,
8090 name: "UnofferedExtension-Client-TLS13",
8091 config: Config{
8092 MaxVersion: VersionTLS13,
8093 Bugs: ProtocolBugs{
8094 SendALPN: "alpn",
8095 },
8096 },
8097 shouldFail: true,
8098 expectedError: ":UNEXPECTED_EXTENSION:",
8099 expectedLocalError: "remote error: unsupported extension",
Steven Valdez143e8b32016-07-11 13:19:03 -04008100 })
Adam Langley09505632015-07-30 18:10:13 -07008101}
8102
David Benjaminb36a3952015-12-01 18:53:13 -05008103func addRSAClientKeyExchangeTests() {
8104 for bad := RSABadValue(1); bad < NumRSABadValues; bad++ {
8105 testCases = append(testCases, testCase{
8106 testType: serverTest,
8107 name: fmt.Sprintf("BadRSAClientKeyExchange-%d", bad),
8108 config: Config{
8109 // Ensure the ClientHello version and final
8110 // version are different, to detect if the
8111 // server uses the wrong one.
8112 MaxVersion: VersionTLS11,
Matt Braithwaite07e78062016-08-21 14:50:43 -07008113 CipherSuites: []uint16{TLS_RSA_WITH_3DES_EDE_CBC_SHA},
David Benjaminb36a3952015-12-01 18:53:13 -05008114 Bugs: ProtocolBugs{
8115 BadRSAClientKeyExchange: bad,
8116 },
8117 },
8118 shouldFail: true,
8119 expectedError: ":DECRYPTION_FAILED_OR_BAD_RECORD_MAC:",
8120 })
8121 }
David Benjamine63d9d72016-09-19 18:27:34 -04008122
8123 // The server must compare whatever was in ClientHello.version for the
8124 // RSA premaster.
8125 testCases = append(testCases, testCase{
8126 testType: serverTest,
8127 name: "SendClientVersion-RSA",
8128 config: Config{
8129 CipherSuites: []uint16{TLS_RSA_WITH_AES_128_GCM_SHA256},
8130 Bugs: ProtocolBugs{
8131 SendClientVersion: 0x1234,
8132 },
8133 },
8134 flags: []string{"-max-version", strconv.Itoa(VersionTLS12)},
8135 })
David Benjaminb36a3952015-12-01 18:53:13 -05008136}
8137
David Benjamin8c2b3bf2015-12-18 20:55:44 -05008138var testCurves = []struct {
8139 name string
8140 id CurveID
8141}{
David Benjamin8c2b3bf2015-12-18 20:55:44 -05008142 {"P-256", CurveP256},
8143 {"P-384", CurveP384},
8144 {"P-521", CurveP521},
David Benjamin4298d772015-12-19 00:18:25 -05008145 {"X25519", CurveX25519},
David Benjamin8c2b3bf2015-12-18 20:55:44 -05008146}
8147
Steven Valdez5440fe02016-07-18 12:40:30 -04008148const bogusCurve = 0x1234
8149
David Benjamin8c2b3bf2015-12-18 20:55:44 -05008150func addCurveTests() {
8151 for _, curve := range testCurves {
8152 testCases = append(testCases, testCase{
8153 name: "CurveTest-Client-" + curve.name,
8154 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04008155 MaxVersion: VersionTLS12,
David Benjamin8c2b3bf2015-12-18 20:55:44 -05008156 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
8157 CurvePreferences: []CurveID{curve.id},
8158 },
David Benjamin5c4e8572016-08-19 17:44:53 -04008159 flags: []string{
8160 "-enable-all-curves",
8161 "-expect-curve-id", strconv.Itoa(int(curve.id)),
8162 },
Steven Valdez5440fe02016-07-18 12:40:30 -04008163 expectedCurveID: curve.id,
David Benjamin8c2b3bf2015-12-18 20:55:44 -05008164 })
8165 testCases = append(testCases, testCase{
Steven Valdez143e8b32016-07-11 13:19:03 -04008166 name: "CurveTest-Client-" + curve.name + "-TLS13",
8167 config: Config{
8168 MaxVersion: VersionTLS13,
Steven Valdez143e8b32016-07-11 13:19:03 -04008169 CurvePreferences: []CurveID{curve.id},
8170 },
David Benjamin5c4e8572016-08-19 17:44:53 -04008171 flags: []string{
8172 "-enable-all-curves",
8173 "-expect-curve-id", strconv.Itoa(int(curve.id)),
8174 },
Steven Valdez5440fe02016-07-18 12:40:30 -04008175 expectedCurveID: curve.id,
Steven Valdez143e8b32016-07-11 13:19:03 -04008176 })
8177 testCases = append(testCases, testCase{
David Benjamin8c2b3bf2015-12-18 20:55:44 -05008178 testType: serverTest,
8179 name: "CurveTest-Server-" + curve.name,
8180 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04008181 MaxVersion: VersionTLS12,
David Benjamin8c2b3bf2015-12-18 20:55:44 -05008182 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
8183 CurvePreferences: []CurveID{curve.id},
8184 },
David Benjamin5c4e8572016-08-19 17:44:53 -04008185 flags: []string{
8186 "-enable-all-curves",
8187 "-expect-curve-id", strconv.Itoa(int(curve.id)),
8188 },
Steven Valdez5440fe02016-07-18 12:40:30 -04008189 expectedCurveID: curve.id,
David Benjamin8c2b3bf2015-12-18 20:55:44 -05008190 })
Steven Valdez143e8b32016-07-11 13:19:03 -04008191 testCases = append(testCases, testCase{
8192 testType: serverTest,
8193 name: "CurveTest-Server-" + curve.name + "-TLS13",
8194 config: Config{
8195 MaxVersion: VersionTLS13,
Steven Valdez143e8b32016-07-11 13:19:03 -04008196 CurvePreferences: []CurveID{curve.id},
8197 },
David Benjamin5c4e8572016-08-19 17:44:53 -04008198 flags: []string{
8199 "-enable-all-curves",
8200 "-expect-curve-id", strconv.Itoa(int(curve.id)),
8201 },
Steven Valdez5440fe02016-07-18 12:40:30 -04008202 expectedCurveID: curve.id,
Steven Valdez143e8b32016-07-11 13:19:03 -04008203 })
David Benjamin8c2b3bf2015-12-18 20:55:44 -05008204 }
David Benjamin241ae832016-01-15 03:04:54 -05008205
8206 // The server must be tolerant to bogus curves.
David Benjamin241ae832016-01-15 03:04:54 -05008207 testCases = append(testCases, testCase{
8208 testType: serverTest,
8209 name: "UnknownCurve",
8210 config: Config{
Steven Valdez803c77a2016-09-06 14:13:43 -04008211 MaxVersion: VersionTLS12,
David Benjamin241ae832016-01-15 03:04:54 -05008212 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
8213 CurvePreferences: []CurveID{bogusCurve, CurveP256},
8214 },
8215 })
David Benjamin4c3ddf72016-06-29 18:13:53 -04008216
Steven Valdez803c77a2016-09-06 14:13:43 -04008217 // The server must be tolerant to bogus curves.
8218 testCases = append(testCases, testCase{
8219 testType: serverTest,
8220 name: "UnknownCurve-TLS13",
8221 config: Config{
8222 MaxVersion: VersionTLS13,
8223 CurvePreferences: []CurveID{bogusCurve, CurveP256},
8224 },
8225 })
8226
David Benjamin4c3ddf72016-06-29 18:13:53 -04008227 // The server must not consider ECDHE ciphers when there are no
8228 // supported curves.
8229 testCases = append(testCases, testCase{
8230 testType: serverTest,
8231 name: "NoSupportedCurves",
8232 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04008233 MaxVersion: VersionTLS12,
8234 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
8235 Bugs: ProtocolBugs{
8236 NoSupportedCurves: true,
8237 },
8238 },
8239 shouldFail: true,
8240 expectedError: ":NO_SHARED_CIPHER:",
8241 })
Steven Valdez143e8b32016-07-11 13:19:03 -04008242 testCases = append(testCases, testCase{
8243 testType: serverTest,
8244 name: "NoSupportedCurves-TLS13",
8245 config: Config{
Steven Valdez803c77a2016-09-06 14:13:43 -04008246 MaxVersion: VersionTLS13,
Steven Valdez143e8b32016-07-11 13:19:03 -04008247 Bugs: ProtocolBugs{
8248 NoSupportedCurves: true,
8249 },
8250 },
8251 shouldFail: true,
Steven Valdez803c77a2016-09-06 14:13:43 -04008252 expectedError: ":NO_SHARED_GROUP:",
Steven Valdez143e8b32016-07-11 13:19:03 -04008253 })
David Benjamin4c3ddf72016-06-29 18:13:53 -04008254
8255 // The server must fall back to another cipher when there are no
8256 // supported curves.
8257 testCases = append(testCases, testCase{
8258 testType: serverTest,
8259 name: "NoCommonCurves",
8260 config: Config{
8261 MaxVersion: VersionTLS12,
8262 CipherSuites: []uint16{
8263 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
Matthew Braithwaitecedc6f12017-03-15 19:20:23 -07008264 TLS_RSA_WITH_AES_128_GCM_SHA256,
David Benjamin4c3ddf72016-06-29 18:13:53 -04008265 },
8266 CurvePreferences: []CurveID{CurveP224},
8267 },
Matthew Braithwaitecedc6f12017-03-15 19:20:23 -07008268 expectedCipher: TLS_RSA_WITH_AES_128_GCM_SHA256,
David Benjamin4c3ddf72016-06-29 18:13:53 -04008269 })
8270
8271 // The client must reject bogus curves and disabled curves.
8272 testCases = append(testCases, testCase{
8273 name: "BadECDHECurve",
8274 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04008275 MaxVersion: VersionTLS12,
8276 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
8277 Bugs: ProtocolBugs{
8278 SendCurve: bogusCurve,
8279 },
8280 },
8281 shouldFail: true,
8282 expectedError: ":WRONG_CURVE:",
8283 })
Steven Valdez143e8b32016-07-11 13:19:03 -04008284 testCases = append(testCases, testCase{
8285 name: "BadECDHECurve-TLS13",
8286 config: Config{
Steven Valdez803c77a2016-09-06 14:13:43 -04008287 MaxVersion: VersionTLS13,
Steven Valdez143e8b32016-07-11 13:19:03 -04008288 Bugs: ProtocolBugs{
8289 SendCurve: bogusCurve,
8290 },
8291 },
8292 shouldFail: true,
8293 expectedError: ":WRONG_CURVE:",
8294 })
David Benjamin4c3ddf72016-06-29 18:13:53 -04008295
8296 testCases = append(testCases, testCase{
8297 name: "UnsupportedCurve",
8298 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04008299 MaxVersion: VersionTLS12,
8300 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
8301 CurvePreferences: []CurveID{CurveP256},
8302 Bugs: ProtocolBugs{
8303 IgnorePeerCurvePreferences: true,
8304 },
8305 },
8306 flags: []string{"-p384-only"},
8307 shouldFail: true,
8308 expectedError: ":WRONG_CURVE:",
8309 })
8310
David Benjamin4f921572016-07-17 14:20:10 +02008311 testCases = append(testCases, testCase{
8312 // TODO(davidben): Add a TLS 1.3 version where
8313 // HelloRetryRequest requests an unsupported curve.
8314 name: "UnsupportedCurve-ServerHello-TLS13",
8315 config: Config{
Steven Valdez803c77a2016-09-06 14:13:43 -04008316 MaxVersion: VersionTLS13,
David Benjamin4f921572016-07-17 14:20:10 +02008317 CurvePreferences: []CurveID{CurveP384},
8318 Bugs: ProtocolBugs{
8319 SendCurve: CurveP256,
8320 },
8321 },
8322 flags: []string{"-p384-only"},
8323 shouldFail: true,
8324 expectedError: ":WRONG_CURVE:",
8325 })
8326
David Benjamin4c3ddf72016-06-29 18:13:53 -04008327 // Test invalid curve points.
8328 testCases = append(testCases, testCase{
8329 name: "InvalidECDHPoint-Client",
8330 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04008331 MaxVersion: VersionTLS12,
8332 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
8333 CurvePreferences: []CurveID{CurveP256},
8334 Bugs: ProtocolBugs{
8335 InvalidECDHPoint: true,
8336 },
8337 },
8338 shouldFail: true,
8339 expectedError: ":INVALID_ENCODING:",
8340 })
8341 testCases = append(testCases, testCase{
Steven Valdez143e8b32016-07-11 13:19:03 -04008342 name: "InvalidECDHPoint-Client-TLS13",
8343 config: Config{
8344 MaxVersion: VersionTLS13,
Steven Valdez143e8b32016-07-11 13:19:03 -04008345 CurvePreferences: []CurveID{CurveP256},
8346 Bugs: ProtocolBugs{
8347 InvalidECDHPoint: true,
8348 },
8349 },
8350 shouldFail: true,
8351 expectedError: ":INVALID_ENCODING:",
8352 })
8353 testCases = append(testCases, testCase{
David Benjamin4c3ddf72016-06-29 18:13:53 -04008354 testType: serverTest,
8355 name: "InvalidECDHPoint-Server",
8356 config: Config{
David Benjamin4c3ddf72016-06-29 18:13:53 -04008357 MaxVersion: VersionTLS12,
8358 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
8359 CurvePreferences: []CurveID{CurveP256},
8360 Bugs: ProtocolBugs{
8361 InvalidECDHPoint: true,
8362 },
8363 },
8364 shouldFail: true,
8365 expectedError: ":INVALID_ENCODING:",
8366 })
Steven Valdez143e8b32016-07-11 13:19:03 -04008367 testCases = append(testCases, testCase{
8368 testType: serverTest,
8369 name: "InvalidECDHPoint-Server-TLS13",
8370 config: Config{
8371 MaxVersion: VersionTLS13,
Steven Valdez143e8b32016-07-11 13:19:03 -04008372 CurvePreferences: []CurveID{CurveP256},
8373 Bugs: ProtocolBugs{
8374 InvalidECDHPoint: true,
8375 },
8376 },
8377 shouldFail: true,
8378 expectedError: ":INVALID_ENCODING:",
8379 })
David Benjamin8a55ce42016-12-11 03:03:42 -05008380
8381 // The previous curve ID should be reported on TLS 1.2 resumption.
8382 testCases = append(testCases, testCase{
8383 name: "CurveID-Resume-Client",
8384 config: Config{
8385 MaxVersion: VersionTLS12,
8386 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
8387 CurvePreferences: []CurveID{CurveX25519},
8388 },
8389 flags: []string{"-expect-curve-id", strconv.Itoa(int(CurveX25519))},
8390 resumeSession: true,
8391 })
8392 testCases = append(testCases, testCase{
8393 testType: serverTest,
8394 name: "CurveID-Resume-Server",
8395 config: Config{
8396 MaxVersion: VersionTLS12,
8397 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
8398 CurvePreferences: []CurveID{CurveX25519},
8399 },
8400 flags: []string{"-expect-curve-id", strconv.Itoa(int(CurveX25519))},
8401 resumeSession: true,
8402 })
8403
8404 // TLS 1.3 allows resuming at a differet curve. If this happens, the new
8405 // one should be reported.
8406 testCases = append(testCases, testCase{
8407 name: "CurveID-Resume-Client-TLS13",
8408 config: Config{
8409 MaxVersion: VersionTLS13,
8410 CurvePreferences: []CurveID{CurveX25519},
8411 },
8412 resumeConfig: &Config{
8413 MaxVersion: VersionTLS13,
8414 CurvePreferences: []CurveID{CurveP256},
8415 },
8416 flags: []string{
8417 "-expect-curve-id", strconv.Itoa(int(CurveX25519)),
8418 "-expect-resume-curve-id", strconv.Itoa(int(CurveP256)),
8419 },
8420 resumeSession: true,
8421 })
8422 testCases = append(testCases, testCase{
8423 testType: serverTest,
8424 name: "CurveID-Resume-Server-TLS13",
8425 config: Config{
8426 MaxVersion: VersionTLS13,
8427 CurvePreferences: []CurveID{CurveX25519},
8428 },
8429 resumeConfig: &Config{
8430 MaxVersion: VersionTLS13,
8431 CurvePreferences: []CurveID{CurveP256},
8432 },
8433 flags: []string{
8434 "-expect-curve-id", strconv.Itoa(int(CurveX25519)),
8435 "-expect-resume-curve-id", strconv.Itoa(int(CurveP256)),
8436 },
8437 resumeSession: true,
8438 })
David Benjamina81967b2016-12-22 09:16:57 -05008439
8440 // Server-sent point formats are legal in TLS 1.2, but not in TLS 1.3.
8441 testCases = append(testCases, testCase{
8442 name: "PointFormat-ServerHello-TLS12",
8443 config: Config{
8444 MaxVersion: VersionTLS12,
8445 Bugs: ProtocolBugs{
8446 SendSupportedPointFormats: []byte{pointFormatUncompressed},
8447 },
8448 },
8449 })
8450 testCases = append(testCases, testCase{
8451 name: "PointFormat-EncryptedExtensions-TLS13",
8452 config: Config{
8453 MaxVersion: VersionTLS13,
8454 Bugs: ProtocolBugs{
8455 SendSupportedPointFormats: []byte{pointFormatUncompressed},
8456 },
8457 },
8458 shouldFail: true,
8459 expectedError: ":ERROR_PARSING_EXTENSION:",
8460 })
8461
8462 // Test that we tolerate unknown point formats, as long as
8463 // pointFormatUncompressed is present. Limit ciphers to ECDHE ciphers to
8464 // check they are still functional.
8465 testCases = append(testCases, testCase{
8466 name: "PointFormat-Client-Tolerance",
8467 config: Config{
8468 MaxVersion: VersionTLS12,
8469 Bugs: ProtocolBugs{
8470 SendSupportedPointFormats: []byte{42, pointFormatUncompressed, 99, pointFormatCompressedPrime},
8471 },
8472 },
8473 })
8474 testCases = append(testCases, testCase{
8475 testType: serverTest,
8476 name: "PointFormat-Server-Tolerance",
8477 config: Config{
8478 MaxVersion: VersionTLS12,
8479 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256},
8480 Bugs: ProtocolBugs{
8481 SendSupportedPointFormats: []byte{42, pointFormatUncompressed, 99, pointFormatCompressedPrime},
8482 },
8483 },
8484 })
8485
8486 // Test TLS 1.2 does not require the point format extension to be
8487 // present.
8488 testCases = append(testCases, testCase{
8489 name: "PointFormat-Client-Missing",
8490 config: Config{
8491 MaxVersion: VersionTLS12,
8492 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256},
8493 Bugs: ProtocolBugs{
8494 SendSupportedPointFormats: []byte{},
8495 },
8496 },
8497 })
8498 testCases = append(testCases, testCase{
8499 testType: serverTest,
8500 name: "PointFormat-Server-Missing",
8501 config: Config{
8502 MaxVersion: VersionTLS12,
8503 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256},
8504 Bugs: ProtocolBugs{
8505 SendSupportedPointFormats: []byte{},
8506 },
8507 },
8508 })
8509
8510 // If the point format extension is present, uncompressed points must be
8511 // offered. BoringSSL requires this whether or not ECDHE is used.
8512 testCases = append(testCases, testCase{
8513 name: "PointFormat-Client-MissingUncompressed",
8514 config: Config{
8515 MaxVersion: VersionTLS12,
8516 Bugs: ProtocolBugs{
8517 SendSupportedPointFormats: []byte{pointFormatCompressedPrime},
8518 },
8519 },
8520 shouldFail: true,
8521 expectedError: ":ERROR_PARSING_EXTENSION:",
8522 })
8523 testCases = append(testCases, testCase{
8524 testType: serverTest,
8525 name: "PointFormat-Server-MissingUncompressed",
8526 config: Config{
8527 MaxVersion: VersionTLS12,
8528 Bugs: ProtocolBugs{
8529 SendSupportedPointFormats: []byte{pointFormatCompressedPrime},
8530 },
8531 },
8532 shouldFail: true,
8533 expectedError: ":ERROR_PARSING_EXTENSION:",
8534 })
David Benjamin8c2b3bf2015-12-18 20:55:44 -05008535}
8536
David Benjaminc9ae27c2016-06-24 22:56:37 -04008537func addTLS13RecordTests() {
8538 testCases = append(testCases, testCase{
8539 name: "TLS13-RecordPadding",
8540 config: Config{
8541 MaxVersion: VersionTLS13,
8542 MinVersion: VersionTLS13,
8543 Bugs: ProtocolBugs{
8544 RecordPadding: 10,
8545 },
8546 },
8547 })
8548
8549 testCases = append(testCases, testCase{
8550 name: "TLS13-EmptyRecords",
8551 config: Config{
8552 MaxVersion: VersionTLS13,
8553 MinVersion: VersionTLS13,
8554 Bugs: ProtocolBugs{
8555 OmitRecordContents: true,
8556 },
8557 },
8558 shouldFail: true,
8559 expectedError: ":DECRYPTION_FAILED_OR_BAD_RECORD_MAC:",
8560 })
8561
8562 testCases = append(testCases, testCase{
8563 name: "TLS13-OnlyPadding",
8564 config: Config{
8565 MaxVersion: VersionTLS13,
8566 MinVersion: VersionTLS13,
8567 Bugs: ProtocolBugs{
8568 OmitRecordContents: true,
8569 RecordPadding: 10,
8570 },
8571 },
8572 shouldFail: true,
8573 expectedError: ":DECRYPTION_FAILED_OR_BAD_RECORD_MAC:",
8574 })
8575
8576 testCases = append(testCases, testCase{
8577 name: "TLS13-WrongOuterRecord",
8578 config: Config{
8579 MaxVersion: VersionTLS13,
8580 MinVersion: VersionTLS13,
8581 Bugs: ProtocolBugs{
8582 OuterRecordType: recordTypeHandshake,
8583 },
8584 },
8585 shouldFail: true,
8586 expectedError: ":INVALID_OUTER_RECORD_TYPE:",
8587 })
8588}
8589
Steven Valdez5b986082016-09-01 12:29:49 -04008590func addSessionTicketTests() {
8591 testCases = append(testCases, testCase{
8592 // In TLS 1.2 and below, empty NewSessionTicket messages
8593 // mean the server changed its mind on sending a ticket.
8594 name: "SendEmptySessionTicket",
8595 config: Config{
8596 MaxVersion: VersionTLS12,
8597 Bugs: ProtocolBugs{
8598 SendEmptySessionTicket: true,
8599 },
8600 },
8601 flags: []string{"-expect-no-session"},
8602 })
8603
8604 // Test that the server ignores unknown PSK modes.
8605 testCases = append(testCases, testCase{
8606 testType: serverTest,
8607 name: "TLS13-SendUnknownModeSessionTicket-Server",
8608 config: Config{
8609 MaxVersion: VersionTLS13,
8610 Bugs: ProtocolBugs{
8611 SendPSKKeyExchangeModes: []byte{0x1a, pskDHEKEMode, 0x2a},
Steven Valdez5b986082016-09-01 12:29:49 -04008612 },
8613 },
8614 resumeSession: true,
8615 expectedResumeVersion: VersionTLS13,
8616 })
8617
Steven Valdeza833c352016-11-01 13:39:36 -04008618 // Test that the server does not send session tickets with no matching key exchange mode.
8619 testCases = append(testCases, testCase{
8620 testType: serverTest,
8621 name: "TLS13-ExpectNoSessionTicketOnBadKEMode-Server",
8622 config: Config{
8623 MaxVersion: VersionTLS13,
8624 Bugs: ProtocolBugs{
8625 SendPSKKeyExchangeModes: []byte{0x1a},
8626 ExpectNoNewSessionTicket: true,
8627 },
8628 },
8629 })
8630
8631 // Test that the server does not accept a session with no matching key exchange mode.
Steven Valdez5b986082016-09-01 12:29:49 -04008632 testCases = append(testCases, testCase{
8633 testType: serverTest,
8634 name: "TLS13-SendBadKEModeSessionTicket-Server",
8635 config: Config{
8636 MaxVersion: VersionTLS13,
Steven Valdeza833c352016-11-01 13:39:36 -04008637 },
8638 resumeConfig: &Config{
8639 MaxVersion: VersionTLS13,
Steven Valdez5b986082016-09-01 12:29:49 -04008640 Bugs: ProtocolBugs{
8641 SendPSKKeyExchangeModes: []byte{0x1a},
8642 },
8643 },
8644 resumeSession: true,
8645 expectResumeRejected: true,
8646 })
8647
Steven Valdeza833c352016-11-01 13:39:36 -04008648 // Test that the client ticket age is sent correctly.
Steven Valdez5b986082016-09-01 12:29:49 -04008649 testCases = append(testCases, testCase{
8650 testType: clientTest,
Steven Valdeza833c352016-11-01 13:39:36 -04008651 name: "TLS13-TestValidTicketAge-Client",
Steven Valdez5b986082016-09-01 12:29:49 -04008652 config: Config{
8653 MaxVersion: VersionTLS13,
8654 Bugs: ProtocolBugs{
Steven Valdeza833c352016-11-01 13:39:36 -04008655 ExpectTicketAge: 10 * time.Second,
Steven Valdez5b986082016-09-01 12:29:49 -04008656 },
8657 },
Steven Valdeza833c352016-11-01 13:39:36 -04008658 resumeSession: true,
8659 flags: []string{
8660 "-resumption-delay", "10",
8661 },
Steven Valdez5b986082016-09-01 12:29:49 -04008662 })
8663
Steven Valdeza833c352016-11-01 13:39:36 -04008664 // Test that the client ticket age is enforced.
Steven Valdez5b986082016-09-01 12:29:49 -04008665 testCases = append(testCases, testCase{
8666 testType: clientTest,
Steven Valdeza833c352016-11-01 13:39:36 -04008667 name: "TLS13-TestBadTicketAge-Client",
Steven Valdez5b986082016-09-01 12:29:49 -04008668 config: Config{
8669 MaxVersion: VersionTLS13,
8670 Bugs: ProtocolBugs{
Steven Valdeza833c352016-11-01 13:39:36 -04008671 ExpectTicketAge: 1000 * time.Second,
Steven Valdez5b986082016-09-01 12:29:49 -04008672 },
8673 },
Steven Valdeza833c352016-11-01 13:39:36 -04008674 resumeSession: true,
8675 shouldFail: true,
8676 expectedLocalError: "tls: invalid ticket age",
Steven Valdez5b986082016-09-01 12:29:49 -04008677 })
8678
David Benjamin35ac5b72017-03-03 15:05:56 -05008679 // Test that the server's ticket age skew reporting works.
8680 testCases = append(testCases, testCase{
8681 testType: serverTest,
8682 name: "TLS13-TicketAgeSkew-Forward",
8683 config: Config{
8684 MaxVersion: VersionTLS13,
8685 Bugs: ProtocolBugs{
8686 SendTicketAge: 15 * time.Second,
8687 },
8688 },
8689 resumeSession: true,
8690 flags: []string{
8691 "-resumption-delay", "10",
8692 "-expect-ticket-age-skew", "5",
8693 },
8694 })
8695 testCases = append(testCases, testCase{
8696 testType: serverTest,
8697 name: "TLS13-TicketAgeSkew-Backward",
8698 config: Config{
8699 MaxVersion: VersionTLS13,
8700 Bugs: ProtocolBugs{
8701 SendTicketAge: 5 * time.Second,
8702 },
8703 },
8704 resumeSession: true,
8705 flags: []string{
8706 "-resumption-delay", "10",
8707 "-expect-ticket-age-skew", "-5",
8708 },
8709 })
8710
Steven Valdez08b65f42016-12-07 15:29:45 -05008711 testCases = append(testCases, testCase{
8712 testType: clientTest,
8713 name: "TLS13-SendTicketEarlyDataInfo",
8714 config: Config{
Nick Harperab20cec2016-12-19 17:38:41 -08008715 MaxVersion: VersionTLS13,
8716 MaxEarlyDataSize: 16384,
Steven Valdez08b65f42016-12-07 15:29:45 -05008717 },
8718 flags: []string{
David Benjamin9b160662017-01-25 19:53:43 -05008719 "-enable-early-data",
Steven Valdez08b65f42016-12-07 15:29:45 -05008720 "-expect-early-data-info",
8721 },
8722 })
8723
David Benjamin9b160662017-01-25 19:53:43 -05008724 // Test that 0-RTT tickets are ignored in clients unless opted in.
8725 testCases = append(testCases, testCase{
8726 testType: clientTest,
8727 name: "TLS13-SendTicketEarlyDataInfo-Disabled",
8728 config: Config{
Nick Harperab20cec2016-12-19 17:38:41 -08008729 MaxVersion: VersionTLS13,
8730 MaxEarlyDataSize: 16384,
David Benjamin9b160662017-01-25 19:53:43 -05008731 },
8732 })
8733
Steven Valdez08b65f42016-12-07 15:29:45 -05008734 testCases = append(testCases, testCase{
David Benjamin9c33ae82017-01-08 06:04:43 -05008735 testType: clientTest,
8736 name: "TLS13-DuplicateTicketEarlyDataInfo",
8737 config: Config{
Nick Harperab20cec2016-12-19 17:38:41 -08008738 MaxVersion: VersionTLS13,
8739 MaxEarlyDataSize: 16384,
David Benjamin9c33ae82017-01-08 06:04:43 -05008740 Bugs: ProtocolBugs{
David Benjamin9c33ae82017-01-08 06:04:43 -05008741 DuplicateTicketEarlyDataInfo: true,
8742 },
8743 },
8744 shouldFail: true,
8745 expectedError: ":DUPLICATE_EXTENSION:",
8746 expectedLocalError: "remote error: illegal parameter",
8747 })
8748
8749 testCases = append(testCases, testCase{
Steven Valdez08b65f42016-12-07 15:29:45 -05008750 testType: serverTest,
8751 name: "TLS13-ExpectTicketEarlyDataInfo",
8752 config: Config{
8753 MaxVersion: VersionTLS13,
8754 Bugs: ProtocolBugs{
8755 ExpectTicketEarlyDataInfo: true,
8756 },
8757 },
8758 flags: []string{
8759 "-enable-early-data",
8760 },
8761 })
David Benjamin17b30832017-01-28 14:00:32 -05008762
8763 // Test that, in TLS 1.3, the server-offered NewSessionTicket lifetime
8764 // is honored.
8765 testCases = append(testCases, testCase{
8766 testType: clientTest,
8767 name: "TLS13-HonorServerSessionTicketLifetime",
8768 config: Config{
8769 MaxVersion: VersionTLS13,
8770 Bugs: ProtocolBugs{
8771 SendTicketLifetime: 20 * time.Second,
8772 },
8773 },
8774 flags: []string{
8775 "-resumption-delay", "19",
8776 },
8777 resumeSession: true,
8778 })
8779 testCases = append(testCases, testCase{
8780 testType: clientTest,
8781 name: "TLS13-HonorServerSessionTicketLifetime-2",
8782 config: Config{
8783 MaxVersion: VersionTLS13,
8784 Bugs: ProtocolBugs{
8785 SendTicketLifetime: 20 * time.Second,
8786 // The client should not offer the expired session.
8787 ExpectNoTLS13PSK: true,
8788 },
8789 },
8790 flags: []string{
8791 "-resumption-delay", "21",
8792 },
David Benjamin023d4192017-02-06 13:49:07 -05008793 resumeSession: true,
David Benjamin17b30832017-01-28 14:00:32 -05008794 expectResumeRejected: true,
8795 })
Steven Valdez5b986082016-09-01 12:29:49 -04008796}
8797
David Benjamin82261be2016-07-07 14:32:50 -07008798func addChangeCipherSpecTests() {
8799 // Test missing ChangeCipherSpecs.
8800 testCases = append(testCases, testCase{
8801 name: "SkipChangeCipherSpec-Client",
8802 config: Config{
8803 MaxVersion: VersionTLS12,
8804 Bugs: ProtocolBugs{
8805 SkipChangeCipherSpec: true,
8806 },
8807 },
8808 shouldFail: true,
8809 expectedError: ":UNEXPECTED_RECORD:",
8810 })
8811 testCases = append(testCases, testCase{
8812 testType: serverTest,
8813 name: "SkipChangeCipherSpec-Server",
8814 config: Config{
8815 MaxVersion: VersionTLS12,
8816 Bugs: ProtocolBugs{
8817 SkipChangeCipherSpec: true,
8818 },
8819 },
8820 shouldFail: true,
8821 expectedError: ":UNEXPECTED_RECORD:",
8822 })
8823 testCases = append(testCases, testCase{
8824 testType: serverTest,
8825 name: "SkipChangeCipherSpec-Server-NPN",
8826 config: Config{
8827 MaxVersion: VersionTLS12,
8828 NextProtos: []string{"bar"},
8829 Bugs: ProtocolBugs{
8830 SkipChangeCipherSpec: true,
8831 },
8832 },
8833 flags: []string{
8834 "-advertise-npn", "\x03foo\x03bar\x03baz",
8835 },
8836 shouldFail: true,
8837 expectedError: ":UNEXPECTED_RECORD:",
8838 })
8839
8840 // Test synchronization between the handshake and ChangeCipherSpec.
8841 // Partial post-CCS handshake messages before ChangeCipherSpec should be
8842 // rejected. Test both with and without handshake packing to handle both
8843 // when the partial post-CCS message is in its own record and when it is
8844 // attached to the pre-CCS message.
David Benjamin82261be2016-07-07 14:32:50 -07008845 for _, packed := range []bool{false, true} {
8846 var suffix string
8847 if packed {
8848 suffix = "-Packed"
8849 }
8850
8851 testCases = append(testCases, testCase{
8852 name: "FragmentAcrossChangeCipherSpec-Client" + suffix,
8853 config: Config{
8854 MaxVersion: VersionTLS12,
8855 Bugs: ProtocolBugs{
8856 FragmentAcrossChangeCipherSpec: true,
8857 PackHandshakeFlight: packed,
8858 },
8859 },
8860 shouldFail: true,
8861 expectedError: ":UNEXPECTED_RECORD:",
8862 })
8863 testCases = append(testCases, testCase{
8864 name: "FragmentAcrossChangeCipherSpec-Client-Resume" + suffix,
8865 config: Config{
8866 MaxVersion: VersionTLS12,
8867 },
8868 resumeSession: true,
8869 resumeConfig: &Config{
8870 MaxVersion: VersionTLS12,
8871 Bugs: ProtocolBugs{
8872 FragmentAcrossChangeCipherSpec: true,
8873 PackHandshakeFlight: packed,
8874 },
8875 },
8876 shouldFail: true,
8877 expectedError: ":UNEXPECTED_RECORD:",
8878 })
8879 testCases = append(testCases, testCase{
8880 testType: serverTest,
8881 name: "FragmentAcrossChangeCipherSpec-Server" + suffix,
8882 config: Config{
8883 MaxVersion: VersionTLS12,
8884 Bugs: ProtocolBugs{
8885 FragmentAcrossChangeCipherSpec: true,
8886 PackHandshakeFlight: packed,
8887 },
8888 },
8889 shouldFail: true,
8890 expectedError: ":UNEXPECTED_RECORD:",
8891 })
8892 testCases = append(testCases, testCase{
8893 testType: serverTest,
8894 name: "FragmentAcrossChangeCipherSpec-Server-Resume" + suffix,
8895 config: Config{
8896 MaxVersion: VersionTLS12,
8897 },
8898 resumeSession: true,
8899 resumeConfig: &Config{
8900 MaxVersion: VersionTLS12,
8901 Bugs: ProtocolBugs{
8902 FragmentAcrossChangeCipherSpec: true,
8903 PackHandshakeFlight: packed,
8904 },
8905 },
8906 shouldFail: true,
8907 expectedError: ":UNEXPECTED_RECORD:",
8908 })
8909 testCases = append(testCases, testCase{
8910 testType: serverTest,
8911 name: "FragmentAcrossChangeCipherSpec-Server-NPN" + suffix,
8912 config: Config{
8913 MaxVersion: VersionTLS12,
8914 NextProtos: []string{"bar"},
8915 Bugs: ProtocolBugs{
8916 FragmentAcrossChangeCipherSpec: true,
8917 PackHandshakeFlight: packed,
8918 },
8919 },
8920 flags: []string{
8921 "-advertise-npn", "\x03foo\x03bar\x03baz",
8922 },
8923 shouldFail: true,
8924 expectedError: ":UNEXPECTED_RECORD:",
8925 })
8926 }
8927
David Benjamin61672812016-07-14 23:10:43 -04008928 // Test that, in DTLS, ChangeCipherSpec is not allowed when there are
8929 // messages in the handshake queue. Do this by testing the server
8930 // reading the client Finished, reversing the flight so Finished comes
8931 // first.
8932 testCases = append(testCases, testCase{
8933 protocol: dtls,
8934 testType: serverTest,
8935 name: "SendUnencryptedFinished-DTLS",
8936 config: Config{
8937 MaxVersion: VersionTLS12,
8938 Bugs: ProtocolBugs{
8939 SendUnencryptedFinished: true,
8940 ReverseHandshakeFragments: true,
8941 },
8942 },
8943 shouldFail: true,
8944 expectedError: ":BUFFERED_MESSAGES_ON_CIPHER_CHANGE:",
8945 })
8946
Steven Valdez143e8b32016-07-11 13:19:03 -04008947 // Test synchronization between encryption changes and the handshake in
8948 // TLS 1.3, where ChangeCipherSpec is implicit.
8949 testCases = append(testCases, testCase{
8950 name: "PartialEncryptedExtensionsWithServerHello",
8951 config: Config{
8952 MaxVersion: VersionTLS13,
8953 Bugs: ProtocolBugs{
8954 PartialEncryptedExtensionsWithServerHello: true,
8955 },
8956 },
8957 shouldFail: true,
8958 expectedError: ":BUFFERED_MESSAGES_ON_CIPHER_CHANGE:",
8959 })
8960 testCases = append(testCases, testCase{
8961 testType: serverTest,
8962 name: "PartialClientFinishedWithClientHello",
8963 config: Config{
8964 MaxVersion: VersionTLS13,
8965 Bugs: ProtocolBugs{
8966 PartialClientFinishedWithClientHello: true,
8967 },
8968 },
8969 shouldFail: true,
8970 expectedError: ":BUFFERED_MESSAGES_ON_CIPHER_CHANGE:",
8971 })
8972
David Benjamin82261be2016-07-07 14:32:50 -07008973 // Test that early ChangeCipherSpecs are handled correctly.
8974 testCases = append(testCases, testCase{
8975 testType: serverTest,
8976 name: "EarlyChangeCipherSpec-server-1",
8977 config: Config{
8978 MaxVersion: VersionTLS12,
8979 Bugs: ProtocolBugs{
8980 EarlyChangeCipherSpec: 1,
8981 },
8982 },
8983 shouldFail: true,
8984 expectedError: ":UNEXPECTED_RECORD:",
8985 })
8986 testCases = append(testCases, testCase{
8987 testType: serverTest,
8988 name: "EarlyChangeCipherSpec-server-2",
8989 config: Config{
8990 MaxVersion: VersionTLS12,
8991 Bugs: ProtocolBugs{
8992 EarlyChangeCipherSpec: 2,
8993 },
8994 },
8995 shouldFail: true,
8996 expectedError: ":UNEXPECTED_RECORD:",
8997 })
8998 testCases = append(testCases, testCase{
8999 protocol: dtls,
9000 name: "StrayChangeCipherSpec",
9001 config: Config{
9002 // TODO(davidben): Once DTLS 1.3 exists, test
9003 // that stray ChangeCipherSpec messages are
9004 // rejected.
9005 MaxVersion: VersionTLS12,
9006 Bugs: ProtocolBugs{
9007 StrayChangeCipherSpec: true,
9008 },
9009 },
9010 })
9011
9012 // Test that the contents of ChangeCipherSpec are checked.
9013 testCases = append(testCases, testCase{
9014 name: "BadChangeCipherSpec-1",
9015 config: Config{
9016 MaxVersion: VersionTLS12,
9017 Bugs: ProtocolBugs{
9018 BadChangeCipherSpec: []byte{2},
9019 },
9020 },
9021 shouldFail: true,
9022 expectedError: ":BAD_CHANGE_CIPHER_SPEC:",
9023 })
9024 testCases = append(testCases, testCase{
9025 name: "BadChangeCipherSpec-2",
9026 config: Config{
9027 MaxVersion: VersionTLS12,
9028 Bugs: ProtocolBugs{
9029 BadChangeCipherSpec: []byte{1, 1},
9030 },
9031 },
9032 shouldFail: true,
9033 expectedError: ":BAD_CHANGE_CIPHER_SPEC:",
9034 })
9035 testCases = append(testCases, testCase{
9036 protocol: dtls,
9037 name: "BadChangeCipherSpec-DTLS-1",
9038 config: Config{
9039 MaxVersion: VersionTLS12,
9040 Bugs: ProtocolBugs{
9041 BadChangeCipherSpec: []byte{2},
9042 },
9043 },
9044 shouldFail: true,
9045 expectedError: ":BAD_CHANGE_CIPHER_SPEC:",
9046 })
9047 testCases = append(testCases, testCase{
9048 protocol: dtls,
9049 name: "BadChangeCipherSpec-DTLS-2",
9050 config: Config{
9051 MaxVersion: VersionTLS12,
9052 Bugs: ProtocolBugs{
9053 BadChangeCipherSpec: []byte{1, 1},
9054 },
9055 },
9056 shouldFail: true,
9057 expectedError: ":BAD_CHANGE_CIPHER_SPEC:",
9058 })
9059}
9060
David Benjamincd2c8062016-09-09 11:28:16 -04009061type perMessageTest struct {
9062 messageType uint8
9063 test testCase
9064}
9065
9066// makePerMessageTests returns a series of test templates which cover each
9067// message in the TLS handshake. These may be used with bugs like
9068// WrongMessageType to fully test a per-message bug.
9069func makePerMessageTests() []perMessageTest {
9070 var ret []perMessageTest
David Benjamin0b8d5da2016-07-15 00:39:56 -04009071 for _, protocol := range []protocol{tls, dtls} {
9072 var suffix string
9073 if protocol == dtls {
9074 suffix = "-DTLS"
9075 }
9076
David Benjamincd2c8062016-09-09 11:28:16 -04009077 ret = append(ret, perMessageTest{
9078 messageType: typeClientHello,
9079 test: testCase{
9080 protocol: protocol,
9081 testType: serverTest,
9082 name: "ClientHello" + suffix,
9083 config: Config{
9084 MaxVersion: VersionTLS12,
David Benjamin0b8d5da2016-07-15 00:39:56 -04009085 },
9086 },
David Benjamin0b8d5da2016-07-15 00:39:56 -04009087 })
9088
9089 if protocol == dtls {
David Benjamincd2c8062016-09-09 11:28:16 -04009090 ret = append(ret, perMessageTest{
9091 messageType: typeHelloVerifyRequest,
9092 test: testCase{
9093 protocol: protocol,
9094 name: "HelloVerifyRequest" + suffix,
9095 config: Config{
9096 MaxVersion: VersionTLS12,
David Benjamin0b8d5da2016-07-15 00:39:56 -04009097 },
9098 },
David Benjamin0b8d5da2016-07-15 00:39:56 -04009099 })
9100 }
9101
David Benjamincd2c8062016-09-09 11:28:16 -04009102 ret = append(ret, perMessageTest{
9103 messageType: typeServerHello,
9104 test: testCase{
9105 protocol: protocol,
9106 name: "ServerHello" + suffix,
9107 config: Config{
9108 MaxVersion: VersionTLS12,
David Benjamin0b8d5da2016-07-15 00:39:56 -04009109 },
9110 },
David Benjamin0b8d5da2016-07-15 00:39:56 -04009111 })
9112
David Benjamincd2c8062016-09-09 11:28:16 -04009113 ret = append(ret, perMessageTest{
9114 messageType: typeCertificate,
9115 test: testCase{
9116 protocol: protocol,
9117 name: "ServerCertificate" + suffix,
9118 config: Config{
9119 MaxVersion: VersionTLS12,
David Benjamin0b8d5da2016-07-15 00:39:56 -04009120 },
9121 },
David Benjamin0b8d5da2016-07-15 00:39:56 -04009122 })
9123
David Benjamincd2c8062016-09-09 11:28:16 -04009124 ret = append(ret, perMessageTest{
9125 messageType: typeCertificateStatus,
9126 test: testCase{
9127 protocol: protocol,
9128 name: "CertificateStatus" + suffix,
9129 config: Config{
9130 MaxVersion: VersionTLS12,
David Benjamin0b8d5da2016-07-15 00:39:56 -04009131 },
David Benjamincd2c8062016-09-09 11:28:16 -04009132 flags: []string{"-enable-ocsp-stapling"},
David Benjamin0b8d5da2016-07-15 00:39:56 -04009133 },
David Benjamin0b8d5da2016-07-15 00:39:56 -04009134 })
9135
David Benjamincd2c8062016-09-09 11:28:16 -04009136 ret = append(ret, perMessageTest{
9137 messageType: typeServerKeyExchange,
9138 test: testCase{
9139 protocol: protocol,
9140 name: "ServerKeyExchange" + suffix,
9141 config: Config{
9142 MaxVersion: VersionTLS12,
9143 CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
David Benjamin0b8d5da2016-07-15 00:39:56 -04009144 },
9145 },
David Benjamin0b8d5da2016-07-15 00:39:56 -04009146 })
9147
David Benjamincd2c8062016-09-09 11:28:16 -04009148 ret = append(ret, perMessageTest{
9149 messageType: typeCertificateRequest,
9150 test: testCase{
9151 protocol: protocol,
9152 name: "CertificateRequest" + suffix,
9153 config: Config{
9154 MaxVersion: VersionTLS12,
9155 ClientAuth: RequireAnyClientCert,
David Benjamin0b8d5da2016-07-15 00:39:56 -04009156 },
9157 },
David Benjamin0b8d5da2016-07-15 00:39:56 -04009158 })
9159
David Benjamincd2c8062016-09-09 11:28:16 -04009160 ret = append(ret, perMessageTest{
9161 messageType: typeServerHelloDone,
9162 test: testCase{
9163 protocol: protocol,
9164 name: "ServerHelloDone" + suffix,
9165 config: Config{
9166 MaxVersion: VersionTLS12,
David Benjamin0b8d5da2016-07-15 00:39:56 -04009167 },
9168 },
David Benjamin0b8d5da2016-07-15 00:39:56 -04009169 })
9170
David Benjamincd2c8062016-09-09 11:28:16 -04009171 ret = append(ret, perMessageTest{
9172 messageType: typeCertificate,
9173 test: testCase{
9174 testType: serverTest,
9175 protocol: protocol,
9176 name: "ClientCertificate" + suffix,
9177 config: Config{
9178 Certificates: []Certificate{rsaCertificate},
9179 MaxVersion: VersionTLS12,
David Benjamin0b8d5da2016-07-15 00:39:56 -04009180 },
David Benjamincd2c8062016-09-09 11:28:16 -04009181 flags: []string{"-require-any-client-certificate"},
David Benjamin0b8d5da2016-07-15 00:39:56 -04009182 },
David Benjamin0b8d5da2016-07-15 00:39:56 -04009183 })
9184
David Benjamincd2c8062016-09-09 11:28:16 -04009185 ret = append(ret, perMessageTest{
9186 messageType: typeCertificateVerify,
9187 test: testCase{
9188 testType: serverTest,
9189 protocol: protocol,
9190 name: "CertificateVerify" + suffix,
9191 config: Config{
9192 Certificates: []Certificate{rsaCertificate},
9193 MaxVersion: VersionTLS12,
David Benjamin0b8d5da2016-07-15 00:39:56 -04009194 },
David Benjamincd2c8062016-09-09 11:28:16 -04009195 flags: []string{"-require-any-client-certificate"},
David Benjamin0b8d5da2016-07-15 00:39:56 -04009196 },
David Benjamin0b8d5da2016-07-15 00:39:56 -04009197 })
9198
David Benjamincd2c8062016-09-09 11:28:16 -04009199 ret = append(ret, perMessageTest{
9200 messageType: typeClientKeyExchange,
9201 test: testCase{
9202 testType: serverTest,
9203 protocol: protocol,
9204 name: "ClientKeyExchange" + suffix,
9205 config: Config{
9206 MaxVersion: VersionTLS12,
David Benjamin0b8d5da2016-07-15 00:39:56 -04009207 },
9208 },
David Benjamin0b8d5da2016-07-15 00:39:56 -04009209 })
9210
9211 if protocol != dtls {
David Benjamincd2c8062016-09-09 11:28:16 -04009212 ret = append(ret, perMessageTest{
9213 messageType: typeNextProtocol,
9214 test: testCase{
9215 testType: serverTest,
9216 protocol: protocol,
9217 name: "NextProtocol" + suffix,
9218 config: Config{
9219 MaxVersion: VersionTLS12,
9220 NextProtos: []string{"bar"},
David Benjamin0b8d5da2016-07-15 00:39:56 -04009221 },
David Benjamincd2c8062016-09-09 11:28:16 -04009222 flags: []string{"-advertise-npn", "\x03foo\x03bar\x03baz"},
David Benjamin0b8d5da2016-07-15 00:39:56 -04009223 },
David Benjamin0b8d5da2016-07-15 00:39:56 -04009224 })
9225
David Benjamincd2c8062016-09-09 11:28:16 -04009226 ret = append(ret, perMessageTest{
9227 messageType: typeChannelID,
9228 test: testCase{
9229 testType: serverTest,
9230 protocol: protocol,
9231 name: "ChannelID" + suffix,
9232 config: Config{
9233 MaxVersion: VersionTLS12,
9234 ChannelID: channelIDKey,
9235 },
9236 flags: []string{
9237 "-expect-channel-id",
9238 base64.StdEncoding.EncodeToString(channelIDBytes),
David Benjamin0b8d5da2016-07-15 00:39:56 -04009239 },
9240 },
David Benjamin0b8d5da2016-07-15 00:39:56 -04009241 })
9242 }
9243
David Benjamincd2c8062016-09-09 11:28:16 -04009244 ret = append(ret, perMessageTest{
9245 messageType: typeFinished,
9246 test: testCase{
9247 testType: serverTest,
9248 protocol: protocol,
9249 name: "ClientFinished" + suffix,
9250 config: Config{
9251 MaxVersion: VersionTLS12,
David Benjamin0b8d5da2016-07-15 00:39:56 -04009252 },
9253 },
David Benjamin0b8d5da2016-07-15 00:39:56 -04009254 })
9255
David Benjamincd2c8062016-09-09 11:28:16 -04009256 ret = append(ret, perMessageTest{
9257 messageType: typeNewSessionTicket,
9258 test: testCase{
9259 protocol: protocol,
9260 name: "NewSessionTicket" + suffix,
9261 config: Config{
9262 MaxVersion: VersionTLS12,
David Benjamin0b8d5da2016-07-15 00:39:56 -04009263 },
9264 },
David Benjamin0b8d5da2016-07-15 00:39:56 -04009265 })
9266
David Benjamincd2c8062016-09-09 11:28:16 -04009267 ret = append(ret, perMessageTest{
9268 messageType: typeFinished,
9269 test: testCase{
9270 protocol: protocol,
9271 name: "ServerFinished" + suffix,
9272 config: Config{
9273 MaxVersion: VersionTLS12,
David Benjamin0b8d5da2016-07-15 00:39:56 -04009274 },
9275 },
David Benjamin0b8d5da2016-07-15 00:39:56 -04009276 })
9277
9278 }
David Benjamincd2c8062016-09-09 11:28:16 -04009279
9280 ret = append(ret, perMessageTest{
9281 messageType: typeClientHello,
9282 test: testCase{
9283 testType: serverTest,
9284 name: "TLS13-ClientHello",
9285 config: Config{
9286 MaxVersion: VersionTLS13,
9287 },
9288 },
9289 })
9290
9291 ret = append(ret, perMessageTest{
9292 messageType: typeServerHello,
9293 test: testCase{
9294 name: "TLS13-ServerHello",
9295 config: Config{
9296 MaxVersion: VersionTLS13,
9297 },
9298 },
9299 })
9300
9301 ret = append(ret, perMessageTest{
9302 messageType: typeEncryptedExtensions,
9303 test: testCase{
9304 name: "TLS13-EncryptedExtensions",
9305 config: Config{
9306 MaxVersion: VersionTLS13,
9307 },
9308 },
9309 })
9310
9311 ret = append(ret, perMessageTest{
9312 messageType: typeCertificateRequest,
9313 test: testCase{
9314 name: "TLS13-CertificateRequest",
9315 config: Config{
9316 MaxVersion: VersionTLS13,
9317 ClientAuth: RequireAnyClientCert,
9318 },
9319 },
9320 })
9321
9322 ret = append(ret, perMessageTest{
9323 messageType: typeCertificate,
9324 test: testCase{
9325 name: "TLS13-ServerCertificate",
9326 config: Config{
9327 MaxVersion: VersionTLS13,
9328 },
9329 },
9330 })
9331
9332 ret = append(ret, perMessageTest{
9333 messageType: typeCertificateVerify,
9334 test: testCase{
9335 name: "TLS13-ServerCertificateVerify",
9336 config: Config{
9337 MaxVersion: VersionTLS13,
9338 },
9339 },
9340 })
9341
9342 ret = append(ret, perMessageTest{
9343 messageType: typeFinished,
9344 test: testCase{
9345 name: "TLS13-ServerFinished",
9346 config: Config{
9347 MaxVersion: VersionTLS13,
9348 },
9349 },
9350 })
9351
9352 ret = append(ret, perMessageTest{
9353 messageType: typeCertificate,
9354 test: testCase{
9355 testType: serverTest,
9356 name: "TLS13-ClientCertificate",
9357 config: Config{
9358 Certificates: []Certificate{rsaCertificate},
9359 MaxVersion: VersionTLS13,
9360 },
9361 flags: []string{"-require-any-client-certificate"},
9362 },
9363 })
9364
9365 ret = append(ret, perMessageTest{
9366 messageType: typeCertificateVerify,
9367 test: testCase{
9368 testType: serverTest,
9369 name: "TLS13-ClientCertificateVerify",
9370 config: Config{
9371 Certificates: []Certificate{rsaCertificate},
9372 MaxVersion: VersionTLS13,
9373 },
9374 flags: []string{"-require-any-client-certificate"},
9375 },
9376 })
9377
9378 ret = append(ret, perMessageTest{
9379 messageType: typeFinished,
9380 test: testCase{
9381 testType: serverTest,
9382 name: "TLS13-ClientFinished",
9383 config: Config{
9384 MaxVersion: VersionTLS13,
9385 },
9386 },
9387 })
9388
9389 return ret
David Benjamin0b8d5da2016-07-15 00:39:56 -04009390}
9391
David Benjamincd2c8062016-09-09 11:28:16 -04009392func addWrongMessageTypeTests() {
9393 for _, t := range makePerMessageTests() {
9394 t.test.name = "WrongMessageType-" + t.test.name
9395 t.test.config.Bugs.SendWrongMessageType = t.messageType
9396 t.test.shouldFail = true
9397 t.test.expectedError = ":UNEXPECTED_MESSAGE:"
9398 t.test.expectedLocalError = "remote error: unexpected message"
Steven Valdez143e8b32016-07-11 13:19:03 -04009399
David Benjamincd2c8062016-09-09 11:28:16 -04009400 if t.test.config.MaxVersion >= VersionTLS13 && t.messageType == typeServerHello {
9401 // In TLS 1.3, a bad ServerHello means the client sends
9402 // an unencrypted alert while the server expects
9403 // encryption, so the alert is not readable by runner.
9404 t.test.expectedLocalError = "local error: bad record MAC"
9405 }
Steven Valdez143e8b32016-07-11 13:19:03 -04009406
David Benjamincd2c8062016-09-09 11:28:16 -04009407 testCases = append(testCases, t.test)
9408 }
Steven Valdez143e8b32016-07-11 13:19:03 -04009409}
9410
David Benjamin639846e2016-09-09 11:41:18 -04009411func addTrailingMessageDataTests() {
9412 for _, t := range makePerMessageTests() {
9413 t.test.name = "TrailingMessageData-" + t.test.name
9414 t.test.config.Bugs.SendTrailingMessageData = t.messageType
9415 t.test.shouldFail = true
9416 t.test.expectedError = ":DECODE_ERROR:"
9417 t.test.expectedLocalError = "remote error: error decoding message"
9418
9419 if t.test.config.MaxVersion >= VersionTLS13 && t.messageType == typeServerHello {
9420 // In TLS 1.3, a bad ServerHello means the client sends
9421 // an unencrypted alert while the server expects
9422 // encryption, so the alert is not readable by runner.
9423 t.test.expectedLocalError = "local error: bad record MAC"
9424 }
9425
9426 if t.messageType == typeFinished {
9427 // Bad Finished messages read as the verify data having
9428 // the wrong length.
9429 t.test.expectedError = ":DIGEST_CHECK_FAILED:"
9430 t.test.expectedLocalError = "remote error: error decrypting message"
9431 }
9432
9433 testCases = append(testCases, t.test)
9434 }
9435}
9436
Steven Valdez143e8b32016-07-11 13:19:03 -04009437func addTLS13HandshakeTests() {
9438 testCases = append(testCases, testCase{
9439 testType: clientTest,
Steven Valdez803c77a2016-09-06 14:13:43 -04009440 name: "NegotiatePSKResumption-TLS13",
9441 config: Config{
9442 MaxVersion: VersionTLS13,
9443 Bugs: ProtocolBugs{
9444 NegotiatePSKResumption: true,
9445 },
9446 },
9447 resumeSession: true,
9448 shouldFail: true,
David Benjamindb5bd722016-12-08 18:21:27 -05009449 expectedError: ":MISSING_KEY_SHARE:",
Steven Valdez803c77a2016-09-06 14:13:43 -04009450 })
9451
9452 testCases = append(testCases, testCase{
9453 testType: clientTest,
Steven Valdez143e8b32016-07-11 13:19:03 -04009454 name: "MissingKeyShare-Client",
9455 config: Config{
9456 MaxVersion: VersionTLS13,
9457 Bugs: ProtocolBugs{
9458 MissingKeyShare: true,
9459 },
9460 },
9461 shouldFail: true,
David Benjamindb5bd722016-12-08 18:21:27 -05009462 expectedError: ":MISSING_KEY_SHARE:",
Steven Valdez143e8b32016-07-11 13:19:03 -04009463 })
9464
9465 testCases = append(testCases, testCase{
Steven Valdez5440fe02016-07-18 12:40:30 -04009466 testType: serverTest,
9467 name: "MissingKeyShare-Server",
Steven Valdez143e8b32016-07-11 13:19:03 -04009468 config: Config{
9469 MaxVersion: VersionTLS13,
9470 Bugs: ProtocolBugs{
9471 MissingKeyShare: true,
9472 },
9473 },
9474 shouldFail: true,
9475 expectedError: ":MISSING_KEY_SHARE:",
9476 })
9477
9478 testCases = append(testCases, testCase{
Steven Valdez143e8b32016-07-11 13:19:03 -04009479 testType: serverTest,
9480 name: "DuplicateKeyShares",
9481 config: Config{
9482 MaxVersion: VersionTLS13,
9483 Bugs: ProtocolBugs{
9484 DuplicateKeyShares: true,
9485 },
9486 },
David Benjamin7e1f9842016-09-20 19:24:40 -04009487 shouldFail: true,
9488 expectedError: ":DUPLICATE_KEY_SHARE:",
Steven Valdez143e8b32016-07-11 13:19:03 -04009489 })
9490
9491 testCases = append(testCases, testCase{
Steven Valdeza4ee74d2016-11-29 13:36:45 -05009492 testType: serverTest,
9493 name: "SkipEarlyData",
9494 config: Config{
9495 MaxVersion: VersionTLS13,
9496 Bugs: ProtocolBugs{
Nick Harperf2511f12016-12-06 16:02:31 -08009497 SendFakeEarlyDataLength: 4,
Steven Valdeza4ee74d2016-11-29 13:36:45 -05009498 },
9499 },
9500 })
9501
9502 testCases = append(testCases, testCase{
9503 testType: serverTest,
9504 name: "SkipEarlyData-OmitEarlyDataExtension",
9505 config: Config{
9506 MaxVersion: VersionTLS13,
9507 Bugs: ProtocolBugs{
Nick Harperf2511f12016-12-06 16:02:31 -08009508 SendFakeEarlyDataLength: 4,
9509 OmitEarlyDataExtension: true,
Steven Valdeza4ee74d2016-11-29 13:36:45 -05009510 },
9511 },
9512 shouldFail: true,
9513 expectedError: ":DECRYPTION_FAILED_OR_BAD_RECORD_MAC:",
9514 })
9515
9516 testCases = append(testCases, testCase{
9517 testType: serverTest,
9518 name: "SkipEarlyData-TooMuchData",
9519 config: Config{
9520 MaxVersion: VersionTLS13,
9521 Bugs: ProtocolBugs{
Nick Harperf2511f12016-12-06 16:02:31 -08009522 SendFakeEarlyDataLength: 16384 + 1,
Steven Valdeza4ee74d2016-11-29 13:36:45 -05009523 },
9524 },
9525 shouldFail: true,
9526 expectedError: ":TOO_MUCH_SKIPPED_EARLY_DATA:",
9527 })
9528
9529 testCases = append(testCases, testCase{
9530 testType: serverTest,
9531 name: "SkipEarlyData-Interleaved",
9532 config: Config{
9533 MaxVersion: VersionTLS13,
9534 Bugs: ProtocolBugs{
Nick Harperf2511f12016-12-06 16:02:31 -08009535 SendFakeEarlyDataLength: 4,
9536 InterleaveEarlyData: true,
Steven Valdeza4ee74d2016-11-29 13:36:45 -05009537 },
9538 },
9539 shouldFail: true,
9540 expectedError: ":DECRYPTION_FAILED_OR_BAD_RECORD_MAC:",
9541 })
9542
9543 testCases = append(testCases, testCase{
9544 testType: serverTest,
9545 name: "SkipEarlyData-EarlyDataInTLS12",
9546 config: Config{
9547 MaxVersion: VersionTLS13,
9548 Bugs: ProtocolBugs{
Nick Harperf2511f12016-12-06 16:02:31 -08009549 SendFakeEarlyDataLength: 4,
Steven Valdeza4ee74d2016-11-29 13:36:45 -05009550 },
9551 },
9552 shouldFail: true,
9553 expectedError: ":UNEXPECTED_RECORD:",
9554 flags: []string{"-max-version", strconv.Itoa(VersionTLS12)},
9555 })
9556
9557 testCases = append(testCases, testCase{
9558 testType: serverTest,
9559 name: "SkipEarlyData-HRR",
9560 config: Config{
9561 MaxVersion: VersionTLS13,
9562 Bugs: ProtocolBugs{
Nick Harperf2511f12016-12-06 16:02:31 -08009563 SendFakeEarlyDataLength: 4,
Steven Valdeza4ee74d2016-11-29 13:36:45 -05009564 },
9565 DefaultCurves: []CurveID{},
9566 },
9567 })
9568
9569 testCases = append(testCases, testCase{
9570 testType: serverTest,
9571 name: "SkipEarlyData-HRR-Interleaved",
9572 config: Config{
9573 MaxVersion: VersionTLS13,
9574 Bugs: ProtocolBugs{
Nick Harperf2511f12016-12-06 16:02:31 -08009575 SendFakeEarlyDataLength: 4,
9576 InterleaveEarlyData: true,
Steven Valdeza4ee74d2016-11-29 13:36:45 -05009577 },
9578 DefaultCurves: []CurveID{},
9579 },
9580 shouldFail: true,
9581 expectedError: ":UNEXPECTED_RECORD:",
9582 })
9583
9584 testCases = append(testCases, testCase{
9585 testType: serverTest,
9586 name: "SkipEarlyData-HRR-TooMuchData",
9587 config: Config{
9588 MaxVersion: VersionTLS13,
9589 Bugs: ProtocolBugs{
Nick Harperf2511f12016-12-06 16:02:31 -08009590 SendFakeEarlyDataLength: 16384 + 1,
Steven Valdeza4ee74d2016-11-29 13:36:45 -05009591 },
9592 DefaultCurves: []CurveID{},
9593 },
9594 shouldFail: true,
9595 expectedError: ":TOO_MUCH_SKIPPED_EARLY_DATA:",
9596 })
9597
9598 // Test that skipping early data looking for cleartext correctly
9599 // processes an alert record.
9600 testCases = append(testCases, testCase{
9601 testType: serverTest,
9602 name: "SkipEarlyData-HRR-FatalAlert",
9603 config: Config{
9604 MaxVersion: VersionTLS13,
9605 Bugs: ProtocolBugs{
Nick Harperf2511f12016-12-06 16:02:31 -08009606 SendEarlyAlert: true,
9607 SendFakeEarlyDataLength: 4,
Steven Valdeza4ee74d2016-11-29 13:36:45 -05009608 },
9609 DefaultCurves: []CurveID{},
9610 },
9611 shouldFail: true,
9612 expectedError: ":SSLV3_ALERT_HANDSHAKE_FAILURE:",
9613 })
9614
9615 testCases = append(testCases, testCase{
9616 testType: serverTest,
9617 name: "SkipEarlyData-SecondClientHelloEarlyData",
9618 config: Config{
9619 MaxVersion: VersionTLS13,
9620 Bugs: ProtocolBugs{
9621 SendEarlyDataOnSecondClientHello: true,
9622 },
9623 DefaultCurves: []CurveID{},
9624 },
9625 shouldFail: true,
9626 expectedLocalError: "remote error: bad record MAC",
9627 })
9628
9629 testCases = append(testCases, testCase{
Steven Valdez143e8b32016-07-11 13:19:03 -04009630 testType: clientTest,
9631 name: "EmptyEncryptedExtensions",
9632 config: Config{
9633 MaxVersion: VersionTLS13,
9634 Bugs: ProtocolBugs{
9635 EmptyEncryptedExtensions: true,
9636 },
9637 },
9638 shouldFail: true,
9639 expectedLocalError: "remote error: error decoding message",
9640 })
9641
9642 testCases = append(testCases, testCase{
9643 testType: clientTest,
9644 name: "EncryptedExtensionsWithKeyShare",
9645 config: Config{
9646 MaxVersion: VersionTLS13,
9647 Bugs: ProtocolBugs{
9648 EncryptedExtensionsWithKeyShare: true,
9649 },
9650 },
9651 shouldFail: true,
9652 expectedLocalError: "remote error: unsupported extension",
9653 })
Steven Valdez5440fe02016-07-18 12:40:30 -04009654
9655 testCases = append(testCases, testCase{
9656 testType: serverTest,
9657 name: "SendHelloRetryRequest",
9658 config: Config{
9659 MaxVersion: VersionTLS13,
9660 // Require a HelloRetryRequest for every curve.
9661 DefaultCurves: []CurveID{},
9662 },
9663 expectedCurveID: CurveX25519,
9664 })
9665
9666 testCases = append(testCases, testCase{
9667 testType: serverTest,
9668 name: "SendHelloRetryRequest-2",
9669 config: Config{
9670 MaxVersion: VersionTLS13,
9671 DefaultCurves: []CurveID{CurveP384},
9672 },
9673 // Although the ClientHello did not predict our preferred curve,
9674 // we always select it whether it is predicted or not.
9675 expectedCurveID: CurveX25519,
9676 })
9677
9678 testCases = append(testCases, testCase{
9679 name: "UnknownCurve-HelloRetryRequest",
9680 config: Config{
9681 MaxVersion: VersionTLS13,
9682 // P-384 requires HelloRetryRequest in BoringSSL.
9683 CurvePreferences: []CurveID{CurveP384},
9684 Bugs: ProtocolBugs{
9685 SendHelloRetryRequestCurve: bogusCurve,
9686 },
9687 },
9688 shouldFail: true,
9689 expectedError: ":WRONG_CURVE:",
9690 })
9691
9692 testCases = append(testCases, testCase{
9693 name: "DisabledCurve-HelloRetryRequest",
9694 config: Config{
9695 MaxVersion: VersionTLS13,
9696 CurvePreferences: []CurveID{CurveP256},
9697 Bugs: ProtocolBugs{
9698 IgnorePeerCurvePreferences: true,
9699 },
9700 },
9701 flags: []string{"-p384-only"},
9702 shouldFail: true,
9703 expectedError: ":WRONG_CURVE:",
9704 })
9705
9706 testCases = append(testCases, testCase{
9707 name: "UnnecessaryHelloRetryRequest",
9708 config: Config{
David Benjamin3baa6e12016-10-07 21:10:38 -04009709 MaxVersion: VersionTLS13,
9710 CurvePreferences: []CurveID{CurveX25519},
Steven Valdez5440fe02016-07-18 12:40:30 -04009711 Bugs: ProtocolBugs{
David Benjamin3baa6e12016-10-07 21:10:38 -04009712 SendHelloRetryRequestCurve: CurveX25519,
Steven Valdez5440fe02016-07-18 12:40:30 -04009713 },
9714 },
9715 shouldFail: true,
9716 expectedError: ":WRONG_CURVE:",
9717 })
9718
9719 testCases = append(testCases, testCase{
9720 name: "SecondHelloRetryRequest",
9721 config: Config{
9722 MaxVersion: VersionTLS13,
9723 // P-384 requires HelloRetryRequest in BoringSSL.
9724 CurvePreferences: []CurveID{CurveP384},
9725 Bugs: ProtocolBugs{
9726 SecondHelloRetryRequest: true,
9727 },
9728 },
9729 shouldFail: true,
9730 expectedError: ":UNEXPECTED_MESSAGE:",
9731 })
9732
9733 testCases = append(testCases, testCase{
David Benjamin3baa6e12016-10-07 21:10:38 -04009734 name: "HelloRetryRequest-Empty",
9735 config: Config{
9736 MaxVersion: VersionTLS13,
9737 Bugs: ProtocolBugs{
9738 AlwaysSendHelloRetryRequest: true,
9739 },
9740 },
9741 shouldFail: true,
9742 expectedError: ":DECODE_ERROR:",
9743 })
9744
9745 testCases = append(testCases, testCase{
9746 name: "HelloRetryRequest-DuplicateCurve",
9747 config: Config{
9748 MaxVersion: VersionTLS13,
9749 // P-384 requires a HelloRetryRequest against BoringSSL's default
9750 // configuration. Assert this ExpectMissingKeyShare.
9751 CurvePreferences: []CurveID{CurveP384},
9752 Bugs: ProtocolBugs{
9753 ExpectMissingKeyShare: true,
9754 DuplicateHelloRetryRequestExtensions: true,
9755 },
9756 },
9757 shouldFail: true,
9758 expectedError: ":DUPLICATE_EXTENSION:",
9759 expectedLocalError: "remote error: illegal parameter",
9760 })
9761
9762 testCases = append(testCases, testCase{
9763 name: "HelloRetryRequest-Cookie",
9764 config: Config{
9765 MaxVersion: VersionTLS13,
9766 Bugs: ProtocolBugs{
9767 SendHelloRetryRequestCookie: []byte("cookie"),
9768 },
9769 },
9770 })
9771
9772 testCases = append(testCases, testCase{
9773 name: "HelloRetryRequest-DuplicateCookie",
9774 config: Config{
9775 MaxVersion: VersionTLS13,
9776 Bugs: ProtocolBugs{
9777 SendHelloRetryRequestCookie: []byte("cookie"),
9778 DuplicateHelloRetryRequestExtensions: true,
9779 },
9780 },
9781 shouldFail: true,
9782 expectedError: ":DUPLICATE_EXTENSION:",
9783 expectedLocalError: "remote error: illegal parameter",
9784 })
9785
9786 testCases = append(testCases, testCase{
9787 name: "HelloRetryRequest-EmptyCookie",
9788 config: Config{
9789 MaxVersion: VersionTLS13,
9790 Bugs: ProtocolBugs{
9791 SendHelloRetryRequestCookie: []byte{},
9792 },
9793 },
9794 shouldFail: true,
9795 expectedError: ":DECODE_ERROR:",
9796 })
9797
9798 testCases = append(testCases, testCase{
9799 name: "HelloRetryRequest-Cookie-Curve",
9800 config: Config{
9801 MaxVersion: VersionTLS13,
9802 // P-384 requires HelloRetryRequest in BoringSSL.
9803 CurvePreferences: []CurveID{CurveP384},
9804 Bugs: ProtocolBugs{
9805 SendHelloRetryRequestCookie: []byte("cookie"),
9806 ExpectMissingKeyShare: true,
9807 },
9808 },
9809 })
9810
9811 testCases = append(testCases, testCase{
9812 name: "HelloRetryRequest-Unknown",
9813 config: Config{
9814 MaxVersion: VersionTLS13,
9815 Bugs: ProtocolBugs{
9816 CustomHelloRetryRequestExtension: "extension",
9817 },
9818 },
9819 shouldFail: true,
9820 expectedError: ":UNEXPECTED_EXTENSION:",
9821 expectedLocalError: "remote error: unsupported extension",
9822 })
9823
9824 testCases = append(testCases, testCase{
Steven Valdez5440fe02016-07-18 12:40:30 -04009825 testType: serverTest,
9826 name: "SecondClientHelloMissingKeyShare",
9827 config: Config{
9828 MaxVersion: VersionTLS13,
9829 DefaultCurves: []CurveID{},
9830 Bugs: ProtocolBugs{
9831 SecondClientHelloMissingKeyShare: true,
9832 },
9833 },
9834 shouldFail: true,
9835 expectedError: ":MISSING_KEY_SHARE:",
9836 })
9837
9838 testCases = append(testCases, testCase{
9839 testType: serverTest,
9840 name: "SecondClientHelloWrongCurve",
9841 config: Config{
9842 MaxVersion: VersionTLS13,
9843 DefaultCurves: []CurveID{},
9844 Bugs: ProtocolBugs{
9845 MisinterpretHelloRetryRequestCurve: CurveP521,
9846 },
9847 },
9848 shouldFail: true,
9849 expectedError: ":WRONG_CURVE:",
9850 })
9851
9852 testCases = append(testCases, testCase{
9853 name: "HelloRetryRequestVersionMismatch",
9854 config: Config{
9855 MaxVersion: VersionTLS13,
9856 // P-384 requires HelloRetryRequest in BoringSSL.
9857 CurvePreferences: []CurveID{CurveP384},
9858 Bugs: ProtocolBugs{
9859 SendServerHelloVersion: 0x0305,
9860 },
9861 },
9862 shouldFail: true,
9863 expectedError: ":WRONG_VERSION_NUMBER:",
9864 })
9865
9866 testCases = append(testCases, testCase{
9867 name: "HelloRetryRequestCurveMismatch",
9868 config: Config{
9869 MaxVersion: VersionTLS13,
9870 // P-384 requires HelloRetryRequest in BoringSSL.
9871 CurvePreferences: []CurveID{CurveP384},
9872 Bugs: ProtocolBugs{
9873 // Send P-384 (correct) in the HelloRetryRequest.
9874 SendHelloRetryRequestCurve: CurveP384,
9875 // But send P-256 in the ServerHello.
9876 SendCurve: CurveP256,
9877 },
9878 },
9879 shouldFail: true,
9880 expectedError: ":WRONG_CURVE:",
9881 })
9882
9883 // Test the server selecting a curve that requires a HelloRetryRequest
9884 // without sending it.
9885 testCases = append(testCases, testCase{
9886 name: "SkipHelloRetryRequest",
9887 config: Config{
9888 MaxVersion: VersionTLS13,
9889 // P-384 requires HelloRetryRequest in BoringSSL.
9890 CurvePreferences: []CurveID{CurveP384},
9891 Bugs: ProtocolBugs{
9892 SkipHelloRetryRequest: true,
9893 },
9894 },
9895 shouldFail: true,
9896 expectedError: ":WRONG_CURVE:",
9897 })
David Benjamin8a8349b2016-08-18 02:32:23 -04009898
9899 testCases = append(testCases, testCase{
9900 name: "TLS13-RequestContextInHandshake",
9901 config: Config{
9902 MaxVersion: VersionTLS13,
9903 MinVersion: VersionTLS13,
9904 ClientAuth: RequireAnyClientCert,
9905 Bugs: ProtocolBugs{
9906 SendRequestContext: []byte("request context"),
9907 },
9908 },
9909 flags: []string{
9910 "-cert-file", path.Join(*resourceDir, rsaCertificateFile),
9911 "-key-file", path.Join(*resourceDir, rsaKeyFile),
9912 },
9913 shouldFail: true,
9914 expectedError: ":DECODE_ERROR:",
9915 })
David Benjamin7e1f9842016-09-20 19:24:40 -04009916
9917 testCases = append(testCases, testCase{
9918 testType: serverTest,
9919 name: "TLS13-TrailingKeyShareData",
9920 config: Config{
9921 MaxVersion: VersionTLS13,
9922 Bugs: ProtocolBugs{
9923 TrailingKeyShareData: true,
9924 },
9925 },
9926 shouldFail: true,
9927 expectedError: ":DECODE_ERROR:",
9928 })
David Benjamin7f78df42016-10-05 22:33:19 -04009929
9930 testCases = append(testCases, testCase{
9931 name: "TLS13-AlwaysSelectPSKIdentity",
9932 config: Config{
9933 MaxVersion: VersionTLS13,
9934 Bugs: ProtocolBugs{
9935 AlwaysSelectPSKIdentity: true,
9936 },
9937 },
9938 shouldFail: true,
9939 expectedError: ":UNEXPECTED_EXTENSION:",
9940 })
9941
9942 testCases = append(testCases, testCase{
9943 name: "TLS13-InvalidPSKIdentity",
9944 config: Config{
9945 MaxVersion: VersionTLS13,
9946 Bugs: ProtocolBugs{
9947 SelectPSKIdentityOnResume: 1,
9948 },
9949 },
9950 resumeSession: true,
9951 shouldFail: true,
9952 expectedError: ":PSK_IDENTITY_NOT_FOUND:",
9953 })
David Benjamin1286bee2016-10-07 15:25:06 -04009954
Steven Valdezaf3b8a92016-11-01 12:49:22 -04009955 testCases = append(testCases, testCase{
9956 testType: serverTest,
9957 name: "TLS13-ExtraPSKIdentity",
9958 config: Config{
9959 MaxVersion: VersionTLS13,
9960 Bugs: ProtocolBugs{
David Benjaminaedf3032016-12-01 16:47:56 -05009961 ExtraPSKIdentity: true,
9962 SendExtraPSKBinder: true,
Steven Valdezaf3b8a92016-11-01 12:49:22 -04009963 },
9964 },
9965 resumeSession: true,
9966 })
9967
David Benjamin1286bee2016-10-07 15:25:06 -04009968 // Test that unknown NewSessionTicket extensions are tolerated.
9969 testCases = append(testCases, testCase{
9970 name: "TLS13-CustomTicketExtension",
9971 config: Config{
9972 MaxVersion: VersionTLS13,
9973 Bugs: ProtocolBugs{
9974 CustomTicketExtension: "1234",
9975 },
9976 },
9977 })
Steven Valdez2d850622017-01-11 11:34:52 -05009978
9979 // Test that we accept data-less early data.
9980 testCases = append(testCases, testCase{
9981 testType: serverTest,
9982 name: "TLS13-DataLessEarlyData-Server",
9983 config: Config{
9984 MaxVersion: VersionTLS13,
9985 Bugs: ProtocolBugs{
9986 SendEarlyData: [][]byte{},
9987 ExpectEarlyDataAccepted: true,
9988 },
9989 },
9990 resumeSession: true,
9991 flags: []string{
9992 "-enable-early-data",
9993 "-expect-accept-early-data",
9994 },
9995 })
9996
9997 testCases = append(testCases, testCase{
9998 testType: clientTest,
9999 name: "TLS13-DataLessEarlyData-Client",
10000 config: Config{
10001 MaxVersion: VersionTLS13,
10002 MaxEarlyDataSize: 16384,
10003 },
10004 resumeSession: true,
10005 flags: []string{
10006 "-enable-early-data",
10007 "-expect-early-data-info",
10008 "-expect-accept-early-data",
10009 },
10010 })
10011
10012 testCases = append(testCases, testCase{
10013 testType: clientTest,
10014 name: "TLS13-DataLessEarlyData-Reject-Client",
10015 config: Config{
10016 MaxVersion: VersionTLS13,
10017 MaxEarlyDataSize: 16384,
10018 },
10019 resumeConfig: &Config{
10020 MaxVersion: VersionTLS13,
10021 MaxEarlyDataSize: 16384,
10022 Bugs: ProtocolBugs{
10023 AlwaysRejectEarlyData: true,
10024 },
10025 },
10026 resumeSession: true,
10027 flags: []string{
10028 "-enable-early-data",
10029 "-expect-early-data-info",
10030 "-expect-reject-early-data",
10031 },
10032 })
10033
10034 testCases = append(testCases, testCase{
10035 testType: clientTest,
10036 name: "TLS13-DataLessEarlyData-HRR-Client",
10037 config: Config{
10038 MaxVersion: VersionTLS13,
10039 MaxEarlyDataSize: 16384,
10040 },
10041 resumeConfig: &Config{
10042 MaxVersion: VersionTLS13,
10043 MaxEarlyDataSize: 16384,
10044 Bugs: ProtocolBugs{
10045 SendHelloRetryRequestCookie: []byte{1, 2, 3, 4},
10046 },
10047 },
10048 resumeSession: true,
10049 flags: []string{
10050 "-enable-early-data",
10051 "-expect-early-data-info",
10052 "-expect-reject-early-data",
10053 },
10054 })
10055
10056 // The client must check the server does not send the early_data
10057 // extension while rejecting the session.
10058 testCases = append(testCases, testCase{
10059 testType: clientTest,
10060 name: "TLS13-EarlyDataWithoutResume-Client",
10061 config: Config{
10062 MaxVersion: VersionTLS13,
10063 MaxEarlyDataSize: 16384,
10064 },
10065 resumeConfig: &Config{
10066 MaxVersion: VersionTLS13,
10067 SessionTicketsDisabled: true,
10068 Bugs: ProtocolBugs{
10069 SendEarlyDataExtension: true,
10070 },
10071 },
10072 resumeSession: true,
10073 flags: []string{
10074 "-enable-early-data",
10075 "-expect-early-data-info",
10076 },
10077 shouldFail: true,
10078 expectedError: ":UNEXPECTED_EXTENSION:",
10079 })
10080
10081 // The client must fail with a dedicated error code if the server
10082 // responds with TLS 1.2 when offering 0-RTT.
10083 testCases = append(testCases, testCase{
10084 testType: clientTest,
10085 name: "TLS13-EarlyDataVersionDowngrade-Client",
10086 config: Config{
10087 MaxVersion: VersionTLS13,
10088 MaxEarlyDataSize: 16384,
10089 },
10090 resumeConfig: &Config{
10091 MaxVersion: VersionTLS12,
10092 },
10093 resumeSession: true,
10094 flags: []string{
10095 "-enable-early-data",
10096 "-expect-early-data-info",
10097 },
10098 shouldFail: true,
10099 expectedError: ":WRONG_VERSION_ON_EARLY_DATA:",
10100 })
10101
10102 // Test that the client rejects an (unsolicited) early_data extension if
10103 // the server sent an HRR.
10104 testCases = append(testCases, testCase{
10105 testType: clientTest,
10106 name: "TLS13-ServerAcceptsEarlyDataOnHRR-Client",
10107 config: Config{
10108 MaxVersion: VersionTLS13,
10109 MaxEarlyDataSize: 16384,
10110 },
10111 resumeConfig: &Config{
10112 MaxVersion: VersionTLS13,
10113 MaxEarlyDataSize: 16384,
10114 Bugs: ProtocolBugs{
10115 SendHelloRetryRequestCookie: []byte{1, 2, 3, 4},
10116 SendEarlyDataExtension: true,
10117 },
10118 },
10119 resumeSession: true,
10120 flags: []string{
10121 "-enable-early-data",
10122 "-expect-early-data-info",
10123 },
10124 shouldFail: true,
10125 expectedError: ":UNEXPECTED_EXTENSION:",
10126 })
10127
10128 fooString := "foo"
10129 barString := "bar"
10130
10131 // Test that the client reports the correct ALPN after a 0-RTT reject
10132 // that changed it.
10133 testCases = append(testCases, testCase{
10134 testType: clientTest,
10135 name: "TLS13-DataLessEarlyData-ALPNMismatch-Client",
10136 config: Config{
10137 MaxVersion: VersionTLS13,
10138 MaxEarlyDataSize: 16384,
10139 Bugs: ProtocolBugs{
10140 ALPNProtocol: &fooString,
10141 },
10142 },
10143 resumeConfig: &Config{
10144 MaxVersion: VersionTLS13,
10145 MaxEarlyDataSize: 16384,
10146 Bugs: ProtocolBugs{
10147 ALPNProtocol: &barString,
10148 },
10149 },
10150 resumeSession: true,
10151 flags: []string{
10152 "-advertise-alpn", "\x03foo\x03bar",
10153 "-enable-early-data",
10154 "-expect-early-data-info",
10155 "-expect-reject-early-data",
10156 "-expect-alpn", "foo",
10157 "-expect-resume-alpn", "bar",
10158 },
10159 })
10160
10161 // Test that the client reports the correct ALPN after a 0-RTT reject if
10162 // ALPN was omitted from the first connection.
10163 testCases = append(testCases, testCase{
10164 testType: clientTest,
10165 name: "TLS13-DataLessEarlyData-ALPNOmitted1-Client",
10166 config: Config{
10167 MaxVersion: VersionTLS13,
10168 MaxEarlyDataSize: 16384,
10169 },
10170 resumeConfig: &Config{
10171 MaxVersion: VersionTLS13,
10172 MaxEarlyDataSize: 16384,
10173 NextProtos: []string{"foo"},
10174 },
10175 resumeSession: true,
10176 flags: []string{
10177 "-advertise-alpn", "\x03foo\x03bar",
10178 "-enable-early-data",
10179 "-expect-early-data-info",
10180 "-expect-reject-early-data",
10181 "-expect-no-alpn",
10182 "-expect-resume-alpn", "foo",
10183 },
10184 })
10185
10186 // Test that the client reports the correct ALPN after a 0-RTT reject if
10187 // ALPN was omitted from the second connection.
10188 testCases = append(testCases, testCase{
10189 testType: clientTest,
10190 name: "TLS13-DataLessEarlyData-ALPNOmitted2-Client",
10191 config: Config{
10192 MaxVersion: VersionTLS13,
10193 MaxEarlyDataSize: 16384,
10194 NextProtos: []string{"foo"},
10195 },
10196 resumeConfig: &Config{
10197 MaxVersion: VersionTLS13,
10198 MaxEarlyDataSize: 16384,
10199 },
10200 resumeSession: true,
10201 flags: []string{
10202 "-advertise-alpn", "\x03foo\x03bar",
10203 "-enable-early-data",
10204 "-expect-early-data-info",
10205 "-expect-reject-early-data",
10206 "-expect-alpn", "foo",
10207 "-expect-no-resume-alpn",
10208 },
10209 })
10210
10211 // Test that the client enforces ALPN match on 0-RTT accept.
10212 testCases = append(testCases, testCase{
10213 testType: clientTest,
10214 name: "TLS13-DataLessEarlyData-BadALPNMismatch-Client",
10215 config: Config{
10216 MaxVersion: VersionTLS13,
10217 MaxEarlyDataSize: 16384,
10218 Bugs: ProtocolBugs{
10219 ALPNProtocol: &fooString,
10220 },
10221 },
10222 resumeConfig: &Config{
10223 MaxVersion: VersionTLS13,
10224 MaxEarlyDataSize: 16384,
10225 Bugs: ProtocolBugs{
10226 AlwaysAcceptEarlyData: true,
10227 ALPNProtocol: &barString,
10228 },
10229 },
10230 resumeSession: true,
10231 flags: []string{
10232 "-advertise-alpn", "\x03foo\x03bar",
10233 "-enable-early-data",
10234 "-expect-early-data-info",
10235 },
10236 shouldFail: true,
10237 expectedError: ":ALPN_MISMATCH_ON_EARLY_DATA:",
10238 })
10239
10240 // Test that the server correctly rejects 0-RTT when the previous
10241 // session did not allow early data on resumption.
10242 testCases = append(testCases, testCase{
10243 testType: serverTest,
10244 name: "TLS13-EarlyData-NonZeroRTTSession-Server",
10245 config: Config{
10246 MaxVersion: VersionTLS13,
10247 },
10248 resumeConfig: &Config{
10249 MaxVersion: VersionTLS13,
10250 Bugs: ProtocolBugs{
10251 SendEarlyData: [][]byte{{}},
10252 ExpectEarlyDataAccepted: false,
10253 },
10254 },
10255 resumeSession: true,
10256 flags: []string{
10257 "-enable-resume-early-data",
10258 "-expect-reject-early-data",
10259 },
10260 })
10261
10262 // Test that we reject early data where ALPN is omitted from the first
10263 // connection.
10264 testCases = append(testCases, testCase{
10265 testType: serverTest,
10266 name: "TLS13-EarlyData-ALPNOmitted1-Server",
10267 config: Config{
10268 MaxVersion: VersionTLS13,
10269 NextProtos: []string{},
10270 },
10271 resumeConfig: &Config{
10272 MaxVersion: VersionTLS13,
10273 NextProtos: []string{"foo"},
10274 Bugs: ProtocolBugs{
10275 SendEarlyData: [][]byte{{}},
10276 ExpectEarlyDataAccepted: false,
10277 },
10278 },
10279 resumeSession: true,
10280 flags: []string{
10281 "-enable-early-data",
10282 "-select-alpn", "",
10283 "-select-resume-alpn", "foo",
10284 },
10285 })
10286
10287 // Test that we reject early data where ALPN is omitted from the second
10288 // connection.
10289 testCases = append(testCases, testCase{
10290 testType: serverTest,
10291 name: "TLS13-EarlyData-ALPNOmitted2-Server",
10292 config: Config{
10293 MaxVersion: VersionTLS13,
10294 NextProtos: []string{"foo"},
10295 },
10296 resumeConfig: &Config{
10297 MaxVersion: VersionTLS13,
10298 NextProtos: []string{},
10299 Bugs: ProtocolBugs{
10300 SendEarlyData: [][]byte{{}},
10301 ExpectEarlyDataAccepted: false,
10302 },
10303 },
10304 resumeSession: true,
10305 flags: []string{
10306 "-enable-early-data",
10307 "-select-alpn", "foo",
10308 "-select-resume-alpn", "",
10309 },
10310 })
10311
10312 // Test that we reject early data with mismatched ALPN.
10313 testCases = append(testCases, testCase{
10314 testType: serverTest,
10315 name: "TLS13-EarlyData-ALPNMismatch-Server",
10316 config: Config{
10317 MaxVersion: VersionTLS13,
10318 NextProtos: []string{"foo"},
10319 },
10320 resumeConfig: &Config{
10321 MaxVersion: VersionTLS13,
10322 NextProtos: []string{"bar"},
10323 Bugs: ProtocolBugs{
10324 SendEarlyData: [][]byte{{}},
10325 ExpectEarlyDataAccepted: false,
10326 },
10327 },
10328 resumeSession: true,
10329 flags: []string{
10330 "-enable-early-data",
10331 "-select-alpn", "foo",
10332 "-select-resume-alpn", "bar",
10333 },
10334 })
10335
Steven Valdez143e8b32016-07-11 13:19:03 -040010336}
10337
David Benjaminabbbee12016-10-31 19:20:42 -040010338func addTLS13CipherPreferenceTests() {
10339 // Test that client preference is honored if the shim has AES hardware
10340 // and ChaCha20-Poly1305 is preferred otherwise.
10341 testCases = append(testCases, testCase{
10342 testType: serverTest,
10343 name: "TLS13-CipherPreference-Server-ChaCha20-AES",
10344 config: Config{
10345 MaxVersion: VersionTLS13,
10346 CipherSuites: []uint16{
10347 TLS_CHACHA20_POLY1305_SHA256,
10348 TLS_AES_128_GCM_SHA256,
10349 },
10350 },
10351 flags: []string{
10352 "-expect-cipher-aes", strconv.Itoa(int(TLS_CHACHA20_POLY1305_SHA256)),
10353 "-expect-cipher-no-aes", strconv.Itoa(int(TLS_CHACHA20_POLY1305_SHA256)),
10354 },
10355 })
10356
10357 testCases = append(testCases, testCase{
10358 testType: serverTest,
10359 name: "TLS13-CipherPreference-Server-AES-ChaCha20",
10360 config: Config{
10361 MaxVersion: VersionTLS13,
10362 CipherSuites: []uint16{
10363 TLS_AES_128_GCM_SHA256,
10364 TLS_CHACHA20_POLY1305_SHA256,
10365 },
10366 },
10367 flags: []string{
10368 "-expect-cipher-aes", strconv.Itoa(int(TLS_AES_128_GCM_SHA256)),
10369 "-expect-cipher-no-aes", strconv.Itoa(int(TLS_CHACHA20_POLY1305_SHA256)),
10370 },
10371 })
10372
10373 // Test that the client orders ChaCha20-Poly1305 and AES-GCM based on
10374 // whether it has AES hardware.
10375 testCases = append(testCases, testCase{
10376 name: "TLS13-CipherPreference-Client",
10377 config: Config{
10378 MaxVersion: VersionTLS13,
10379 // Use the client cipher order. (This is the default but
10380 // is listed to be explicit.)
10381 PreferServerCipherSuites: false,
10382 },
10383 flags: []string{
10384 "-expect-cipher-aes", strconv.Itoa(int(TLS_AES_128_GCM_SHA256)),
10385 "-expect-cipher-no-aes", strconv.Itoa(int(TLS_CHACHA20_POLY1305_SHA256)),
10386 },
10387 })
10388}
10389
David Benjaminf3fbade2016-09-19 13:08:16 -040010390func addPeekTests() {
10391 // Test SSL_peek works, including on empty records.
10392 testCases = append(testCases, testCase{
10393 name: "Peek-Basic",
10394 sendEmptyRecords: 1,
10395 flags: []string{"-peek-then-read"},
10396 })
10397
10398 // Test SSL_peek can drive the initial handshake.
10399 testCases = append(testCases, testCase{
10400 name: "Peek-ImplicitHandshake",
10401 flags: []string{
10402 "-peek-then-read",
10403 "-implicit-handshake",
10404 },
10405 })
10406
10407 // Test SSL_peek can discover and drive a renegotiation.
10408 testCases = append(testCases, testCase{
10409 name: "Peek-Renegotiate",
10410 config: Config{
10411 MaxVersion: VersionTLS12,
10412 },
10413 renegotiate: 1,
10414 flags: []string{
10415 "-peek-then-read",
10416 "-renegotiate-freely",
10417 "-expect-total-renegotiations", "1",
10418 },
10419 })
10420
10421 // Test SSL_peek can discover a close_notify.
10422 testCases = append(testCases, testCase{
10423 name: "Peek-Shutdown",
10424 config: Config{
10425 Bugs: ProtocolBugs{
10426 ExpectCloseNotify: true,
10427 },
10428 },
10429 flags: []string{
10430 "-peek-then-read",
10431 "-check-close-notify",
10432 },
10433 })
10434
10435 // Test SSL_peek can discover an alert.
10436 testCases = append(testCases, testCase{
10437 name: "Peek-Alert",
10438 config: Config{
10439 Bugs: ProtocolBugs{
10440 SendSpuriousAlert: alertRecordOverflow,
10441 },
10442 },
10443 flags: []string{"-peek-then-read"},
10444 shouldFail: true,
10445 expectedError: ":TLSV1_ALERT_RECORD_OVERFLOW:",
10446 })
10447
10448 // Test SSL_peek can handle KeyUpdate.
10449 testCases = append(testCases, testCase{
10450 name: "Peek-KeyUpdate",
10451 config: Config{
10452 MaxVersion: VersionTLS13,
David Benjaminf3fbade2016-09-19 13:08:16 -040010453 },
Steven Valdezc4aa7272016-10-03 12:25:56 -040010454 sendKeyUpdates: 1,
10455 keyUpdateRequest: keyUpdateNotRequested,
10456 flags: []string{"-peek-then-read"},
David Benjaminf3fbade2016-09-19 13:08:16 -040010457 })
10458}
10459
David Benjamine6f22212016-11-08 14:28:24 -050010460func addRecordVersionTests() {
10461 for _, ver := range tlsVersions {
10462 // Test that the record version is enforced.
10463 testCases = append(testCases, testCase{
10464 name: "CheckRecordVersion-" + ver.name,
10465 config: Config{
10466 MinVersion: ver.version,
10467 MaxVersion: ver.version,
10468 Bugs: ProtocolBugs{
10469 SendRecordVersion: 0x03ff,
10470 },
10471 },
10472 shouldFail: true,
10473 expectedError: ":WRONG_VERSION_NUMBER:",
10474 })
10475
10476 // Test that the ClientHello may use any record version, for
10477 // compatibility reasons.
10478 testCases = append(testCases, testCase{
10479 testType: serverTest,
10480 name: "LooseInitialRecordVersion-" + ver.name,
10481 config: Config{
10482 MinVersion: ver.version,
10483 MaxVersion: ver.version,
10484 Bugs: ProtocolBugs{
10485 SendInitialRecordVersion: 0x03ff,
10486 },
10487 },
10488 })
10489
10490 // Test that garbage ClientHello record versions are rejected.
10491 testCases = append(testCases, testCase{
10492 testType: serverTest,
10493 name: "GarbageInitialRecordVersion-" + ver.name,
10494 config: Config{
10495 MinVersion: ver.version,
10496 MaxVersion: ver.version,
10497 Bugs: ProtocolBugs{
10498 SendInitialRecordVersion: 0xffff,
10499 },
10500 },
10501 shouldFail: true,
10502 expectedError: ":WRONG_VERSION_NUMBER:",
10503 })
10504 }
10505}
10506
David Benjamin2c516452016-11-15 10:16:54 +090010507func addCertificateTests() {
10508 // Test that a certificate chain with intermediate may be sent and
10509 // received as both client and server.
10510 for _, ver := range tlsVersions {
10511 testCases = append(testCases, testCase{
10512 testType: clientTest,
10513 name: "SendReceiveIntermediate-Client-" + ver.name,
10514 config: Config{
Adam Langleycd6cfb02016-12-06 15:11:00 -080010515 MinVersion: ver.version,
10516 MaxVersion: ver.version,
David Benjamin2c516452016-11-15 10:16:54 +090010517 Certificates: []Certificate{rsaChainCertificate},
10518 ClientAuth: RequireAnyClientCert,
10519 },
10520 expectPeerCertificate: &rsaChainCertificate,
10521 flags: []string{
10522 "-cert-file", path.Join(*resourceDir, rsaChainCertificateFile),
10523 "-key-file", path.Join(*resourceDir, rsaChainKeyFile),
10524 "-expect-peer-cert-file", path.Join(*resourceDir, rsaChainCertificateFile),
10525 },
10526 })
10527
10528 testCases = append(testCases, testCase{
10529 testType: serverTest,
10530 name: "SendReceiveIntermediate-Server-" + ver.name,
10531 config: Config{
Adam Langleycd6cfb02016-12-06 15:11:00 -080010532 MinVersion: ver.version,
10533 MaxVersion: ver.version,
David Benjamin2c516452016-11-15 10:16:54 +090010534 Certificates: []Certificate{rsaChainCertificate},
10535 },
10536 expectPeerCertificate: &rsaChainCertificate,
10537 flags: []string{
10538 "-cert-file", path.Join(*resourceDir, rsaChainCertificateFile),
10539 "-key-file", path.Join(*resourceDir, rsaChainKeyFile),
10540 "-require-any-client-certificate",
10541 "-expect-peer-cert-file", path.Join(*resourceDir, rsaChainCertificateFile),
10542 },
10543 })
10544 }
10545}
10546
David Benjaminbbaf3672016-11-17 10:53:09 +090010547func addRetainOnlySHA256ClientCertTests() {
10548 for _, ver := range tlsVersions {
10549 // Test that enabling
10550 // SSL_CTX_set_retain_only_sha256_of_client_certs without
10551 // actually requesting a client certificate is a no-op.
10552 testCases = append(testCases, testCase{
10553 testType: serverTest,
10554 name: "RetainOnlySHA256-NoCert-" + ver.name,
10555 config: Config{
10556 MinVersion: ver.version,
10557 MaxVersion: ver.version,
10558 },
10559 flags: []string{
10560 "-retain-only-sha256-client-cert-initial",
10561 "-retain-only-sha256-client-cert-resume",
10562 },
10563 resumeSession: true,
10564 })
10565
10566 // Test that when retaining only a SHA-256 certificate is
10567 // enabled, the hash appears as expected.
10568 testCases = append(testCases, testCase{
10569 testType: serverTest,
10570 name: "RetainOnlySHA256-Cert-" + ver.name,
10571 config: Config{
10572 MinVersion: ver.version,
10573 MaxVersion: ver.version,
10574 Certificates: []Certificate{rsaCertificate},
10575 },
10576 flags: []string{
10577 "-verify-peer",
10578 "-retain-only-sha256-client-cert-initial",
10579 "-retain-only-sha256-client-cert-resume",
10580 "-expect-sha256-client-cert-initial",
10581 "-expect-sha256-client-cert-resume",
10582 },
10583 resumeSession: true,
10584 })
10585
10586 // Test that when the config changes from on to off, a
10587 // resumption is rejected because the server now wants the full
10588 // certificate chain.
10589 testCases = append(testCases, testCase{
10590 testType: serverTest,
10591 name: "RetainOnlySHA256-OnOff-" + ver.name,
10592 config: Config{
10593 MinVersion: ver.version,
10594 MaxVersion: ver.version,
10595 Certificates: []Certificate{rsaCertificate},
10596 },
10597 flags: []string{
10598 "-verify-peer",
10599 "-retain-only-sha256-client-cert-initial",
10600 "-expect-sha256-client-cert-initial",
10601 },
10602 resumeSession: true,
10603 expectResumeRejected: true,
10604 })
10605
10606 // Test that when the config changes from off to on, a
10607 // resumption is rejected because the server now wants just the
10608 // hash.
10609 testCases = append(testCases, testCase{
10610 testType: serverTest,
10611 name: "RetainOnlySHA256-OffOn-" + ver.name,
10612 config: Config{
10613 MinVersion: ver.version,
10614 MaxVersion: ver.version,
10615 Certificates: []Certificate{rsaCertificate},
10616 },
10617 flags: []string{
10618 "-verify-peer",
10619 "-retain-only-sha256-client-cert-resume",
10620 "-expect-sha256-client-cert-resume",
10621 },
10622 resumeSession: true,
10623 expectResumeRejected: true,
10624 })
10625 }
10626}
10627
Adam Langleya4b91982016-12-12 12:05:53 -080010628func addECDSAKeyUsageTests() {
10629 p256 := elliptic.P256()
10630 priv, err := ecdsa.GenerateKey(p256, rand.Reader)
10631 if err != nil {
10632 panic(err)
10633 }
10634
10635 serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
10636 serialNumber, err := rand.Int(rand.Reader, serialNumberLimit)
10637 if err != nil {
10638 panic(err)
10639 }
10640
10641 template := x509.Certificate{
10642 SerialNumber: serialNumber,
10643 Subject: pkix.Name{
10644 Organization: []string{"Acme Co"},
10645 },
10646 NotBefore: time.Now(),
10647 NotAfter: time.Now(),
10648
10649 // An ECC certificate with only the keyAgreement key usgae may
10650 // be used with ECDH, but not ECDSA.
10651 KeyUsage: x509.KeyUsageKeyAgreement,
10652 ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
10653 BasicConstraintsValid: true,
10654 }
10655
10656 derBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, &priv.PublicKey, priv)
10657 if err != nil {
10658 panic(err)
10659 }
10660
10661 cert := Certificate{
10662 Certificate: [][]byte{derBytes},
10663 PrivateKey: priv,
10664 }
10665
10666 for _, ver := range tlsVersions {
10667 if ver.version < VersionTLS12 {
10668 continue
10669 }
10670
10671 testCases = append(testCases, testCase{
10672 testType: clientTest,
10673 name: "ECDSAKeyUsage-" + ver.name,
10674 config: Config{
10675 MinVersion: ver.version,
10676 MaxVersion: ver.version,
10677 Certificates: []Certificate{cert},
10678 },
10679 shouldFail: true,
10680 expectedError: ":ECC_CERT_NOT_FOR_SIGNING:",
10681 })
10682 }
10683}
10684
Adam Langley7c803a62015-06-15 15:35:05 -070010685func worker(statusChan chan statusMsg, c chan *testCase, shimPath string, wg *sync.WaitGroup) {
Adam Langley95c29f32014-06-20 12:00:00 -070010686 defer wg.Done()
10687
10688 for test := range c {
Adam Langley69a01602014-11-17 17:26:55 -080010689 var err error
10690
David Benjaminba28dfc2016-11-15 17:47:21 +090010691 if *mallocTest >= 0 {
Adam Langley69a01602014-11-17 17:26:55 -080010692 for mallocNumToFail := int64(*mallocTest); ; mallocNumToFail++ {
10693 statusChan <- statusMsg{test: test, started: true}
Adam Langley7c803a62015-06-15 15:35:05 -070010694 if err = runTest(test, shimPath, mallocNumToFail); err != errMoreMallocs {
Adam Langley69a01602014-11-17 17:26:55 -080010695 if err != nil {
10696 fmt.Printf("\n\nmalloc test failed at %d: %s\n", mallocNumToFail, err)
10697 }
10698 break
10699 }
10700 }
David Benjaminba28dfc2016-11-15 17:47:21 +090010701 } else if *repeatUntilFailure {
10702 for err == nil {
10703 statusChan <- statusMsg{test: test, started: true}
10704 err = runTest(test, shimPath, -1)
10705 }
10706 } else {
10707 statusChan <- statusMsg{test: test, started: true}
10708 err = runTest(test, shimPath, -1)
Adam Langley69a01602014-11-17 17:26:55 -080010709 }
Adam Langley95c29f32014-06-20 12:00:00 -070010710 statusChan <- statusMsg{test: test, err: err}
10711 }
10712}
10713
10714type statusMsg struct {
10715 test *testCase
10716 started bool
10717 err error
10718}
10719
David Benjamin5f237bc2015-02-11 17:14:15 -050010720func statusPrinter(doneChan chan *testOutput, statusChan chan statusMsg, total int) {
EKR842ae6c2016-07-27 09:22:05 +020010721 var started, done, failed, unimplemented, lineLen int
Adam Langley95c29f32014-06-20 12:00:00 -070010722
David Benjamin5f237bc2015-02-11 17:14:15 -050010723 testOutput := newTestOutput()
Adam Langley95c29f32014-06-20 12:00:00 -070010724 for msg := range statusChan {
David Benjamin5f237bc2015-02-11 17:14:15 -050010725 if !*pipe {
10726 // Erase the previous status line.
David Benjamin87c8a642015-02-21 01:54:29 -050010727 var erase string
10728 for i := 0; i < lineLen; i++ {
10729 erase += "\b \b"
10730 }
10731 fmt.Print(erase)
David Benjamin5f237bc2015-02-11 17:14:15 -050010732 }
10733
Adam Langley95c29f32014-06-20 12:00:00 -070010734 if msg.started {
10735 started++
10736 } else {
10737 done++
David Benjamin5f237bc2015-02-11 17:14:15 -050010738
10739 if msg.err != nil {
EKR842ae6c2016-07-27 09:22:05 +020010740 if msg.err == errUnimplemented {
10741 if *pipe {
10742 // Print each test instead of a status line.
10743 fmt.Printf("UNIMPLEMENTED (%s)\n", msg.test.name)
10744 }
10745 unimplemented++
10746 testOutput.addResult(msg.test.name, "UNIMPLEMENTED")
10747 } else {
10748 fmt.Printf("FAILED (%s)\n%s\n", msg.test.name, msg.err)
10749 failed++
10750 testOutput.addResult(msg.test.name, "FAIL")
10751 }
David Benjamin5f237bc2015-02-11 17:14:15 -050010752 } else {
10753 if *pipe {
10754 // Print each test instead of a status line.
10755 fmt.Printf("PASSED (%s)\n", msg.test.name)
10756 }
10757 testOutput.addResult(msg.test.name, "PASS")
10758 }
Adam Langley95c29f32014-06-20 12:00:00 -070010759 }
10760
David Benjamin5f237bc2015-02-11 17:14:15 -050010761 if !*pipe {
10762 // Print a new status line.
EKR842ae6c2016-07-27 09:22:05 +020010763 line := fmt.Sprintf("%d/%d/%d/%d/%d", failed, unimplemented, done, started, total)
David Benjamin5f237bc2015-02-11 17:14:15 -050010764 lineLen = len(line)
10765 os.Stdout.WriteString(line)
Adam Langley95c29f32014-06-20 12:00:00 -070010766 }
Adam Langley95c29f32014-06-20 12:00:00 -070010767 }
David Benjamin5f237bc2015-02-11 17:14:15 -050010768
10769 doneChan <- testOutput
Adam Langley95c29f32014-06-20 12:00:00 -070010770}
10771
10772func main() {
Adam Langley95c29f32014-06-20 12:00:00 -070010773 flag.Parse()
Adam Langley7c803a62015-06-15 15:35:05 -070010774 *resourceDir = path.Clean(*resourceDir)
David Benjamin33863262016-07-08 17:20:12 -070010775 initCertificates()
Adam Langley95c29f32014-06-20 12:00:00 -070010776
Adam Langley7c803a62015-06-15 15:35:05 -070010777 addBasicTests()
Adam Langley95c29f32014-06-20 12:00:00 -070010778 addCipherSuiteTests()
10779 addBadECDSASignatureTests()
Adam Langley80842bd2014-06-20 12:00:00 -070010780 addCBCPaddingTests()
Kenny Root7fdeaf12014-08-05 15:23:37 -070010781 addCBCSplittingTests()
David Benjamin636293b2014-07-08 17:59:18 -040010782 addClientAuthTests()
Adam Langley524e7172015-02-20 16:04:00 -080010783 addDDoSCallbackTests()
David Benjamin7e2e6cf2014-08-07 17:44:24 -040010784 addVersionNegotiationTests()
David Benjaminaccb4542014-12-12 23:44:33 -050010785 addMinimumVersionTests()
David Benjamine78bfde2014-09-06 12:45:15 -040010786 addExtensionTests()
David Benjamin01fe8202014-09-24 15:21:44 -040010787 addResumptionVersionTests()
Adam Langley75712922014-10-10 16:23:43 -070010788 addExtendedMasterSecretTests()
Adam Langley2ae77d22014-10-28 17:29:33 -070010789 addRenegotiationTests()
David Benjamin5e961c12014-11-07 01:48:35 -050010790 addDTLSReplayTests()
Nick Harper60edffd2016-06-21 15:19:24 -070010791 addSignatureAlgorithmTests()
David Benjamin83f90402015-01-27 01:09:43 -050010792 addDTLSRetransmitTests()
David Benjaminc565ebb2015-04-03 04:06:36 -040010793 addExportKeyingMaterialTests()
Adam Langleyaf0e32c2015-06-03 09:57:23 -070010794 addTLSUniqueTests()
Adam Langley09505632015-07-30 18:10:13 -070010795 addCustomExtensionTests()
David Benjaminb36a3952015-12-01 18:53:13 -050010796 addRSAClientKeyExchangeTests()
David Benjamin8c2b3bf2015-12-18 20:55:44 -050010797 addCurveTests()
Steven Valdez5b986082016-09-01 12:29:49 -040010798 addSessionTicketTests()
David Benjaminc9ae27c2016-06-24 22:56:37 -040010799 addTLS13RecordTests()
David Benjamin582ba042016-07-07 12:33:25 -070010800 addAllStateMachineCoverageTests()
David Benjamin82261be2016-07-07 14:32:50 -070010801 addChangeCipherSpecTests()
David Benjamin0b8d5da2016-07-15 00:39:56 -040010802 addWrongMessageTypeTests()
David Benjamin639846e2016-09-09 11:41:18 -040010803 addTrailingMessageDataTests()
Steven Valdez143e8b32016-07-11 13:19:03 -040010804 addTLS13HandshakeTests()
David Benjaminabbbee12016-10-31 19:20:42 -040010805 addTLS13CipherPreferenceTests()
David Benjaminf3fbade2016-09-19 13:08:16 -040010806 addPeekTests()
David Benjamine6f22212016-11-08 14:28:24 -050010807 addRecordVersionTests()
David Benjamin2c516452016-11-15 10:16:54 +090010808 addCertificateTests()
David Benjaminbbaf3672016-11-17 10:53:09 +090010809 addRetainOnlySHA256ClientCertTests()
Adam Langleya4b91982016-12-12 12:05:53 -080010810 addECDSAKeyUsageTests()
Adam Langley95c29f32014-06-20 12:00:00 -070010811
10812 var wg sync.WaitGroup
10813
Adam Langley7c803a62015-06-15 15:35:05 -070010814 statusChan := make(chan statusMsg, *numWorkers)
10815 testChan := make(chan *testCase, *numWorkers)
David Benjamin5f237bc2015-02-11 17:14:15 -050010816 doneChan := make(chan *testOutput)
Adam Langley95c29f32014-06-20 12:00:00 -070010817
EKRf71d7ed2016-08-06 13:25:12 -070010818 if len(*shimConfigFile) != 0 {
10819 encoded, err := ioutil.ReadFile(*shimConfigFile)
10820 if err != nil {
10821 fmt.Fprintf(os.Stderr, "Couldn't read config file %q: %s\n", *shimConfigFile, err)
10822 os.Exit(1)
10823 }
10824
10825 if err := json.Unmarshal(encoded, &shimConfig); err != nil {
10826 fmt.Fprintf(os.Stderr, "Couldn't decode config file %q: %s\n", *shimConfigFile, err)
10827 os.Exit(1)
10828 }
10829 }
10830
David Benjamin025b3d32014-07-01 19:53:04 -040010831 go statusPrinter(doneChan, statusChan, len(testCases))
Adam Langley95c29f32014-06-20 12:00:00 -070010832
Adam Langley7c803a62015-06-15 15:35:05 -070010833 for i := 0; i < *numWorkers; i++ {
Adam Langley95c29f32014-06-20 12:00:00 -070010834 wg.Add(1)
Adam Langley7c803a62015-06-15 15:35:05 -070010835 go worker(statusChan, testChan, *shimPath, &wg)
Adam Langley95c29f32014-06-20 12:00:00 -070010836 }
10837
David Benjamin270f0a72016-03-17 14:41:36 -040010838 var foundTest bool
David Benjamin025b3d32014-07-01 19:53:04 -040010839 for i := range testCases {
David Benjamin17e12922016-07-28 18:04:43 -040010840 matched := true
10841 if len(*testToRun) != 0 {
10842 var err error
10843 matched, err = filepath.Match(*testToRun, testCases[i].name)
10844 if err != nil {
10845 fmt.Fprintf(os.Stderr, "Error matching pattern: %s\n", err)
10846 os.Exit(1)
10847 }
10848 }
10849
EKRf71d7ed2016-08-06 13:25:12 -070010850 if !*includeDisabled {
10851 for pattern := range shimConfig.DisabledTests {
10852 isDisabled, err := filepath.Match(pattern, testCases[i].name)
10853 if err != nil {
10854 fmt.Fprintf(os.Stderr, "Error matching pattern %q from config file: %s\n", pattern, err)
10855 os.Exit(1)
10856 }
10857
10858 if isDisabled {
10859 matched = false
10860 break
10861 }
10862 }
10863 }
10864
David Benjamin17e12922016-07-28 18:04:43 -040010865 if matched {
David Benjamin270f0a72016-03-17 14:41:36 -040010866 foundTest = true
David Benjamin025b3d32014-07-01 19:53:04 -040010867 testChan <- &testCases[i]
David Benjaminba28dfc2016-11-15 17:47:21 +090010868
10869 // Only run one test if repeating until failure.
10870 if *repeatUntilFailure {
10871 break
10872 }
Adam Langley95c29f32014-06-20 12:00:00 -070010873 }
10874 }
David Benjamin17e12922016-07-28 18:04:43 -040010875
David Benjamin270f0a72016-03-17 14:41:36 -040010876 if !foundTest {
EKRf71d7ed2016-08-06 13:25:12 -070010877 fmt.Fprintf(os.Stderr, "No tests run\n")
David Benjamin270f0a72016-03-17 14:41:36 -040010878 os.Exit(1)
10879 }
Adam Langley95c29f32014-06-20 12:00:00 -070010880
10881 close(testChan)
10882 wg.Wait()
10883 close(statusChan)
David Benjamin5f237bc2015-02-11 17:14:15 -050010884 testOutput := <-doneChan
Adam Langley95c29f32014-06-20 12:00:00 -070010885
10886 fmt.Printf("\n")
David Benjamin5f237bc2015-02-11 17:14:15 -050010887
10888 if *jsonOutput != "" {
10889 if err := testOutput.writeTo(*jsonOutput); err != nil {
10890 fmt.Fprintf(os.Stderr, "Error: %s\n", err)
10891 }
10892 }
David Benjamin2ab7a862015-04-04 17:02:18 -040010893
EKR842ae6c2016-07-27 09:22:05 +020010894 if !*allowUnimplemented && testOutput.NumFailuresByType["UNIMPLEMENTED"] > 0 {
10895 os.Exit(1)
10896 }
10897
10898 if !testOutput.noneFailed {
David Benjamin2ab7a862015-04-04 17:02:18 -040010899 os.Exit(1)
10900 }
Adam Langley95c29f32014-06-20 12:00:00 -070010901}