handshake_server.go 23 KB

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