1// Copyright 2009 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package runner
6
7import (
8	"container/list"
9	"crypto"
10	"crypto/ecdsa"
11	"crypto/rand"
12	"crypto/x509"
13	"fmt"
14	"io"
15	"math/big"
16	"strings"
17	"sync"
18	"time"
19)
20
21const (
22	VersionSSL30 = 0x0300
23	VersionTLS10 = 0x0301
24	VersionTLS11 = 0x0302
25	VersionTLS12 = 0x0303
26	VersionTLS13 = 0x0304
27)
28
29// A draft version of TLS 1.3 that is sent over the wire for the current draft.
30const tls13DraftVersion = 0x7f12
31
32const (
33	maxPlaintext        = 16384        // maximum plaintext payload length
34	maxCiphertext       = 16384 + 2048 // maximum ciphertext payload length
35	tlsRecordHeaderLen  = 5            // record header length
36	dtlsRecordHeaderLen = 13
37	maxHandshake        = 65536 // maximum handshake we support (protocol max is 16 MB)
38
39	minVersion = VersionSSL30
40	maxVersion = VersionTLS13
41)
42
43// TLS record types.
44type recordType uint8
45
46const (
47	recordTypeChangeCipherSpec recordType = 20
48	recordTypeAlert            recordType = 21
49	recordTypeHandshake        recordType = 22
50	recordTypeApplicationData  recordType = 23
51)
52
53// TLS handshake message types.
54const (
55	typeHelloRequest        uint8 = 0
56	typeClientHello         uint8 = 1
57	typeServerHello         uint8 = 2
58	typeHelloVerifyRequest  uint8 = 3
59	typeNewSessionTicket    uint8 = 4
60	typeHelloRetryRequest   uint8 = 6 // draft-ietf-tls-tls13-16
61	typeEncryptedExtensions uint8 = 8 // draft-ietf-tls-tls13-16
62	typeCertificate         uint8 = 11
63	typeServerKeyExchange   uint8 = 12
64	typeCertificateRequest  uint8 = 13
65	typeServerHelloDone     uint8 = 14
66	typeCertificateVerify   uint8 = 15
67	typeClientKeyExchange   uint8 = 16
68	typeFinished            uint8 = 20
69	typeCertificateStatus   uint8 = 22
70	typeKeyUpdate           uint8 = 24  // draft-ietf-tls-tls13-16
71	typeNextProtocol        uint8 = 67  // Not IANA assigned
72	typeChannelID           uint8 = 203 // Not IANA assigned
73)
74
75// TLS compression types.
76const (
77	compressionNone uint8 = 0
78)
79
80// TLS extension numbers
81const (
82	extensionServerName                 uint16 = 0
83	extensionStatusRequest              uint16 = 5
84	extensionSupportedCurves            uint16 = 10
85	extensionSupportedPoints            uint16 = 11
86	extensionSignatureAlgorithms        uint16 = 13
87	extensionUseSRTP                    uint16 = 14
88	extensionALPN                       uint16 = 16
89	extensionSignedCertificateTimestamp uint16 = 18
90	extensionExtendedMasterSecret       uint16 = 23
91	extensionSessionTicket              uint16 = 35
92	extensionKeyShare                   uint16 = 40    // draft-ietf-tls-tls13-16
93	extensionPreSharedKey               uint16 = 41    // draft-ietf-tls-tls13-16
94	extensionEarlyData                  uint16 = 42    // draft-ietf-tls-tls13-16
95	extensionSupportedVersions          uint16 = 43    // draft-ietf-tls-tls13-16
96	extensionCookie                     uint16 = 44    // draft-ietf-tls-tls13-16
97	extensionPSKKeyExchangeModes        uint16 = 45    // draft-ietf-tls-tls13-18
98	extensionTicketEarlyDataInfo        uint16 = 46    // draft-ietf-tls-tls13-18
99	extensionCustom                     uint16 = 1234  // not IANA assigned
100	extensionNextProtoNeg               uint16 = 13172 // not IANA assigned
101	extensionRenegotiationInfo          uint16 = 0xff01
102	extensionChannelID                  uint16 = 30032 // not IANA assigned
103)
104
105// TLS signaling cipher suite values
106const (
107	scsvRenegotiation uint16 = 0x00ff
108)
109
110// CurveID is the type of a TLS identifier for an elliptic curve. See
111// http://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-8
112type CurveID uint16
113
114const (
115	CurveP224   CurveID = 21
116	CurveP256   CurveID = 23
117	CurveP384   CurveID = 24
118	CurveP521   CurveID = 25
119	CurveX25519 CurveID = 29
120)
121
122// TLS Elliptic Curve Point Formats
123// http://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-9
124const (
125	pointFormatUncompressed    uint8 = 0
126	pointFormatCompressedPrime uint8 = 1
127)
128
129// TLS CertificateStatusType (RFC 3546)
130const (
131	statusTypeOCSP uint8 = 1
132)
133
134// Certificate types (for certificateRequestMsg)
135const (
136	CertTypeRSASign    = 1 // A certificate containing an RSA key
137	CertTypeDSSSign    = 2 // A certificate containing a DSA key
138	CertTypeRSAFixedDH = 3 // A certificate containing a static DH key
139	CertTypeDSSFixedDH = 4 // A certificate containing a static DH key
140
141	// See RFC4492 sections 3 and 5.5.
142	CertTypeECDSASign      = 64 // A certificate containing an ECDSA-capable public key, signed with ECDSA.
143	CertTypeRSAFixedECDH   = 65 // A certificate containing an ECDH-capable public key, signed with RSA.
144	CertTypeECDSAFixedECDH = 66 // A certificate containing an ECDH-capable public key, signed with ECDSA.
145
146	// Rest of these are reserved by the TLS spec
147)
148
149// signatureAlgorithm corresponds to a SignatureScheme value from TLS 1.3. Note
150// that TLS 1.3 names the production 'SignatureScheme' to avoid colliding with
151// TLS 1.2's SignatureAlgorithm but otherwise refers to them as 'signature
152// algorithms' throughout. We match the latter.
153type signatureAlgorithm uint16
154
155const (
156	// RSASSA-PKCS1-v1_5 algorithms
157	signatureRSAPKCS1WithMD5    signatureAlgorithm = 0x0101
158	signatureRSAPKCS1WithSHA1   signatureAlgorithm = 0x0201
159	signatureRSAPKCS1WithSHA256 signatureAlgorithm = 0x0401
160	signatureRSAPKCS1WithSHA384 signatureAlgorithm = 0x0501
161	signatureRSAPKCS1WithSHA512 signatureAlgorithm = 0x0601
162
163	// ECDSA algorithms
164	signatureECDSAWithSHA1          signatureAlgorithm = 0x0203
165	signatureECDSAWithP256AndSHA256 signatureAlgorithm = 0x0403
166	signatureECDSAWithP384AndSHA384 signatureAlgorithm = 0x0503
167	signatureECDSAWithP521AndSHA512 signatureAlgorithm = 0x0603
168
169	// RSASSA-PSS algorithms
170	signatureRSAPSSWithSHA256 signatureAlgorithm = 0x0804
171	signatureRSAPSSWithSHA384 signatureAlgorithm = 0x0805
172	signatureRSAPSSWithSHA512 signatureAlgorithm = 0x0806
173
174	// EdDSA algorithms
175	signatureEd25519 signatureAlgorithm = 0x0807
176	signatureEd448   signatureAlgorithm = 0x0808
177)
178
179// supportedSignatureAlgorithms contains the default supported signature
180// algorithms.
181var supportedSignatureAlgorithms = []signatureAlgorithm{
182	signatureRSAPSSWithSHA256,
183	signatureRSAPKCS1WithSHA256,
184	signatureECDSAWithP256AndSHA256,
185	signatureRSAPKCS1WithSHA1,
186	signatureECDSAWithSHA1,
187}
188
189// SRTP protection profiles (See RFC 5764, section 4.1.2)
190const (
191	SRTP_AES128_CM_HMAC_SHA1_80 uint16 = 0x0001
192	SRTP_AES128_CM_HMAC_SHA1_32        = 0x0002
193)
194
195// PskKeyExchangeMode values (see draft-ietf-tls-tls13-16)
196const (
197	pskKEMode    = 0
198	pskDHEKEMode = 1
199)
200
201// KeyUpdateRequest values (see draft-ietf-tls-tls13-16, section 4.5.3)
202const (
203	keyUpdateNotRequested = 0
204	keyUpdateRequested    = 1
205)
206
207// ConnectionState records basic TLS details about the connection.
208type ConnectionState struct {
209	Version                    uint16                // TLS version used by the connection (e.g. VersionTLS12)
210	HandshakeComplete          bool                  // TLS handshake is complete
211	DidResume                  bool                  // connection resumes a previous TLS connection
212	CipherSuite                uint16                // cipher suite in use (TLS_RSA_WITH_RC4_128_SHA, ...)
213	NegotiatedProtocol         string                // negotiated next protocol (from Config.NextProtos)
214	NegotiatedProtocolIsMutual bool                  // negotiated protocol was advertised by server
215	NegotiatedProtocolFromALPN bool                  // protocol negotiated with ALPN
216	ServerName                 string                // server name requested by client, if any (server side only)
217	PeerCertificates           []*x509.Certificate   // certificate chain presented by remote peer
218	VerifiedChains             [][]*x509.Certificate // verified chains built from PeerCertificates
219	ChannelID                  *ecdsa.PublicKey      // the channel ID for this connection
220	SRTPProtectionProfile      uint16                // the negotiated DTLS-SRTP protection profile
221	TLSUnique                  []byte                // the tls-unique channel binding
222	SCTList                    []byte                // signed certificate timestamp list
223	PeerSignatureAlgorithm     signatureAlgorithm    // algorithm used by the peer in the handshake
224	CurveID                    CurveID               // the curve used in ECDHE
225}
226
227// ClientAuthType declares the policy the server will follow for
228// TLS Client Authentication.
229type ClientAuthType int
230
231const (
232	NoClientCert ClientAuthType = iota
233	RequestClientCert
234	RequireAnyClientCert
235	VerifyClientCertIfGiven
236	RequireAndVerifyClientCert
237)
238
239// ClientSessionState contains the state needed by clients to resume TLS
240// sessions.
241type ClientSessionState struct {
242	sessionId            []uint8             // Session ID supplied by the server. nil if the session has a ticket.
243	sessionTicket        []uint8             // Encrypted ticket used for session resumption with server
244	vers                 uint16              // SSL/TLS version negotiated for the session
245	cipherSuite          uint16              // Ciphersuite negotiated for the session
246	masterSecret         []byte              // MasterSecret generated by client on a full handshake
247	handshakeHash        []byte              // Handshake hash for Channel ID purposes.
248	serverCertificates   []*x509.Certificate // Certificate chain presented by the server
249	extendedMasterSecret bool                // Whether an extended master secret was used to generate the session
250	sctList              []byte
251	ocspResponse         []byte
252	earlyALPN            string
253	ticketCreationTime   time.Time
254	ticketExpiration     time.Time
255	ticketAgeAdd         uint32
256	maxEarlyDataSize     uint32
257}
258
259// ClientSessionCache is a cache of ClientSessionState objects that can be used
260// by a client to resume a TLS session with a given server. ClientSessionCache
261// implementations should expect to be called concurrently from different
262// goroutines.
263type ClientSessionCache interface {
264	// Get searches for a ClientSessionState associated with the given key.
265	// On return, ok is true if one was found.
266	Get(sessionKey string) (session *ClientSessionState, ok bool)
267
268	// Put adds the ClientSessionState to the cache with the given key.
269	Put(sessionKey string, cs *ClientSessionState)
270}
271
272// ServerSessionCache is a cache of sessionState objects that can be used by a
273// client to resume a TLS session with a given server. ServerSessionCache
274// implementations should expect to be called concurrently from different
275// goroutines.
276type ServerSessionCache interface {
277	// Get searches for a sessionState associated with the given session
278	// ID. On return, ok is true if one was found.
279	Get(sessionId string) (session *sessionState, ok bool)
280
281	// Put adds the sessionState to the cache with the given session ID.
282	Put(sessionId string, session *sessionState)
283}
284
285// A Config structure is used to configure a TLS client or server.
286// After one has been passed to a TLS function it must not be
287// modified. A Config may be reused; the tls package will also not
288// modify it.
289type Config struct {
290	// Rand provides the source of entropy for nonces and RSA blinding.
291	// If Rand is nil, TLS uses the cryptographic random reader in package
292	// crypto/rand.
293	// The Reader must be safe for use by multiple goroutines.
294	Rand io.Reader
295
296	// Time returns the current time as the number of seconds since the epoch.
297	// If Time is nil, TLS uses time.Now.
298	Time func() time.Time
299
300	// Certificates contains one or more certificate chains
301	// to present to the other side of the connection.
302	// Server configurations must include at least one certificate.
303	Certificates []Certificate
304
305	// NameToCertificate maps from a certificate name to an element of
306	// Certificates. Note that a certificate name can be of the form
307	// '*.example.com' and so doesn't have to be a domain name as such.
308	// See Config.BuildNameToCertificate
309	// The nil value causes the first element of Certificates to be used
310	// for all connections.
311	NameToCertificate map[string]*Certificate
312
313	// RootCAs defines the set of root certificate authorities
314	// that clients use when verifying server certificates.
315	// If RootCAs is nil, TLS uses the host's root CA set.
316	RootCAs *x509.CertPool
317
318	// NextProtos is a list of supported, application level protocols.
319	NextProtos []string
320
321	// ServerName is used to verify the hostname on the returned
322	// certificates unless InsecureSkipVerify is given. It is also included
323	// in the client's handshake to support virtual hosting.
324	ServerName string
325
326	// ClientAuth determines the server's policy for
327	// TLS Client Authentication. The default is NoClientCert.
328	ClientAuth ClientAuthType
329
330	// ClientCAs defines the set of root certificate authorities
331	// that servers use if required to verify a client certificate
332	// by the policy in ClientAuth.
333	ClientCAs *x509.CertPool
334
335	// ClientCertificateTypes defines the set of allowed client certificate
336	// types. The default is CertTypeRSASign and CertTypeECDSASign.
337	ClientCertificateTypes []byte
338
339	// InsecureSkipVerify controls whether a client verifies the
340	// server's certificate chain and host name.
341	// If InsecureSkipVerify is true, TLS accepts any certificate
342	// presented by the server and any host name in that certificate.
343	// In this mode, TLS is susceptible to man-in-the-middle attacks.
344	// This should be used only for testing.
345	InsecureSkipVerify bool
346
347	// CipherSuites is a list of supported cipher suites. If CipherSuites
348	// is nil, TLS uses a list of suites supported by the implementation.
349	CipherSuites []uint16
350
351	// PreferServerCipherSuites controls whether the server selects the
352	// client's most preferred ciphersuite, or the server's most preferred
353	// ciphersuite. If true then the server's preference, as expressed in
354	// the order of elements in CipherSuites, is used.
355	PreferServerCipherSuites bool
356
357	// SessionTicketsDisabled may be set to true to disable session ticket
358	// (resumption) support.
359	SessionTicketsDisabled bool
360
361	// SessionTicketKey is used by TLS servers to provide session
362	// resumption. See RFC 5077. If zero, it will be filled with
363	// random data before the first server handshake.
364	//
365	// If multiple servers are terminating connections for the same host
366	// they should all have the same SessionTicketKey. If the
367	// SessionTicketKey leaks, previously recorded and future TLS
368	// connections using that key are compromised.
369	SessionTicketKey [32]byte
370
371	// ClientSessionCache is a cache of ClientSessionState entries
372	// for TLS session resumption.
373	ClientSessionCache ClientSessionCache
374
375	// ServerSessionCache is a cache of sessionState entries for TLS session
376	// resumption.
377	ServerSessionCache ServerSessionCache
378
379	// MinVersion contains the minimum SSL/TLS version that is acceptable.
380	// If zero, then SSLv3 is taken as the minimum.
381	MinVersion uint16
382
383	// MaxVersion contains the maximum SSL/TLS version that is acceptable.
384	// If zero, then the maximum version supported by this package is used,
385	// which is currently TLS 1.2.
386	MaxVersion uint16
387
388	// CurvePreferences contains the elliptic curves that will be used in
389	// an ECDHE handshake, in preference order. If empty, the default will
390	// be used.
391	CurvePreferences []CurveID
392
393	// DefaultCurves contains the elliptic curves for which public values will
394	// be sent in the ClientHello's KeyShare extension. If this value is nil,
395	// all supported curves will have public values sent. This field is ignored
396	// on servers.
397	DefaultCurves []CurveID
398
399	// ChannelID contains the ECDSA key for the client to use as
400	// its TLS Channel ID.
401	ChannelID *ecdsa.PrivateKey
402
403	// RequestChannelID controls whether the server requests a TLS
404	// Channel ID. If negotiated, the client's public key is
405	// returned in the ConnectionState.
406	RequestChannelID bool
407
408	// PreSharedKey, if not nil, is the pre-shared key to use with
409	// the PSK cipher suites.
410	PreSharedKey []byte
411
412	// PreSharedKeyIdentity, if not empty, is the identity to use
413	// with the PSK cipher suites.
414	PreSharedKeyIdentity string
415
416	// MaxEarlyDataSize controls the maximum number of bytes that the
417	// server will accept in early data and advertise in a
418	// NewSessionTicketMsg. If 0, no early data will be accepted and
419	// the TicketEarlyDataInfo extension in the NewSessionTicketMsg
420	// will be omitted.
421	MaxEarlyDataSize uint32
422
423	// SRTPProtectionProfiles, if not nil, is the list of SRTP
424	// protection profiles to offer in DTLS-SRTP.
425	SRTPProtectionProfiles []uint16
426
427	// SignSignatureAlgorithms, if not nil, overrides the default set of
428	// supported signature algorithms to sign with.
429	SignSignatureAlgorithms []signatureAlgorithm
430
431	// VerifySignatureAlgorithms, if not nil, overrides the default set of
432	// supported signature algorithms that are accepted.
433	VerifySignatureAlgorithms []signatureAlgorithm
434
435	// Bugs specifies optional misbehaviour to be used for testing other
436	// implementations.
437	Bugs ProtocolBugs
438
439	serverInitOnce sync.Once // guards calling (*Config).serverInit
440}
441
442type BadValue int
443
444const (
445	BadValueNone BadValue = iota
446	BadValueNegative
447	BadValueZero
448	BadValueLimit
449	BadValueLarge
450	NumBadValues
451)
452
453type RSABadValue int
454
455const (
456	RSABadValueNone RSABadValue = iota
457	RSABadValueCorrupt
458	RSABadValueTooLong
459	RSABadValueTooShort
460	RSABadValueWrongVersion
461	NumRSABadValues
462)
463
464type ProtocolBugs struct {
465	// InvalidSignature specifies that the signature in a ServerKeyExchange
466	// or CertificateVerify message should be invalid.
467	InvalidSignature bool
468
469	// SendCurve, if non-zero, causes the server to send the specified curve
470	// ID in ServerKeyExchange (TLS 1.2) or ServerHello (TLS 1.3) rather
471	// than the negotiated one.
472	SendCurve CurveID
473
474	// InvalidECDHPoint, if true, causes the ECC points in
475	// ServerKeyExchange or ClientKeyExchange messages to be invalid.
476	InvalidECDHPoint bool
477
478	// BadECDSAR controls ways in which the 'r' value of an ECDSA signature
479	// can be invalid.
480	BadECDSAR BadValue
481	BadECDSAS BadValue
482
483	// MaxPadding causes CBC records to have the maximum possible padding.
484	MaxPadding bool
485	// PaddingFirstByteBad causes the first byte of the padding to be
486	// incorrect.
487	PaddingFirstByteBad bool
488	// PaddingFirstByteBadIf255 causes the first byte of padding to be
489	// incorrect if there's a maximum amount of padding (i.e. 255 bytes).
490	PaddingFirstByteBadIf255 bool
491
492	// FailIfNotFallbackSCSV causes a server handshake to fail if the
493	// client doesn't send the fallback SCSV value.
494	FailIfNotFallbackSCSV bool
495
496	// DuplicateExtension causes an extra empty extension of bogus type to
497	// be emitted in either the ClientHello or the ServerHello.
498	DuplicateExtension bool
499
500	// UnauthenticatedECDH causes the server to pretend ECDHE_RSA
501	// and ECDHE_ECDSA cipher suites are actually ECDH_anon. No
502	// Certificate message is sent and no signature is added to
503	// ServerKeyExchange.
504	UnauthenticatedECDH bool
505
506	// SkipHelloVerifyRequest causes a DTLS server to skip the
507	// HelloVerifyRequest message.
508	SkipHelloVerifyRequest bool
509
510	// SkipCertificateStatus, if true, causes the server to skip the
511	// CertificateStatus message. This is legal because CertificateStatus is
512	// optional, even with a status_request in ServerHello.
513	SkipCertificateStatus bool
514
515	// SkipServerKeyExchange causes the server to skip sending
516	// ServerKeyExchange messages.
517	SkipServerKeyExchange bool
518
519	// SkipNewSessionTicket causes the server to skip sending the
520	// NewSessionTicket message despite promising to in ServerHello.
521	SkipNewSessionTicket bool
522
523	// SkipClientCertificate causes the client to skip the Certificate
524	// message.
525	SkipClientCertificate bool
526
527	// SkipChangeCipherSpec causes the implementation to skip
528	// sending the ChangeCipherSpec message (and adjusting cipher
529	// state accordingly for the Finished message).
530	SkipChangeCipherSpec bool
531
532	// SkipFinished causes the implementation to skip sending the Finished
533	// message.
534	SkipFinished bool
535
536	// SkipEndOfEarlyData causes the implementation to skip the
537	// end_of_early_data alert.
538	SkipEndOfEarlyData bool
539
540	// EarlyChangeCipherSpec causes the client to send an early
541	// ChangeCipherSpec message before the ClientKeyExchange. A value of
542	// zero disables this behavior. One and two configure variants for 0.9.8
543	// and 1.0.1 modes, respectively.
544	EarlyChangeCipherSpec int
545
546	// StrayChangeCipherSpec causes every pre-ChangeCipherSpec handshake
547	// message in DTLS to be prefaced by stray ChangeCipherSpec record. This
548	// may be used to test DTLS's handling of reordered ChangeCipherSpec.
549	StrayChangeCipherSpec bool
550
551	// FragmentAcrossChangeCipherSpec causes the implementation to fragment
552	// the Finished (or NextProto) message around the ChangeCipherSpec
553	// messages.
554	FragmentAcrossChangeCipherSpec bool
555
556	// SendUnencryptedFinished, if true, causes the Finished message to be
557	// send unencrypted before ChangeCipherSpec rather than after it.
558	SendUnencryptedFinished bool
559
560	// PartialEncryptedExtensionsWithServerHello, if true, causes the TLS
561	// 1.3 server to send part of EncryptedExtensions unencrypted
562	// in the same record as ServerHello.
563	PartialEncryptedExtensionsWithServerHello bool
564
565	// PartialClientFinishedWithClientHello, if true, causes the TLS 1.3
566	// client to send part of Finished unencrypted in the same record as
567	// ClientHello.
568	PartialClientFinishedWithClientHello bool
569
570	// SendV2ClientHello causes the client to send a V2ClientHello
571	// instead of a normal ClientHello.
572	SendV2ClientHello bool
573
574	// SendFallbackSCSV causes the client to include
575	// TLS_FALLBACK_SCSV in the ClientHello.
576	SendFallbackSCSV bool
577
578	// SendRenegotiationSCSV causes the client to include the renegotiation
579	// SCSV in the ClientHello.
580	SendRenegotiationSCSV bool
581
582	// MaxHandshakeRecordLength, if non-zero, is the maximum size of a
583	// handshake record. Handshake messages will be split into multiple
584	// records at the specified size, except that the client_version will
585	// never be fragmented. For DTLS, it is the maximum handshake fragment
586	// size, not record size; DTLS allows multiple handshake fragments in a
587	// single handshake record. See |PackHandshakeFragments|.
588	MaxHandshakeRecordLength int
589
590	// FragmentClientVersion will allow MaxHandshakeRecordLength to apply to
591	// the first 6 bytes of the ClientHello.
592	FragmentClientVersion bool
593
594	// FragmentAlert will cause all alerts to be fragmented across
595	// two records.
596	FragmentAlert bool
597
598	// DoubleAlert will cause all alerts to be sent as two copies packed
599	// within one record.
600	DoubleAlert bool
601
602	// SendSpuriousAlert, if non-zero, will cause an spurious, unwanted
603	// alert to be sent.
604	SendSpuriousAlert alert
605
606	// BadRSAClientKeyExchange causes the client to send a corrupted RSA
607	// ClientKeyExchange which would not pass padding checks.
608	BadRSAClientKeyExchange RSABadValue
609
610	// RenewTicketOnResume causes the server to renew the session ticket and
611	// send a NewSessionTicket message during an abbreviated handshake.
612	RenewTicketOnResume bool
613
614	// SendClientVersion, if non-zero, causes the client to send the
615	// specified value in the ClientHello version field.
616	SendClientVersion uint16
617
618	// OmitSupportedVersions, if true, causes the client to omit the
619	// supported versions extension.
620	OmitSupportedVersions bool
621
622	// SendSupportedVersions, if non-empty, causes the client to send a
623	// supported versions extension with the values from array.
624	SendSupportedVersions []uint16
625
626	// NegotiateVersion, if non-zero, causes the server to negotiate the
627	// specifed TLS version rather than the version supported by either
628	// peer.
629	NegotiateVersion uint16
630
631	// NegotiateVersionOnRenego, if non-zero, causes the server to negotiate
632	// the specified TLS version on renegotiation rather than retaining it.
633	NegotiateVersionOnRenego uint16
634
635	// ExpectFalseStart causes the server to, on full handshakes,
636	// expect the peer to False Start; the server Finished message
637	// isn't sent until we receive an application data record
638	// from the peer.
639	ExpectFalseStart bool
640
641	// AlertBeforeFalseStartTest, if non-zero, causes the server to, on full
642	// handshakes, send an alert just before reading the application data
643	// record to test False Start. This can be used in a negative False
644	// Start test to determine whether the peer processed the alert (and
645	// closed the connection) before or after sending app data.
646	AlertBeforeFalseStartTest alert
647
648	// ExpectServerName, if not empty, is the hostname the client
649	// must specify in the server_name extension.
650	ExpectServerName string
651
652	// SwapNPNAndALPN switches the relative order between NPN and ALPN in
653	// both ClientHello and ServerHello.
654	SwapNPNAndALPN bool
655
656	// ALPNProtocol, if not nil, sets the ALPN protocol that a server will
657	// return.
658	ALPNProtocol *string
659
660	// AcceptAnySession causes the server to resume sessions regardless of
661	// the version associated with the session or cipher suite. It also
662	// causes the server to look in both TLS 1.2 and 1.3 extensions to
663	// process a ticket.
664	AcceptAnySession bool
665
666	// SendBothTickets, if true, causes the client to send tickets in both
667	// TLS 1.2 and 1.3 extensions.
668	SendBothTickets bool
669
670	// FilterTicket, if not nil, causes the client to modify a session
671	// ticket before sending it in a resume handshake.
672	FilterTicket func([]byte) ([]byte, error)
673
674	// TicketSessionIDLength, if non-zero, is the length of the session ID
675	// to send with a ticket resumption offer.
676	TicketSessionIDLength int
677
678	// EmptyTicketSessionID, if true, causes the client to send an empty
679	// session ID with a ticket resumption offer. For simplicity, this will
680	// also cause the client to interpret a ServerHello with empty session
681	// ID as a resumption. (A client which sends empty session ID is
682	// normally expected to look ahead for ChangeCipherSpec.)
683	EmptyTicketSessionID bool
684
685	// ExpectNoTLS12Session, if true, causes the server to fail the
686	// connection if either a session ID or TLS 1.2 ticket is offered.
687	ExpectNoTLS12Session bool
688
689	// ExpectNoTLS13PSK, if true, causes the server to fail the connection
690	// if a TLS 1.3 PSK is offered.
691	ExpectNoTLS13PSK bool
692
693	// RequireExtendedMasterSecret, if true, requires that the peer support
694	// the extended master secret option.
695	RequireExtendedMasterSecret bool
696
697	// NoExtendedMasterSecret causes the client and server to behave as if
698	// they didn't support an extended master secret in the initial
699	// handshake.
700	NoExtendedMasterSecret bool
701
702	// NoExtendedMasterSecretOnRenegotiation causes the client and server to
703	// behave as if they didn't support an extended master secret in
704	// renegotiation handshakes.
705	NoExtendedMasterSecretOnRenegotiation bool
706
707	// EmptyRenegotiationInfo causes the renegotiation extension to be
708	// empty in a renegotiation handshake.
709	EmptyRenegotiationInfo bool
710
711	// BadRenegotiationInfo causes the renegotiation extension value in a
712	// renegotiation handshake to be incorrect.
713	BadRenegotiationInfo bool
714
715	// NoRenegotiationInfo disables renegotiation info support in all
716	// handshakes.
717	NoRenegotiationInfo bool
718
719	// NoRenegotiationInfoInInitial disables renegotiation info support in
720	// the initial handshake.
721	NoRenegotiationInfoInInitial bool
722
723	// NoRenegotiationInfoAfterInitial disables renegotiation info support
724	// in renegotiation handshakes.
725	NoRenegotiationInfoAfterInitial bool
726
727	// RequireRenegotiationInfo, if true, causes the client to return an
728	// error if the server doesn't reply with the renegotiation extension.
729	RequireRenegotiationInfo bool
730
731	// SequenceNumberMapping, if non-nil, is the mapping function to apply
732	// to the sequence number of outgoing packets. For both TLS and DTLS,
733	// the two most-significant bytes in the resulting sequence number are
734	// ignored so that the DTLS epoch cannot be changed.
735	SequenceNumberMapping func(uint64) uint64
736
737	// RSAEphemeralKey, if true, causes the server to send a
738	// ServerKeyExchange message containing an ephemeral key (as in
739	// RSA_EXPORT) in the plain RSA key exchange.
740	RSAEphemeralKey bool
741
742	// SRTPMasterKeyIdentifer, if not empty, is the SRTP MKI value that the
743	// client offers when negotiating SRTP. MKI support is still missing so
744	// the peer must still send none.
745	SRTPMasterKeyIdentifer string
746
747	// SendSRTPProtectionProfile, if non-zero, is the SRTP profile that the
748	// server sends in the ServerHello instead of the negotiated one.
749	SendSRTPProtectionProfile uint16
750
751	// NoSignatureAlgorithms, if true, causes the client to omit the
752	// signature and hashes extension.
753	//
754	// For a server, it will cause an empty list to be sent in the
755	// CertificateRequest message. None the less, the configured set will
756	// still be enforced.
757	NoSignatureAlgorithms bool
758
759	// NoSupportedCurves, if true, causes the client to omit the
760	// supported_curves extension.
761	NoSupportedCurves bool
762
763	// RequireSameRenegoClientVersion, if true, causes the server
764	// to require that all ClientHellos match in offered version
765	// across a renego.
766	RequireSameRenegoClientVersion bool
767
768	// ExpectInitialRecordVersion, if non-zero, is the expected value of
769	// record-layer version field before the protocol version is determined.
770	ExpectInitialRecordVersion uint16
771
772	// SendRecordVersion, if non-zero, is the value to send as the
773	// record-layer version.
774	SendRecordVersion uint16
775
776	// SendInitialRecordVersion, if non-zero, is the value to send as the
777	// record-layer version before the protocol version is determined.
778	SendInitialRecordVersion uint16
779
780	// MaxPacketLength, if non-zero, is the maximum acceptable size for a
781	// packet.
782	MaxPacketLength int
783
784	// SendCipherSuite, if non-zero, is the cipher suite value that the
785	// server will send in the ServerHello. This does not affect the cipher
786	// the server believes it has actually negotiated.
787	SendCipherSuite uint16
788
789	// SendCipherSuites, if not nil, is the cipher suite list that the
790	// client will send in the ClientHello. This does not affect the cipher
791	// the client believes it has actually offered.
792	SendCipherSuites []uint16
793
794	// AppDataBeforeHandshake, if not nil, causes application data to be
795	// sent immediately before the first handshake message.
796	AppDataBeforeHandshake []byte
797
798	// AppDataAfterChangeCipherSpec, if not nil, causes application data to
799	// be sent immediately after ChangeCipherSpec.
800	AppDataAfterChangeCipherSpec []byte
801
802	// AlertAfterChangeCipherSpec, if non-zero, causes an alert to be sent
803	// immediately after ChangeCipherSpec.
804	AlertAfterChangeCipherSpec alert
805
806	// TimeoutSchedule is the schedule of packet drops and simulated
807	// timeouts for before each handshake leg from the peer.
808	TimeoutSchedule []time.Duration
809
810	// PacketAdaptor is the packetAdaptor to use to simulate timeouts.
811	PacketAdaptor *packetAdaptor
812
813	// ReorderHandshakeFragments, if true, causes handshake fragments in
814	// DTLS to overlap and be sent in the wrong order. It also causes
815	// pre-CCS flights to be sent twice. (Post-CCS flights consist of
816	// Finished and will trigger a spurious retransmit.)
817	ReorderHandshakeFragments bool
818
819	// ReverseHandshakeFragments, if true, causes handshake fragments in
820	// DTLS to be reversed within a flight.
821	ReverseHandshakeFragments bool
822
823	// MixCompleteMessageWithFragments, if true, causes handshake
824	// messages in DTLS to redundantly both fragment the message
825	// and include a copy of the full one.
826	MixCompleteMessageWithFragments bool
827
828	// SendInvalidRecordType, if true, causes a record with an invalid
829	// content type to be sent immediately following the handshake.
830	SendInvalidRecordType bool
831
832	// SendWrongMessageType, if non-zero, causes messages of the specified
833	// type to be sent with the wrong value.
834	SendWrongMessageType byte
835
836	// SendTrailingMessageData, if non-zero, causes messages of the
837	// specified type to be sent with trailing data.
838	SendTrailingMessageData byte
839
840	// FragmentMessageTypeMismatch, if true, causes all non-initial
841	// handshake fragments in DTLS to have the wrong message type.
842	FragmentMessageTypeMismatch bool
843
844	// FragmentMessageLengthMismatch, if true, causes all non-initial
845	// handshake fragments in DTLS to have the wrong message length.
846	FragmentMessageLengthMismatch bool
847
848	// SplitFragments, if non-zero, causes the handshake fragments in DTLS
849	// to be split across two records. The value of |SplitFragments| is the
850	// number of bytes in the first fragment.
851	SplitFragments int
852
853	// SendEmptyFragments, if true, causes handshakes to include empty
854	// fragments in DTLS.
855	SendEmptyFragments bool
856
857	// SendSplitAlert, if true, causes an alert to be sent with the header
858	// and record body split across multiple packets. The peer should
859	// discard these packets rather than process it.
860	SendSplitAlert bool
861
862	// FailIfResumeOnRenego, if true, causes renegotiations to fail if the
863	// client offers a resumption or the server accepts one.
864	FailIfResumeOnRenego bool
865
866	// IgnorePeerCipherPreferences, if true, causes the peer's cipher
867	// preferences to be ignored.
868	IgnorePeerCipherPreferences bool
869
870	// IgnorePeerSignatureAlgorithmPreferences, if true, causes the peer's
871	// signature algorithm preferences to be ignored.
872	IgnorePeerSignatureAlgorithmPreferences bool
873
874	// IgnorePeerCurvePreferences, if true, causes the peer's curve
875	// preferences to be ignored.
876	IgnorePeerCurvePreferences bool
877
878	// BadFinished, if true, causes the Finished hash to be broken.
879	BadFinished bool
880
881	// DHGroupPrime, if not nil, is used to define the (finite field)
882	// Diffie-Hellman group. The generator used is always two.
883	DHGroupPrime *big.Int
884
885	// PackHandshakeFragments, if true, causes handshake fragments in DTLS
886	// to be packed into individual handshake records, up to the specified
887	// record size.
888	PackHandshakeFragments int
889
890	// PackHandshakeRecords, if true, causes handshake records in DTLS to be
891	// packed into individual packets, up to the specified packet size.
892	PackHandshakeRecords int
893
894	// PackHandshakeFlight, if true, causes each handshake flight in TLS to
895	// be packed into records, up to the largest size record available.
896	PackHandshakeFlight bool
897
898	// AdvertiseAllConfiguredCiphers, if true, causes the client to
899	// advertise all configured cipher suite values.
900	AdvertiseAllConfiguredCiphers bool
901
902	// EmptyCertificateList, if true, causes the server to send an empty
903	// certificate list in the Certificate message.
904	EmptyCertificateList bool
905
906	// ExpectNewTicket, if true, causes the client to abort if it does not
907	// receive a new ticket.
908	ExpectNewTicket bool
909
910	// RequireClientHelloSize, if not zero, is the required length in bytes
911	// of the ClientHello /record/. This is checked by the server.
912	RequireClientHelloSize int
913
914	// CustomExtension, if not empty, contains the contents of an extension
915	// that will be added to client/server hellos.
916	CustomExtension string
917
918	// CustomUnencryptedExtension, if not empty, contains the contents of
919	// an extension that will be added to ServerHello in TLS 1.3.
920	CustomUnencryptedExtension string
921
922	// ExpectedCustomExtension, if not nil, contains the expected contents
923	// of a custom extension.
924	ExpectedCustomExtension *string
925
926	// CustomTicketExtension, if not empty, contains the contents of an
927	// extension what will be added to NewSessionTicket in TLS 1.3.
928	CustomTicketExtension string
929
930	// CustomTicketExtension, if not empty, contains the contents of an
931	// extension what will be added to HelloRetryRequest in TLS 1.3.
932	CustomHelloRetryRequestExtension string
933
934	// NoCloseNotify, if true, causes the close_notify alert to be skipped
935	// on connection shutdown.
936	NoCloseNotify bool
937
938	// SendAlertOnShutdown, if non-zero, is the alert to send instead of
939	// close_notify on shutdown.
940	SendAlertOnShutdown alert
941
942	// ExpectCloseNotify, if true, requires a close_notify from the peer on
943	// shutdown. Records from the peer received after close_notify is sent
944	// are not discard.
945	ExpectCloseNotify bool
946
947	// SendLargeRecords, if true, allows outgoing records to be sent
948	// arbitrarily large.
949	SendLargeRecords bool
950
951	// NegotiateALPNAndNPN, if true, causes the server to negotiate both
952	// ALPN and NPN in the same connetion.
953	NegotiateALPNAndNPN bool
954
955	// SendALPN, if non-empty, causes the server to send the specified
956	// string in the ALPN extension regardless of the content or presence of
957	// the client offer.
958	SendALPN string
959
960	// SendUnencryptedALPN, if non-empty, causes the server to send the
961	// specified string in a ServerHello ALPN extension in TLS 1.3.
962	SendUnencryptedALPN string
963
964	// SendEmptySessionTicket, if true, causes the server to send an empty
965	// session ticket.
966	SendEmptySessionTicket bool
967
968	// SendPSKKeyExchangeModes, if present, determines the PSK key exchange modes
969	// to send.
970	SendPSKKeyExchangeModes []byte
971
972	// ExpectNoNewSessionTicket, if present, means that the client will fail upon
973	// receipt of a NewSessionTicket message.
974	ExpectNoNewSessionTicket bool
975
976	// DuplicateTicketEarlyDataInfo causes an extra empty extension of
977	// ticket_early_data_info to be sent in NewSessionTicket.
978	DuplicateTicketEarlyDataInfo bool
979
980	// ExpectTicketEarlyDataInfo, if true, means that the client will fail upon
981	// absence of the ticket_early_data_info extension.
982	ExpectTicketEarlyDataInfo bool
983
984	// ExpectTicketAge, if non-zero, is the expected age of the ticket that the
985	// server receives from the client.
986	ExpectTicketAge time.Duration
987
988	// SendTicketAge, if non-zero, is the ticket age to be sent by the
989	// client.
990	SendTicketAge time.Duration
991
992	// FailIfSessionOffered, if true, causes the server to fail any
993	// connections where the client offers a non-empty session ID or session
994	// ticket.
995	FailIfSessionOffered bool
996
997	// SendHelloRequestBeforeEveryAppDataRecord, if true, causes a
998	// HelloRequest handshake message to be sent before each application
999	// data record. This only makes sense for a server.
1000	SendHelloRequestBeforeEveryAppDataRecord bool
1001
1002	// SendHelloRequestBeforeEveryHandshakeMessage, if true, causes a
1003	// HelloRequest handshake message to be sent before each handshake
1004	// message. This only makes sense for a server.
1005	SendHelloRequestBeforeEveryHandshakeMessage bool
1006
1007	// RequireDHPublicValueLen causes a fatal error if the length (in
1008	// bytes) of the server's Diffie-Hellman public value is not equal to
1009	// this.
1010	RequireDHPublicValueLen int
1011
1012	// BadChangeCipherSpec, if not nil, is the body to be sent in
1013	// ChangeCipherSpec records instead of {1}.
1014	BadChangeCipherSpec []byte
1015
1016	// BadHelloRequest, if not nil, is what to send instead of a
1017	// HelloRequest.
1018	BadHelloRequest []byte
1019
1020	// RequireSessionTickets, if true, causes the client to require new
1021	// sessions use session tickets instead of session IDs.
1022	RequireSessionTickets bool
1023
1024	// NullAllCiphers, if true, causes every cipher to behave like the null
1025	// cipher.
1026	NullAllCiphers bool
1027
1028	// SendSCTListOnResume, if not nil, causes the server to send the
1029	// supplied SCT list in resumption handshakes.
1030	SendSCTListOnResume []byte
1031
1032	// SendOCSPResponseOnResume, if not nil, causes the server to advertise
1033	// OCSP stapling in resumption handshakes and, if applicable, send the
1034	// supplied stapled response.
1035	SendOCSPResponseOnResume []byte
1036
1037	// SendExtensionOnCertificate, if not nil, causes the runner to send the
1038	// supplied bytes in the extensions on the Certificate message.
1039	SendExtensionOnCertificate []byte
1040
1041	// SendOCSPOnIntermediates, if not nil, causes the server to send the
1042	// supplied OCSP on intermediate certificates in the Certificate message.
1043	SendOCSPOnIntermediates []byte
1044
1045	// SendSCTOnIntermediates, if not nil, causes the server to send the
1046	// supplied SCT on intermediate certificates in the Certificate message.
1047	SendSCTOnIntermediates []byte
1048
1049	// SendDuplicateCertExtensions, if true, causes the server to send an extra
1050	// copy of the OCSP/SCT extensions in the Certificate message.
1051	SendDuplicateCertExtensions bool
1052
1053	// ExpectNoExtensionsOnIntermediate, if true, causes the client to
1054	// reject extensions on intermediate certificates.
1055	ExpectNoExtensionsOnIntermediate bool
1056
1057	// RecordPadding is the number of bytes of padding to add to each
1058	// encrypted record in TLS 1.3.
1059	RecordPadding int
1060
1061	// OmitRecordContents, if true, causes encrypted records in TLS 1.3 to
1062	// be missing their body and content type. Padding, if configured, is
1063	// still added.
1064	OmitRecordContents bool
1065
1066	// OuterRecordType, if non-zero, is the outer record type to use instead
1067	// of application data.
1068	OuterRecordType recordType
1069
1070	// SendSignatureAlgorithm, if non-zero, causes all signatures to be sent
1071	// with the given signature algorithm rather than the one negotiated.
1072	SendSignatureAlgorithm signatureAlgorithm
1073
1074	// SkipECDSACurveCheck, if true, causes all ECDSA curve checks to be
1075	// skipped.
1076	SkipECDSACurveCheck bool
1077
1078	// IgnoreSignatureVersionChecks, if true, causes all signature
1079	// algorithms to be enabled at all TLS versions.
1080	IgnoreSignatureVersionChecks bool
1081
1082	// NegotiateRenegotiationInfoAtAllVersions, if true, causes
1083	// Renegotiation Info to be negotiated at all versions.
1084	NegotiateRenegotiationInfoAtAllVersions bool
1085
1086	// NegotiateNPNAtAllVersions, if true, causes NPN to be negotiated at
1087	// all versions.
1088	NegotiateNPNAtAllVersions bool
1089
1090	// NegotiateEMSAtAllVersions, if true, causes EMS to be negotiated at
1091	// all versions.
1092	NegotiateEMSAtAllVersions bool
1093
1094	// AdvertiseTicketExtension, if true, causes the ticket extension to be
1095	// advertised in server extensions
1096	AdvertiseTicketExtension bool
1097
1098	// NegotiatePSKResumption, if true, causes the server to attempt pure PSK
1099	// resumption.
1100	NegotiatePSKResumption bool
1101
1102	// AlwaysSelectPSKIdentity, if true, causes the server in TLS 1.3 to
1103	// always acknowledge a session, regardless of one was offered.
1104	AlwaysSelectPSKIdentity bool
1105
1106	// SelectPSKIdentityOnResume, if non-zero, causes the server to select
1107	// the specified PSK identity index rather than the actual value.
1108	SelectPSKIdentityOnResume uint16
1109
1110	// ExtraPSKIdentity, if true, causes the client to send an extra PSK
1111	// identity.
1112	ExtraPSKIdentity bool
1113
1114	// MissingKeyShare, if true, causes the TLS 1.3 implementation to skip
1115	// sending a key_share extension and use the zero ECDHE secret
1116	// instead.
1117	MissingKeyShare bool
1118
1119	// SecondClientHelloMissingKeyShare, if true, causes the second TLS 1.3
1120	// ClientHello to skip sending a key_share extension and use the zero
1121	// ECDHE secret instead.
1122	SecondClientHelloMissingKeyShare bool
1123
1124	// MisinterpretHelloRetryRequestCurve, if non-zero, causes the TLS 1.3
1125	// client to pretend the server requested a HelloRetryRequest with the
1126	// given curve rather than the actual one.
1127	MisinterpretHelloRetryRequestCurve CurveID
1128
1129	// DuplicateKeyShares, if true, causes the TLS 1.3 client to send two
1130	// copies of each KeyShareEntry.
1131	DuplicateKeyShares bool
1132
1133	// SendEarlyAlert, if true, sends a fatal alert after the ClientHello.
1134	SendEarlyAlert bool
1135
1136	// SendFakeEarlyDataLength, if non-zero, is the amount of early data to
1137	// send after the ClientHello.
1138	SendFakeEarlyDataLength int
1139
1140	// SendStrayEarlyHandshake, if non-zero, causes the client to send a stray
1141	// handshake record before sending end of early data.
1142	SendStrayEarlyHandshake bool
1143
1144	// OmitEarlyDataExtension, if true, causes the early data extension to
1145	// be omitted in the ClientHello.
1146	OmitEarlyDataExtension bool
1147
1148	// SendEarlyDataOnSecondClientHello, if true, causes the TLS 1.3 client to
1149	// send early data after the second ClientHello.
1150	SendEarlyDataOnSecondClientHello bool
1151
1152	// InterleaveEarlyData, if true, causes the TLS 1.3 client to send early
1153	// data interleaved with the second ClientHello and the client Finished.
1154	InterleaveEarlyData bool
1155
1156	// SendEarlyData causes a TLS 1.3 client to send the provided data
1157	// in application data records immediately after the ClientHello,
1158	// provided that the client offers a TLS 1.3 session. It will do this
1159	// whether or not the server advertised early data for the ticket.
1160	SendEarlyData [][]byte
1161
1162	// ExpectEarlyDataAccepted causes a TLS 1.3 client to check that early data
1163	// was accepted by the server.
1164	ExpectEarlyDataAccepted bool
1165
1166	// AlwaysAcceptEarlyData causes a TLS 1.3 server to always accept early data
1167	// regardless of ALPN mismatch.
1168	AlwaysAcceptEarlyData bool
1169
1170	// AlwaysRejectEarlyData causes a TLS 1.3 server to always reject early data.
1171	AlwaysRejectEarlyData bool
1172
1173	// SendEarlyDataExtension, if true, causes a TLS 1.3 server to send the
1174	// early_data extension in EncryptedExtensions, independent of whether
1175	// it was accepted.
1176	SendEarlyDataExtension bool
1177
1178	// ExpectEarlyData causes a TLS 1.3 server to read application
1179	// data after the ClientHello (assuming the server is able to
1180	// derive the key under which the data is encrypted) before it
1181	// sends a ServerHello. It checks that the application data it
1182	// reads matches what is provided in ExpectEarlyData and errors if
1183	// the number of records or their content do not match.
1184	ExpectEarlyData [][]byte
1185
1186	// SendHalfRTTData causes a TLS 1.3 server to send the provided
1187	// data in application data records before reading the client's
1188	// Finished message.
1189	SendHalfRTTData [][]byte
1190
1191	// ExpectHalfRTTData causes a TLS 1.3 client, if 0-RTT was accepted, to
1192	// read application data after reading the server's Finished message and
1193	// before sending any subsequent handshake messages. It checks that the
1194	// application data it reads matches what is provided in
1195	// ExpectHalfRTTData and errors if the number of records or their
1196	// content do not match.
1197	ExpectHalfRTTData [][]byte
1198
1199	// EmptyEncryptedExtensions, if true, causes the TLS 1.3 server to
1200	// emit an empty EncryptedExtensions block.
1201	EmptyEncryptedExtensions bool
1202
1203	// EncryptedExtensionsWithKeyShare, if true, causes the TLS 1.3 server to
1204	// include the KeyShare extension in the EncryptedExtensions block.
1205	EncryptedExtensionsWithKeyShare bool
1206
1207	// AlwaysSendHelloRetryRequest, if true, causes a HelloRetryRequest to
1208	// be sent by the server, even if empty.
1209	AlwaysSendHelloRetryRequest bool
1210
1211	// SecondHelloRetryRequest, if true, causes the TLS 1.3 server to send
1212	// two HelloRetryRequests instead of one.
1213	SecondHelloRetryRequest bool
1214
1215	// SendHelloRetryRequestCurve, if non-zero, causes the server to send
1216	// the specified curve in a HelloRetryRequest.
1217	SendHelloRetryRequestCurve CurveID
1218
1219	// SendHelloRetryRequestCookie, if not nil, contains a cookie to be
1220	// sent by the server in HelloRetryRequest.
1221	SendHelloRetryRequestCookie []byte
1222
1223	// DuplicateHelloRetryRequestExtensions, if true, causes all
1224	// HelloRetryRequest extensions to be sent twice.
1225	DuplicateHelloRetryRequestExtensions bool
1226
1227	// SendServerHelloVersion, if non-zero, causes the server to send the
1228	// specified value in ServerHello version field.
1229	SendServerHelloVersion uint16
1230
1231	// SkipHelloRetryRequest, if true, causes the TLS 1.3 server to not send
1232	// HelloRetryRequest.
1233	SkipHelloRetryRequest bool
1234
1235	// PackHelloRequestWithFinished, if true, causes the TLS server to send
1236	// HelloRequest in the same record as Finished.
1237	PackHelloRequestWithFinished bool
1238
1239	// ExpectMissingKeyShare, if true, causes the TLS server to fail the
1240	// connection if the selected curve appears in the client's initial
1241	// ClientHello. That is, it requires that a HelloRetryRequest be sent.
1242	ExpectMissingKeyShare bool
1243
1244	// SendExtraFinished, if true, causes an extra Finished message to be
1245	// sent.
1246	SendExtraFinished bool
1247
1248	// SendRequestContext, if not empty, is the request context to send in
1249	// a TLS 1.3 CertificateRequest.
1250	SendRequestContext []byte
1251
1252	// SendSNIWarningAlert, if true, causes the server to send an
1253	// unrecognized_name alert before the ServerHello.
1254	SendSNIWarningAlert bool
1255
1256	// SendCompressionMethods, if not nil, is the compression method list to
1257	// send in the ClientHello.
1258	SendCompressionMethods []byte
1259
1260	// AlwaysSendPreSharedKeyIdentityHint, if true, causes the server to
1261	// always send a ServerKeyExchange for PSK ciphers, even if the identity
1262	// hint is empty.
1263	AlwaysSendPreSharedKeyIdentityHint bool
1264
1265	// TrailingKeyShareData, if true, causes the client key share list to
1266	// include a trailing byte.
1267	TrailingKeyShareData bool
1268
1269	// InvalidChannelIDSignature, if true, causes the client to generate an
1270	// invalid Channel ID signature.
1271	InvalidChannelIDSignature bool
1272
1273	// ExpectGREASE, if true, causes messages without GREASE values to be
1274	// rejected. See draft-davidben-tls-grease-01.
1275	ExpectGREASE bool
1276
1277	// SendShortPSKBinder, if true, causes the client to send a PSK binder
1278	// that is one byte shorter than it should be.
1279	SendShortPSKBinder bool
1280
1281	// SendInvalidPSKBinder, if true, causes the client to send an invalid
1282	// PSK binder.
1283	SendInvalidPSKBinder bool
1284
1285	// SendNoPSKBinder, if true, causes the client to send no PSK binders.
1286	SendNoPSKBinder bool
1287
1288	// SendExtraPSKBinder, if true, causes the client to send an extra PSK
1289	// binder.
1290	SendExtraPSKBinder bool
1291
1292	// PSKBinderFirst, if true, causes the client to send the PSK Binder
1293	// extension as the first extension instead of the last extension.
1294	PSKBinderFirst bool
1295
1296	// NoOCSPStapling, if true, causes the client to not request OCSP
1297	// stapling.
1298	NoOCSPStapling bool
1299
1300	// NoSignedCertificateTimestamps, if true, causes the client to not
1301	// request signed certificate timestamps.
1302	NoSignedCertificateTimestamps bool
1303
1304	// SendSupportedPointFormats, if not nil, is the list of supported point
1305	// formats to send in ClientHello or ServerHello. If set to a non-nil
1306	// empty slice, no extension will be sent.
1307	SendSupportedPointFormats []byte
1308
1309	// MaxReceivePlaintext, if non-zero, is the maximum plaintext record
1310	// length accepted from the peer.
1311	MaxReceivePlaintext int
1312
1313	// SendTicketLifetime, if non-zero, is the ticket lifetime to send in
1314	// NewSessionTicket messages.
1315	SendTicketLifetime time.Duration
1316
1317	// SendServerNameAck, if true, causes the server to acknowledge the SNI
1318	// extension.
1319	SendServerNameAck bool
1320
1321	// ExpectCertificateReqNames, if not nil, contains the list of X.509
1322	// names that must be sent in a CertificateRequest from the server.
1323	ExpectCertificateReqNames [][]byte
1324
1325	// RenegotiationCertificate, if not nil, is the certificate to use on
1326	// renegotiation handshakes.
1327	RenegotiationCertificate *Certificate
1328}
1329
1330func (c *Config) serverInit() {
1331	if c.SessionTicketsDisabled {
1332		return
1333	}
1334
1335	// If the key has already been set then we have nothing to do.
1336	for _, b := range c.SessionTicketKey {
1337		if b != 0 {
1338			return
1339		}
1340	}
1341
1342	if _, err := io.ReadFull(c.rand(), c.SessionTicketKey[:]); err != nil {
1343		c.SessionTicketsDisabled = true
1344	}
1345}
1346
1347func (c *Config) rand() io.Reader {
1348	r := c.Rand
1349	if r == nil {
1350		return rand.Reader
1351	}
1352	return r
1353}
1354
1355func (c *Config) time() time.Time {
1356	t := c.Time
1357	if t == nil {
1358		t = time.Now
1359	}
1360	return t()
1361}
1362
1363func (c *Config) cipherSuites() []uint16 {
1364	s := c.CipherSuites
1365	if s == nil {
1366		s = defaultCipherSuites()
1367	}
1368	return s
1369}
1370
1371func (c *Config) minVersion(isDTLS bool) uint16 {
1372	ret := uint16(minVersion)
1373	if c != nil && c.MinVersion != 0 {
1374		ret = c.MinVersion
1375	}
1376	if isDTLS {
1377		// The lowest version of DTLS is 1.0. There is no DSSL 3.0.
1378		if ret < VersionTLS10 {
1379			return VersionTLS10
1380		}
1381		// There is no such thing as DTLS 1.1.
1382		if ret == VersionTLS11 {
1383			return VersionTLS12
1384		}
1385	}
1386	return ret
1387}
1388
1389func (c *Config) maxVersion(isDTLS bool) uint16 {
1390	ret := uint16(maxVersion)
1391	if c != nil && c.MaxVersion != 0 {
1392		ret = c.MaxVersion
1393	}
1394	if isDTLS {
1395		// We only implement up to DTLS 1.2.
1396		if ret > VersionTLS12 {
1397			return VersionTLS12
1398		}
1399		// There is no such thing as DTLS 1.1.
1400		if ret == VersionTLS11 {
1401			return VersionTLS10
1402		}
1403	}
1404	return ret
1405}
1406
1407var defaultCurvePreferences = []CurveID{CurveX25519, CurveP256, CurveP384, CurveP521}
1408
1409func (c *Config) curvePreferences() []CurveID {
1410	if c == nil || len(c.CurvePreferences) == 0 {
1411		return defaultCurvePreferences
1412	}
1413	return c.CurvePreferences
1414}
1415
1416func (c *Config) defaultCurves() map[CurveID]bool {
1417	defaultCurves := make(map[CurveID]bool)
1418	curves := c.DefaultCurves
1419	if c == nil || c.DefaultCurves == nil {
1420		curves = c.curvePreferences()
1421	}
1422	for _, curveID := range curves {
1423		defaultCurves[curveID] = true
1424	}
1425	return defaultCurves
1426}
1427
1428// isSupportedVersion returns true if the specified protocol version is
1429// acceptable.
1430func (c *Config) isSupportedVersion(vers uint16, isDTLS bool) bool {
1431	return c.minVersion(isDTLS) <= vers && vers <= c.maxVersion(isDTLS)
1432}
1433
1434// getCertificateForName returns the best certificate for the given name,
1435// defaulting to the first element of c.Certificates if there are no good
1436// options.
1437func (c *Config) getCertificateForName(name string) *Certificate {
1438	if len(c.Certificates) == 1 || c.NameToCertificate == nil {
1439		// There's only one choice, so no point doing any work.
1440		return &c.Certificates[0]
1441	}
1442
1443	name = strings.ToLower(name)
1444	for len(name) > 0 && name[len(name)-1] == '.' {
1445		name = name[:len(name)-1]
1446	}
1447
1448	if cert, ok := c.NameToCertificate[name]; ok {
1449		return cert
1450	}
1451
1452	// try replacing labels in the name with wildcards until we get a
1453	// match.
1454	labels := strings.Split(name, ".")
1455	for i := range labels {
1456		labels[i] = "*"
1457		candidate := strings.Join(labels, ".")
1458		if cert, ok := c.NameToCertificate[candidate]; ok {
1459			return cert
1460		}
1461	}
1462
1463	// If nothing matches, return the first certificate.
1464	return &c.Certificates[0]
1465}
1466
1467func (c *Config) signSignatureAlgorithms() []signatureAlgorithm {
1468	if c != nil && c.SignSignatureAlgorithms != nil {
1469		return c.SignSignatureAlgorithms
1470	}
1471	return supportedSignatureAlgorithms
1472}
1473
1474func (c *Config) verifySignatureAlgorithms() []signatureAlgorithm {
1475	if c != nil && c.VerifySignatureAlgorithms != nil {
1476		return c.VerifySignatureAlgorithms
1477	}
1478	return supportedSignatureAlgorithms
1479}
1480
1481// BuildNameToCertificate parses c.Certificates and builds c.NameToCertificate
1482// from the CommonName and SubjectAlternateName fields of each of the leaf
1483// certificates.
1484func (c *Config) BuildNameToCertificate() {
1485	c.NameToCertificate = make(map[string]*Certificate)
1486	for i := range c.Certificates {
1487		cert := &c.Certificates[i]
1488		x509Cert, err := x509.ParseCertificate(cert.Certificate[0])
1489		if err != nil {
1490			continue
1491		}
1492		if len(x509Cert.Subject.CommonName) > 0 {
1493			c.NameToCertificate[x509Cert.Subject.CommonName] = cert
1494		}
1495		for _, san := range x509Cert.DNSNames {
1496			c.NameToCertificate[san] = cert
1497		}
1498	}
1499}
1500
1501// A Certificate is a chain of one or more certificates, leaf first.
1502type Certificate struct {
1503	Certificate [][]byte
1504	PrivateKey  crypto.PrivateKey // supported types: *rsa.PrivateKey, *ecdsa.PrivateKey
1505	// OCSPStaple contains an optional OCSP response which will be served
1506	// to clients that request it.
1507	OCSPStaple []byte
1508	// SignedCertificateTimestampList contains an optional encoded
1509	// SignedCertificateTimestampList structure which will be
1510	// served to clients that request it.
1511	SignedCertificateTimestampList []byte
1512	// Leaf is the parsed form of the leaf certificate, which may be
1513	// initialized using x509.ParseCertificate to reduce per-handshake
1514	// processing for TLS clients doing client authentication. If nil, the
1515	// leaf certificate will be parsed as needed.
1516	Leaf *x509.Certificate
1517}
1518
1519// A TLS record.
1520type record struct {
1521	contentType  recordType
1522	major, minor uint8
1523	payload      []byte
1524}
1525
1526type handshakeMessage interface {
1527	marshal() []byte
1528	unmarshal([]byte) bool
1529}
1530
1531// lruSessionCache is a client or server session cache implementation
1532// that uses an LRU caching strategy.
1533type lruSessionCache struct {
1534	sync.Mutex
1535
1536	m        map[string]*list.Element
1537	q        *list.List
1538	capacity int
1539}
1540
1541type lruSessionCacheEntry struct {
1542	sessionKey string
1543	state      interface{}
1544}
1545
1546// Put adds the provided (sessionKey, cs) pair to the cache.
1547func (c *lruSessionCache) Put(sessionKey string, cs interface{}) {
1548	c.Lock()
1549	defer c.Unlock()
1550
1551	if elem, ok := c.m[sessionKey]; ok {
1552		entry := elem.Value.(*lruSessionCacheEntry)
1553		entry.state = cs
1554		c.q.MoveToFront(elem)
1555		return
1556	}
1557
1558	if c.q.Len() < c.capacity {
1559		entry := &lruSessionCacheEntry{sessionKey, cs}
1560		c.m[sessionKey] = c.q.PushFront(entry)
1561		return
1562	}
1563
1564	elem := c.q.Back()
1565	entry := elem.Value.(*lruSessionCacheEntry)
1566	delete(c.m, entry.sessionKey)
1567	entry.sessionKey = sessionKey
1568	entry.state = cs
1569	c.q.MoveToFront(elem)
1570	c.m[sessionKey] = elem
1571}
1572
1573// Get returns the value associated with a given key. It returns (nil,
1574// false) if no value is found.
1575func (c *lruSessionCache) Get(sessionKey string) (interface{}, bool) {
1576	c.Lock()
1577	defer c.Unlock()
1578
1579	if elem, ok := c.m[sessionKey]; ok {
1580		c.q.MoveToFront(elem)
1581		return elem.Value.(*lruSessionCacheEntry).state, true
1582	}
1583	return nil, false
1584}
1585
1586// lruClientSessionCache is a ClientSessionCache implementation that
1587// uses an LRU caching strategy.
1588type lruClientSessionCache struct {
1589	lruSessionCache
1590}
1591
1592func (c *lruClientSessionCache) Put(sessionKey string, cs *ClientSessionState) {
1593	c.lruSessionCache.Put(sessionKey, cs)
1594}
1595
1596func (c *lruClientSessionCache) Get(sessionKey string) (*ClientSessionState, bool) {
1597	cs, ok := c.lruSessionCache.Get(sessionKey)
1598	if !ok {
1599		return nil, false
1600	}
1601	return cs.(*ClientSessionState), true
1602}
1603
1604// lruServerSessionCache is a ServerSessionCache implementation that
1605// uses an LRU caching strategy.
1606type lruServerSessionCache struct {
1607	lruSessionCache
1608}
1609
1610func (c *lruServerSessionCache) Put(sessionId string, session *sessionState) {
1611	c.lruSessionCache.Put(sessionId, session)
1612}
1613
1614func (c *lruServerSessionCache) Get(sessionId string) (*sessionState, bool) {
1615	cs, ok := c.lruSessionCache.Get(sessionId)
1616	if !ok {
1617		return nil, false
1618	}
1619	return cs.(*sessionState), true
1620}
1621
1622// NewLRUClientSessionCache returns a ClientSessionCache with the given
1623// capacity that uses an LRU strategy. If capacity is < 1, a default capacity
1624// is used instead.
1625func NewLRUClientSessionCache(capacity int) ClientSessionCache {
1626	const defaultSessionCacheCapacity = 64
1627
1628	if capacity < 1 {
1629		capacity = defaultSessionCacheCapacity
1630	}
1631	return &lruClientSessionCache{
1632		lruSessionCache{
1633			m:        make(map[string]*list.Element),
1634			q:        list.New(),
1635			capacity: capacity,
1636		},
1637	}
1638}
1639
1640// NewLRUServerSessionCache returns a ServerSessionCache with the given
1641// capacity that uses an LRU strategy. If capacity is < 1, a default capacity
1642// is used instead.
1643func NewLRUServerSessionCache(capacity int) ServerSessionCache {
1644	const defaultSessionCacheCapacity = 64
1645
1646	if capacity < 1 {
1647		capacity = defaultSessionCacheCapacity
1648	}
1649	return &lruServerSessionCache{
1650		lruSessionCache{
1651			m:        make(map[string]*list.Element),
1652			q:        list.New(),
1653			capacity: capacity,
1654		},
1655	}
1656}
1657
1658// TODO(jsing): Make these available to both crypto/x509 and crypto/tls.
1659type dsaSignature struct {
1660	R, S *big.Int
1661}
1662
1663type ecdsaSignature dsaSignature
1664
1665var emptyConfig Config
1666
1667func defaultConfig() *Config {
1668	return &emptyConfig
1669}
1670
1671var (
1672	once                   sync.Once
1673	varDefaultCipherSuites []uint16
1674)
1675
1676func defaultCipherSuites() []uint16 {
1677	once.Do(initDefaultCipherSuites)
1678	return varDefaultCipherSuites
1679}
1680
1681func initDefaultCipherSuites() {
1682	for _, suite := range cipherSuites {
1683		if suite.flags&suitePSK == 0 {
1684			varDefaultCipherSuites = append(varDefaultCipherSuites, suite.id)
1685		}
1686	}
1687}
1688
1689func unexpectedMessageError(wanted, got interface{}) error {
1690	return fmt.Errorf("tls: received unexpected handshake message of type %T when waiting for %T", got, wanted)
1691}
1692
1693func isSupportedSignatureAlgorithm(sigAlg signatureAlgorithm, sigAlgs []signatureAlgorithm) bool {
1694	for _, s := range sigAlgs {
1695		if s == sigAlg {
1696			return true
1697		}
1698	}
1699	return false
1700}
1701
1702var (
1703	// See draft-ietf-tls-tls13-16, section 6.3.1.2.
1704	downgradeTLS13 = []byte{0x44, 0x4f, 0x57, 0x4e, 0x47, 0x52, 0x44, 0x01}
1705	downgradeTLS12 = []byte{0x44, 0x4f, 0x57, 0x4e, 0x47, 0x52, 0x44, 0x00}
1706)
1707