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.

handshake_client.go 16 KiB

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