25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

928 lines
28 KiB

  1. package tls
  2. import (
  3. "bytes"
  4. "crypto"
  5. "crypto/ecdsa"
  6. "crypto/elliptic"
  7. "crypto/hmac"
  8. "crypto/rsa"
  9. "crypto/subtle"
  10. "encoding/hex"
  11. "errors"
  12. "fmt"
  13. "hash"
  14. "io"
  15. "log"
  16. "os"
  17. "runtime"
  18. "runtime/debug"
  19. "strings"
  20. "sync/atomic"
  21. "time"
  22. "golang_org/x/crypto/curve25519"
  23. )
  24. // numSessionTickets is the number of different session tickets the
  25. // server sends to a TLS 1.3 client, who will use each only once.
  26. const numSessionTickets = 2
  27. type secretLabel int
  28. const (
  29. secretResumptionPskBinder secretLabel = iota
  30. secretEarlyClient
  31. secretHandshakeClient
  32. secretHandshakeServer
  33. secretApplicationClient
  34. secretApplicationServer
  35. secretResumption
  36. )
  37. type keySchedule13 struct {
  38. suite *cipherSuite
  39. transcriptHash hash.Hash // uses the cipher suite hash algo
  40. secret []byte // Current secret as used for Derive-Secret
  41. handshakeCtx []byte // cached handshake context, invalidated on updates.
  42. clientRandom []byte // Used for keylogging, nil if keylogging is disabled.
  43. config *Config // Used for KeyLogWriter callback, nil if keylogging is disabled.
  44. }
  45. func newKeySchedule13(suite *cipherSuite, config *Config, clientRandom []byte) *keySchedule13 {
  46. if config.KeyLogWriter == nil {
  47. clientRandom = nil
  48. config = nil
  49. }
  50. return &keySchedule13{
  51. suite: suite,
  52. transcriptHash: hashForSuite(suite).New(),
  53. clientRandom: clientRandom,
  54. config: config,
  55. }
  56. }
  57. // setSecret sets the early/handshake/master secret based on the given secret
  58. // (IKM). The salt is based on previous secrets (nil for the early secret).
  59. func (ks *keySchedule13) setSecret(secret []byte) {
  60. hash := hashForSuite(ks.suite)
  61. salt := ks.secret
  62. if salt != nil {
  63. h0 := hash.New().Sum(nil)
  64. salt = hkdfExpandLabel(hash, salt, h0, "derived", hash.Size())
  65. }
  66. ks.secret = hkdfExtract(hash, secret, salt)
  67. }
  68. // write appends the data to the transcript hash context.
  69. func (ks *keySchedule13) write(data []byte) {
  70. ks.handshakeCtx = nil
  71. ks.transcriptHash.Write(data)
  72. }
  73. func (ks *keySchedule13) getLabel(secretLabel secretLabel) (label, keylogType string) {
  74. switch secretLabel {
  75. case secretResumptionPskBinder:
  76. label = "res binder"
  77. case secretEarlyClient:
  78. label = "c e traffic"
  79. keylogType = "CLIENT_EARLY_TRAFFIC_SECRET"
  80. case secretHandshakeClient:
  81. label = "c hs traffic"
  82. keylogType = "CLIENT_HANDSHAKE_TRAFFIC_SECRET"
  83. case secretHandshakeServer:
  84. label = "s hs traffic"
  85. keylogType = "SERVER_HANDSHAKE_TRAFFIC_SECRET"
  86. case secretApplicationClient:
  87. label = "c ap traffic"
  88. keylogType = "CLIENT_TRAFFIC_SECRET_0"
  89. case secretApplicationServer:
  90. label = "s ap traffic"
  91. keylogType = "SERVER_TRAFFIC_SECRET_0"
  92. case secretResumption:
  93. label = "res master"
  94. }
  95. return
  96. }
  97. // deriveSecret returns the secret derived from the handshake context and label.
  98. func (ks *keySchedule13) deriveSecret(secretLabel secretLabel) []byte {
  99. label, keylogType := ks.getLabel(secretLabel)
  100. if ks.handshakeCtx == nil {
  101. ks.handshakeCtx = ks.transcriptHash.Sum(nil)
  102. }
  103. hash := hashForSuite(ks.suite)
  104. secret := hkdfExpandLabel(hash, ks.secret, ks.handshakeCtx, label, hash.Size())
  105. if keylogType != "" && ks.config != nil {
  106. ks.config.writeKeyLog(keylogType, ks.clientRandom, secret)
  107. }
  108. return secret
  109. }
  110. func (ks *keySchedule13) prepareCipher(secretLabel secretLabel) (interface{}, []byte) {
  111. trafficSecret := ks.deriveSecret(secretLabel)
  112. hash := hashForSuite(ks.suite)
  113. key := hkdfExpandLabel(hash, trafficSecret, nil, "key", ks.suite.keyLen)
  114. iv := hkdfExpandLabel(hash, trafficSecret, nil, "iv", ks.suite.ivLen)
  115. return ks.suite.aead(key, iv), trafficSecret
  116. }
  117. func (hs *serverHandshakeState) doTLS13Handshake() error {
  118. config := hs.c.config
  119. c := hs.c
  120. hs.c.cipherSuite, hs.hello.cipherSuite = hs.suite.id, hs.suite.id
  121. hs.c.clientHello = hs.clientHello.marshal()
  122. // When picking the group for the handshake, priority is given to groups
  123. // that the client provided a keyShare for, so to avoid a round-trip.
  124. // After that the order of CurvePreferences is respected.
  125. var ks keyShare
  126. CurvePreferenceLoop:
  127. for _, curveID := range config.curvePreferences() {
  128. for _, keyShare := range hs.clientHello.keyShares {
  129. if curveID == keyShare.group {
  130. ks = keyShare
  131. break CurvePreferenceLoop
  132. }
  133. }
  134. }
  135. if ks.group == 0 {
  136. c.sendAlert(alertInternalError)
  137. return errors.New("tls: HelloRetryRequest not implemented") // TODO(filippo)
  138. }
  139. if committer, ok := c.conn.(Committer); ok {
  140. if err := committer.Commit(); err != nil {
  141. return err
  142. }
  143. }
  144. privateKey, serverKS, err := config.generateKeyShare(ks.group)
  145. if err != nil {
  146. c.sendAlert(alertInternalError)
  147. return err
  148. }
  149. hs.hello.keyShare = serverKS
  150. hash := hashForSuite(hs.suite)
  151. hashSize := hash.Size()
  152. hs.keySchedule = newKeySchedule13(hs.suite, config, hs.clientHello.random)
  153. // Check for PSK and update key schedule with new early secret key
  154. isResumed, pskAlert := hs.checkPSK()
  155. switch {
  156. case pskAlert != alertSuccess:
  157. c.sendAlert(pskAlert)
  158. return errors.New("tls: invalid client PSK")
  159. case !isResumed:
  160. // apply an empty PSK if not resumed.
  161. hs.keySchedule.setSecret(nil)
  162. case isResumed:
  163. c.didResume = true
  164. }
  165. hs.keySchedule.write(hs.clientHello.marshal())
  166. earlyClientCipher, _ := hs.keySchedule.prepareCipher(secretEarlyClient)
  167. ecdheSecret := deriveECDHESecret(ks, privateKey)
  168. if ecdheSecret == nil {
  169. c.sendAlert(alertIllegalParameter)
  170. return errors.New("tls: bad ECDHE client share")
  171. }
  172. hs.keySchedule.write(hs.hello.marshal())
  173. if _, err := c.writeRecord(recordTypeHandshake, hs.hello.marshal()); err != nil {
  174. return err
  175. }
  176. // middlebox compatibility mode: send CCS after first handshake message
  177. if _, err := c.writeRecord(recordTypeChangeCipherSpec, []byte{1}); err != nil {
  178. return err
  179. }
  180. hs.keySchedule.setSecret(ecdheSecret)
  181. clientCipher, cTrafficSecret := hs.keySchedule.prepareCipher(secretHandshakeClient)
  182. hs.hsClientCipher = clientCipher
  183. serverCipher, sTrafficSecret := hs.keySchedule.prepareCipher(secretHandshakeServer)
  184. c.out.setCipher(c.vers, serverCipher)
  185. serverFinishedKey := hkdfExpandLabel(hash, sTrafficSecret, nil, "finished", hashSize)
  186. hs.clientFinishedKey = hkdfExpandLabel(hash, cTrafficSecret, nil, "finished", hashSize)
  187. hs.keySchedule.write(hs.hello13Enc.marshal())
  188. if _, err := c.writeRecord(recordTypeHandshake, hs.hello13Enc.marshal()); err != nil {
  189. return err
  190. }
  191. if !c.didResume {
  192. if err := hs.sendCertificate13(); err != nil {
  193. return err
  194. }
  195. }
  196. verifyData := hmacOfSum(hash, hs.keySchedule.transcriptHash, serverFinishedKey)
  197. serverFinished := &finishedMsg{
  198. verifyData: verifyData,
  199. }
  200. hs.keySchedule.write(serverFinished.marshal())
  201. if _, err := c.writeRecord(recordTypeHandshake, serverFinished.marshal()); err != nil {
  202. return err
  203. }
  204. hs.keySchedule.setSecret(nil) // derive master secret
  205. hs.appClientCipher, _ = hs.keySchedule.prepareCipher(secretApplicationClient)
  206. serverCipher, _ = hs.keySchedule.prepareCipher(secretApplicationServer)
  207. c.out.setCipher(c.vers, serverCipher)
  208. if c.hand.Len() > 0 {
  209. return c.sendAlert(alertUnexpectedMessage)
  210. }
  211. if hs.hello13Enc.earlyData {
  212. c.in.setCipher(c.vers, earlyClientCipher)
  213. c.phase = readingEarlyData
  214. } else if hs.clientHello.earlyData {
  215. c.in.setCipher(c.vers, hs.hsClientCipher)
  216. c.phase = discardingEarlyData
  217. } else {
  218. c.in.setCipher(c.vers, hs.hsClientCipher)
  219. c.phase = waitingClientFinished
  220. }
  221. return nil
  222. }
  223. // readClientFinished13 is called during the server handshake (when no early
  224. // data it available) or after reading all early data. It discards early data if
  225. // the server did not accept it and then verifies the Finished message. Once
  226. // done it sends the session tickets. Under c.in lock.
  227. func (hs *serverHandshakeState) readClientFinished13(hasConfirmLock bool) error {
  228. c := hs.c
  229. // If the client advertised and sends early data while the server does
  230. // not accept it, it must be fully skipped until the Finished message.
  231. for c.phase == discardingEarlyData {
  232. if err := c.readRecord(recordTypeApplicationData); err != nil {
  233. return err
  234. }
  235. // Assume receipt of Finished message (will be checked below).
  236. if c.hand.Len() > 0 {
  237. c.phase = waitingClientFinished
  238. break
  239. }
  240. }
  241. // If the client sends early data followed by a Finished message (but
  242. // no end_of_early_data), the server MUST terminate the connection.
  243. if c.phase != waitingClientFinished {
  244. c.sendAlert(alertUnexpectedMessage)
  245. return errors.New("tls: did not expect Client Finished yet")
  246. }
  247. c.phase = readingClientFinished
  248. msg, err := c.readHandshake()
  249. if err != nil {
  250. return err
  251. }
  252. clientFinished, ok := msg.(*finishedMsg)
  253. if !ok {
  254. c.sendAlert(alertUnexpectedMessage)
  255. return unexpectedMessageError(clientFinished, msg)
  256. }
  257. hash := hashForSuite(hs.suite)
  258. expectedVerifyData := hmacOfSum(hash, hs.keySchedule.transcriptHash, hs.clientFinishedKey)
  259. if len(expectedVerifyData) != len(clientFinished.verifyData) ||
  260. subtle.ConstantTimeCompare(expectedVerifyData, clientFinished.verifyData) != 1 {
  261. c.sendAlert(alertDecryptError)
  262. return errors.New("tls: client's Finished message is incorrect")
  263. }
  264. hs.keySchedule.write(clientFinished.marshal())
  265. c.hs = nil // Discard the server handshake state
  266. if c.hand.Len() > 0 {
  267. return c.sendAlert(alertUnexpectedMessage)
  268. }
  269. c.in.setCipher(c.vers, hs.appClientCipher)
  270. c.in.traceErr, c.out.traceErr = nil, nil
  271. c.phase = handshakeConfirmed
  272. atomic.StoreInt32(&c.handshakeConfirmed, 1)
  273. // Any read operation after handshakeRunning and before handshakeConfirmed
  274. // will be holding this lock, which we release as soon as the confirmation
  275. // happens, even if the Read call might do more work.
  276. // If a Handshake is pending, c.confirmMutex will never be locked as
  277. // ConfirmHandshake will wait for the handshake to complete. If a
  278. // handshake was complete, and this was a confirmation, unlock
  279. // c.confirmMutex now to allow readers to proceed.
  280. if hasConfirmLock {
  281. c.confirmMutex.Unlock()
  282. }
  283. return hs.sendSessionTicket13() // TODO: do in a goroutine
  284. }
  285. func (hs *serverHandshakeState) sendCertificate13() error {
  286. c := hs.c
  287. certEntries := []certificateEntry{}
  288. for _, cert := range hs.cert.Certificate {
  289. certEntries = append(certEntries, certificateEntry{data: cert})
  290. }
  291. if len(certEntries) > 0 && hs.clientHello.ocspStapling {
  292. certEntries[0].ocspStaple = hs.cert.OCSPStaple
  293. }
  294. if len(certEntries) > 0 && hs.clientHello.scts {
  295. certEntries[0].sctList = hs.cert.SignedCertificateTimestamps
  296. }
  297. certMsg := &certificateMsg13{certificates: certEntries}
  298. hs.keySchedule.write(certMsg.marshal())
  299. if _, err := c.writeRecord(recordTypeHandshake, certMsg.marshal()); err != nil {
  300. return err
  301. }
  302. sigScheme, err := hs.selectTLS13SignatureScheme()
  303. if err != nil {
  304. c.sendAlert(alertInternalError)
  305. return err
  306. }
  307. sigHash := hashForSignatureScheme(sigScheme)
  308. opts := crypto.SignerOpts(sigHash)
  309. if signatureSchemeIsPSS(sigScheme) {
  310. opts = &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash, Hash: sigHash}
  311. }
  312. toSign := prepareDigitallySigned(sigHash, "TLS 1.3, server CertificateVerify", hs.keySchedule.transcriptHash.Sum(nil))
  313. signature, err := hs.cert.PrivateKey.(crypto.Signer).Sign(c.config.rand(), toSign[:], opts)
  314. if err != nil {
  315. c.sendAlert(alertInternalError)
  316. return err
  317. }
  318. verifyMsg := &certificateVerifyMsg{
  319. hasSignatureAndHash: true,
  320. signatureAlgorithm: sigScheme,
  321. signature: signature,
  322. }
  323. hs.keySchedule.write(verifyMsg.marshal())
  324. if _, err := c.writeRecord(recordTypeHandshake, verifyMsg.marshal()); err != nil {
  325. return err
  326. }
  327. return nil
  328. }
  329. func (c *Conn) handleEndOfEarlyData() error {
  330. if c.phase != readingEarlyData || c.vers < VersionTLS13 {
  331. return c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage))
  332. }
  333. msg, err := c.readHandshake()
  334. if err != nil {
  335. return err
  336. }
  337. endOfEarlyData, ok := msg.(*endOfEarlyDataMsg)
  338. // No handshake messages are allowed after EOD.
  339. if !ok || c.hand.Len() > 0 {
  340. return c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage))
  341. }
  342. c.hs.keySchedule.write(endOfEarlyData.marshal())
  343. c.phase = waitingClientFinished
  344. c.in.setCipher(c.vers, c.hs.hsClientCipher)
  345. return nil
  346. }
  347. // selectTLS13SignatureScheme chooses the SignatureScheme for the CertificateVerify
  348. // based on the certificate type and client supported schemes. If no overlap is found,
  349. // a fallback is selected.
  350. //
  351. // See https://tools.ietf.org/html/draft-ietf-tls-tls13-18#section-4.4.1.2
  352. func (hs *serverHandshakeState) selectTLS13SignatureScheme() (sigScheme SignatureScheme, err error) {
  353. var supportedSchemes []SignatureScheme
  354. signer, ok := hs.cert.PrivateKey.(crypto.Signer)
  355. if !ok {
  356. return 0, errors.New("tls: certificate private key does not implement crypto.Signer")
  357. }
  358. pk := signer.Public()
  359. if _, ok := pk.(*rsa.PublicKey); ok {
  360. sigScheme = PSSWithSHA256
  361. supportedSchemes = []SignatureScheme{PSSWithSHA256, PSSWithSHA384, PSSWithSHA512}
  362. } else if pk, ok := pk.(*ecdsa.PublicKey); ok {
  363. switch pk.Curve {
  364. case elliptic.P256():
  365. sigScheme = ECDSAWithP256AndSHA256
  366. supportedSchemes = []SignatureScheme{ECDSAWithP256AndSHA256}
  367. case elliptic.P384():
  368. sigScheme = ECDSAWithP384AndSHA384
  369. supportedSchemes = []SignatureScheme{ECDSAWithP384AndSHA384}
  370. case elliptic.P521():
  371. sigScheme = ECDSAWithP521AndSHA512
  372. supportedSchemes = []SignatureScheme{ECDSAWithP521AndSHA512}
  373. default:
  374. return 0, errors.New("tls: unknown ECDSA certificate curve")
  375. }
  376. } else {
  377. return 0, errors.New("tls: unknown certificate key type")
  378. }
  379. for _, ss := range supportedSchemes {
  380. for _, cs := range hs.clientHello.supportedSignatureAlgorithms {
  381. if ss == cs {
  382. return ss, nil
  383. }
  384. }
  385. }
  386. return sigScheme, nil
  387. }
  388. func signatureSchemeIsPSS(s SignatureScheme) bool {
  389. return s == PSSWithSHA256 || s == PSSWithSHA384 || s == PSSWithSHA512
  390. }
  391. // hashForSignatureScheme returns the Hash used by a SignatureScheme which is
  392. // supported by selectTLS13SignatureScheme.
  393. func hashForSignatureScheme(ss SignatureScheme) crypto.Hash {
  394. switch ss {
  395. case PSSWithSHA256, ECDSAWithP256AndSHA256:
  396. return crypto.SHA256
  397. case PSSWithSHA384, ECDSAWithP384AndSHA384:
  398. return crypto.SHA384
  399. case PSSWithSHA512, ECDSAWithP521AndSHA512:
  400. return crypto.SHA512
  401. default:
  402. panic("unsupported SignatureScheme passed to hashForSignatureScheme")
  403. }
  404. }
  405. func hashForSuite(suite *cipherSuite) crypto.Hash {
  406. if suite.flags&suiteSHA384 != 0 {
  407. return crypto.SHA384
  408. }
  409. return crypto.SHA256
  410. }
  411. func prepareDigitallySigned(hash crypto.Hash, context string, data []byte) []byte {
  412. message := bytes.Repeat([]byte{32}, 64)
  413. message = append(message, context...)
  414. message = append(message, 0)
  415. message = append(message, data...)
  416. h := hash.New()
  417. h.Write(message)
  418. return h.Sum(nil)
  419. }
  420. func (c *Config) generateKeyShare(curveID CurveID) ([]byte, keyShare, error) {
  421. if curveID == X25519 {
  422. var scalar, public [32]byte
  423. if _, err := io.ReadFull(c.rand(), scalar[:]); err != nil {
  424. return nil, keyShare{}, err
  425. }
  426. curve25519.ScalarBaseMult(&public, &scalar)
  427. return scalar[:], keyShare{group: curveID, data: public[:]}, nil
  428. }
  429. curve, ok := curveForCurveID(curveID)
  430. if !ok {
  431. return nil, keyShare{}, errors.New("tls: preferredCurves includes unsupported curve")
  432. }
  433. privateKey, x, y, err := elliptic.GenerateKey(curve, c.rand())
  434. if err != nil {
  435. return nil, keyShare{}, err
  436. }
  437. ecdhePublic := elliptic.Marshal(curve, x, y)
  438. return privateKey, keyShare{group: curveID, data: ecdhePublic}, nil
  439. }
  440. func deriveECDHESecret(ks keyShare, secretKey []byte) []byte {
  441. if ks.group == X25519 {
  442. if len(ks.data) != 32 {
  443. return nil
  444. }
  445. var theirPublic, sharedKey, scalar [32]byte
  446. copy(theirPublic[:], ks.data)
  447. copy(scalar[:], secretKey)
  448. curve25519.ScalarMult(&sharedKey, &scalar, &theirPublic)
  449. return sharedKey[:]
  450. }
  451. curve, ok := curveForCurveID(ks.group)
  452. if !ok {
  453. return nil
  454. }
  455. x, y := elliptic.Unmarshal(curve, ks.data)
  456. if x == nil {
  457. return nil
  458. }
  459. x, _ = curve.ScalarMult(x, y, secretKey)
  460. xBytes := x.Bytes()
  461. curveSize := (curve.Params().BitSize + 8 - 1) >> 3
  462. if len(xBytes) == curveSize {
  463. return xBytes
  464. }
  465. buf := make([]byte, curveSize)
  466. copy(buf[len(buf)-len(xBytes):], xBytes)
  467. return buf
  468. }
  469. func hkdfExpandLabel(hash crypto.Hash, secret, hashValue []byte, label string, L int) []byte {
  470. prefix := "tls13 "
  471. hkdfLabel := make([]byte, 4+len(prefix)+len(label)+len(hashValue))
  472. hkdfLabel[0] = byte(L >> 8)
  473. hkdfLabel[1] = byte(L)
  474. hkdfLabel[2] = byte(len(prefix) + len(label))
  475. copy(hkdfLabel[3:], prefix)
  476. z := hkdfLabel[3+len(prefix):]
  477. copy(z, label)
  478. z = z[len(label):]
  479. z[0] = byte(len(hashValue))
  480. copy(z[1:], hashValue)
  481. return hkdfExpand(hash, secret, hkdfLabel, L)
  482. }
  483. func hmacOfSum(f crypto.Hash, hash hash.Hash, key []byte) []byte {
  484. h := hmac.New(f.New, key)
  485. h.Write(hash.Sum(nil))
  486. return h.Sum(nil)
  487. }
  488. // Maximum allowed mismatch between the stated age of a ticket
  489. // and the server-observed one. See
  490. // https://tools.ietf.org/html/draft-ietf-tls-tls13-18#section-4.2.8.2.
  491. const ticketAgeSkewAllowance = 10 * time.Second
  492. // checkPSK tries to resume using a PSK, returning true (and updating the
  493. // early secret in the key schedule) if the PSK was used and false otherwise.
  494. func (hs *serverHandshakeState) checkPSK() (isResumed bool, alert alert) {
  495. if hs.c.config.SessionTicketsDisabled {
  496. return false, alertSuccess
  497. }
  498. foundDHE := false
  499. for _, mode := range hs.clientHello.pskKeyExchangeModes {
  500. if mode == pskDHEKeyExchange {
  501. foundDHE = true
  502. break
  503. }
  504. }
  505. if !foundDHE {
  506. return false, alertSuccess
  507. }
  508. hash := hashForSuite(hs.suite)
  509. hashSize := hash.Size()
  510. for i := range hs.clientHello.psks {
  511. sessionTicket := append([]uint8{}, hs.clientHello.psks[i].identity...)
  512. if hs.c.config.SessionTicketSealer != nil {
  513. var ok bool
  514. sessionTicket, ok = hs.c.config.SessionTicketSealer.Unseal(hs.clientHelloInfo(), sessionTicket)
  515. if !ok {
  516. continue
  517. }
  518. } else {
  519. sessionTicket, _ = hs.c.decryptTicket(sessionTicket)
  520. if sessionTicket == nil {
  521. continue
  522. }
  523. }
  524. s := &sessionState13{}
  525. if s.unmarshal(sessionTicket) != alertSuccess {
  526. continue
  527. }
  528. if s.vers != hs.c.vers {
  529. continue
  530. }
  531. clientAge := time.Duration(hs.clientHello.psks[i].obfTicketAge-s.ageAdd) * time.Millisecond
  532. serverAge := time.Since(time.Unix(int64(s.createdAt), 0))
  533. if clientAge-serverAge > ticketAgeSkewAllowance || clientAge-serverAge < -ticketAgeSkewAllowance {
  534. // XXX: NSS is off spec and sends obfuscated_ticket_age as seconds
  535. clientAge = time.Duration(hs.clientHello.psks[i].obfTicketAge-s.ageAdd) * time.Second
  536. if clientAge-serverAge > ticketAgeSkewAllowance || clientAge-serverAge < -ticketAgeSkewAllowance {
  537. continue
  538. }
  539. }
  540. // This enforces the stricter 0-RTT requirements on all ticket uses.
  541. // The benefit of using PSK+ECDHE without 0-RTT are small enough that
  542. // we can give them up in the edge case of changed suite or ALPN or SNI.
  543. if s.suite != hs.suite.id {
  544. continue
  545. }
  546. if s.alpnProtocol != hs.c.clientProtocol {
  547. continue
  548. }
  549. if s.SNI != hs.c.serverName {
  550. continue
  551. }
  552. hs.keySchedule.setSecret(s.pskSecret)
  553. binderKey := hs.keySchedule.deriveSecret(secretResumptionPskBinder)
  554. binderFinishedKey := hkdfExpandLabel(hash, binderKey, nil, "finished", hashSize)
  555. chHash := hash.New()
  556. chHash.Write(hs.clientHello.rawTruncated)
  557. expectedBinder := hmacOfSum(hash, chHash, binderFinishedKey)
  558. if subtle.ConstantTimeCompare(expectedBinder, hs.clientHello.psks[i].binder) != 1 {
  559. return false, alertDecryptError
  560. }
  561. if i == 0 && hs.clientHello.earlyData {
  562. // This is a ticket intended to be used for 0-RTT
  563. if s.maxEarlyDataLen == 0 {
  564. // But we had not tagged it as such.
  565. return false, alertIllegalParameter
  566. }
  567. if hs.c.config.Accept0RTTData {
  568. hs.c.binder = expectedBinder
  569. hs.c.ticketMaxEarlyData = int64(s.maxEarlyDataLen)
  570. hs.hello13Enc.earlyData = true
  571. }
  572. }
  573. hs.hello.psk = true
  574. hs.hello.pskIdentity = uint16(i)
  575. return true, alertSuccess
  576. }
  577. return false, alertSuccess
  578. }
  579. func (hs *serverHandshakeState) sendSessionTicket13() error {
  580. c := hs.c
  581. if c.config.SessionTicketsDisabled {
  582. return nil
  583. }
  584. foundDHE := false
  585. for _, mode := range hs.clientHello.pskKeyExchangeModes {
  586. if mode == pskDHEKeyExchange {
  587. foundDHE = true
  588. break
  589. }
  590. }
  591. if !foundDHE {
  592. return nil
  593. }
  594. resumptionMasterSecret := hs.keySchedule.deriveSecret(secretResumption)
  595. ageAddBuf := make([]byte, 4)
  596. sessionState := &sessionState13{
  597. vers: c.vers,
  598. suite: hs.suite.id,
  599. createdAt: uint64(time.Now().Unix()),
  600. alpnProtocol: c.clientProtocol,
  601. SNI: c.serverName,
  602. maxEarlyDataLen: c.config.Max0RTTDataSize,
  603. }
  604. hash := hashForSuite(hs.suite)
  605. for i := 0; i < numSessionTickets; i++ {
  606. if _, err := io.ReadFull(c.config.rand(), ageAddBuf); err != nil {
  607. c.sendAlert(alertInternalError)
  608. return err
  609. }
  610. sessionState.ageAdd = uint32(ageAddBuf[0])<<24 | uint32(ageAddBuf[1])<<16 |
  611. uint32(ageAddBuf[2])<<8 | uint32(ageAddBuf[3])
  612. // ticketNonce must be a unique value for this connection.
  613. // Assume there are no more than 255 tickets, otherwise two
  614. // tickets might have the same PSK which could be a problem if
  615. // one of them is compromised.
  616. ticketNonce := []byte{byte(i)}
  617. sessionState.pskSecret = hkdfExpandLabel(hash, resumptionMasterSecret, ticketNonce, "resumption", hash.Size())
  618. ticket := sessionState.marshal()
  619. var err error
  620. if c.config.SessionTicketSealer != nil {
  621. cs := c.ConnectionState()
  622. ticket, err = c.config.SessionTicketSealer.Seal(&cs, ticket)
  623. } else {
  624. ticket, err = c.encryptTicket(ticket)
  625. }
  626. if err != nil {
  627. c.sendAlert(alertInternalError)
  628. return err
  629. }
  630. if ticket == nil {
  631. continue
  632. }
  633. ticketMsg := &newSessionTicketMsg13{
  634. lifetime: 24 * 3600, // TODO(filippo)
  635. maxEarlyDataLength: c.config.Max0RTTDataSize,
  636. withEarlyDataInfo: c.config.Max0RTTDataSize > 0,
  637. ageAdd: sessionState.ageAdd,
  638. nonce: ticketNonce,
  639. ticket: ticket,
  640. }
  641. if _, err := c.writeRecord(recordTypeHandshake, ticketMsg.marshal()); err != nil {
  642. return err
  643. }
  644. }
  645. return nil
  646. }
  647. func (hs *serverHandshakeState) traceErr(err error) {
  648. if err == nil {
  649. return
  650. }
  651. if os.Getenv("TLSDEBUG") == "error" {
  652. if hs != nil && hs.clientHello != nil {
  653. os.Stderr.WriteString(hex.Dump(hs.clientHello.marshal()))
  654. } else if err == io.EOF {
  655. return // don't stack trace on EOF before CH
  656. }
  657. fmt.Fprintf(os.Stderr, "\n%s\n", debug.Stack())
  658. }
  659. if os.Getenv("TLSDEBUG") == "short" {
  660. var pcs [4]uintptr
  661. frames := runtime.CallersFrames(pcs[0:runtime.Callers(3, pcs[:])])
  662. for {
  663. frame, more := frames.Next()
  664. if frame.Function != "crypto/tls.(*halfConn).setErrorLocked" &&
  665. frame.Function != "crypto/tls.(*Conn).sendAlertLocked" &&
  666. frame.Function != "crypto/tls.(*Conn).sendAlert" {
  667. file := frame.File[strings.LastIndex(frame.File, "/")+1:]
  668. log.Printf("%s:%d (%s): %v", file, frame.Line, frame.Function, err)
  669. return
  670. }
  671. if !more {
  672. break
  673. }
  674. }
  675. }
  676. }
  677. func (hs *clientHandshakeState) processCertsFromServer13(certMsg *certificateMsg13) error {
  678. certs := make([][]byte, len(certMsg.certificates))
  679. for i, cert := range certMsg.certificates {
  680. certs[i] = cert.data
  681. }
  682. return hs.processCertsFromServer(certs)
  683. }
  684. func (hs *clientHandshakeState) processEncryptedExtensions(ee *encryptedExtensionsMsg) error {
  685. c := hs.c
  686. if ee.alpnProtocol != "" {
  687. c.clientProtocol = ee.alpnProtocol
  688. c.clientProtocolFallback = false
  689. }
  690. return nil
  691. }
  692. func (hs *clientHandshakeState) verifyPeerCertificate(certVerify *certificateVerifyMsg) error {
  693. pub := hs.c.peerCertificates[0].PublicKey
  694. _, sigType, hashFunc, err := pickSignatureAlgorithm(pub, []SignatureScheme{certVerify.signatureAlgorithm}, hs.hello.supportedSignatureAlgorithms, hs.c.vers)
  695. if err != nil {
  696. hs.c.sendAlert(alertHandshakeFailure)
  697. return err
  698. }
  699. digest := prepareDigitallySigned(hashFunc, "TLS 1.3, server CertificateVerify", hs.keySchedule.transcriptHash.Sum(nil))
  700. err = verifyHandshakeSignature(sigType, pub, hashFunc, digest, certVerify.signature)
  701. if err != nil {
  702. hs.c.sendAlert(alertDecryptError)
  703. return err
  704. }
  705. return nil
  706. }
  707. func (hs *clientHandshakeState) doTLS13Handshake() error {
  708. c := hs.c
  709. hash := hashForSuite(hs.suite)
  710. hashSize := hash.Size()
  711. serverHello := hs.serverHello
  712. // middlebox compatibility mode, send CCS before second flight.
  713. if _, err := c.writeRecord(recordTypeChangeCipherSpec, []byte{1}); err != nil {
  714. return err
  715. }
  716. // TODO check if keyshare is unacceptable, raise HRR.
  717. clientKS := hs.hello.keyShares[0]
  718. if serverHello.keyShare.group != clientKS.group {
  719. c.sendAlert(alertIllegalParameter)
  720. return errors.New("bad or missing key share from server")
  721. }
  722. // 0-RTT is not supported yet, so use an empty PSK.
  723. hs.keySchedule.setSecret(nil)
  724. ecdheSecret := deriveECDHESecret(serverHello.keyShare, hs.privateKey)
  725. if ecdheSecret == nil {
  726. c.sendAlert(alertIllegalParameter)
  727. return errors.New("tls: bad ECDHE server share")
  728. }
  729. // Calculate handshake secrets.
  730. hs.keySchedule.setSecret(ecdheSecret)
  731. clientCipher, clientHandshakeSecret := hs.keySchedule.prepareCipher(secretHandshakeClient)
  732. serverCipher, serverHandshakeSecret := hs.keySchedule.prepareCipher(secretHandshakeServer)
  733. if c.hand.Len() > 0 {
  734. c.sendAlert(alertUnexpectedMessage)
  735. return errors.New("tls: unexpected data after Server Hello")
  736. }
  737. // Do not change the sender key yet, the server must authenticate first.
  738. c.in.setCipher(c.vers, serverCipher)
  739. // Calculate MAC key for Finished messages.
  740. serverFinishedKey := hkdfExpandLabel(hash, serverHandshakeSecret, nil, "finished", hashSize)
  741. clientFinishedKey := hkdfExpandLabel(hash, clientHandshakeSecret, nil, "finished", hashSize)
  742. msg, err := c.readHandshake()
  743. if err != nil {
  744. return err
  745. }
  746. encryptedExtensions, ok := msg.(*encryptedExtensionsMsg)
  747. if !ok {
  748. c.sendAlert(alertUnexpectedMessage)
  749. return unexpectedMessageError(encryptedExtensions, msg)
  750. }
  751. if err := hs.processEncryptedExtensions(encryptedExtensions); err != nil {
  752. return err
  753. }
  754. hs.keySchedule.write(encryptedExtensions.marshal())
  755. // PSKs are not supported, so receive Certificate message.
  756. msg, err = c.readHandshake()
  757. if err != nil {
  758. return err
  759. }
  760. // TODO handle optional CertificateRequest
  761. certMsg, ok := msg.(*certificateMsg13)
  762. if !ok {
  763. c.sendAlert(alertUnexpectedMessage)
  764. return unexpectedMessageError(certMsg, msg)
  765. }
  766. hs.keySchedule.write(certMsg.marshal())
  767. // Validate certificates.
  768. if err := hs.processCertsFromServer13(certMsg); err != nil {
  769. return err
  770. }
  771. // Receive CertificateVerify message.
  772. msg, err = c.readHandshake()
  773. if err != nil {
  774. return err
  775. }
  776. certVerifyMsg, ok := msg.(*certificateVerifyMsg)
  777. if !ok {
  778. c.sendAlert(alertUnexpectedMessage)
  779. return unexpectedMessageError(certVerifyMsg, msg)
  780. }
  781. if err = hs.verifyPeerCertificate(certVerifyMsg); err != nil {
  782. return err
  783. }
  784. hs.keySchedule.write(certVerifyMsg.marshal())
  785. // Receive Finished message.
  786. msg, err = c.readHandshake()
  787. if err != nil {
  788. return err
  789. }
  790. serverFinished, ok := msg.(*finishedMsg)
  791. if !ok {
  792. c.sendAlert(alertUnexpectedMessage)
  793. return unexpectedMessageError(serverFinished, msg)
  794. }
  795. // Validate server Finished hash.
  796. expectedVerifyData := hmacOfSum(hash, hs.keySchedule.transcriptHash, serverFinishedKey)
  797. if subtle.ConstantTimeCompare(expectedVerifyData, serverFinished.verifyData) != 1 {
  798. c.sendAlert(alertDecryptError)
  799. return errors.New("tls: server's Finished message is incorrect")
  800. }
  801. hs.keySchedule.write(serverFinished.marshal())
  802. // Server has authenticated itself, change our cipher.
  803. c.out.setCipher(c.vers, clientCipher)
  804. // TODO optionally send a client cert
  805. // Send Finished
  806. verifyData := hmacOfSum(hash, hs.keySchedule.transcriptHash, clientFinishedKey)
  807. clientFinished := &finishedMsg{
  808. verifyData: verifyData,
  809. }
  810. if _, err := c.writeRecord(recordTypeHandshake, clientFinished.marshal()); err != nil {
  811. return err
  812. }
  813. // Calculate application traffic secrets.
  814. hs.keySchedule.setSecret(nil) // derive master secret
  815. // TODO store initial traffic secret key for KeyUpdate
  816. clientCipher, _ = hs.keySchedule.prepareCipher(secretApplicationClient)
  817. serverCipher, _ = hs.keySchedule.prepareCipher(secretApplicationServer)
  818. c.out.setCipher(c.vers, clientCipher)
  819. if c.hand.Len() > 0 {
  820. c.sendAlert(alertUnexpectedMessage)
  821. return errors.New("tls: unexpected data after handshake")
  822. }
  823. c.in.setCipher(c.vers, serverCipher)
  824. return nil
  825. }