You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

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