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.

935 lignes
26 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. "crypto"
  7. "crypto/ecdsa"
  8. "crypto/rsa"
  9. "crypto/subtle"
  10. "crypto/x509"
  11. "encoding/asn1"
  12. "errors"
  13. "fmt"
  14. "hash"
  15. "io"
  16. "sync/atomic"
  17. )
  18. type Committer interface {
  19. Commit() error
  20. }
  21. // serverHandshakeState contains details of a server handshake in progress.
  22. // It's discarded once the handshake has completed.
  23. type serverHandshakeState struct {
  24. c *Conn
  25. suite *cipherSuite
  26. masterSecret []byte
  27. cachedClientHelloInfo *ClientHelloInfo
  28. clientHello *clientHelloMsg
  29. cert *Certificate
  30. // TLS 1.0-1.2 fields
  31. hello *serverHelloMsg
  32. ellipticOk bool
  33. ecdsaOk bool
  34. rsaDecryptOk bool
  35. rsaSignOk bool
  36. sessionState *sessionState
  37. finishedHash finishedHash
  38. certsFromClient [][]byte
  39. // TLS 1.3 fields
  40. hello13 *serverHelloMsg13
  41. hello13Enc *encryptedExtensionsMsg
  42. finishedHash13 hash.Hash
  43. clientFinishedKey []byte
  44. hsClientCipher interface{}
  45. appClientCipher interface{}
  46. }
  47. // serverHandshake performs a TLS handshake as a server.
  48. // c.out.Mutex <= L; c.handshakeMutex <= L.
  49. func (c *Conn) serverHandshake() error {
  50. // If this is the first server handshake, we generate a random key to
  51. // encrypt the tickets with.
  52. c.config.serverInitOnce.Do(func() { c.config.serverInit(nil) })
  53. hs := serverHandshakeState{
  54. c: c,
  55. }
  56. c.in.traceErr = hs.traceErr
  57. c.out.traceErr = hs.traceErr
  58. isResume, err := hs.readClientHello()
  59. if err != nil {
  60. return err
  61. }
  62. // For an overview of TLS handshaking, see https://tools.ietf.org/html/rfc5246#section-7.3
  63. // and https://tools.ietf.org/html/draft-ietf-tls-tls13-18#section-2
  64. c.buffering = true
  65. if hs.hello13 != nil {
  66. if err := hs.doTLS13Handshake(); err != nil {
  67. return err
  68. }
  69. if _, err := c.flush(); err != nil {
  70. return err
  71. }
  72. c.hs = &hs
  73. c.handshakeComplete = true
  74. return nil
  75. } else if isResume {
  76. // The client has included a session ticket and so we do an abbreviated handshake.
  77. if err := hs.doResumeHandshake(); err != nil {
  78. return err
  79. }
  80. if err := hs.establishKeys(); err != nil {
  81. return err
  82. }
  83. // ticketSupported is set in a resumption handshake if the
  84. // ticket from the client was encrypted with an old session
  85. // ticket key and thus a refreshed ticket should be sent.
  86. if hs.hello.ticketSupported {
  87. if err := hs.sendSessionTicket(); err != nil {
  88. return err
  89. }
  90. }
  91. if err := hs.sendFinished(c.serverFinished[:]); err != nil {
  92. return err
  93. }
  94. if _, err := c.flush(); err != nil {
  95. return err
  96. }
  97. c.clientFinishedIsFirst = false
  98. if err := hs.readFinished(nil); err != nil {
  99. return err
  100. }
  101. c.didResume = true
  102. } else {
  103. // The client didn't include a session ticket, or it wasn't
  104. // valid so we do a full handshake.
  105. if err := hs.doFullHandshake(); err != nil {
  106. return err
  107. }
  108. if err := hs.establishKeys(); err != nil {
  109. return err
  110. }
  111. if err := hs.readFinished(c.clientFinished[:]); err != nil {
  112. return err
  113. }
  114. c.clientFinishedIsFirst = true
  115. c.buffering = true
  116. if err := hs.sendSessionTicket(); err != nil {
  117. return err
  118. }
  119. if err := hs.sendFinished(nil); err != nil {
  120. return err
  121. }
  122. if _, err := c.flush(); err != nil {
  123. return err
  124. }
  125. }
  126. if c.hand.Len() > 0 {
  127. return c.sendAlert(alertUnexpectedMessage)
  128. }
  129. c.phase = handshakeConfirmed
  130. atomic.StoreInt32(&c.handshakeConfirmed, 1)
  131. c.handshakeComplete = true
  132. return nil
  133. }
  134. // readClientHello reads a ClientHello message from the client and decides
  135. // whether we will perform session resumption.
  136. func (hs *serverHandshakeState) readClientHello() (isResume bool, err error) {
  137. c := hs.c
  138. msg, err := c.readHandshake()
  139. if err != nil {
  140. return false, err
  141. }
  142. var ok bool
  143. hs.clientHello, ok = msg.(*clientHelloMsg)
  144. if !ok {
  145. c.sendAlert(alertUnexpectedMessage)
  146. return false, unexpectedMessageError(hs.clientHello, msg)
  147. }
  148. if c.config.GetConfigForClient != nil {
  149. if newConfig, err := c.config.GetConfigForClient(hs.clientHelloInfo()); err != nil {
  150. c.out.traceErr, c.in.traceErr = nil, nil // disable tracing
  151. c.sendAlert(alertInternalError)
  152. return false, err
  153. } else if newConfig != nil {
  154. newConfig.serverInitOnce.Do(func() { newConfig.serverInit(c.config) })
  155. c.config = newConfig
  156. }
  157. }
  158. var keyShares []CurveID
  159. for _, ks := range hs.clientHello.keyShares {
  160. keyShares = append(keyShares, ks.group)
  161. }
  162. if hs.clientHello.supportedVersions != nil {
  163. c.vers, ok = c.config.pickVersion(hs.clientHello.supportedVersions)
  164. if !ok {
  165. c.sendAlert(alertProtocolVersion)
  166. return false, fmt.Errorf("tls: none of the client versions (%x) are supported", hs.clientHello.supportedVersions)
  167. }
  168. } else {
  169. c.vers, ok = c.config.mutualVersion(hs.clientHello.vers)
  170. if !ok {
  171. c.sendAlert(alertProtocolVersion)
  172. return false, fmt.Errorf("tls: client offered an unsupported, maximum protocol version of %x", hs.clientHello.vers)
  173. }
  174. }
  175. c.haveVers = true
  176. preferredCurves := c.config.curvePreferences()
  177. Curves:
  178. for _, curve := range hs.clientHello.supportedCurves {
  179. for _, supported := range preferredCurves {
  180. if supported == curve {
  181. hs.ellipticOk = true
  182. break Curves
  183. }
  184. }
  185. }
  186. // If present, the supported points extension must include uncompressed.
  187. // Can be absent. This behavior mirrors BoringSSL.
  188. if hs.clientHello.supportedPoints != nil {
  189. supportedPointFormat := false
  190. for _, pointFormat := range hs.clientHello.supportedPoints {
  191. if pointFormat == pointFormatUncompressed {
  192. supportedPointFormat = true
  193. break
  194. }
  195. }
  196. if !supportedPointFormat {
  197. c.sendAlert(alertHandshakeFailure)
  198. return false, errors.New("tls: client does not support uncompressed points")
  199. }
  200. }
  201. foundCompression := false
  202. // We only support null compression, so check that the client offered it.
  203. for _, compression := range hs.clientHello.compressionMethods {
  204. if compression == compressionNone {
  205. foundCompression = true
  206. break
  207. }
  208. }
  209. if !foundCompression {
  210. c.sendAlert(alertIllegalParameter)
  211. return false, errors.New("tls: client does not support uncompressed connections")
  212. }
  213. if len(hs.clientHello.compressionMethods) != 1 && c.vers >= VersionTLS13 {
  214. c.sendAlert(alertIllegalParameter)
  215. return false, errors.New("tls: 1.3 client offered compression")
  216. }
  217. if len(hs.clientHello.secureRenegotiation) != 0 {
  218. c.sendAlert(alertHandshakeFailure)
  219. return false, errors.New("tls: initial handshake had non-empty renegotiation extension")
  220. }
  221. if c.vers < VersionTLS13 {
  222. hs.hello = new(serverHelloMsg)
  223. hs.hello.vers = c.vers
  224. hs.hello.random = make([]byte, 32)
  225. _, err = io.ReadFull(c.config.rand(), hs.hello.random)
  226. if err != nil {
  227. c.sendAlert(alertInternalError)
  228. return false, err
  229. }
  230. hs.hello.secureRenegotiationSupported = hs.clientHello.secureRenegotiationSupported
  231. hs.hello.compressionMethod = compressionNone
  232. } else {
  233. hs.hello13 = new(serverHelloMsg13)
  234. hs.hello13Enc = new(encryptedExtensionsMsg)
  235. hs.hello13.vers = c.vers
  236. hs.hello13.random = make([]byte, 32)
  237. _, err = io.ReadFull(c.config.rand(), hs.hello13.random)
  238. if err != nil {
  239. c.sendAlert(alertInternalError)
  240. return false, err
  241. }
  242. }
  243. if len(hs.clientHello.serverName) > 0 {
  244. c.serverName = hs.clientHello.serverName
  245. }
  246. if len(hs.clientHello.alpnProtocols) > 0 {
  247. if selectedProto, fallback := mutualProtocol(hs.clientHello.alpnProtocols, c.config.NextProtos); !fallback {
  248. if hs.hello != nil {
  249. hs.hello.alpnProtocol = selectedProto
  250. } else {
  251. hs.hello13Enc.alpnProtocol = selectedProto
  252. }
  253. c.clientProtocol = selectedProto
  254. }
  255. } else {
  256. // Although sending an empty NPN extension is reasonable, Firefox has
  257. // had a bug around this. Best to send nothing at all if
  258. // c.config.NextProtos is empty. See
  259. // https://golang.org/issue/5445.
  260. if hs.clientHello.nextProtoNeg && len(c.config.NextProtos) > 0 && c.vers < VersionTLS13 {
  261. hs.hello.nextProtoNeg = true
  262. hs.hello.nextProtos = c.config.NextProtos
  263. }
  264. }
  265. hs.cert, err = c.config.getCertificate(hs.clientHelloInfo())
  266. if err != nil {
  267. c.sendAlert(alertInternalError)
  268. return false, err
  269. }
  270. if hs.clientHello.scts && hs.hello != nil {
  271. hs.hello.scts = hs.cert.SignedCertificateTimestamps
  272. }
  273. if priv, ok := hs.cert.PrivateKey.(crypto.Signer); ok {
  274. switch priv.Public().(type) {
  275. case *ecdsa.PublicKey:
  276. hs.ecdsaOk = true
  277. case *rsa.PublicKey:
  278. hs.rsaSignOk = true
  279. default:
  280. c.sendAlert(alertInternalError)
  281. return false, fmt.Errorf("tls: unsupported signing key type (%T)", priv.Public())
  282. }
  283. }
  284. if priv, ok := hs.cert.PrivateKey.(crypto.Decrypter); ok {
  285. switch priv.Public().(type) {
  286. case *rsa.PublicKey:
  287. hs.rsaDecryptOk = true
  288. default:
  289. c.sendAlert(alertInternalError)
  290. return false, fmt.Errorf("tls: unsupported decryption key type (%T)", priv.Public())
  291. }
  292. }
  293. if c.vers != VersionTLS13 && hs.checkForResumption() {
  294. return true, nil
  295. }
  296. var preferenceList, supportedList []uint16
  297. if c.config.PreferServerCipherSuites {
  298. preferenceList = c.config.cipherSuites(c.vers)
  299. supportedList = hs.clientHello.cipherSuites
  300. } else {
  301. preferenceList = hs.clientHello.cipherSuites
  302. supportedList = c.config.cipherSuites(c.vers)
  303. }
  304. for _, id := range preferenceList {
  305. if hs.setCipherSuite(id, supportedList, c.vers) {
  306. break
  307. }
  308. }
  309. if hs.suite == nil {
  310. c.sendAlert(alertHandshakeFailure)
  311. return false, errors.New("tls: no cipher suite supported by both client and server")
  312. }
  313. // See https://tools.ietf.org/html/rfc7507.
  314. for _, id := range hs.clientHello.cipherSuites {
  315. if id == TLS_FALLBACK_SCSV {
  316. // The client is doing a fallback connection.
  317. if c.vers < c.config.maxVersion() {
  318. c.sendAlert(alertInappropriateFallback)
  319. return false, errors.New("tls: client using inappropriate protocol fallback")
  320. }
  321. break
  322. }
  323. }
  324. return false, nil
  325. }
  326. // checkForResumption reports whether we should perform resumption on this connection.
  327. func (hs *serverHandshakeState) checkForResumption() bool {
  328. c := hs.c
  329. if c.config.SessionTicketsDisabled {
  330. return false
  331. }
  332. sessionTicket := append([]uint8{}, hs.clientHello.sessionTicket...)
  333. serializedState, usedOldKey := c.decryptTicket(sessionTicket)
  334. hs.sessionState = &sessionState{usedOldKey: usedOldKey}
  335. if hs.sessionState.unmarshal(serializedState) != alertSuccess {
  336. return false
  337. }
  338. // Never resume a session for a different TLS version.
  339. if c.vers != hs.sessionState.vers {
  340. return false
  341. }
  342. cipherSuiteOk := false
  343. // Check that the client is still offering the ciphersuite in the session.
  344. for _, id := range hs.clientHello.cipherSuites {
  345. if id == hs.sessionState.cipherSuite {
  346. cipherSuiteOk = true
  347. break
  348. }
  349. }
  350. if !cipherSuiteOk {
  351. return false
  352. }
  353. // Check that we also support the ciphersuite from the session.
  354. if !hs.setCipherSuite(hs.sessionState.cipherSuite, c.config.cipherSuites(c.vers), hs.sessionState.vers) {
  355. return false
  356. }
  357. sessionHasClientCerts := len(hs.sessionState.certificates) != 0
  358. needClientCerts := c.config.ClientAuth == RequireAnyClientCert || c.config.ClientAuth == RequireAndVerifyClientCert
  359. if needClientCerts && !sessionHasClientCerts {
  360. return false
  361. }
  362. if sessionHasClientCerts && c.config.ClientAuth == NoClientCert {
  363. return false
  364. }
  365. return true
  366. }
  367. func (hs *serverHandshakeState) doResumeHandshake() error {
  368. c := hs.c
  369. hs.hello.cipherSuite = hs.suite.id
  370. // We echo the client's session ID in the ServerHello to let it know
  371. // that we're doing a resumption.
  372. hs.hello.sessionId = hs.clientHello.sessionId
  373. hs.hello.ticketSupported = hs.sessionState.usedOldKey
  374. hs.finishedHash = newFinishedHash(c.vers, hs.suite)
  375. hs.finishedHash.discardHandshakeBuffer()
  376. hs.finishedHash.Write(hs.clientHello.marshal())
  377. hs.finishedHash.Write(hs.hello.marshal())
  378. if _, err := c.writeRecord(recordTypeHandshake, hs.hello.marshal()); err != nil {
  379. return err
  380. }
  381. if len(hs.sessionState.certificates) > 0 {
  382. if _, err := hs.processCertsFromClient(hs.sessionState.certificates); err != nil {
  383. return err
  384. }
  385. }
  386. hs.masterSecret = hs.sessionState.masterSecret
  387. return nil
  388. }
  389. func (hs *serverHandshakeState) doFullHandshake() error {
  390. c := hs.c
  391. if hs.clientHello.ocspStapling && len(hs.cert.OCSPStaple) > 0 {
  392. hs.hello.ocspStapling = true
  393. }
  394. hs.hello.ticketSupported = hs.clientHello.ticketSupported && !c.config.SessionTicketsDisabled
  395. hs.hello.cipherSuite = hs.suite.id
  396. hs.finishedHash = newFinishedHash(hs.c.vers, hs.suite)
  397. if c.config.ClientAuth == NoClientCert {
  398. // No need to keep a full record of the handshake if client
  399. // certificates won't be used.
  400. hs.finishedHash.discardHandshakeBuffer()
  401. }
  402. hs.finishedHash.Write(hs.clientHello.marshal())
  403. hs.finishedHash.Write(hs.hello.marshal())
  404. if _, err := c.writeRecord(recordTypeHandshake, hs.hello.marshal()); err != nil {
  405. return err
  406. }
  407. certMsg := new(certificateMsg)
  408. certMsg.certificates = hs.cert.Certificate
  409. hs.finishedHash.Write(certMsg.marshal())
  410. if _, err := c.writeRecord(recordTypeHandshake, certMsg.marshal()); err != nil {
  411. return err
  412. }
  413. if hs.hello.ocspStapling {
  414. certStatus := new(certificateStatusMsg)
  415. certStatus.statusType = statusTypeOCSP
  416. certStatus.response = hs.cert.OCSPStaple
  417. hs.finishedHash.Write(certStatus.marshal())
  418. if _, err := c.writeRecord(recordTypeHandshake, certStatus.marshal()); err != nil {
  419. return err
  420. }
  421. }
  422. keyAgreement := hs.suite.ka(c.vers)
  423. skx, err := keyAgreement.generateServerKeyExchange(c.config, hs.cert, hs.clientHello, hs.hello)
  424. if err != nil {
  425. c.sendAlert(alertHandshakeFailure)
  426. return err
  427. }
  428. if skx != nil {
  429. hs.finishedHash.Write(skx.marshal())
  430. if _, err := c.writeRecord(recordTypeHandshake, skx.marshal()); err != nil {
  431. return err
  432. }
  433. }
  434. if c.config.ClientAuth >= RequestClientCert {
  435. // Request a client certificate
  436. certReq := new(certificateRequestMsg)
  437. certReq.certificateTypes = []byte{
  438. byte(certTypeRSASign),
  439. byte(certTypeECDSASign),
  440. }
  441. if c.vers >= VersionTLS12 {
  442. certReq.hasSignatureAndHash = true
  443. certReq.signatureAndHashes = supportedSignatureAlgorithms
  444. }
  445. // An empty list of certificateAuthorities signals to
  446. // the client that it may send any certificate in response
  447. // to our request. When we know the CAs we trust, then
  448. // we can send them down, so that the client can choose
  449. // an appropriate certificate to give to us.
  450. if c.config.ClientCAs != nil {
  451. certReq.certificateAuthorities = c.config.ClientCAs.Subjects()
  452. }
  453. hs.finishedHash.Write(certReq.marshal())
  454. if _, err := c.writeRecord(recordTypeHandshake, certReq.marshal()); err != nil {
  455. return err
  456. }
  457. }
  458. helloDone := new(serverHelloDoneMsg)
  459. hs.finishedHash.Write(helloDone.marshal())
  460. if _, err := c.writeRecord(recordTypeHandshake, helloDone.marshal()); err != nil {
  461. return err
  462. }
  463. if _, err := c.flush(); err != nil {
  464. return err
  465. }
  466. var pub crypto.PublicKey // public key for client auth, if any
  467. msg, err := c.readHandshake()
  468. if err != nil {
  469. return err
  470. }
  471. var ok bool
  472. // If we requested a client certificate, then the client must send a
  473. // certificate message, even if it's empty.
  474. if c.config.ClientAuth >= RequestClientCert {
  475. if certMsg, ok = msg.(*certificateMsg); !ok {
  476. c.sendAlert(alertUnexpectedMessage)
  477. return unexpectedMessageError(certMsg, msg)
  478. }
  479. hs.finishedHash.Write(certMsg.marshal())
  480. if len(certMsg.certificates) == 0 {
  481. // The client didn't actually send a certificate
  482. switch c.config.ClientAuth {
  483. case RequireAnyClientCert, RequireAndVerifyClientCert:
  484. c.sendAlert(alertBadCertificate)
  485. return errors.New("tls: client didn't provide a certificate")
  486. }
  487. }
  488. pub, err = hs.processCertsFromClient(certMsg.certificates)
  489. if err != nil {
  490. return err
  491. }
  492. msg, err = c.readHandshake()
  493. if err != nil {
  494. return err
  495. }
  496. }
  497. // Get client key exchange
  498. ckx, ok := msg.(*clientKeyExchangeMsg)
  499. if !ok {
  500. c.sendAlert(alertUnexpectedMessage)
  501. return unexpectedMessageError(ckx, msg)
  502. }
  503. hs.finishedHash.Write(ckx.marshal())
  504. preMasterSecret, err := keyAgreement.processClientKeyExchange(c.config, hs.cert, ckx, c.vers)
  505. if err != nil {
  506. if err == errClientKeyExchange {
  507. c.sendAlert(alertDecodeError)
  508. } else {
  509. c.sendAlert(alertInternalError)
  510. }
  511. return err
  512. }
  513. hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret, hs.clientHello.random, hs.hello.random)
  514. if err := c.config.writeKeyLog(hs.clientHello.random, hs.masterSecret); err != nil {
  515. c.sendAlert(alertInternalError)
  516. return err
  517. }
  518. // If we received a client cert in response to our certificate request message,
  519. // the client will send us a certificateVerifyMsg immediately after the
  520. // clientKeyExchangeMsg. This message is a digest of all preceding
  521. // handshake-layer messages that is signed using the private key corresponding
  522. // to the client's certificate. This allows us to verify that the client is in
  523. // possession of the private key of the certificate.
  524. if len(c.peerCertificates) > 0 {
  525. msg, err = c.readHandshake()
  526. if err != nil {
  527. return err
  528. }
  529. certVerify, ok := msg.(*certificateVerifyMsg)
  530. if !ok {
  531. c.sendAlert(alertUnexpectedMessage)
  532. return unexpectedMessageError(certVerify, msg)
  533. }
  534. // Determine the signature type.
  535. var signatureAndHash signatureAndHash
  536. if certVerify.hasSignatureAndHash {
  537. signatureAndHash = certVerify.signatureAndHash
  538. if !isSupportedSignatureAndHash(signatureAndHash, supportedSignatureAlgorithms) {
  539. return errors.New("tls: unsupported hash function for client certificate")
  540. }
  541. } else {
  542. // Before TLS 1.2 the signature algorithm was implicit
  543. // from the key type, and only one hash per signature
  544. // algorithm was possible. Leave the hash as zero.
  545. switch pub.(type) {
  546. case *ecdsa.PublicKey:
  547. signatureAndHash.signature = signatureECDSA
  548. case *rsa.PublicKey:
  549. signatureAndHash.signature = signatureRSA
  550. }
  551. }
  552. switch key := pub.(type) {
  553. case *ecdsa.PublicKey:
  554. if signatureAndHash.signature != signatureECDSA {
  555. err = errors.New("tls: bad signature type for client's ECDSA certificate")
  556. break
  557. }
  558. ecdsaSig := new(ecdsaSignature)
  559. if _, err = asn1.Unmarshal(certVerify.signature, ecdsaSig); err != nil {
  560. break
  561. }
  562. if ecdsaSig.R.Sign() <= 0 || ecdsaSig.S.Sign() <= 0 {
  563. err = errors.New("tls: ECDSA signature contained zero or negative values")
  564. break
  565. }
  566. var digest []byte
  567. if digest, _, err = hs.finishedHash.hashForClientCertificate(signatureAndHash, hs.masterSecret); err != nil {
  568. break
  569. }
  570. if !ecdsa.Verify(key, digest, ecdsaSig.R, ecdsaSig.S) {
  571. err = errors.New("tls: ECDSA verification failure")
  572. }
  573. case *rsa.PublicKey:
  574. if signatureAndHash.signature != signatureRSA {
  575. err = errors.New("tls: bad signature type for client's RSA certificate")
  576. break
  577. }
  578. var digest []byte
  579. var hashFunc crypto.Hash
  580. if digest, hashFunc, err = hs.finishedHash.hashForClientCertificate(signatureAndHash, hs.masterSecret); err != nil {
  581. break
  582. }
  583. err = rsa.VerifyPKCS1v15(key, hashFunc, digest, certVerify.signature)
  584. }
  585. if err != nil {
  586. c.sendAlert(alertBadCertificate)
  587. return errors.New("tls: could not validate signature of connection nonces: " + err.Error())
  588. }
  589. hs.finishedHash.Write(certVerify.marshal())
  590. }
  591. hs.finishedHash.discardHandshakeBuffer()
  592. return nil
  593. }
  594. func (hs *serverHandshakeState) establishKeys() error {
  595. c := hs.c
  596. clientMAC, serverMAC, clientKey, serverKey, clientIV, serverIV :=
  597. keysFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.clientHello.random, hs.hello.random, hs.suite.macLen, hs.suite.keyLen, hs.suite.ivLen)
  598. var clientCipher, serverCipher interface{}
  599. var clientHash, serverHash macFunction
  600. if hs.suite.aead == nil {
  601. clientCipher = hs.suite.cipher(clientKey, clientIV, true /* for reading */)
  602. clientHash = hs.suite.mac(c.vers, clientMAC)
  603. serverCipher = hs.suite.cipher(serverKey, serverIV, false /* not for reading */)
  604. serverHash = hs.suite.mac(c.vers, serverMAC)
  605. } else {
  606. clientCipher = hs.suite.aead(clientKey, clientIV)
  607. serverCipher = hs.suite.aead(serverKey, serverIV)
  608. }
  609. c.in.prepareCipherSpec(c.vers, clientCipher, clientHash)
  610. c.out.prepareCipherSpec(c.vers, serverCipher, serverHash)
  611. return nil
  612. }
  613. func (hs *serverHandshakeState) readFinished(out []byte) error {
  614. c := hs.c
  615. c.readRecord(recordTypeChangeCipherSpec)
  616. if c.in.err != nil {
  617. return c.in.err
  618. }
  619. if hs.hello.nextProtoNeg {
  620. msg, err := c.readHandshake()
  621. if err != nil {
  622. return err
  623. }
  624. nextProto, ok := msg.(*nextProtoMsg)
  625. if !ok {
  626. c.sendAlert(alertUnexpectedMessage)
  627. return unexpectedMessageError(nextProto, msg)
  628. }
  629. hs.finishedHash.Write(nextProto.marshal())
  630. c.clientProtocol = nextProto.proto
  631. }
  632. msg, err := c.readHandshake()
  633. if err != nil {
  634. return err
  635. }
  636. clientFinished, ok := msg.(*finishedMsg)
  637. if !ok {
  638. c.sendAlert(alertUnexpectedMessage)
  639. return unexpectedMessageError(clientFinished, msg)
  640. }
  641. verify := hs.finishedHash.clientSum(hs.masterSecret)
  642. if len(verify) != len(clientFinished.verifyData) ||
  643. subtle.ConstantTimeCompare(verify, clientFinished.verifyData) != 1 {
  644. c.sendAlert(alertDecryptError)
  645. return errors.New("tls: client's Finished message is incorrect")
  646. }
  647. hs.finishedHash.Write(clientFinished.marshal())
  648. copy(out, verify)
  649. return nil
  650. }
  651. func (hs *serverHandshakeState) sendSessionTicket() error {
  652. if !hs.hello.ticketSupported {
  653. return nil
  654. }
  655. c := hs.c
  656. m := new(newSessionTicketMsg)
  657. var err error
  658. state := sessionState{
  659. vers: c.vers,
  660. cipherSuite: hs.suite.id,
  661. masterSecret: hs.masterSecret,
  662. certificates: hs.certsFromClient,
  663. }
  664. m.ticket, err = c.encryptTicket(state.marshal())
  665. if err != nil {
  666. return err
  667. }
  668. hs.finishedHash.Write(m.marshal())
  669. if _, err := c.writeRecord(recordTypeHandshake, m.marshal()); err != nil {
  670. return err
  671. }
  672. return nil
  673. }
  674. func (hs *serverHandshakeState) sendFinished(out []byte) error {
  675. c := hs.c
  676. if _, err := c.writeRecord(recordTypeChangeCipherSpec, []byte{1}); err != nil {
  677. return err
  678. }
  679. finished := new(finishedMsg)
  680. finished.verifyData = hs.finishedHash.serverSum(hs.masterSecret)
  681. hs.finishedHash.Write(finished.marshal())
  682. if _, err := c.writeRecord(recordTypeHandshake, finished.marshal()); err != nil {
  683. return err
  684. }
  685. c.cipherSuite = hs.suite.id
  686. copy(out, finished.verifyData)
  687. return nil
  688. }
  689. // processCertsFromClient takes a chain of client certificates either from a
  690. // Certificates message or from a sessionState and verifies them. It returns
  691. // the public key of the leaf certificate.
  692. func (hs *serverHandshakeState) processCertsFromClient(certificates [][]byte) (crypto.PublicKey, error) {
  693. c := hs.c
  694. hs.certsFromClient = certificates
  695. certs := make([]*x509.Certificate, len(certificates))
  696. var err error
  697. for i, asn1Data := range certificates {
  698. if certs[i], err = x509.ParseCertificate(asn1Data); err != nil {
  699. c.sendAlert(alertBadCertificate)
  700. return nil, errors.New("tls: failed to parse client certificate: " + err.Error())
  701. }
  702. }
  703. if c.config.ClientAuth >= VerifyClientCertIfGiven && len(certs) > 0 {
  704. opts := x509.VerifyOptions{
  705. Roots: c.config.ClientCAs,
  706. CurrentTime: c.config.time(),
  707. Intermediates: x509.NewCertPool(),
  708. KeyUsages: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth},
  709. }
  710. for _, cert := range certs[1:] {
  711. opts.Intermediates.AddCert(cert)
  712. }
  713. chains, err := certs[0].Verify(opts)
  714. if err != nil {
  715. c.sendAlert(alertBadCertificate)
  716. return nil, errors.New("tls: failed to verify client's certificate: " + err.Error())
  717. }
  718. c.verifiedChains = chains
  719. }
  720. if c.config.VerifyPeerCertificate != nil {
  721. if err := c.config.VerifyPeerCertificate(certificates, c.verifiedChains); err != nil {
  722. c.sendAlert(alertBadCertificate)
  723. return nil, err
  724. }
  725. }
  726. if len(certs) == 0 {
  727. return nil, nil
  728. }
  729. var pub crypto.PublicKey
  730. switch key := certs[0].PublicKey.(type) {
  731. case *ecdsa.PublicKey, *rsa.PublicKey:
  732. pub = key
  733. default:
  734. c.sendAlert(alertUnsupportedCertificate)
  735. return nil, fmt.Errorf("tls: client's certificate contains an unsupported public key of type %T", certs[0].PublicKey)
  736. }
  737. c.peerCertificates = certs
  738. return pub, nil
  739. }
  740. // setCipherSuite sets a cipherSuite with the given id as the serverHandshakeState
  741. // suite if that cipher suite is acceptable to use.
  742. // It returns a bool indicating if the suite was set.
  743. func (hs *serverHandshakeState) setCipherSuite(id uint16, supportedCipherSuites []uint16, version uint16) bool {
  744. for _, supported := range supportedCipherSuites {
  745. if id == supported {
  746. var candidate *cipherSuite
  747. for _, s := range cipherSuites {
  748. if s.id == id {
  749. candidate = s
  750. break
  751. }
  752. }
  753. if candidate == nil {
  754. continue
  755. }
  756. if version >= VersionTLS13 && candidate.flags&suiteTLS13 != 0 {
  757. hs.suite = candidate
  758. return true
  759. }
  760. if version < VersionTLS13 && candidate.flags&suiteTLS13 != 0 {
  761. continue
  762. }
  763. // Don't select a ciphersuite which we can't
  764. // support for this client.
  765. if candidate.flags&suiteECDHE != 0 {
  766. if !hs.ellipticOk {
  767. continue
  768. }
  769. if candidate.flags&suiteECDSA != 0 {
  770. if !hs.ecdsaOk {
  771. continue
  772. }
  773. } else if !hs.rsaSignOk {
  774. continue
  775. }
  776. } else if !hs.rsaDecryptOk {
  777. continue
  778. }
  779. if version < VersionTLS12 && candidate.flags&suiteTLS12 != 0 {
  780. continue
  781. }
  782. hs.suite = candidate
  783. return true
  784. }
  785. }
  786. return false
  787. }
  788. // suppVersArray is the backing array of ClientHelloInfo.SupportedVersions
  789. var suppVersArray = [...]uint16{VersionTLS12, VersionTLS11, VersionTLS10, VersionSSL30}
  790. func (hs *serverHandshakeState) clientHelloInfo() *ClientHelloInfo {
  791. if hs.cachedClientHelloInfo != nil {
  792. return hs.cachedClientHelloInfo
  793. }
  794. var supportedVersions []uint16
  795. if hs.clientHello.supportedVersions != nil {
  796. supportedVersions = hs.clientHello.supportedVersions
  797. } else if hs.clientHello.vers > VersionTLS12 {
  798. supportedVersions = suppVersArray[:]
  799. } else if hs.clientHello.vers >= VersionSSL30 {
  800. supportedVersions = suppVersArray[VersionTLS12-hs.clientHello.vers:]
  801. }
  802. signatureSchemes := make([]SignatureScheme, 0, len(hs.clientHello.signatureAndHashes))
  803. for _, sah := range hs.clientHello.signatureAndHashes {
  804. signatureSchemes = append(signatureSchemes, SignatureScheme(sah.hash)<<8+SignatureScheme(sah.signature))
  805. }
  806. var pskBinder []byte
  807. if len(hs.clientHello.psks) > 0 {
  808. pskBinder = hs.clientHello.psks[0].binder
  809. }
  810. hs.cachedClientHelloInfo = &ClientHelloInfo{
  811. CipherSuites: hs.clientHello.cipherSuites,
  812. ServerName: hs.clientHello.serverName,
  813. SupportedCurves: hs.clientHello.supportedCurves,
  814. SupportedPoints: hs.clientHello.supportedPoints,
  815. SignatureSchemes: signatureSchemes,
  816. SupportedProtos: hs.clientHello.alpnProtocols,
  817. SupportedVersions: supportedVersions,
  818. Conn: hs.c.conn,
  819. Offered0RTTData: hs.clientHello.earlyData,
  820. Fingerprint: pskBinder,
  821. }
  822. return hs.cachedClientHelloInfo
  823. }