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