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