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

1116 regels
33 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. // EncryptedExtensions
  188. hs.keySchedule.write(hs.hello13Enc.marshal())
  189. if _, err := c.writeRecord(recordTypeHandshake, hs.hello13Enc.marshal()); err != nil {
  190. return err
  191. }
  192. // TODO: we should have 2 separated methods - one for full-handshake and the other for PSK-handshake
  193. if !c.didResume {
  194. // Server MUST NOT send CertificateRequest if authenticating with PSK
  195. if c.config.ClientAuth >= RequestClientCert {
  196. certReq := new(certificateRequestMsg13)
  197. // extension 'signature_algorithms' MUST be specified
  198. certReq.supportedSignatureAlgorithms = supportedSignatureAlgorithms13
  199. hs.keySchedule.write(certReq.marshal())
  200. if _, err := hs.c.writeRecord(recordTypeHandshake, certReq.marshal()); err != nil {
  201. return err
  202. }
  203. }
  204. if err := hs.sendCertificate13(); err != nil {
  205. return err
  206. }
  207. }
  208. verifyData := hmacOfSum(hash, hs.keySchedule.transcriptHash, serverFinishedKey)
  209. serverFinished := &finishedMsg{
  210. verifyData: verifyData,
  211. }
  212. hs.keySchedule.write(serverFinished.marshal())
  213. if _, err := c.writeRecord(recordTypeHandshake, serverFinished.marshal()); err != nil {
  214. return err
  215. }
  216. hs.keySchedule.setSecret(nil) // derive master secret
  217. hs.appClientCipher, _ = hs.keySchedule.prepareCipher(secretApplicationClient)
  218. serverCipher, _ = hs.keySchedule.prepareCipher(secretApplicationServer)
  219. c.out.setCipher(c.vers, serverCipher)
  220. if c.hand.Len() > 0 {
  221. return c.sendAlert(alertUnexpectedMessage)
  222. }
  223. if hs.hello13Enc.earlyData {
  224. c.in.setCipher(c.vers, earlyClientCipher)
  225. c.phase = readingEarlyData
  226. } else if hs.clientHello.earlyData {
  227. c.in.setCipher(c.vers, hs.hsClientCipher)
  228. c.phase = discardingEarlyData
  229. } else {
  230. c.in.setCipher(c.vers, hs.hsClientCipher)
  231. c.phase = waitingClientFinished
  232. }
  233. return nil
  234. }
  235. // readClientFinished13 is called during the server handshake (when no early
  236. // data it available) or after reading all early data. It discards early data if
  237. // the server did not accept it and then verifies the Finished message. Once
  238. // done it sends the session tickets. Under c.in lock.
  239. func (hs *serverHandshakeState) readClientFinished13(hasConfirmLock bool) error {
  240. c := hs.c
  241. // If the client advertised and sends early data while the server does
  242. // not accept it, it must be fully skipped until the Finished message.
  243. for c.phase == discardingEarlyData {
  244. if err := c.readRecord(recordTypeApplicationData); err != nil {
  245. return err
  246. }
  247. // Assume receipt of Finished message (will be checked below).
  248. if c.hand.Len() > 0 {
  249. c.phase = waitingClientFinished
  250. break
  251. }
  252. }
  253. // If the client sends early data followed by a Finished message (but
  254. // no end_of_early_data), the server MUST terminate the connection.
  255. if c.phase != waitingClientFinished {
  256. c.sendAlert(alertUnexpectedMessage)
  257. return errors.New("tls: did not expect Client Finished yet")
  258. }
  259. c.phase = readingClientFinished
  260. msg, err := c.readHandshake()
  261. if err != nil {
  262. return err
  263. }
  264. // client authentication
  265. if certMsg, ok := msg.(*certificateMsg13); ok {
  266. // (4.4.2) Client MUST send certificate msg if requested by server
  267. if c.config.ClientAuth < RequestClientCert {
  268. c.sendAlert(alertUnexpectedMessage)
  269. return unexpectedMessageError(certMsg, msg)
  270. }
  271. hs.keySchedule.write(certMsg.marshal())
  272. certs := getCertsFromEntries(certMsg.certificates)
  273. pubKey, err := hs.processCertsFromClient(certs)
  274. if err != nil {
  275. return err
  276. }
  277. // 4.4.3: CertificateVerify MUST appear immediately after Certificate msg
  278. msg, err = c.readHandshake()
  279. if err != nil {
  280. return err
  281. }
  282. certVerify, ok := msg.(*certificateVerifyMsg);
  283. if !ok {
  284. c.sendAlert(alertUnexpectedMessage)
  285. return unexpectedMessageError(certVerify, msg)
  286. }
  287. err, alertCode := verifyPeerCertificate(
  288. certVerify,
  289. pubKey,
  290. supportedSignatureAlgorithms13,
  291. hs.keySchedule.transcriptHash.Sum(nil),
  292. "TLS 1.3, client CertificateVerify");
  293. if err != nil {
  294. c.sendAlert(alertCode)
  295. return err
  296. }
  297. hs.keySchedule.write(certVerify.marshal())
  298. // Read next chunk
  299. msg, err = c.readHandshake()
  300. if err != nil {
  301. return err
  302. }
  303. } else if (c.config.ClientAuth >= RequestClientCert) && !c.didResume {
  304. c.sendAlert(alertCertificateRequired)
  305. return unexpectedMessageError(certMsg, msg)
  306. }
  307. clientFinished, ok := msg.(*finishedMsg)
  308. if !ok {
  309. c.sendAlert(alertUnexpectedMessage)
  310. return unexpectedMessageError(clientFinished, msg)
  311. }
  312. hash := hashForSuite(hs.suite)
  313. expectedVerifyData := hmacOfSum(hash, hs.keySchedule.transcriptHash, hs.clientFinishedKey)
  314. if len(expectedVerifyData) != len(clientFinished.verifyData) ||
  315. subtle.ConstantTimeCompare(expectedVerifyData, clientFinished.verifyData) != 1 {
  316. c.sendAlert(alertDecryptError)
  317. return errors.New("tls: client's Finished message is incorrect")
  318. }
  319. hs.keySchedule.write(clientFinished.marshal())
  320. c.hs = nil // Discard the server handshake state
  321. if c.hand.Len() > 0 {
  322. return c.sendAlert(alertUnexpectedMessage)
  323. }
  324. c.in.setCipher(c.vers, hs.appClientCipher)
  325. c.in.traceErr, c.out.traceErr = nil, nil
  326. c.phase = handshakeConfirmed
  327. atomic.StoreInt32(&c.handshakeConfirmed, 1)
  328. // Any read operation after handshakeRunning and before handshakeConfirmed
  329. // will be holding this lock, which we release as soon as the confirmation
  330. // happens, even if the Read call might do more work.
  331. // If a Handshake is pending, c.confirmMutex will never be locked as
  332. // ConfirmHandshake will wait for the handshake to complete. If a
  333. // handshake was complete, and this was a confirmation, unlock
  334. // c.confirmMutex now to allow readers to proceed.
  335. if hasConfirmLock {
  336. c.confirmMutex.Unlock()
  337. }
  338. return hs.sendSessionTicket13() // TODO: do in a goroutine
  339. }
  340. func (hs *serverHandshakeState) sendCertificate13() error {
  341. c := hs.c
  342. certEntries := []certificateEntry{}
  343. for _, cert := range hs.cert.Certificate {
  344. certEntries = append(certEntries, certificateEntry{data: cert})
  345. }
  346. if len(certEntries) > 0 && hs.clientHello.ocspStapling {
  347. certEntries[0].ocspStaple = hs.cert.OCSPStaple
  348. }
  349. if len(certEntries) > 0 && hs.clientHello.scts {
  350. certEntries[0].sctList = hs.cert.SignedCertificateTimestamps
  351. }
  352. certMsg := &certificateMsg13{certificates: certEntries}
  353. hs.keySchedule.write(certMsg.marshal())
  354. if _, err := c.writeRecord(recordTypeHandshake, certMsg.marshal()); err != nil {
  355. return err
  356. }
  357. sigScheme, err := hs.selectTLS13SignatureScheme()
  358. if err != nil {
  359. c.sendAlert(alertInternalError)
  360. return err
  361. }
  362. sigHash := hashForSignatureScheme(sigScheme)
  363. opts := crypto.SignerOpts(sigHash)
  364. if signatureSchemeIsPSS(sigScheme) {
  365. opts = &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash, Hash: sigHash}
  366. }
  367. toSign := prepareDigitallySigned(sigHash, "TLS 1.3, server CertificateVerify", hs.keySchedule.transcriptHash.Sum(nil))
  368. signature, err := hs.cert.PrivateKey.(crypto.Signer).Sign(c.config.rand(), toSign[:], opts)
  369. if err != nil {
  370. c.sendAlert(alertInternalError)
  371. return err
  372. }
  373. verifyMsg := &certificateVerifyMsg{
  374. hasSignatureAndHash: true,
  375. signatureAlgorithm: sigScheme,
  376. signature: signature,
  377. }
  378. hs.keySchedule.write(verifyMsg.marshal())
  379. if _, err := c.writeRecord(recordTypeHandshake, verifyMsg.marshal()); err != nil {
  380. return err
  381. }
  382. return nil
  383. }
  384. func (c *Conn) handleEndOfEarlyData() error {
  385. if c.phase != readingEarlyData || c.vers < VersionTLS13 {
  386. return c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage))
  387. }
  388. msg, err := c.readHandshake()
  389. if err != nil {
  390. return err
  391. }
  392. endOfEarlyData, ok := msg.(*endOfEarlyDataMsg)
  393. // No handshake messages are allowed after EOD.
  394. if !ok || c.hand.Len() > 0 {
  395. return c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage))
  396. }
  397. c.hs.keySchedule.write(endOfEarlyData.marshal())
  398. c.phase = waitingClientFinished
  399. c.in.setCipher(c.vers, c.hs.hsClientCipher)
  400. return nil
  401. }
  402. // selectTLS13SignatureScheme chooses the SignatureScheme for the CertificateVerify
  403. // based on the certificate type and client supported schemes. If no overlap is found,
  404. // a fallback is selected.
  405. //
  406. // See https://tools.ietf.org/html/draft-ietf-tls-tls13-18#section-4.4.1.2
  407. func (hs *serverHandshakeState) selectTLS13SignatureScheme() (sigScheme SignatureScheme, err error) {
  408. var supportedSchemes []SignatureScheme
  409. signer, ok := hs.cert.PrivateKey.(crypto.Signer)
  410. if !ok {
  411. return 0, errors.New("tls: certificate private key does not implement crypto.Signer")
  412. }
  413. pk := signer.Public()
  414. if _, ok := pk.(*rsa.PublicKey); ok {
  415. sigScheme = PSSWithSHA256
  416. supportedSchemes = []SignatureScheme{PSSWithSHA256, PSSWithSHA384, PSSWithSHA512}
  417. } else if pk, ok := pk.(*ecdsa.PublicKey); ok {
  418. switch pk.Curve {
  419. case elliptic.P256():
  420. sigScheme = ECDSAWithP256AndSHA256
  421. supportedSchemes = []SignatureScheme{ECDSAWithP256AndSHA256}
  422. case elliptic.P384():
  423. sigScheme = ECDSAWithP384AndSHA384
  424. supportedSchemes = []SignatureScheme{ECDSAWithP384AndSHA384}
  425. case elliptic.P521():
  426. sigScheme = ECDSAWithP521AndSHA512
  427. supportedSchemes = []SignatureScheme{ECDSAWithP521AndSHA512}
  428. default:
  429. return 0, errors.New("tls: unknown ECDSA certificate curve")
  430. }
  431. } else {
  432. return 0, errors.New("tls: unknown certificate key type")
  433. }
  434. for _, ss := range supportedSchemes {
  435. for _, cs := range hs.clientHello.supportedSignatureAlgorithms {
  436. if ss == cs {
  437. return ss, nil
  438. }
  439. }
  440. }
  441. return sigScheme, nil
  442. }
  443. func signatureSchemeIsPSS(s SignatureScheme) bool {
  444. return s == PSSWithSHA256 || s == PSSWithSHA384 || s == PSSWithSHA512
  445. }
  446. // hashForSignatureScheme returns the Hash used by a SignatureScheme which is
  447. // supported by selectTLS13SignatureScheme.
  448. func hashForSignatureScheme(ss SignatureScheme) crypto.Hash {
  449. switch ss {
  450. case PSSWithSHA256, ECDSAWithP256AndSHA256:
  451. return crypto.SHA256
  452. case PSSWithSHA384, ECDSAWithP384AndSHA384:
  453. return crypto.SHA384
  454. case PSSWithSHA512, ECDSAWithP521AndSHA512:
  455. return crypto.SHA512
  456. default:
  457. panic("unsupported SignatureScheme passed to hashForSignatureScheme")
  458. }
  459. }
  460. func hashForSuite(suite *cipherSuite) crypto.Hash {
  461. if suite.flags&suiteSHA384 != 0 {
  462. return crypto.SHA384
  463. }
  464. return crypto.SHA256
  465. }
  466. func prepareDigitallySigned(hash crypto.Hash, context string, data []byte) []byte {
  467. message := bytes.Repeat([]byte{32}, 64)
  468. message = append(message, context...)
  469. message = append(message, 0)
  470. message = append(message, data...)
  471. h := hash.New()
  472. h.Write(message)
  473. return h.Sum(nil)
  474. }
  475. func (c *Config) generateKeyShare(curveID CurveID) ([]byte, keyShare, error) {
  476. if curveID == X25519 {
  477. var scalar, public [32]byte
  478. if _, err := io.ReadFull(c.rand(), scalar[:]); err != nil {
  479. return nil, keyShare{}, err
  480. }
  481. curve25519.ScalarBaseMult(&public, &scalar)
  482. return scalar[:], keyShare{group: curveID, data: public[:]}, nil
  483. }
  484. curve, ok := curveForCurveID(curveID)
  485. if !ok {
  486. return nil, keyShare{}, errors.New("tls: preferredCurves includes unsupported curve")
  487. }
  488. privateKey, x, y, err := elliptic.GenerateKey(curve, c.rand())
  489. if err != nil {
  490. return nil, keyShare{}, err
  491. }
  492. ecdhePublic := elliptic.Marshal(curve, x, y)
  493. return privateKey, keyShare{group: curveID, data: ecdhePublic}, nil
  494. }
  495. func deriveECDHESecret(ks keyShare, secretKey []byte) []byte {
  496. if ks.group == X25519 {
  497. if len(ks.data) != 32 {
  498. return nil
  499. }
  500. var theirPublic, sharedKey, scalar [32]byte
  501. copy(theirPublic[:], ks.data)
  502. copy(scalar[:], secretKey)
  503. curve25519.ScalarMult(&sharedKey, &scalar, &theirPublic)
  504. return sharedKey[:]
  505. }
  506. curve, ok := curveForCurveID(ks.group)
  507. if !ok {
  508. return nil
  509. }
  510. x, y := elliptic.Unmarshal(curve, ks.data)
  511. if x == nil {
  512. return nil
  513. }
  514. x, _ = curve.ScalarMult(x, y, secretKey)
  515. xBytes := x.Bytes()
  516. curveSize := (curve.Params().BitSize + 8 - 1) >> 3
  517. if len(xBytes) == curveSize {
  518. return xBytes
  519. }
  520. buf := make([]byte, curveSize)
  521. copy(buf[len(buf)-len(xBytes):], xBytes)
  522. return buf
  523. }
  524. func hkdfExpandLabel(hash crypto.Hash, secret, hashValue []byte, label string, L int) []byte {
  525. prefix := "tls13 "
  526. hkdfLabel := make([]byte, 4+len(prefix)+len(label)+len(hashValue))
  527. hkdfLabel[0] = byte(L >> 8)
  528. hkdfLabel[1] = byte(L)
  529. hkdfLabel[2] = byte(len(prefix) + len(label))
  530. copy(hkdfLabel[3:], prefix)
  531. z := hkdfLabel[3+len(prefix):]
  532. copy(z, label)
  533. z = z[len(label):]
  534. z[0] = byte(len(hashValue))
  535. copy(z[1:], hashValue)
  536. return hkdfExpand(hash, secret, hkdfLabel, L)
  537. }
  538. func hmacOfSum(f crypto.Hash, hash hash.Hash, key []byte) []byte {
  539. h := hmac.New(f.New, key)
  540. h.Write(hash.Sum(nil))
  541. return h.Sum(nil)
  542. }
  543. // Maximum allowed mismatch between the stated age of a ticket
  544. // and the server-observed one. See
  545. // https://tools.ietf.org/html/draft-ietf-tls-tls13-18#section-4.2.8.2.
  546. const ticketAgeSkewAllowance = 10 * time.Second
  547. // checkPSK tries to resume using a PSK, returning true (and updating the
  548. // early secret in the key schedule) if the PSK was used and false otherwise.
  549. func (hs *serverHandshakeState) checkPSK() (isResumed bool, alert alert) {
  550. if hs.c.config.SessionTicketsDisabled {
  551. return false, alertSuccess
  552. }
  553. foundDHE := false
  554. for _, mode := range hs.clientHello.pskKeyExchangeModes {
  555. if mode == pskDHEKeyExchange {
  556. foundDHE = true
  557. break
  558. }
  559. }
  560. if !foundDHE {
  561. return false, alertSuccess
  562. }
  563. hash := hashForSuite(hs.suite)
  564. hashSize := hash.Size()
  565. for i := range hs.clientHello.psks {
  566. sessionTicket := append([]uint8{}, hs.clientHello.psks[i].identity...)
  567. if hs.c.config.SessionTicketSealer != nil {
  568. var ok bool
  569. sessionTicket, ok = hs.c.config.SessionTicketSealer.Unseal(hs.clientHelloInfo(), sessionTicket)
  570. if !ok {
  571. continue
  572. }
  573. } else {
  574. sessionTicket, _ = hs.c.decryptTicket(sessionTicket)
  575. if sessionTicket == nil {
  576. continue
  577. }
  578. }
  579. s := &sessionState13{}
  580. if s.unmarshal(sessionTicket) != alertSuccess {
  581. continue
  582. }
  583. if s.vers != hs.c.vers {
  584. continue
  585. }
  586. clientAge := time.Duration(hs.clientHello.psks[i].obfTicketAge-s.ageAdd) * time.Millisecond
  587. serverAge := time.Since(time.Unix(int64(s.createdAt), 0))
  588. if clientAge-serverAge > ticketAgeSkewAllowance || clientAge-serverAge < -ticketAgeSkewAllowance {
  589. // XXX: NSS is off spec and sends obfuscated_ticket_age as seconds
  590. clientAge = time.Duration(hs.clientHello.psks[i].obfTicketAge-s.ageAdd) * time.Second
  591. if clientAge-serverAge > ticketAgeSkewAllowance || clientAge-serverAge < -ticketAgeSkewAllowance {
  592. continue
  593. }
  594. }
  595. // This enforces the stricter 0-RTT requirements on all ticket uses.
  596. // The benefit of using PSK+ECDHE without 0-RTT are small enough that
  597. // we can give them up in the edge case of changed suite or ALPN or SNI.
  598. if s.suite != hs.suite.id {
  599. continue
  600. }
  601. if s.alpnProtocol != hs.c.clientProtocol {
  602. continue
  603. }
  604. if s.SNI != hs.c.serverName {
  605. continue
  606. }
  607. hs.keySchedule.setSecret(s.pskSecret)
  608. binderKey := hs.keySchedule.deriveSecret(secretResumptionPskBinder)
  609. binderFinishedKey := hkdfExpandLabel(hash, binderKey, nil, "finished", hashSize)
  610. chHash := hash.New()
  611. chHash.Write(hs.clientHello.rawTruncated)
  612. expectedBinder := hmacOfSum(hash, chHash, binderFinishedKey)
  613. if subtle.ConstantTimeCompare(expectedBinder, hs.clientHello.psks[i].binder) != 1 {
  614. return false, alertDecryptError
  615. }
  616. if i == 0 && hs.clientHello.earlyData {
  617. // This is a ticket intended to be used for 0-RTT
  618. if s.maxEarlyDataLen == 0 {
  619. // But we had not tagged it as such.
  620. return false, alertIllegalParameter
  621. }
  622. if hs.c.config.Accept0RTTData {
  623. hs.c.binder = expectedBinder
  624. hs.c.ticketMaxEarlyData = int64(s.maxEarlyDataLen)
  625. hs.hello13Enc.earlyData = true
  626. }
  627. }
  628. hs.hello.psk = true
  629. hs.hello.pskIdentity = uint16(i)
  630. return true, alertSuccess
  631. }
  632. return false, alertSuccess
  633. }
  634. func (hs *serverHandshakeState) sendSessionTicket13() error {
  635. c := hs.c
  636. if c.config.SessionTicketsDisabled {
  637. return nil
  638. }
  639. foundDHE := false
  640. for _, mode := range hs.clientHello.pskKeyExchangeModes {
  641. if mode == pskDHEKeyExchange {
  642. foundDHE = true
  643. break
  644. }
  645. }
  646. if !foundDHE {
  647. return nil
  648. }
  649. resumptionMasterSecret := hs.keySchedule.deriveSecret(secretResumption)
  650. ageAddBuf := make([]byte, 4)
  651. sessionState := &sessionState13{
  652. vers: c.vers,
  653. suite: hs.suite.id,
  654. createdAt: uint64(time.Now().Unix()),
  655. alpnProtocol: c.clientProtocol,
  656. SNI: c.serverName,
  657. maxEarlyDataLen: c.config.Max0RTTDataSize,
  658. }
  659. hash := hashForSuite(hs.suite)
  660. for i := 0; i < numSessionTickets; i++ {
  661. if _, err := io.ReadFull(c.config.rand(), ageAddBuf); err != nil {
  662. c.sendAlert(alertInternalError)
  663. return err
  664. }
  665. sessionState.ageAdd = uint32(ageAddBuf[0])<<24 | uint32(ageAddBuf[1])<<16 |
  666. uint32(ageAddBuf[2])<<8 | uint32(ageAddBuf[3])
  667. // ticketNonce must be a unique value for this connection.
  668. // Assume there are no more than 255 tickets, otherwise two
  669. // tickets might have the same PSK which could be a problem if
  670. // one of them is compromised.
  671. ticketNonce := []byte{byte(i)}
  672. sessionState.pskSecret = hkdfExpandLabel(hash, resumptionMasterSecret, ticketNonce, "resumption", hash.Size())
  673. ticket := sessionState.marshal()
  674. var err error
  675. if c.config.SessionTicketSealer != nil {
  676. cs := c.ConnectionState()
  677. ticket, err = c.config.SessionTicketSealer.Seal(&cs, ticket)
  678. } else {
  679. ticket, err = c.encryptTicket(ticket)
  680. }
  681. if err != nil {
  682. c.sendAlert(alertInternalError)
  683. return err
  684. }
  685. if ticket == nil {
  686. continue
  687. }
  688. ticketMsg := &newSessionTicketMsg13{
  689. lifetime: 24 * 3600, // TODO(filippo)
  690. maxEarlyDataLength: c.config.Max0RTTDataSize,
  691. withEarlyDataInfo: c.config.Max0RTTDataSize > 0,
  692. ageAdd: sessionState.ageAdd,
  693. nonce: ticketNonce,
  694. ticket: ticket,
  695. }
  696. if _, err := c.writeRecord(recordTypeHandshake, ticketMsg.marshal()); err != nil {
  697. return err
  698. }
  699. }
  700. return nil
  701. }
  702. func (hs *serverHandshakeState) traceErr(err error) {
  703. if err == nil {
  704. return
  705. }
  706. if os.Getenv("TLSDEBUG") == "error" {
  707. if hs != nil && hs.clientHello != nil {
  708. os.Stderr.WriteString(hex.Dump(hs.clientHello.marshal()))
  709. } else if err == io.EOF {
  710. return // don't stack trace on EOF before CH
  711. }
  712. fmt.Fprintf(os.Stderr, "\n%s\n", debug.Stack())
  713. }
  714. if os.Getenv("TLSDEBUG") == "short" {
  715. var pcs [4]uintptr
  716. frames := runtime.CallersFrames(pcs[0:runtime.Callers(3, pcs[:])])
  717. for {
  718. frame, more := frames.Next()
  719. if frame.Function != "crypto/tls.(*halfConn).setErrorLocked" &&
  720. frame.Function != "crypto/tls.(*Conn).sendAlertLocked" &&
  721. frame.Function != "crypto/tls.(*Conn).sendAlert" {
  722. file := frame.File[strings.LastIndex(frame.File, "/")+1:]
  723. log.Printf("%s:%d (%s): %v", file, frame.Line, frame.Function, err)
  724. return
  725. }
  726. if !more {
  727. break
  728. }
  729. }
  730. }
  731. }
  732. func getCertsFromEntries(certEntries []certificateEntry) ([][]byte) {
  733. certs := make([][]byte, len(certEntries))
  734. for i, cert := range certEntries {
  735. certs[i] = cert.data
  736. }
  737. return certs
  738. }
  739. func (hs *clientHandshakeState) processEncryptedExtensions(ee *encryptedExtensionsMsg) error {
  740. c := hs.c
  741. if ee.alpnProtocol != "" {
  742. c.clientProtocol = ee.alpnProtocol
  743. c.clientProtocolFallback = false
  744. }
  745. return nil
  746. }
  747. func verifyPeerCertificate(
  748. certVerify *certificateVerifyMsg,
  749. pubKey crypto.PublicKey,
  750. signAlgosKnown []SignatureScheme,
  751. transHash []byte,
  752. contextString string) (error, alert) {
  753. _, sigType, hashFunc, err := pickSignatureAlgorithm(
  754. pubKey,
  755. []SignatureScheme{certVerify.signatureAlgorithm},
  756. signAlgosKnown,
  757. VersionTLS13)
  758. if err != nil {
  759. return err, alertHandshakeFailure
  760. }
  761. digest := prepareDigitallySigned(hashFunc, contextString, transHash)
  762. err = verifyHandshakeSignature(sigType, pubKey, hashFunc, digest, certVerify.signature)
  763. if err != nil {
  764. return err, alertDecryptError
  765. }
  766. return nil, alertSuccess
  767. }
  768. func (hs *clientHandshakeState) getCertificate13(certReq *certificateRequestMsg13) (*Certificate, error) {
  769. certReq12 := &certificateRequestMsg{
  770. hasSignatureAndHash: true,
  771. supportedSignatureAlgorithms: certReq.supportedSignatureAlgorithms,
  772. certificateAuthorities: certReq.certificateAuthorities,
  773. }
  774. var rsaAvail, ecdsaAvail bool
  775. for _, sigAlg := range certReq.supportedSignatureAlgorithms {
  776. switch signatureFromSignatureScheme(sigAlg) {
  777. case signaturePKCS1v15, signatureRSAPSS:
  778. rsaAvail = true
  779. case signatureECDSA:
  780. ecdsaAvail = true
  781. }
  782. }
  783. if rsaAvail {
  784. certReq12.certificateTypes = append(certReq12.certificateTypes, certTypeRSASign)
  785. }
  786. if ecdsaAvail {
  787. certReq12.certificateTypes = append(certReq12.certificateTypes, certTypeECDSASign)
  788. }
  789. return hs.getCertificate(certReq12)
  790. }
  791. func (hs *clientHandshakeState) sendCertificate13(chainToSend *Certificate, certReq *certificateRequestMsg13) error {
  792. c := hs.c
  793. certEntries := []certificateEntry{}
  794. for _, cert := range chainToSend.Certificate {
  795. certEntries = append(certEntries, certificateEntry{data: cert})
  796. }
  797. certMsg := &certificateMsg13{certificates: certEntries}
  798. hs.keySchedule.write(certMsg.marshal())
  799. if _, err := c.writeRecord(recordTypeHandshake, certMsg.marshal()); err != nil {
  800. return err
  801. }
  802. if len(certEntries) == 0 {
  803. // No client cert available, nothing to sign.
  804. return nil
  805. }
  806. key, ok := chainToSend.PrivateKey.(crypto.Signer)
  807. if !ok {
  808. c.sendAlert(alertInternalError)
  809. return fmt.Errorf("tls: client certificate private key of type %T does not implement crypto.Signer", chainToSend.PrivateKey)
  810. }
  811. signatureAlgorithm, sigType, hashFunc, err := pickSignatureAlgorithm(key.Public(), certReq.supportedSignatureAlgorithms, hs.hello.supportedSignatureAlgorithms, c.vers)
  812. if err != nil {
  813. hs.c.sendAlert(alertHandshakeFailure)
  814. return err
  815. }
  816. digest := prepareDigitallySigned(hashFunc, "TLS 1.3, client CertificateVerify", hs.keySchedule.transcriptHash.Sum(nil))
  817. signOpts := crypto.SignerOpts(hashFunc)
  818. if sigType == signatureRSAPSS {
  819. signOpts = &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash, Hash: hashFunc}
  820. }
  821. signature, err := key.Sign(c.config.rand(), digest, signOpts)
  822. if err != nil {
  823. c.sendAlert(alertInternalError)
  824. return err
  825. }
  826. verifyMsg := &certificateVerifyMsg{
  827. hasSignatureAndHash: true,
  828. signatureAlgorithm: signatureAlgorithm,
  829. signature: signature,
  830. }
  831. hs.keySchedule.write(verifyMsg.marshal())
  832. if _, err := c.writeRecord(recordTypeHandshake, verifyMsg.marshal()); err != nil {
  833. return err
  834. }
  835. return nil
  836. }
  837. func (hs *clientHandshakeState) doTLS13Handshake() error {
  838. c := hs.c
  839. hash := hashForSuite(hs.suite)
  840. hashSize := hash.Size()
  841. serverHello := hs.serverHello
  842. // middlebox compatibility mode, send CCS before second flight.
  843. if _, err := c.writeRecord(recordTypeChangeCipherSpec, []byte{1}); err != nil {
  844. return err
  845. }
  846. // TODO check if keyshare is unacceptable, raise HRR.
  847. clientKS := hs.hello.keyShares[0]
  848. if serverHello.keyShare.group != clientKS.group {
  849. c.sendAlert(alertIllegalParameter)
  850. return errors.New("bad or missing key share from server")
  851. }
  852. // 0-RTT is not supported yet, so use an empty PSK.
  853. hs.keySchedule.setSecret(nil)
  854. ecdheSecret := deriveECDHESecret(serverHello.keyShare, hs.privateKey)
  855. if ecdheSecret == nil {
  856. c.sendAlert(alertIllegalParameter)
  857. return errors.New("tls: bad ECDHE server share")
  858. }
  859. // Calculate handshake secrets.
  860. hs.keySchedule.setSecret(ecdheSecret)
  861. clientCipher, clientHandshakeSecret := hs.keySchedule.prepareCipher(secretHandshakeClient)
  862. serverCipher, serverHandshakeSecret := hs.keySchedule.prepareCipher(secretHandshakeServer)
  863. if c.hand.Len() > 0 {
  864. c.sendAlert(alertUnexpectedMessage)
  865. return errors.New("tls: unexpected data after Server Hello")
  866. }
  867. // Do not change the sender key yet, the server must authenticate first.
  868. c.in.setCipher(c.vers, serverCipher)
  869. // Calculate MAC key for Finished messages.
  870. serverFinishedKey := hkdfExpandLabel(hash, serverHandshakeSecret, nil, "finished", hashSize)
  871. clientFinishedKey := hkdfExpandLabel(hash, clientHandshakeSecret, nil, "finished", hashSize)
  872. msg, err := c.readHandshake()
  873. if err != nil {
  874. return err
  875. }
  876. encryptedExtensions, ok := msg.(*encryptedExtensionsMsg)
  877. if !ok {
  878. c.sendAlert(alertUnexpectedMessage)
  879. return unexpectedMessageError(encryptedExtensions, msg)
  880. }
  881. if err := hs.processEncryptedExtensions(encryptedExtensions); err != nil {
  882. return err
  883. }
  884. hs.keySchedule.write(encryptedExtensions.marshal())
  885. // PSKs are not supported, so receive Certificate message.
  886. msg, err = c.readHandshake()
  887. if err != nil {
  888. return err
  889. }
  890. var chainToSend *Certificate
  891. certReq, isCertRequested := msg.(*certificateRequestMsg13)
  892. if isCertRequested {
  893. hs.keySchedule.write(certReq.marshal())
  894. if chainToSend, err = hs.getCertificate13(certReq); err != nil {
  895. c.sendAlert(alertInternalError)
  896. return err
  897. }
  898. msg, err = c.readHandshake()
  899. if err != nil {
  900. return err
  901. }
  902. }
  903. certMsg, ok := msg.(*certificateMsg13)
  904. if !ok {
  905. c.sendAlert(alertUnexpectedMessage)
  906. return unexpectedMessageError(certMsg, msg)
  907. }
  908. hs.keySchedule.write(certMsg.marshal())
  909. // Validate certificates.
  910. certs := getCertsFromEntries(certMsg.certificates)
  911. if err := hs.processCertsFromServer(certs); err != nil {
  912. return err
  913. }
  914. // Receive CertificateVerify message.
  915. msg, err = c.readHandshake()
  916. if err != nil {
  917. return err
  918. }
  919. certVerifyMsg, ok := msg.(*certificateVerifyMsg)
  920. if !ok {
  921. c.sendAlert(alertUnexpectedMessage)
  922. return unexpectedMessageError(certVerifyMsg, msg)
  923. }
  924. err, alertCode := verifyPeerCertificate(
  925. certVerifyMsg,
  926. hs.c.peerCertificates[0].PublicKey,
  927. hs.hello.supportedSignatureAlgorithms,
  928. hs.keySchedule.transcriptHash.Sum(nil),
  929. "TLS 1.3, server CertificateVerify");
  930. if err != nil {
  931. c.sendAlert(alertCode)
  932. return err
  933. }
  934. hs.keySchedule.write(certVerifyMsg.marshal())
  935. // Receive Finished message.
  936. msg, err = c.readHandshake()
  937. if err != nil {
  938. return err
  939. }
  940. serverFinished, ok := msg.(*finishedMsg)
  941. if !ok {
  942. c.sendAlert(alertUnexpectedMessage)
  943. return unexpectedMessageError(serverFinished, msg)
  944. }
  945. // Validate server Finished hash.
  946. expectedVerifyData := hmacOfSum(hash, hs.keySchedule.transcriptHash, serverFinishedKey)
  947. if subtle.ConstantTimeCompare(expectedVerifyData, serverFinished.verifyData) != 1 {
  948. c.sendAlert(alertDecryptError)
  949. return errors.New("tls: server's Finished message is incorrect")
  950. }
  951. hs.keySchedule.write(serverFinished.marshal())
  952. // Server has authenticated itself. Calculate application traffic secrets.
  953. hs.keySchedule.setSecret(nil) // derive master secret
  954. appServerCipher, _ := hs.keySchedule.prepareCipher(secretApplicationServer)
  955. appClientCipher, _ := hs.keySchedule.prepareCipher(secretApplicationClient)
  956. // TODO store initial traffic secret key for KeyUpdate GH #85
  957. // Change outbound handshake cipher for final step
  958. c.out.setCipher(c.vers, clientCipher)
  959. // Client auth requires sending a (possibly empty) Certificate followed
  960. // by a CertificateVerify message (if there was an actual certificate).
  961. if isCertRequested {
  962. if err := hs.sendCertificate13(chainToSend, certReq); err != nil {
  963. return err
  964. }
  965. }
  966. // Send Finished
  967. verifyData := hmacOfSum(hash, hs.keySchedule.transcriptHash, clientFinishedKey)
  968. clientFinished := &finishedMsg{
  969. verifyData: verifyData,
  970. }
  971. if _, err := c.writeRecord(recordTypeHandshake, clientFinished.marshal()); err != nil {
  972. return err
  973. }
  974. // Handshake done, set application traffic secret
  975. c.out.setCipher(c.vers, appClientCipher)
  976. if c.hand.Len() > 0 {
  977. c.sendAlert(alertUnexpectedMessage)
  978. return errors.New("tls: unexpected data after handshake")
  979. }
  980. c.in.setCipher(c.vers, appServerCipher)
  981. return nil
  982. }