Alternative TLS implementation in Go
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

763 lignes
21 KiB

  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. package tls
  5. import (
  6. "bytes"
  7. "crypto"
  8. "crypto/ecdsa"
  9. "crypto/rsa"
  10. "crypto/subtle"
  11. "crypto/x509"
  12. "errors"
  13. "fmt"
  14. "io"
  15. "net"
  16. "strconv"
  17. "strings"
  18. )
  19. type clientHandshakeState struct {
  20. c *Conn
  21. serverHello *serverHelloMsg
  22. hello *clientHelloMsg
  23. suite *cipherSuite
  24. finishedHash finishedHash
  25. masterSecret []byte
  26. session *ClientSessionState
  27. }
  28. // c.out.Mutex <= L; c.handshakeMutex <= L.
  29. func (c *Conn) clientHandshake() error {
  30. if c.config == nil {
  31. c.config = defaultConfig()
  32. }
  33. // This may be a renegotiation handshake, in which case some fields
  34. // need to be reset.
  35. c.didResume = false
  36. if len(c.config.ServerName) == 0 && !c.config.InsecureSkipVerify {
  37. return errors.New("tls: either ServerName or InsecureSkipVerify must be specified in the tls.Config")
  38. }
  39. nextProtosLength := 0
  40. for _, proto := range c.config.NextProtos {
  41. if l := len(proto); l == 0 || l > 255 {
  42. return errors.New("tls: invalid NextProtos value")
  43. } else {
  44. nextProtosLength += 1 + l
  45. }
  46. }
  47. if nextProtosLength > 0xffff {
  48. return errors.New("tls: NextProtos values too large")
  49. }
  50. hello := &clientHelloMsg{
  51. vers: c.config.maxVersion(),
  52. compressionMethods: []uint8{compressionNone},
  53. random: make([]byte, 32),
  54. ocspStapling: true,
  55. scts: true,
  56. serverName: hostnameInSNI(c.config.ServerName),
  57. supportedCurves: c.config.curvePreferences(),
  58. supportedPoints: []uint8{pointFormatUncompressed},
  59. nextProtoNeg: len(c.config.NextProtos) > 0,
  60. secureRenegotiationSupported: true,
  61. alpnProtocols: c.config.NextProtos,
  62. }
  63. if c.handshakes > 0 {
  64. hello.secureRenegotiation = c.clientFinished[:]
  65. }
  66. possibleCipherSuites := c.config.cipherSuites()
  67. hello.cipherSuites = make([]uint16, 0, len(possibleCipherSuites))
  68. NextCipherSuite:
  69. for _, suiteId := range possibleCipherSuites {
  70. for _, suite := range cipherSuites {
  71. if suite.id != suiteId {
  72. continue
  73. }
  74. // Don't advertise TLS 1.2-only cipher suites unless
  75. // we're attempting TLS 1.2.
  76. if hello.vers < VersionTLS12 && suite.flags&suiteTLS12 != 0 {
  77. continue
  78. }
  79. hello.cipherSuites = append(hello.cipherSuites, suiteId)
  80. continue NextCipherSuite
  81. }
  82. }
  83. _, err := io.ReadFull(c.config.rand(), hello.random)
  84. if err != nil {
  85. c.sendAlert(alertInternalError)
  86. return errors.New("tls: short read from Rand: " + err.Error())
  87. }
  88. if hello.vers >= VersionTLS12 {
  89. hello.signatureAndHashes = supportedSignatureAlgorithms
  90. }
  91. var session *ClientSessionState
  92. var cacheKey string
  93. sessionCache := c.config.ClientSessionCache
  94. if c.config.SessionTicketsDisabled {
  95. sessionCache = nil
  96. }
  97. if sessionCache != nil {
  98. hello.ticketSupported = true
  99. }
  100. // Session resumption is not allowed if renegotiating because
  101. // renegotiation is primarily used to allow a client to send a client
  102. // certificate, which would be skipped if session resumption occured.
  103. if sessionCache != nil && c.handshakes == 0 {
  104. // Try to resume a previously negotiated TLS session, if
  105. // available.
  106. cacheKey = clientSessionCacheKey(c.conn.RemoteAddr(), c.config)
  107. candidateSession, ok := sessionCache.Get(cacheKey)
  108. if ok {
  109. // Check that the ciphersuite/version used for the
  110. // previous session are still valid.
  111. cipherSuiteOk := false
  112. for _, id := range hello.cipherSuites {
  113. if id == candidateSession.cipherSuite {
  114. cipherSuiteOk = true
  115. break
  116. }
  117. }
  118. versOk := candidateSession.vers >= c.config.minVersion() &&
  119. candidateSession.vers <= c.config.maxVersion()
  120. if versOk && cipherSuiteOk {
  121. session = candidateSession
  122. }
  123. }
  124. }
  125. if session != nil {
  126. hello.sessionTicket = session.sessionTicket
  127. // A random session ID is used to detect when the
  128. // server accepted the ticket and is resuming a session
  129. // (see RFC 5077).
  130. hello.sessionId = make([]byte, 16)
  131. if _, err := io.ReadFull(c.config.rand(), hello.sessionId); err != nil {
  132. c.sendAlert(alertInternalError)
  133. return errors.New("tls: short read from Rand: " + err.Error())
  134. }
  135. }
  136. if _, err := c.writeRecord(recordTypeHandshake, hello.marshal()); err != nil {
  137. return err
  138. }
  139. msg, err := c.readHandshake()
  140. if err != nil {
  141. return err
  142. }
  143. serverHello, ok := msg.(*serverHelloMsg)
  144. if !ok {
  145. c.sendAlert(alertUnexpectedMessage)
  146. return unexpectedMessageError(serverHello, msg)
  147. }
  148. vers, ok := c.config.mutualVersion(serverHello.vers)
  149. if !ok || vers < VersionTLS10 {
  150. // TLS 1.0 is the minimum version supported as a client.
  151. c.sendAlert(alertProtocolVersion)
  152. return fmt.Errorf("tls: server selected unsupported protocol version %x", serverHello.vers)
  153. }
  154. c.vers = vers
  155. c.haveVers = true
  156. suite := mutualCipherSuite(hello.cipherSuites, serverHello.cipherSuite)
  157. if suite == nil {
  158. c.sendAlert(alertHandshakeFailure)
  159. return errors.New("tls: server chose an unconfigured cipher suite")
  160. }
  161. hs := &clientHandshakeState{
  162. c: c,
  163. serverHello: serverHello,
  164. hello: hello,
  165. suite: suite,
  166. finishedHash: newFinishedHash(c.vers, suite),
  167. session: session,
  168. }
  169. isResume, err := hs.processServerHello()
  170. if err != nil {
  171. return err
  172. }
  173. // No signatures of the handshake are needed in a resumption.
  174. // Otherwise, in a full handshake, if we don't have any certificates
  175. // configured then we will never send a CertificateVerify message and
  176. // thus no signatures are needed in that case either.
  177. if isResume || len(c.config.Certificates) == 0 {
  178. hs.finishedHash.discardHandshakeBuffer()
  179. }
  180. hs.finishedHash.Write(hs.hello.marshal())
  181. hs.finishedHash.Write(hs.serverHello.marshal())
  182. c.buffering = true
  183. if isResume {
  184. if err := hs.establishKeys(); err != nil {
  185. return err
  186. }
  187. if err := hs.readSessionTicket(); err != nil {
  188. return err
  189. }
  190. if err := hs.readFinished(c.serverFinished[:]); err != nil {
  191. return err
  192. }
  193. c.clientFinishedIsFirst = false
  194. if err := hs.sendFinished(c.clientFinished[:]); err != nil {
  195. return err
  196. }
  197. if _, err := c.flush(); err != nil {
  198. return err
  199. }
  200. } else {
  201. if err := hs.doFullHandshake(); err != nil {
  202. return err
  203. }
  204. if err := hs.establishKeys(); err != nil {
  205. return err
  206. }
  207. if err := hs.sendFinished(c.clientFinished[:]); err != nil {
  208. return err
  209. }
  210. if _, err := c.flush(); err != nil {
  211. return err
  212. }
  213. c.clientFinishedIsFirst = true
  214. if err := hs.readSessionTicket(); err != nil {
  215. return err
  216. }
  217. if err := hs.readFinished(c.serverFinished[:]); err != nil {
  218. return err
  219. }
  220. }
  221. if sessionCache != nil && hs.session != nil && session != hs.session {
  222. sessionCache.Put(cacheKey, hs.session)
  223. }
  224. c.didResume = isResume
  225. c.handshakeComplete = true
  226. c.cipherSuite = suite.id
  227. return nil
  228. }
  229. func (hs *clientHandshakeState) doFullHandshake() error {
  230. c := hs.c
  231. msg, err := c.readHandshake()
  232. if err != nil {
  233. return err
  234. }
  235. certMsg, ok := msg.(*certificateMsg)
  236. if !ok || len(certMsg.certificates) == 0 {
  237. c.sendAlert(alertUnexpectedMessage)
  238. return unexpectedMessageError(certMsg, msg)
  239. }
  240. hs.finishedHash.Write(certMsg.marshal())
  241. if c.handshakes == 0 {
  242. // If this is the first handshake on a connection, process and
  243. // (optionally) verify the server's certificates.
  244. certs := make([]*x509.Certificate, len(certMsg.certificates))
  245. for i, asn1Data := range certMsg.certificates {
  246. cert, err := x509.ParseCertificate(asn1Data)
  247. if err != nil {
  248. c.sendAlert(alertBadCertificate)
  249. return errors.New("tls: failed to parse certificate from server: " + err.Error())
  250. }
  251. certs[i] = cert
  252. }
  253. if !c.config.InsecureSkipVerify {
  254. opts := x509.VerifyOptions{
  255. Roots: c.config.RootCAs,
  256. CurrentTime: c.config.time(),
  257. DNSName: c.config.ServerName,
  258. Intermediates: x509.NewCertPool(),
  259. }
  260. for i, cert := range certs {
  261. if i == 0 {
  262. continue
  263. }
  264. opts.Intermediates.AddCert(cert)
  265. }
  266. c.verifiedChains, err = certs[0].Verify(opts)
  267. if err != nil {
  268. c.sendAlert(alertBadCertificate)
  269. return err
  270. }
  271. }
  272. switch certs[0].PublicKey.(type) {
  273. case *rsa.PublicKey, *ecdsa.PublicKey:
  274. break
  275. default:
  276. c.sendAlert(alertUnsupportedCertificate)
  277. return fmt.Errorf("tls: server's certificate contains an unsupported type of public key: %T", certs[0].PublicKey)
  278. }
  279. c.peerCertificates = certs
  280. } else {
  281. // This is a renegotiation handshake. We require that the
  282. // server's identity (i.e. leaf certificate) is unchanged and
  283. // thus any previous trust decision is still valid.
  284. //
  285. // See https://mitls.org/pages/attacks/3SHAKE for the
  286. // motivation behind this requirement.
  287. if !bytes.Equal(c.peerCertificates[0].Raw, certMsg.certificates[0]) {
  288. c.sendAlert(alertBadCertificate)
  289. return errors.New("tls: server's identity changed during renegotiation")
  290. }
  291. }
  292. if hs.serverHello.ocspStapling {
  293. msg, err = c.readHandshake()
  294. if err != nil {
  295. return err
  296. }
  297. cs, ok := msg.(*certificateStatusMsg)
  298. if !ok {
  299. c.sendAlert(alertUnexpectedMessage)
  300. return unexpectedMessageError(cs, msg)
  301. }
  302. hs.finishedHash.Write(cs.marshal())
  303. if cs.statusType == statusTypeOCSP {
  304. c.ocspResponse = cs.response
  305. }
  306. }
  307. msg, err = c.readHandshake()
  308. if err != nil {
  309. return err
  310. }
  311. keyAgreement := hs.suite.ka(c.vers)
  312. skx, ok := msg.(*serverKeyExchangeMsg)
  313. if ok {
  314. hs.finishedHash.Write(skx.marshal())
  315. err = keyAgreement.processServerKeyExchange(c.config, hs.hello, hs.serverHello, c.peerCertificates[0], skx)
  316. if err != nil {
  317. c.sendAlert(alertUnexpectedMessage)
  318. return err
  319. }
  320. msg, err = c.readHandshake()
  321. if err != nil {
  322. return err
  323. }
  324. }
  325. var chainToSend *Certificate
  326. var certRequested bool
  327. certReq, ok := msg.(*certificateRequestMsg)
  328. if ok {
  329. certRequested = true
  330. // RFC 4346 on the certificateAuthorities field:
  331. // A list of the distinguished names of acceptable certificate
  332. // authorities. These distinguished names may specify a desired
  333. // distinguished name for a root CA or for a subordinate CA;
  334. // thus, this message can be used to describe both known roots
  335. // and a desired authorization space. If the
  336. // certificate_authorities list is empty then the client MAY
  337. // send any certificate of the appropriate
  338. // ClientCertificateType, unless there is some external
  339. // arrangement to the contrary.
  340. hs.finishedHash.Write(certReq.marshal())
  341. var rsaAvail, ecdsaAvail bool
  342. for _, certType := range certReq.certificateTypes {
  343. switch certType {
  344. case certTypeRSASign:
  345. rsaAvail = true
  346. case certTypeECDSASign:
  347. ecdsaAvail = true
  348. }
  349. }
  350. // We need to search our list of client certs for one
  351. // where SignatureAlgorithm is acceptable to the server and the
  352. // Issuer is in certReq.certificateAuthorities
  353. findCert:
  354. for i, chain := range c.config.Certificates {
  355. if !rsaAvail && !ecdsaAvail {
  356. continue
  357. }
  358. for j, cert := range chain.Certificate {
  359. x509Cert := chain.Leaf
  360. // parse the certificate if this isn't the leaf
  361. // node, or if chain.Leaf was nil
  362. if j != 0 || x509Cert == nil {
  363. if x509Cert, err = x509.ParseCertificate(cert); err != nil {
  364. c.sendAlert(alertInternalError)
  365. return errors.New("tls: failed to parse client certificate #" + strconv.Itoa(i) + ": " + err.Error())
  366. }
  367. }
  368. switch {
  369. case rsaAvail && x509Cert.PublicKeyAlgorithm == x509.RSA:
  370. case ecdsaAvail && x509Cert.PublicKeyAlgorithm == x509.ECDSA:
  371. default:
  372. continue findCert
  373. }
  374. if len(certReq.certificateAuthorities) == 0 {
  375. // they gave us an empty list, so just take the
  376. // first cert from c.config.Certificates
  377. chainToSend = &chain
  378. break findCert
  379. }
  380. for _, ca := range certReq.certificateAuthorities {
  381. if bytes.Equal(x509Cert.RawIssuer, ca) {
  382. chainToSend = &chain
  383. break findCert
  384. }
  385. }
  386. }
  387. }
  388. msg, err = c.readHandshake()
  389. if err != nil {
  390. return err
  391. }
  392. }
  393. shd, ok := msg.(*serverHelloDoneMsg)
  394. if !ok {
  395. c.sendAlert(alertUnexpectedMessage)
  396. return unexpectedMessageError(shd, msg)
  397. }
  398. hs.finishedHash.Write(shd.marshal())
  399. // If the server requested a certificate then we have to send a
  400. // Certificate message, even if it's empty because we don't have a
  401. // certificate to send.
  402. if certRequested {
  403. certMsg = new(certificateMsg)
  404. if chainToSend != nil {
  405. certMsg.certificates = chainToSend.Certificate
  406. }
  407. hs.finishedHash.Write(certMsg.marshal())
  408. if _, err := c.writeRecord(recordTypeHandshake, certMsg.marshal()); err != nil {
  409. return err
  410. }
  411. }
  412. preMasterSecret, ckx, err := keyAgreement.generateClientKeyExchange(c.config, hs.hello, c.peerCertificates[0])
  413. if err != nil {
  414. c.sendAlert(alertInternalError)
  415. return err
  416. }
  417. if ckx != nil {
  418. hs.finishedHash.Write(ckx.marshal())
  419. if _, err := c.writeRecord(recordTypeHandshake, ckx.marshal()); err != nil {
  420. return err
  421. }
  422. }
  423. if chainToSend != nil {
  424. certVerify := &certificateVerifyMsg{
  425. hasSignatureAndHash: c.vers >= VersionTLS12,
  426. }
  427. key, ok := chainToSend.PrivateKey.(crypto.Signer)
  428. if !ok {
  429. c.sendAlert(alertInternalError)
  430. return fmt.Errorf("tls: client certificate private key of type %T does not implement crypto.Signer", chainToSend.PrivateKey)
  431. }
  432. var signatureType uint8
  433. switch key.Public().(type) {
  434. case *ecdsa.PublicKey:
  435. signatureType = signatureECDSA
  436. case *rsa.PublicKey:
  437. signatureType = signatureRSA
  438. default:
  439. c.sendAlert(alertInternalError)
  440. return fmt.Errorf("tls: failed to sign handshake with client certificate: unknown client certificate key type: %T", key)
  441. }
  442. certVerify.signatureAndHash, err = hs.finishedHash.selectClientCertSignatureAlgorithm(certReq.signatureAndHashes, signatureType)
  443. if err != nil {
  444. c.sendAlert(alertInternalError)
  445. return err
  446. }
  447. digest, hashFunc, err := hs.finishedHash.hashForClientCertificate(certVerify.signatureAndHash, hs.masterSecret)
  448. if err != nil {
  449. c.sendAlert(alertInternalError)
  450. return err
  451. }
  452. certVerify.signature, err = key.Sign(c.config.rand(), digest, hashFunc)
  453. if err != nil {
  454. c.sendAlert(alertInternalError)
  455. return err
  456. }
  457. hs.finishedHash.Write(certVerify.marshal())
  458. if _, err := c.writeRecord(recordTypeHandshake, certVerify.marshal()); err != nil {
  459. return err
  460. }
  461. }
  462. hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret, hs.hello.random, hs.serverHello.random)
  463. hs.finishedHash.discardHandshakeBuffer()
  464. return nil
  465. }
  466. func (hs *clientHandshakeState) establishKeys() error {
  467. c := hs.c
  468. clientMAC, serverMAC, clientKey, serverKey, clientIV, serverIV :=
  469. keysFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.hello.random, hs.serverHello.random, hs.suite.macLen, hs.suite.keyLen, hs.suite.ivLen)
  470. var clientCipher, serverCipher interface{}
  471. var clientHash, serverHash macFunction
  472. if hs.suite.cipher != nil {
  473. clientCipher = hs.suite.cipher(clientKey, clientIV, false /* not for reading */)
  474. clientHash = hs.suite.mac(c.vers, clientMAC)
  475. serverCipher = hs.suite.cipher(serverKey, serverIV, true /* for reading */)
  476. serverHash = hs.suite.mac(c.vers, serverMAC)
  477. } else {
  478. clientCipher = hs.suite.aead(clientKey, clientIV)
  479. serverCipher = hs.suite.aead(serverKey, serverIV)
  480. }
  481. c.in.prepareCipherSpec(c.vers, serverCipher, serverHash)
  482. c.out.prepareCipherSpec(c.vers, clientCipher, clientHash)
  483. return nil
  484. }
  485. func (hs *clientHandshakeState) serverResumedSession() bool {
  486. // If the server responded with the same sessionId then it means the
  487. // sessionTicket is being used to resume a TLS session.
  488. return hs.session != nil && hs.hello.sessionId != nil &&
  489. bytes.Equal(hs.serverHello.sessionId, hs.hello.sessionId)
  490. }
  491. func (hs *clientHandshakeState) processServerHello() (bool, error) {
  492. c := hs.c
  493. if hs.serverHello.compressionMethod != compressionNone {
  494. c.sendAlert(alertUnexpectedMessage)
  495. return false, errors.New("tls: server selected unsupported compression format")
  496. }
  497. if c.handshakes == 0 && hs.serverHello.secureRenegotiationSupported {
  498. c.secureRenegotiation = true
  499. if len(hs.serverHello.secureRenegotiation) != 0 {
  500. c.sendAlert(alertHandshakeFailure)
  501. return false, errors.New("tls: initial handshake had non-empty renegotiation extension")
  502. }
  503. }
  504. if c.handshakes > 0 && c.secureRenegotiation {
  505. var expectedSecureRenegotiation [24]byte
  506. copy(expectedSecureRenegotiation[:], c.clientFinished[:])
  507. copy(expectedSecureRenegotiation[12:], c.serverFinished[:])
  508. if !bytes.Equal(hs.serverHello.secureRenegotiation, expectedSecureRenegotiation[:]) {
  509. c.sendAlert(alertHandshakeFailure)
  510. return false, errors.New("tls: incorrect renegotiation extension contents")
  511. }
  512. }
  513. clientDidNPN := hs.hello.nextProtoNeg
  514. clientDidALPN := len(hs.hello.alpnProtocols) > 0
  515. serverHasNPN := hs.serverHello.nextProtoNeg
  516. serverHasALPN := len(hs.serverHello.alpnProtocol) > 0
  517. if !clientDidNPN && serverHasNPN {
  518. c.sendAlert(alertHandshakeFailure)
  519. return false, errors.New("tls: server advertised unrequested NPN extension")
  520. }
  521. if !clientDidALPN && serverHasALPN {
  522. c.sendAlert(alertHandshakeFailure)
  523. return false, errors.New("tls: server advertised unrequested ALPN extension")
  524. }
  525. if serverHasNPN && serverHasALPN {
  526. c.sendAlert(alertHandshakeFailure)
  527. return false, errors.New("tls: server advertised both NPN and ALPN extensions")
  528. }
  529. if serverHasALPN {
  530. c.clientProtocol = hs.serverHello.alpnProtocol
  531. c.clientProtocolFallback = false
  532. }
  533. c.scts = hs.serverHello.scts
  534. if !hs.serverResumedSession() {
  535. return false, nil
  536. }
  537. if hs.session.vers != c.vers {
  538. c.sendAlert(alertHandshakeFailure)
  539. return false, errors.New("tls: server resumed a session with a different version")
  540. }
  541. if hs.session.cipherSuite != hs.suite.id {
  542. c.sendAlert(alertHandshakeFailure)
  543. return false, errors.New("tls: server resumed a session with a different cipher suite")
  544. }
  545. // Restore masterSecret and peerCerts from previous state
  546. hs.masterSecret = hs.session.masterSecret
  547. c.peerCertificates = hs.session.serverCertificates
  548. c.verifiedChains = hs.session.verifiedChains
  549. return true, nil
  550. }
  551. func (hs *clientHandshakeState) readFinished(out []byte) error {
  552. c := hs.c
  553. c.readRecord(recordTypeChangeCipherSpec)
  554. if c.in.err != nil {
  555. return c.in.err
  556. }
  557. msg, err := c.readHandshake()
  558. if err != nil {
  559. return err
  560. }
  561. serverFinished, ok := msg.(*finishedMsg)
  562. if !ok {
  563. c.sendAlert(alertUnexpectedMessage)
  564. return unexpectedMessageError(serverFinished, msg)
  565. }
  566. verify := hs.finishedHash.serverSum(hs.masterSecret)
  567. if len(verify) != len(serverFinished.verifyData) ||
  568. subtle.ConstantTimeCompare(verify, serverFinished.verifyData) != 1 {
  569. c.sendAlert(alertHandshakeFailure)
  570. return errors.New("tls: server's Finished message was incorrect")
  571. }
  572. hs.finishedHash.Write(serverFinished.marshal())
  573. copy(out, verify)
  574. return nil
  575. }
  576. func (hs *clientHandshakeState) readSessionTicket() error {
  577. if !hs.serverHello.ticketSupported {
  578. return nil
  579. }
  580. c := hs.c
  581. msg, err := c.readHandshake()
  582. if err != nil {
  583. return err
  584. }
  585. sessionTicketMsg, ok := msg.(*newSessionTicketMsg)
  586. if !ok {
  587. c.sendAlert(alertUnexpectedMessage)
  588. return unexpectedMessageError(sessionTicketMsg, msg)
  589. }
  590. hs.finishedHash.Write(sessionTicketMsg.marshal())
  591. hs.session = &ClientSessionState{
  592. sessionTicket: sessionTicketMsg.ticket,
  593. vers: c.vers,
  594. cipherSuite: hs.suite.id,
  595. masterSecret: hs.masterSecret,
  596. serverCertificates: c.peerCertificates,
  597. verifiedChains: c.verifiedChains,
  598. }
  599. return nil
  600. }
  601. func (hs *clientHandshakeState) sendFinished(out []byte) error {
  602. c := hs.c
  603. if _, err := c.writeRecord(recordTypeChangeCipherSpec, []byte{1}); err != nil {
  604. return err
  605. }
  606. if hs.serverHello.nextProtoNeg {
  607. nextProto := new(nextProtoMsg)
  608. proto, fallback := mutualProtocol(c.config.NextProtos, hs.serverHello.nextProtos)
  609. nextProto.proto = proto
  610. c.clientProtocol = proto
  611. c.clientProtocolFallback = fallback
  612. hs.finishedHash.Write(nextProto.marshal())
  613. if _, err := c.writeRecord(recordTypeHandshake, nextProto.marshal()); err != nil {
  614. return err
  615. }
  616. }
  617. finished := new(finishedMsg)
  618. finished.verifyData = hs.finishedHash.clientSum(hs.masterSecret)
  619. hs.finishedHash.Write(finished.marshal())
  620. if _, err := c.writeRecord(recordTypeHandshake, finished.marshal()); err != nil {
  621. return err
  622. }
  623. copy(out, finished.verifyData)
  624. return nil
  625. }
  626. // clientSessionCacheKey returns a key used to cache sessionTickets that could
  627. // be used to resume previously negotiated TLS sessions with a server.
  628. func clientSessionCacheKey(serverAddr net.Addr, config *Config) string {
  629. if len(config.ServerName) > 0 {
  630. return config.ServerName
  631. }
  632. return serverAddr.String()
  633. }
  634. // mutualProtocol finds the mutual Next Protocol Negotiation or ALPN protocol
  635. // given list of possible protocols and a list of the preference order. The
  636. // first list must not be empty. It returns the resulting protocol and flag
  637. // indicating if the fallback case was reached.
  638. func mutualProtocol(protos, preferenceProtos []string) (string, bool) {
  639. for _, s := range preferenceProtos {
  640. for _, c := range protos {
  641. if s == c {
  642. return s, false
  643. }
  644. }
  645. }
  646. return protos[0], true
  647. }
  648. // hostnameInSNI converts name into an approriate hostname for SNI.
  649. // Literal IP addresses and absolute FQDNs are not permitted as SNI values.
  650. // See https://tools.ietf.org/html/rfc6066#section-3.
  651. func hostnameInSNI(name string) string {
  652. host := name
  653. if len(host) > 0 && host[0] == '[' && host[len(host)-1] == ']' {
  654. host = host[1 : len(host)-1]
  655. }
  656. if i := strings.LastIndex(host, "%"); i > 0 {
  657. host = host[:i]
  658. }
  659. if net.ParseIP(host) != nil {
  660. return ""
  661. }
  662. if len(name) > 0 && name[len(name)-1] == '.' {
  663. name = name[:len(name)-1]
  664. }
  665. return name
  666. }