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.

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