13.go 41 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328
  1. package qtls
  2. import (
  3. "bytes"
  4. "crypto"
  5. "crypto/cipher"
  6. "crypto/ecdsa"
  7. "crypto/elliptic"
  8. "crypto/hmac"
  9. "crypto/rsa"
  10. "crypto/subtle"
  11. "encoding/hex"
  12. "errors"
  13. "fmt"
  14. "hash"
  15. "io"
  16. "log"
  17. "os"
  18. "runtime"
  19. "runtime/debug"
  20. "strings"
  21. "sync/atomic"
  22. "time"
  23. "golang.org/x/crypto/curve25519"
  24. "v2ray.com/core/external/github.com/cloudflare/sidh/sidh"
  25. )
  26. // numSessionTickets is the number of different session tickets the
  27. // server sends to a TLS 1.3 client, who will use each only once.
  28. const numSessionTickets = 2
  29. type secretLabel int
  30. const (
  31. x25519SharedSecretSz = 32
  32. P503PubKeySz = 378
  33. P503PrvKeySz = 32
  34. P503SharedSecretSz = 126
  35. SIDHp503Curve25519PubKeySz = x25519SharedSecretSz + P503PubKeySz
  36. SIDHp503Curve25519PrvKeySz = x25519SharedSecretSz + P503PrvKeySz
  37. SIDHp503Curve25519SharedKeySz = x25519SharedSecretSz + P503SharedSecretSz
  38. )
  39. const (
  40. secretResumptionPskBinder secretLabel = iota
  41. secretEarlyClient
  42. secretHandshakeClient
  43. secretHandshakeServer
  44. secretApplicationClient
  45. secretApplicationServer
  46. secretResumption
  47. )
  48. type keySchedule13 struct {
  49. suite *cipherSuite
  50. transcriptHash hash.Hash // uses the cipher suite hash algo
  51. secret []byte // Current secret as used for Derive-Secret
  52. handshakeCtx []byte // cached handshake context, invalidated on updates.
  53. clientRandom []byte // Used for keylogging, nil if keylogging is disabled.
  54. config *Config // Used for KeyLogWriter callback, nil if keylogging is disabled.
  55. }
  56. // Interface implemented by DH key exchange strategies
  57. type dhKex interface {
  58. // c - context of current TLS handshake, groupId - ID of an algorithm
  59. // (curve/field) being chosen for key agreement. Methods implmenting an
  60. // interface always assume that provided groupId is correct.
  61. //
  62. // In case of success, function returns secret key and ephemeral key. Otherwise
  63. // error is set.
  64. generate(c *Conn, groupId CurveID) ([]byte, keyShare, error)
  65. // c - context of current TLS handshake, ks - public key received
  66. // from the other side of the connection, secretKey - is a private key
  67. // used for DH key agreement. Function returns shared secret in case
  68. // of success or empty slice otherwise.
  69. derive(c *Conn, ks keyShare, secretKey []byte) []byte
  70. }
  71. // Key Exchange strategies per curve type
  72. type kexNist struct{} // Used by NIST curves; P-256, P-384, P-512
  73. type kexX25519 struct{} // Used by X25519
  74. type kexSIDHp503 struct{} // Used by SIDH/P503
  75. type kexHybridSIDHp503X25519 struct {
  76. classicKEX kexX25519
  77. pqKEX kexSIDHp503
  78. } // Used by SIDH-ECDH hybrid scheme
  79. // Routing map for key exchange strategies
  80. var dhKexStrat = map[CurveID]dhKex{
  81. CurveP256: &kexNist{},
  82. CurveP384: &kexNist{},
  83. CurveP521: &kexNist{},
  84. X25519: &kexX25519{},
  85. HybridSIDHp503Curve25519: &kexHybridSIDHp503X25519{},
  86. }
  87. func newKeySchedule13(suite *cipherSuite, config *Config, clientRandom []byte) *keySchedule13 {
  88. if config.KeyLogWriter == nil {
  89. clientRandom = nil
  90. config = nil
  91. }
  92. return &keySchedule13{
  93. suite: suite,
  94. transcriptHash: hashForSuite(suite).New(),
  95. clientRandom: clientRandom,
  96. config: config,
  97. }
  98. }
  99. // setSecret sets the early/handshake/master secret based on the given secret
  100. // (IKM). The salt is based on previous secrets (nil for the early secret).
  101. func (ks *keySchedule13) setSecret(secret []byte) {
  102. hash := hashForSuite(ks.suite)
  103. salt := ks.secret
  104. if salt != nil {
  105. h0 := hash.New().Sum(nil)
  106. salt = hkdfExpandLabel(hash, salt, h0, "derived", hash.Size())
  107. }
  108. ks.secret = hkdfExtract(hash, secret, salt)
  109. }
  110. // Depending on role returns pair of key variant to be used by
  111. // local and remote process.
  112. func getSidhKeyVariant(isClient bool) (sidh.KeyVariant, sidh.KeyVariant) {
  113. if isClient {
  114. return sidh.KeyVariant_SIDH_A, sidh.KeyVariant_SIDH_B
  115. }
  116. return sidh.KeyVariant_SIDH_B, sidh.KeyVariant_SIDH_A
  117. }
  118. // write appends the data to the transcript hash context.
  119. func (ks *keySchedule13) write(data []byte) {
  120. ks.handshakeCtx = nil
  121. ks.transcriptHash.Write(data)
  122. }
  123. func (ks *keySchedule13) getLabel(secretLabel secretLabel) (label, keylogType string) {
  124. switch secretLabel {
  125. case secretResumptionPskBinder:
  126. label = "res binder"
  127. case secretEarlyClient:
  128. label = "c e traffic"
  129. keylogType = "CLIENT_EARLY_TRAFFIC_SECRET"
  130. case secretHandshakeClient:
  131. label = "c hs traffic"
  132. keylogType = "CLIENT_HANDSHAKE_TRAFFIC_SECRET"
  133. case secretHandshakeServer:
  134. label = "s hs traffic"
  135. keylogType = "SERVER_HANDSHAKE_TRAFFIC_SECRET"
  136. case secretApplicationClient:
  137. label = "c ap traffic"
  138. keylogType = "CLIENT_TRAFFIC_SECRET_0"
  139. case secretApplicationServer:
  140. label = "s ap traffic"
  141. keylogType = "SERVER_TRAFFIC_SECRET_0"
  142. case secretResumption:
  143. label = "res master"
  144. }
  145. return
  146. }
  147. // deriveSecret returns the secret derived from the handshake context and label.
  148. func (ks *keySchedule13) deriveSecret(secretLabel secretLabel) []byte {
  149. label, keylogType := ks.getLabel(secretLabel)
  150. if ks.handshakeCtx == nil {
  151. ks.handshakeCtx = ks.transcriptHash.Sum(nil)
  152. }
  153. hash := hashForSuite(ks.suite)
  154. secret := hkdfExpandLabel(hash, ks.secret, ks.handshakeCtx, label, hash.Size())
  155. if keylogType != "" && ks.config != nil {
  156. ks.config.writeKeyLog(keylogType, ks.clientRandom, secret)
  157. }
  158. return secret
  159. }
  160. func (ks *keySchedule13) prepareCipher(trafficSecret []byte) cipher.AEAD {
  161. hash := hashForSuite(ks.suite)
  162. key := hkdfExpandLabel(hash, trafficSecret, nil, "key", ks.suite.keyLen)
  163. iv := hkdfExpandLabel(hash, trafficSecret, nil, "iv", ks.suite.ivLen)
  164. return ks.suite.aead(key, iv)
  165. }
  166. func (hs *serverHandshakeState) doTLS13Handshake() error {
  167. config := hs.c.config
  168. c := hs.c
  169. hs.c.cipherSuite, hs.hello.cipherSuite = hs.suite.id, hs.suite.id
  170. hs.c.clientHello = hs.clientHello.marshal()
  171. // When picking the group for the handshake, priority is given to groups
  172. // that the client provided a keyShare for, so to avoid a round-trip.
  173. // After that the order of CurvePreferences is respected.
  174. var ks keyShare
  175. CurvePreferenceLoop:
  176. for _, curveID := range config.curvePreferences() {
  177. for _, keyShare := range hs.clientHello.keyShares {
  178. if curveID == keyShare.group {
  179. ks = keyShare
  180. break CurvePreferenceLoop
  181. }
  182. }
  183. }
  184. if ks.group == 0 {
  185. c.sendAlert(alertInternalError)
  186. return errors.New("tls: HelloRetryRequest not implemented") // TODO(filippo)
  187. }
  188. privateKey, serverKS, err := c.generateKeyShare(ks.group)
  189. if err != nil {
  190. c.sendAlert(alertInternalError)
  191. return err
  192. }
  193. hs.hello.keyShare = serverKS
  194. hash := hashForSuite(hs.suite)
  195. hashSize := hash.Size()
  196. hs.keySchedule = newKeySchedule13(hs.suite, config, hs.clientHello.random)
  197. // Check for PSK and update key schedule with new early secret key
  198. isResumed, pskAlert := hs.checkPSK()
  199. switch {
  200. case pskAlert != alertSuccess:
  201. c.sendAlert(pskAlert)
  202. return errors.New("tls: invalid client PSK")
  203. case !isResumed:
  204. // apply an empty PSK if not resumed.
  205. hs.keySchedule.setSecret(nil)
  206. case isResumed:
  207. c.didResume = true
  208. }
  209. hs.keySchedule.write(hs.clientHello.marshal())
  210. earlyClientTrafficSecret := hs.keySchedule.deriveSecret(secretEarlyClient)
  211. ecdheSecret := c.deriveDHESecret(ks, privateKey)
  212. if ecdheSecret == nil {
  213. c.sendAlert(alertIllegalParameter)
  214. return errors.New("tls: bad ECDHE client share")
  215. }
  216. hs.keySchedule.write(hs.hello.marshal())
  217. if _, err := c.writeRecord(recordTypeHandshake, hs.hello.marshal()); err != nil {
  218. return err
  219. }
  220. // middlebox compatibility mode: send CCS after first handshake message
  221. if _, err := c.writeRecord(recordTypeChangeCipherSpec, []byte{1}); err != nil {
  222. return err
  223. }
  224. hs.keySchedule.setSecret(ecdheSecret)
  225. hs.hsClientTrafficSecret = hs.keySchedule.deriveSecret(secretHandshakeClient)
  226. hsServerTrafficSecret := hs.keySchedule.deriveSecret(secretHandshakeServer)
  227. c.out.exportKey(hs.keySchedule.suite, hsServerTrafficSecret)
  228. c.out.setKey(c.vers, hs.keySchedule.suite, hsServerTrafficSecret)
  229. serverFinishedKey := hkdfExpandLabel(hash, hsServerTrafficSecret, nil, "finished", hashSize)
  230. hs.clientFinishedKey = hkdfExpandLabel(hash, hs.hsClientTrafficSecret, nil, "finished", hashSize)
  231. // EncryptedExtensions
  232. hs.keySchedule.write(hs.hello13Enc.marshal())
  233. if _, err := c.writeRecord(recordTypeHandshake, hs.hello13Enc.marshal()); err != nil {
  234. return err
  235. }
  236. // TODO: we should have 2 separated methods - one for full-handshake and the other for PSK-handshake
  237. if !c.didResume {
  238. // Server MUST NOT send CertificateRequest if authenticating with PSK
  239. if c.config.ClientAuth >= RequestClientCert {
  240. certReq := new(certificateRequestMsg13)
  241. // extension 'signature_algorithms' MUST be specified
  242. certReq.supportedSignatureAlgorithms = supportedSignatureAlgorithms13
  243. certReq.supportedSignatureAlgorithmsCert = supportedSigAlgorithmsCert(supportedSignatureAlgorithms13)
  244. hs.keySchedule.write(certReq.marshal())
  245. if _, err := hs.c.writeRecord(recordTypeHandshake, certReq.marshal()); err != nil {
  246. return err
  247. }
  248. }
  249. if err := hs.sendCertificate13(); err != nil {
  250. return err
  251. }
  252. }
  253. verifyData := hmacOfSum(hash, hs.keySchedule.transcriptHash, serverFinishedKey)
  254. serverFinished := &finishedMsg{
  255. verifyData: verifyData,
  256. }
  257. hs.keySchedule.write(serverFinished.marshal())
  258. if _, err := c.writeRecord(recordTypeHandshake, serverFinished.marshal()); err != nil {
  259. return err
  260. }
  261. hs.keySchedule.setSecret(nil) // derive master secret
  262. serverAppTrafficSecret := hs.keySchedule.deriveSecret(secretApplicationServer)
  263. c.out.exportKey(hs.keySchedule.suite, serverAppTrafficSecret)
  264. c.out.setKey(c.vers, hs.keySchedule.suite, serverAppTrafficSecret)
  265. if c.hand.Len() > 0 {
  266. return c.sendAlert(alertUnexpectedMessage)
  267. }
  268. hs.appClientTrafficSecret = hs.keySchedule.deriveSecret(secretApplicationClient)
  269. if hs.hello13Enc.earlyData {
  270. c.in.exportKey(hs.keySchedule.suite, earlyClientTrafficSecret)
  271. c.in.setKey(c.vers, hs.keySchedule.suite, earlyClientTrafficSecret)
  272. c.phase = readingEarlyData
  273. } else {
  274. c.in.exportKey(hs.keySchedule.suite, hs.hsClientTrafficSecret)
  275. c.in.setKey(c.vers, hs.keySchedule.suite, hs.hsClientTrafficSecret)
  276. if hs.clientHello.earlyData {
  277. c.phase = discardingEarlyData
  278. } else {
  279. c.phase = waitingClientFinished
  280. }
  281. }
  282. return nil
  283. }
  284. // readClientFinished13 is called during the server handshake (when no early
  285. // data it available) or after reading all early data. It discards early data if
  286. // the server did not accept it and then verifies the Finished message. Once
  287. // done it sends the session tickets. Under c.in lock.
  288. func (hs *serverHandshakeState) readClientFinished13(hasConfirmLock bool) error {
  289. c := hs.c
  290. // If the client advertised and sends early data while the server does
  291. // not accept it, it must be fully skipped until the Finished message.
  292. for c.phase == discardingEarlyData {
  293. if err := c.readRecord(recordTypeApplicationData); err != nil {
  294. return err
  295. }
  296. // Assume receipt of Finished message (will be checked below).
  297. if c.hand.Len() > 0 {
  298. c.phase = waitingClientFinished
  299. break
  300. }
  301. }
  302. // If the client sends early data followed by a Finished message (but
  303. // no end_of_early_data), the server MUST terminate the connection.
  304. if c.phase != waitingClientFinished {
  305. c.sendAlert(alertUnexpectedMessage)
  306. return errors.New("tls: did not expect Client Finished yet")
  307. }
  308. c.phase = readingClientFinished
  309. msg, err := c.readHandshake()
  310. if err != nil {
  311. return err
  312. }
  313. // client authentication
  314. // (4.4.2) Client MUST send certificate msg if requested by server
  315. if c.config.ClientAuth >= RequestClientCert && !c.didResume {
  316. certMsg, ok := msg.(*certificateMsg13)
  317. if !ok {
  318. c.sendAlert(alertCertificateRequired)
  319. return unexpectedMessageError(certMsg, msg)
  320. }
  321. hs.keySchedule.write(certMsg.marshal())
  322. certs := getCertsFromEntries(certMsg.certificates)
  323. pubKey, err := hs.processCertsFromClient(certs)
  324. if err != nil {
  325. return err
  326. }
  327. if len(certs) > 0 {
  328. // 4.4.3: CertificateVerify MUST appear immediately after Certificate msg
  329. msg, err = c.readHandshake()
  330. if err != nil {
  331. return err
  332. }
  333. certVerify, ok := msg.(*certificateVerifyMsg)
  334. if !ok {
  335. c.sendAlert(alertUnexpectedMessage)
  336. return unexpectedMessageError(certVerify, msg)
  337. }
  338. err, alertCode := verifyPeerHandshakeSignature(
  339. certVerify,
  340. pubKey,
  341. supportedSignatureAlgorithms13,
  342. hs.keySchedule.transcriptHash.Sum(nil),
  343. "TLS 1.3, client CertificateVerify")
  344. if err != nil {
  345. c.sendAlert(alertCode)
  346. return err
  347. }
  348. hs.keySchedule.write(certVerify.marshal())
  349. }
  350. // Read next chunk
  351. msg, err = c.readHandshake()
  352. if err != nil {
  353. return err
  354. }
  355. }
  356. clientFinished, ok := msg.(*finishedMsg)
  357. if !ok {
  358. c.sendAlert(alertUnexpectedMessage)
  359. return unexpectedMessageError(clientFinished, msg)
  360. }
  361. hash := hashForSuite(hs.suite)
  362. expectedVerifyData := hmacOfSum(hash, hs.keySchedule.transcriptHash, hs.clientFinishedKey)
  363. if len(expectedVerifyData) != len(clientFinished.verifyData) ||
  364. subtle.ConstantTimeCompare(expectedVerifyData, clientFinished.verifyData) != 1 {
  365. c.sendAlert(alertDecryptError)
  366. return errors.New("tls: client's Finished message is incorrect")
  367. }
  368. hs.keySchedule.write(clientFinished.marshal())
  369. c.hs = nil // Discard the server handshake state
  370. if c.hand.Len() > 0 {
  371. return c.sendAlert(alertUnexpectedMessage)
  372. }
  373. c.in.exportKey(hs.keySchedule.suite, hs.appClientTrafficSecret)
  374. c.in.setKey(c.vers, hs.keySchedule.suite, hs.appClientTrafficSecret)
  375. c.in.traceErr, c.out.traceErr = nil, nil
  376. c.phase = handshakeConfirmed
  377. atomic.StoreInt32(&c.handshakeConfirmed, 1)
  378. // Any read operation after handshakeRunning and before handshakeConfirmed
  379. // will be holding this lock, which we release as soon as the confirmation
  380. // happens, even if the Read call might do more work.
  381. // If a Handshake is pending, c.confirmMutex will never be locked as
  382. // ConfirmHandshake will wait for the handshake to complete. If a
  383. // handshake was complete, and this was a confirmation, unlock
  384. // c.confirmMutex now to allow readers to proceed.
  385. if hasConfirmLock {
  386. c.confirmMutex.Unlock()
  387. }
  388. return hs.sendSessionTicket13() // TODO: do in a goroutine
  389. }
  390. func (hs *serverHandshakeState) sendCertificate13() error {
  391. c := hs.c
  392. certEntries := []certificateEntry{}
  393. for _, cert := range hs.cert.Certificate {
  394. certEntries = append(certEntries, certificateEntry{data: cert})
  395. }
  396. if len(certEntries) > 0 && hs.clientHello.ocspStapling {
  397. certEntries[0].ocspStaple = hs.cert.OCSPStaple
  398. }
  399. if len(certEntries) > 0 && hs.clientHello.scts {
  400. certEntries[0].sctList = hs.cert.SignedCertificateTimestamps
  401. }
  402. // If hs.delegatedCredential is set (see hs.readClientHello()) then the
  403. // server is using the delegated credential extension. The DC is added as an
  404. // extension to the end-entity certificate, i.e., the last CertificateEntry
  405. // of Certificate.certficate_list. (For details, see
  406. // https://tools.ietf.org/html/draft-ietf-tls-subcerts-02.)
  407. if len(certEntries) > 0 && hs.clientHello.delegatedCredential && hs.delegatedCredential != nil {
  408. certEntries[0].delegatedCredential = hs.delegatedCredential
  409. }
  410. certMsg := &certificateMsg13{certificates: certEntries}
  411. hs.keySchedule.write(certMsg.marshal())
  412. if _, err := c.writeRecord(recordTypeHandshake, certMsg.marshal()); err != nil {
  413. return err
  414. }
  415. sigScheme, err := hs.selectTLS13SignatureScheme()
  416. if err != nil {
  417. c.sendAlert(alertInternalError)
  418. return err
  419. }
  420. sigHash := hashForSignatureScheme(sigScheme)
  421. opts := crypto.SignerOpts(sigHash)
  422. if signatureSchemeIsPSS(sigScheme) {
  423. opts = &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash, Hash: sigHash}
  424. }
  425. toSign := prepareDigitallySigned(sigHash, "TLS 1.3, server CertificateVerify", hs.keySchedule.transcriptHash.Sum(nil))
  426. signature, err := hs.privateKey.(crypto.Signer).Sign(c.config.rand(), toSign[:], opts)
  427. if err != nil {
  428. c.sendAlert(alertInternalError)
  429. return err
  430. }
  431. verifyMsg := &certificateVerifyMsg{
  432. hasSignatureAndHash: true,
  433. signatureAlgorithm: sigScheme,
  434. signature: signature,
  435. }
  436. hs.keySchedule.write(verifyMsg.marshal())
  437. if _, err := c.writeRecord(recordTypeHandshake, verifyMsg.marshal()); err != nil {
  438. return err
  439. }
  440. return nil
  441. }
  442. func (c *Conn) handleEndOfEarlyData() error {
  443. if c.phase != readingEarlyData || c.vers < VersionTLS13 {
  444. return c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage))
  445. }
  446. msg, err := c.readHandshake()
  447. if err != nil {
  448. return err
  449. }
  450. endOfEarlyData, ok := msg.(*endOfEarlyDataMsg)
  451. // No handshake messages are allowed after EOD.
  452. if !ok || c.hand.Len() > 0 {
  453. return c.in.setErrorLocked(c.sendAlert(alertUnexpectedMessage))
  454. }
  455. c.hs.keySchedule.write(endOfEarlyData.marshal())
  456. c.phase = waitingClientFinished
  457. c.in.exportKey(c.hs.keySchedule.suite, c.hs.hsClientTrafficSecret)
  458. c.in.setKey(c.vers, c.hs.keySchedule.suite, c.hs.hsClientTrafficSecret)
  459. return nil
  460. }
  461. // selectTLS13SignatureScheme chooses the SignatureScheme for the CertificateVerify
  462. // based on the certificate type and client supported schemes. If no overlap is found,
  463. // a fallback is selected.
  464. //
  465. // See https://tools.ietf.org/html/draft-ietf-tls-tls13-18#section-4.4.1.2
  466. func (hs *serverHandshakeState) selectTLS13SignatureScheme() (sigScheme SignatureScheme, err error) {
  467. var supportedSchemes []SignatureScheme
  468. signer, ok := hs.privateKey.(crypto.Signer)
  469. if !ok {
  470. return 0, errors.New("tls: private key does not implement crypto.Signer")
  471. }
  472. pk := signer.Public()
  473. if _, ok := pk.(*rsa.PublicKey); ok {
  474. sigScheme = PSSWithSHA256
  475. supportedSchemes = []SignatureScheme{PSSWithSHA256, PSSWithSHA384, PSSWithSHA512}
  476. } else if pk, ok := pk.(*ecdsa.PublicKey); ok {
  477. switch pk.Curve {
  478. case elliptic.P256():
  479. sigScheme = ECDSAWithP256AndSHA256
  480. supportedSchemes = []SignatureScheme{ECDSAWithP256AndSHA256}
  481. case elliptic.P384():
  482. sigScheme = ECDSAWithP384AndSHA384
  483. supportedSchemes = []SignatureScheme{ECDSAWithP384AndSHA384}
  484. case elliptic.P521():
  485. sigScheme = ECDSAWithP521AndSHA512
  486. supportedSchemes = []SignatureScheme{ECDSAWithP521AndSHA512}
  487. default:
  488. return 0, errors.New("tls: unknown ECDSA certificate curve")
  489. }
  490. } else {
  491. return 0, errors.New("tls: unknown certificate key type")
  492. }
  493. for _, ss := range supportedSchemes {
  494. for _, cs := range hs.clientHello.supportedSignatureAlgorithms {
  495. if ss == cs {
  496. return ss, nil
  497. }
  498. }
  499. }
  500. return sigScheme, nil
  501. }
  502. func signatureSchemeIsPSS(s SignatureScheme) bool {
  503. return s == PSSWithSHA256 || s == PSSWithSHA384 || s == PSSWithSHA512
  504. }
  505. // hashForSignatureScheme returns the Hash used by a SignatureScheme which is
  506. // supported by selectTLS13SignatureScheme.
  507. func hashForSignatureScheme(ss SignatureScheme) crypto.Hash {
  508. switch ss {
  509. case PSSWithSHA256, ECDSAWithP256AndSHA256:
  510. return crypto.SHA256
  511. case PSSWithSHA384, ECDSAWithP384AndSHA384:
  512. return crypto.SHA384
  513. case PSSWithSHA512, ECDSAWithP521AndSHA512:
  514. return crypto.SHA512
  515. default:
  516. panic("unsupported SignatureScheme passed to hashForSignatureScheme")
  517. }
  518. }
  519. func hashForSuite(suite *cipherSuite) crypto.Hash {
  520. if suite.flags&suiteSHA384 != 0 {
  521. return crypto.SHA384
  522. }
  523. return crypto.SHA256
  524. }
  525. func prepareDigitallySigned(hash crypto.Hash, context string, data []byte) []byte {
  526. message := bytes.Repeat([]byte{32}, 64)
  527. message = append(message, context...)
  528. message = append(message, 0)
  529. message = append(message, data...)
  530. h := hash.New()
  531. h.Write(message)
  532. return h.Sum(nil)
  533. }
  534. // generateKeyShare generates keypair. Private key is returned as first argument, public key
  535. // is returned in keyShare.data. keyshare.curveID stores ID of the scheme used.
  536. func (c *Conn) generateKeyShare(curveID CurveID) ([]byte, keyShare, error) {
  537. if val, ok := dhKexStrat[curveID]; ok {
  538. return val.generate(c, curveID)
  539. }
  540. return nil, keyShare{}, errors.New("tls: preferredCurves includes unsupported curve")
  541. }
  542. // DH key agreement. ks stores public key, secretKey stores private key used for ephemeral
  543. // key agreement. Function returns shared secret in case of success or empty slice otherwise.
  544. func (c *Conn) deriveDHESecret(ks keyShare, secretKey []byte) []byte {
  545. if val, ok := dhKexStrat[ks.group]; ok {
  546. return val.derive(c, ks, secretKey)
  547. }
  548. return nil
  549. }
  550. // HkdfExpandLabel HKDF expands a label
  551. func HkdfExpandLabel(hash crypto.Hash, secret, hashValue []byte, label string, L int) []byte {
  552. return hkdfExpandLabel(hash, secret, hashValue, label, L)
  553. }
  554. func hkdfExpandLabel(hash crypto.Hash, secret, hashValue []byte, label string, L int) []byte {
  555. prefix := "tls13 "
  556. hkdfLabel := make([]byte, 4+len(prefix)+len(label)+len(hashValue))
  557. hkdfLabel[0] = byte(L >> 8)
  558. hkdfLabel[1] = byte(L)
  559. hkdfLabel[2] = byte(len(prefix) + len(label))
  560. copy(hkdfLabel[3:], prefix)
  561. z := hkdfLabel[3+len(prefix):]
  562. copy(z, label)
  563. z = z[len(label):]
  564. z[0] = byte(len(hashValue))
  565. copy(z[1:], hashValue)
  566. return hkdfExpand(hash, secret, hkdfLabel, L)
  567. }
  568. func hmacOfSum(f crypto.Hash, hash hash.Hash, key []byte) []byte {
  569. h := hmac.New(f.New, key)
  570. h.Write(hash.Sum(nil))
  571. return h.Sum(nil)
  572. }
  573. // Maximum allowed mismatch between the stated age of a ticket
  574. // and the server-observed one. See
  575. // https://tools.ietf.org/html/draft-ietf-tls-tls13-18#section-4.2.8.2.
  576. const ticketAgeSkewAllowance = 10 * time.Second
  577. // checkPSK tries to resume using a PSK, returning true (and updating the
  578. // early secret in the key schedule) if the PSK was used and false otherwise.
  579. func (hs *serverHandshakeState) checkPSK() (isResumed bool, alert alert) {
  580. if hs.c.config.SessionTicketsDisabled {
  581. return false, alertSuccess
  582. }
  583. foundDHE := false
  584. for _, mode := range hs.clientHello.pskKeyExchangeModes {
  585. if mode == pskDHEKeyExchange {
  586. foundDHE = true
  587. break
  588. }
  589. }
  590. if !foundDHE {
  591. return false, alertSuccess
  592. }
  593. hash := hashForSuite(hs.suite)
  594. hashSize := hash.Size()
  595. for i := range hs.clientHello.psks {
  596. sessionTicket := append([]uint8{}, hs.clientHello.psks[i].identity...)
  597. if hs.c.config.SessionTicketSealer != nil {
  598. var ok bool
  599. sessionTicket, ok = hs.c.config.SessionTicketSealer.Unseal(hs.clientHelloInfo(), sessionTicket)
  600. if !ok {
  601. continue
  602. }
  603. } else {
  604. sessionTicket, _ = hs.c.decryptTicket(sessionTicket)
  605. if sessionTicket == nil {
  606. continue
  607. }
  608. }
  609. s := &sessionState13{}
  610. if s.unmarshal(sessionTicket) != alertSuccess {
  611. continue
  612. }
  613. if s.vers != hs.c.vers {
  614. continue
  615. }
  616. clientAge := time.Duration(hs.clientHello.psks[i].obfTicketAge-s.ageAdd) * time.Millisecond
  617. serverAge := time.Since(time.Unix(int64(s.createdAt), 0))
  618. if clientAge-serverAge > ticketAgeSkewAllowance || clientAge-serverAge < -ticketAgeSkewAllowance {
  619. // XXX: NSS is off spec and sends obfuscated_ticket_age as seconds
  620. clientAge = time.Duration(hs.clientHello.psks[i].obfTicketAge-s.ageAdd) * time.Second
  621. if clientAge-serverAge > ticketAgeSkewAllowance || clientAge-serverAge < -ticketAgeSkewAllowance {
  622. continue
  623. }
  624. }
  625. // This enforces the stricter 0-RTT requirements on all ticket uses.
  626. // The benefit of using PSK+ECDHE without 0-RTT are small enough that
  627. // we can give them up in the edge case of changed suite or ALPN or SNI.
  628. if s.suite != hs.suite.id {
  629. continue
  630. }
  631. if s.alpnProtocol != hs.c.clientProtocol {
  632. continue
  633. }
  634. if s.SNI != hs.c.serverName {
  635. continue
  636. }
  637. hs.keySchedule.setSecret(s.pskSecret)
  638. binderKey := hs.keySchedule.deriveSecret(secretResumptionPskBinder)
  639. binderFinishedKey := hkdfExpandLabel(hash, binderKey, nil, "finished", hashSize)
  640. chHash := hash.New()
  641. chHash.Write(hs.clientHello.rawTruncated)
  642. expectedBinder := hmacOfSum(hash, chHash, binderFinishedKey)
  643. if subtle.ConstantTimeCompare(expectedBinder, hs.clientHello.psks[i].binder) != 1 {
  644. return false, alertDecryptError
  645. }
  646. if i == 0 && hs.clientHello.earlyData {
  647. // This is a ticket intended to be used for 0-RTT
  648. if s.maxEarlyDataLen == 0 {
  649. // But we had not tagged it as such.
  650. return false, alertIllegalParameter
  651. }
  652. if hs.c.config.Accept0RTTData {
  653. hs.c.binder = expectedBinder
  654. hs.c.ticketMaxEarlyData = int64(s.maxEarlyDataLen)
  655. hs.hello13Enc.earlyData = true
  656. }
  657. }
  658. hs.hello.psk = true
  659. hs.hello.pskIdentity = uint16(i)
  660. return true, alertSuccess
  661. }
  662. return false, alertSuccess
  663. }
  664. func (hs *serverHandshakeState) sendSessionTicket13() error {
  665. c := hs.c
  666. if c.config.SessionTicketsDisabled {
  667. return nil
  668. }
  669. foundDHE := false
  670. for _, mode := range hs.clientHello.pskKeyExchangeModes {
  671. if mode == pskDHEKeyExchange {
  672. foundDHE = true
  673. break
  674. }
  675. }
  676. if !foundDHE {
  677. return nil
  678. }
  679. resumptionMasterSecret := hs.keySchedule.deriveSecret(secretResumption)
  680. ageAddBuf := make([]byte, 4)
  681. sessionState := &sessionState13{
  682. vers: c.vers,
  683. suite: hs.suite.id,
  684. createdAt: uint64(time.Now().Unix()),
  685. alpnProtocol: c.clientProtocol,
  686. SNI: c.serverName,
  687. maxEarlyDataLen: c.config.Max0RTTDataSize,
  688. }
  689. hash := hashForSuite(hs.suite)
  690. for i := 0; i < numSessionTickets; i++ {
  691. if _, err := io.ReadFull(c.config.rand(), ageAddBuf); err != nil {
  692. c.sendAlert(alertInternalError)
  693. return err
  694. }
  695. sessionState.ageAdd = uint32(ageAddBuf[0])<<24 | uint32(ageAddBuf[1])<<16 |
  696. uint32(ageAddBuf[2])<<8 | uint32(ageAddBuf[3])
  697. // ticketNonce must be a unique value for this connection.
  698. // Assume there are no more than 255 tickets, otherwise two
  699. // tickets might have the same PSK which could be a problem if
  700. // one of them is compromised.
  701. ticketNonce := []byte{byte(i)}
  702. sessionState.pskSecret = hkdfExpandLabel(hash, resumptionMasterSecret, ticketNonce, "resumption", hash.Size())
  703. ticket := sessionState.marshal()
  704. var err error
  705. if c.config.SessionTicketSealer != nil {
  706. cs := c.ConnectionState()
  707. ticket, err = c.config.SessionTicketSealer.Seal(&cs, ticket)
  708. } else {
  709. ticket, err = c.encryptTicket(ticket)
  710. }
  711. if err != nil {
  712. c.sendAlert(alertInternalError)
  713. return err
  714. }
  715. if ticket == nil {
  716. continue
  717. }
  718. ticketMsg := &newSessionTicketMsg13{
  719. lifetime: 24 * 3600, // TODO(filippo)
  720. maxEarlyDataLength: c.config.Max0RTTDataSize,
  721. withEarlyDataInfo: c.config.Max0RTTDataSize > 0,
  722. ageAdd: sessionState.ageAdd,
  723. nonce: ticketNonce,
  724. ticket: ticket,
  725. }
  726. if _, err := c.writeRecord(recordTypeHandshake, ticketMsg.marshal()); err != nil {
  727. return err
  728. }
  729. }
  730. return nil
  731. }
  732. func (hs *serverHandshakeState) traceErr(err error) {
  733. if err == nil {
  734. return
  735. }
  736. if os.Getenv("TLSDEBUG") == "error" {
  737. if hs != nil && hs.clientHello != nil {
  738. os.Stderr.WriteString(hex.Dump(hs.clientHello.marshal()))
  739. } else if err == io.EOF {
  740. return // don't stack trace on EOF before CH
  741. }
  742. fmt.Fprintf(os.Stderr, "\n%s\n", debug.Stack())
  743. }
  744. if os.Getenv("TLSDEBUG") == "short" {
  745. var pcs [4]uintptr
  746. frames := runtime.CallersFrames(pcs[0:runtime.Callers(3, pcs[:])])
  747. for {
  748. frame, more := frames.Next()
  749. if frame.Function != "crypto/tls.(*halfConn).setErrorLocked" &&
  750. frame.Function != "crypto/tls.(*Conn).sendAlertLocked" &&
  751. frame.Function != "crypto/tls.(*Conn).sendAlert" {
  752. file := frame.File[strings.LastIndex(frame.File, "/")+1:]
  753. log.Printf("%s:%d (%s): %v", file, frame.Line, frame.Function, err)
  754. return
  755. }
  756. if !more {
  757. break
  758. }
  759. }
  760. }
  761. }
  762. func getCertsFromEntries(certEntries []certificateEntry) [][]byte {
  763. certs := make([][]byte, len(certEntries))
  764. for i, cert := range certEntries {
  765. certs[i] = cert.data
  766. }
  767. return certs
  768. }
  769. func (hs *clientHandshakeState) processEncryptedExtensions(ee *encryptedExtensionsMsg) error {
  770. c := hs.c
  771. if ee.alpnProtocol != "" {
  772. c.clientProtocol = ee.alpnProtocol
  773. c.clientProtocolFallback = false
  774. }
  775. if hs.c.config.ReceivedExtensions != nil {
  776. return hs.c.config.ReceivedExtensions(typeEncryptedExtensions, ee.additionalExtensions)
  777. }
  778. return nil
  779. }
  780. func verifyPeerHandshakeSignature(
  781. certVerify *certificateVerifyMsg,
  782. pubKey crypto.PublicKey,
  783. signAlgosKnown []SignatureScheme,
  784. transHash []byte,
  785. contextString string) (error, alert) {
  786. _, sigType, hashFunc, err := pickSignatureAlgorithm(
  787. pubKey,
  788. []SignatureScheme{certVerify.signatureAlgorithm},
  789. signAlgosKnown,
  790. VersionTLS13)
  791. if err != nil {
  792. return err, alertHandshakeFailure
  793. }
  794. digest := prepareDigitallySigned(hashFunc, contextString, transHash)
  795. err = verifyHandshakeSignature(sigType, pubKey, hashFunc, digest, certVerify.signature)
  796. if err != nil {
  797. return err, alertDecryptError
  798. }
  799. return nil, alertSuccess
  800. }
  801. func (hs *clientHandshakeState) getCertificate13(certReq *certificateRequestMsg13) (*Certificate, error) {
  802. certReq12 := &certificateRequestMsg{
  803. hasSignatureAndHash: true,
  804. supportedSignatureAlgorithms: certReq.supportedSignatureAlgorithms,
  805. certificateAuthorities: certReq.certificateAuthorities,
  806. }
  807. var rsaAvail, ecdsaAvail bool
  808. for _, sigAlg := range certReq.supportedSignatureAlgorithms {
  809. switch signatureFromSignatureScheme(sigAlg) {
  810. case signaturePKCS1v15, signatureRSAPSS:
  811. rsaAvail = true
  812. case signatureECDSA:
  813. ecdsaAvail = true
  814. }
  815. }
  816. if rsaAvail {
  817. certReq12.certificateTypes = append(certReq12.certificateTypes, certTypeRSASign)
  818. }
  819. if ecdsaAvail {
  820. certReq12.certificateTypes = append(certReq12.certificateTypes, certTypeECDSASign)
  821. }
  822. return hs.getCertificate(certReq12)
  823. }
  824. func (hs *clientHandshakeState) sendCertificate13(chainToSend *Certificate, certReq *certificateRequestMsg13) error {
  825. c := hs.c
  826. certEntries := []certificateEntry{}
  827. for _, cert := range chainToSend.Certificate {
  828. certEntries = append(certEntries, certificateEntry{data: cert})
  829. }
  830. certMsg := &certificateMsg13{certificates: certEntries}
  831. hs.keySchedule.write(certMsg.marshal())
  832. if _, err := c.writeRecord(recordTypeHandshake, certMsg.marshal()); err != nil {
  833. return err
  834. }
  835. if len(certEntries) == 0 {
  836. // No client cert available, nothing to sign.
  837. return nil
  838. }
  839. key, ok := chainToSend.PrivateKey.(crypto.Signer)
  840. if !ok {
  841. c.sendAlert(alertInternalError)
  842. return fmt.Errorf("tls: client certificate private key of type %T does not implement crypto.Signer", chainToSend.PrivateKey)
  843. }
  844. signatureAlgorithm, sigType, hashFunc, err := pickSignatureAlgorithm(key.Public(), certReq.supportedSignatureAlgorithms, hs.hello.supportedSignatureAlgorithms, c.vers)
  845. if err != nil {
  846. hs.c.sendAlert(alertHandshakeFailure)
  847. return err
  848. }
  849. digest := prepareDigitallySigned(hashFunc, "TLS 1.3, client CertificateVerify", hs.keySchedule.transcriptHash.Sum(nil))
  850. signOpts := crypto.SignerOpts(hashFunc)
  851. if sigType == signatureRSAPSS {
  852. signOpts = &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash, Hash: hashFunc}
  853. }
  854. signature, err := key.Sign(c.config.rand(), digest, signOpts)
  855. if err != nil {
  856. c.sendAlert(alertInternalError)
  857. return err
  858. }
  859. verifyMsg := &certificateVerifyMsg{
  860. hasSignatureAndHash: true,
  861. signatureAlgorithm: signatureAlgorithm,
  862. signature: signature,
  863. }
  864. hs.keySchedule.write(verifyMsg.marshal())
  865. if _, err := c.writeRecord(recordTypeHandshake, verifyMsg.marshal()); err != nil {
  866. return err
  867. }
  868. return nil
  869. }
  870. func (hs *clientHandshakeState) doTLS13Handshake() error {
  871. c := hs.c
  872. hash := hashForSuite(hs.suite)
  873. hashSize := hash.Size()
  874. serverHello := hs.serverHello
  875. c.scts = serverHello.scts
  876. // middlebox compatibility mode, send CCS before second flight.
  877. if _, err := c.writeRecord(recordTypeChangeCipherSpec, []byte{1}); err != nil {
  878. return err
  879. }
  880. // TODO check if keyshare is unacceptable, raise HRR.
  881. clientKS := hs.hello.keyShares[0]
  882. if serverHello.keyShare.group != clientKS.group {
  883. c.sendAlert(alertIllegalParameter)
  884. return errors.New("bad or missing key share from server")
  885. }
  886. // 0-RTT is not supported yet, so use an empty PSK.
  887. hs.keySchedule.setSecret(nil)
  888. ecdheSecret := c.deriveDHESecret(serverHello.keyShare, hs.privateKey)
  889. if ecdheSecret == nil {
  890. c.sendAlert(alertIllegalParameter)
  891. return errors.New("tls: bad ECDHE server share")
  892. }
  893. // Calculate handshake secrets.
  894. hs.keySchedule.setSecret(ecdheSecret)
  895. clientHandshakeSecret := hs.keySchedule.deriveSecret(secretHandshakeClient)
  896. if c.hand.Len() > 0 {
  897. c.sendAlert(alertUnexpectedMessage)
  898. return errors.New("tls: unexpected data after Server Hello")
  899. }
  900. serverHandshakeSecret := hs.keySchedule.deriveSecret(secretHandshakeServer)
  901. c.in.exportKey(hs.keySchedule.suite, serverHandshakeSecret)
  902. // Already the sender key yet, when using an alternative record layer.
  903. // QUIC needs the handshake write key in order to acknowledge Handshake packets.
  904. c.out.exportKey(hs.keySchedule.suite, clientHandshakeSecret)
  905. // Do not change the sender key yet, the server must authenticate first.
  906. c.in.setKey(c.vers, hs.keySchedule.suite, serverHandshakeSecret)
  907. // Calculate MAC key for Finished messages.
  908. serverFinishedKey := hkdfExpandLabel(hash, serverHandshakeSecret, nil, "finished", hashSize)
  909. clientFinishedKey := hkdfExpandLabel(hash, clientHandshakeSecret, nil, "finished", hashSize)
  910. msg, err := c.readHandshake()
  911. if err != nil {
  912. return err
  913. }
  914. encryptedExtensions, ok := msg.(*encryptedExtensionsMsg)
  915. if !ok {
  916. c.sendAlert(alertUnexpectedMessage)
  917. return unexpectedMessageError(encryptedExtensions, msg)
  918. }
  919. if err := hs.processEncryptedExtensions(encryptedExtensions); err != nil {
  920. return err
  921. }
  922. hs.keySchedule.write(encryptedExtensions.marshal())
  923. // PSKs are not supported, so receive Certificate message.
  924. msg, err = c.readHandshake()
  925. if err != nil {
  926. return err
  927. }
  928. var chainToSend *Certificate
  929. certReq, isCertRequested := msg.(*certificateRequestMsg13)
  930. if isCertRequested {
  931. hs.keySchedule.write(certReq.marshal())
  932. if chainToSend, err = hs.getCertificate13(certReq); err != nil {
  933. c.sendAlert(alertInternalError)
  934. return err
  935. }
  936. msg, err = c.readHandshake()
  937. if err != nil {
  938. return err
  939. }
  940. }
  941. certMsg, ok := msg.(*certificateMsg13)
  942. if !ok {
  943. c.sendAlert(alertUnexpectedMessage)
  944. return unexpectedMessageError(certMsg, msg)
  945. }
  946. hs.keySchedule.write(certMsg.marshal())
  947. // Validate certificates.
  948. certs := getCertsFromEntries(certMsg.certificates)
  949. if err := hs.processCertsFromServer(certs); err != nil {
  950. return err
  951. }
  952. // Receive CertificateVerify message.
  953. msg, err = c.readHandshake()
  954. if err != nil {
  955. return err
  956. }
  957. certVerifyMsg, ok := msg.(*certificateVerifyMsg)
  958. if !ok {
  959. c.sendAlert(alertUnexpectedMessage)
  960. return unexpectedMessageError(certVerifyMsg, msg)
  961. }
  962. // Validate the DC if present. The DC is only processed if the extension was
  963. // indicated by the ClientHello; otherwise this call will result in an
  964. // "illegal_parameter" alert.
  965. if len(certMsg.certificates) > 0 {
  966. if err := hs.processDelegatedCredentialFromServer(
  967. certMsg.certificates[0].delegatedCredential,
  968. certVerifyMsg.signatureAlgorithm); err != nil {
  969. return err
  970. }
  971. }
  972. // Set the public key used to verify the handshake.
  973. pk := hs.c.peerCertificates[0].PublicKey
  974. // If the delegated credential extension has successfully been negotiated,
  975. // then the CertificateVerify signature will have been produced with the
  976. // DelegatedCredential's private key.
  977. if hs.c.verifiedDc != nil {
  978. pk = hs.c.verifiedDc.cred.publicKey
  979. }
  980. // Verify the handshake signature.
  981. err, alertCode := verifyPeerHandshakeSignature(
  982. certVerifyMsg,
  983. pk,
  984. hs.hello.supportedSignatureAlgorithms,
  985. hs.keySchedule.transcriptHash.Sum(nil),
  986. "TLS 1.3, server CertificateVerify")
  987. if err != nil {
  988. c.sendAlert(alertCode)
  989. return err
  990. }
  991. hs.keySchedule.write(certVerifyMsg.marshal())
  992. // Receive Finished message.
  993. msg, err = c.readHandshake()
  994. if err != nil {
  995. return err
  996. }
  997. serverFinished, ok := msg.(*finishedMsg)
  998. if !ok {
  999. c.sendAlert(alertUnexpectedMessage)
  1000. return unexpectedMessageError(serverFinished, msg)
  1001. }
  1002. // Validate server Finished hash.
  1003. expectedVerifyData := hmacOfSum(hash, hs.keySchedule.transcriptHash, serverFinishedKey)
  1004. if subtle.ConstantTimeCompare(expectedVerifyData, serverFinished.verifyData) != 1 {
  1005. c.sendAlert(alertDecryptError)
  1006. return errors.New("tls: server's Finished message is incorrect")
  1007. }
  1008. hs.keySchedule.write(serverFinished.marshal())
  1009. // Server has authenticated itself. Calculate application traffic secrets.
  1010. hs.keySchedule.setSecret(nil) // derive master secret
  1011. // Change outbound handshake cipher for final step
  1012. c.out.setKey(c.vers, hs.keySchedule.suite, clientHandshakeSecret)
  1013. clientAppTrafficSecret := hs.keySchedule.deriveSecret(secretApplicationClient)
  1014. serverAppTrafficSecret := hs.keySchedule.deriveSecret(secretApplicationServer)
  1015. // TODO store initial traffic secret key for KeyUpdate GH #85
  1016. // Client auth requires sending a (possibly empty) Certificate followed
  1017. // by a CertificateVerify message (if there was an actual certificate).
  1018. if isCertRequested {
  1019. if err := hs.sendCertificate13(chainToSend, certReq); err != nil {
  1020. return err
  1021. }
  1022. }
  1023. // Send Finished
  1024. verifyData := hmacOfSum(hash, hs.keySchedule.transcriptHash, clientFinishedKey)
  1025. clientFinished := &finishedMsg{
  1026. verifyData: verifyData,
  1027. }
  1028. if _, err := c.writeRecord(recordTypeHandshake, clientFinished.marshal()); err != nil {
  1029. return err
  1030. }
  1031. // Handshake done, set application traffic secret
  1032. // TODO store initial traffic secret key for KeyUpdate GH #85
  1033. c.out.exportKey(hs.keySchedule.suite, clientAppTrafficSecret)
  1034. c.out.setKey(c.vers, hs.keySchedule.suite, clientAppTrafficSecret)
  1035. if c.hand.Len() > 0 {
  1036. c.sendAlert(alertUnexpectedMessage)
  1037. return errors.New("tls: unexpected data after handshake")
  1038. }
  1039. c.in.exportKey(hs.keySchedule.suite, serverAppTrafficSecret)
  1040. c.in.setKey(c.vers, hs.keySchedule.suite, serverAppTrafficSecret)
  1041. return nil
  1042. }
  1043. // supportedSigAlgorithmsCert iterates over schemes and filters out those algorithms
  1044. // which are not supported for certificate verification.
  1045. func supportedSigAlgorithmsCert(schemes []SignatureScheme) (ret []SignatureScheme) {
  1046. for _, sig := range schemes {
  1047. // X509 doesn't support PSS signatures
  1048. if !signatureSchemeIsPSS(sig) {
  1049. ret = append(ret, sig)
  1050. }
  1051. }
  1052. return
  1053. }
  1054. // Functions below implement dhKex interface for different DH shared secret agreements
  1055. // KEX: P-256, P-384, P-512 KEX
  1056. func (kexNist) generate(c *Conn, groupId CurveID) (private []byte, ks keyShare, err error) {
  1057. // never fails
  1058. curve, _ := curveForCurveID(groupId)
  1059. private, x, y, err := elliptic.GenerateKey(curve, c.config.rand())
  1060. if err != nil {
  1061. return nil, keyShare{}, err
  1062. }
  1063. ks.group = groupId
  1064. ks.data = elliptic.Marshal(curve, x, y)
  1065. return
  1066. }
  1067. func (kexNist) derive(c *Conn, ks keyShare, secretKey []byte) []byte {
  1068. // never fails
  1069. curve, _ := curveForCurveID(ks.group)
  1070. x, y := elliptic.Unmarshal(curve, ks.data)
  1071. if x == nil {
  1072. return nil
  1073. }
  1074. x, _ = curve.ScalarMult(x, y, secretKey)
  1075. xBytes := x.Bytes()
  1076. curveSize := (curve.Params().BitSize + 8 - 1) >> 3
  1077. if len(xBytes) == curveSize {
  1078. return xBytes
  1079. }
  1080. buf := make([]byte, curveSize)
  1081. copy(buf[len(buf)-len(xBytes):], xBytes)
  1082. return buf
  1083. }
  1084. // KEX: X25519
  1085. func (kexX25519) generate(c *Conn, groupId CurveID) ([]byte, keyShare, error) {
  1086. var scalar, public [x25519SharedSecretSz]byte
  1087. if _, err := io.ReadFull(c.config.rand(), scalar[:]); err != nil {
  1088. return nil, keyShare{}, err
  1089. }
  1090. curve25519.ScalarBaseMult(&public, &scalar)
  1091. return scalar[:], keyShare{group: X25519, data: public[:]}, nil
  1092. }
  1093. func (kexX25519) derive(c *Conn, ks keyShare, secretKey []byte) []byte {
  1094. var theirPublic, sharedKey, scalar [x25519SharedSecretSz]byte
  1095. if len(ks.data) != x25519SharedSecretSz {
  1096. return nil
  1097. }
  1098. copy(theirPublic[:], ks.data)
  1099. copy(scalar[:], secretKey)
  1100. curve25519.ScalarMult(&sharedKey, &scalar, &theirPublic)
  1101. return sharedKey[:]
  1102. }
  1103. // KEX: SIDH/503
  1104. func (kexSIDHp503) generate(c *Conn, groupId CurveID) ([]byte, keyShare, error) {
  1105. var variant, _ = getSidhKeyVariant(c.isClient)
  1106. var prvKey = sidh.NewPrivateKey(sidh.FP_503, variant)
  1107. if prvKey.Generate(c.config.rand()) != nil {
  1108. return nil, keyShare{}, errors.New("tls: private SIDH key generation failed")
  1109. }
  1110. pubKey := prvKey.GeneratePublicKey()
  1111. return prvKey.Export(), keyShare{group: 0 /*UNUSED*/, data: pubKey.Export()}, nil
  1112. }
  1113. func (kexSIDHp503) derive(c *Conn, ks keyShare, key []byte) []byte {
  1114. var prvVariant, pubVariant = getSidhKeyVariant(c.isClient)
  1115. var prvKeySize = P503PrvKeySz
  1116. if len(ks.data) != P503PubKeySz || len(key) != prvKeySize {
  1117. return nil
  1118. }
  1119. prvKey := sidh.NewPrivateKey(sidh.FP_503, prvVariant)
  1120. pubKey := sidh.NewPublicKey(sidh.FP_503, pubVariant)
  1121. if err := prvKey.Import(key); err != nil {
  1122. return nil
  1123. }
  1124. if err := pubKey.Import(ks.data); err != nil {
  1125. return nil
  1126. }
  1127. // Never fails
  1128. sharedKey, _ := sidh.DeriveSecret(prvKey, pubKey)
  1129. return sharedKey
  1130. }
  1131. // KEX Hybrid SIDH/503-X25519
  1132. func (kex *kexHybridSIDHp503X25519) generate(c *Conn, groupId CurveID) (private []byte, ks keyShare, err error) {
  1133. var pubHybrid [SIDHp503Curve25519PubKeySz]byte
  1134. var prvHybrid [SIDHp503Curve25519PrvKeySz]byte
  1135. // Generate ephemeral key for classic x25519
  1136. private, ks, err = kex.classicKEX.generate(c, groupId)
  1137. if err != nil {
  1138. return
  1139. }
  1140. copy(prvHybrid[:], private)
  1141. copy(pubHybrid[:], ks.data)
  1142. // Generate PQ ephemeral key for SIDH
  1143. private, ks, err = kex.pqKEX.generate(c, groupId)
  1144. if err != nil {
  1145. return
  1146. }
  1147. copy(prvHybrid[x25519SharedSecretSz:], private)
  1148. copy(pubHybrid[x25519SharedSecretSz:], ks.data)
  1149. return prvHybrid[:], keyShare{group: HybridSIDHp503Curve25519, data: pubHybrid[:]}, nil
  1150. }
  1151. func (kex *kexHybridSIDHp503X25519) derive(c *Conn, ks keyShare, key []byte) []byte {
  1152. var sharedKey [SIDHp503Curve25519SharedKeySz]byte
  1153. var ret []byte
  1154. var tmpKs keyShare
  1155. // Key agreement for classic
  1156. tmpKs.group = X25519
  1157. tmpKs.data = ks.data[:x25519SharedSecretSz]
  1158. ret = kex.classicKEX.derive(c, tmpKs, key[:x25519SharedSecretSz])
  1159. if ret == nil {
  1160. return nil
  1161. }
  1162. copy(sharedKey[:], ret)
  1163. // Key agreement for PQ
  1164. tmpKs.group = 0 /*UNUSED*/
  1165. tmpKs.data = ks.data[x25519SharedSecretSz:]
  1166. ret = kex.pqKEX.derive(c, tmpKs, key[x25519SharedSecretSz:])
  1167. if ret == nil {
  1168. return nil
  1169. }
  1170. copy(sharedKey[x25519SharedSecretSz:], ret)
  1171. return sharedKey[:]
  1172. }