server-state-machine.go 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177
  1. package mint
  2. import (
  3. "bytes"
  4. "crypto/x509"
  5. "fmt"
  6. "hash"
  7. "reflect"
  8. "github.com/bifurcation/mint/syntax"
  9. )
  10. // Server State Machine
  11. //
  12. // START <-----+
  13. // Recv ClientHello | | Send HelloRetryRequest
  14. // v |
  15. // RECVD_CH ----+
  16. // | Select parameters
  17. // | Send ServerHello
  18. // v
  19. // NEGOTIATED
  20. // | Send EncryptedExtensions
  21. // | [Send CertificateRequest]
  22. // Can send | [Send Certificate + CertificateVerify]
  23. // app data --> | Send Finished
  24. // after here |
  25. // +-----------+--------+
  26. // | | |
  27. // Rejected 0-RTT | No | | 0-RTT
  28. // | 0-RTT | |
  29. // | | v
  30. // +---->READ_PAST | WAIT_EOED <---+
  31. // Decrypt | | | Decrypt | Recv | | | Recv
  32. // error | | | OK + HS | EOED | | | early data
  33. // +-----+ | V | +-----+
  34. // +---> WAIT_FLIGHT2 <-+
  35. // |
  36. // +--------+--------+
  37. // No auth | | Client auth
  38. // | |
  39. // | v
  40. // | WAIT_CERT
  41. // | Recv | | Recv Certificate
  42. // | empty | v
  43. // | Certificate | WAIT_CV
  44. // | | | Recv
  45. // | v | CertificateVerify
  46. // +-> WAIT_FINISHED <---+
  47. // | Recv Finished
  48. // v
  49. // CONNECTED
  50. //
  51. // NB: Not using state RECVD_CH
  52. //
  53. // State Instructions
  54. // START {}
  55. // NEGOTIATED Send(SH); [RekeyIn;] RekeyOut; Send(EE); [Send(CertReq);] [Send(Cert); Send(CV)]
  56. // WAIT_EOED RekeyIn;
  57. // READ_PAST {}
  58. // WAIT_FLIGHT2 {}
  59. // WAIT_CERT_CR {}
  60. // WAIT_CERT {}
  61. // WAIT_CV {}
  62. // WAIT_FINISHED RekeyIn; RekeyOut;
  63. // CONNECTED StoreTicket || (RekeyIn; [RekeyOut])
  64. // A cookie can be sent to the client in a HRR.
  65. type cookie struct {
  66. // The CipherSuite that was selected when the client sent the first ClientHello
  67. CipherSuite CipherSuite
  68. ClientHelloHash []byte `tls:"head=2"`
  69. // The ApplicationCookie can be provided by the application (by setting a Config.CookieHandler)
  70. ApplicationCookie []byte `tls:"head=2"`
  71. }
  72. type serverStateStart struct {
  73. Config *Config
  74. conn *Conn
  75. hsCtx *HandshakeContext
  76. }
  77. var _ HandshakeState = &serverStateStart{}
  78. func (state serverStateStart) State() State {
  79. return StateServerStart
  80. }
  81. func (state serverStateStart) Next(hr handshakeMessageReader) (HandshakeState, []HandshakeAction, Alert) {
  82. hm, alert := hr.ReadMessage()
  83. if alert != AlertNoAlert {
  84. return nil, nil, alert
  85. }
  86. if hm == nil || hm.msgType != HandshakeTypeClientHello {
  87. logf(logTypeHandshake, "[ServerStateStart] unexpected message")
  88. return nil, nil, AlertUnexpectedMessage
  89. }
  90. ch := &ClientHelloBody{LegacyVersion: wireVersion(state.hsCtx.hIn)}
  91. if err := safeUnmarshal(ch, hm.body); err != nil {
  92. logf(logTypeHandshake, "[ServerStateStart] Error decoding message: %v", err)
  93. return nil, nil, AlertDecodeError
  94. }
  95. // We are strict about these things because we only support 1.3
  96. if ch.LegacyVersion != wireVersion(state.hsCtx.hIn) {
  97. logf(logTypeHandshake, "[ServerStateStart] Invalid version number: %v", ch.LegacyVersion)
  98. return nil, nil, AlertDecodeError
  99. }
  100. clientHello := hm
  101. connParams := ConnectionParameters{}
  102. supportedVersions := &SupportedVersionsExtension{HandshakeType: HandshakeTypeClientHello}
  103. serverName := new(ServerNameExtension)
  104. supportedGroups := new(SupportedGroupsExtension)
  105. signatureAlgorithms := new(SignatureAlgorithmsExtension)
  106. clientKeyShares := &KeyShareExtension{HandshakeType: HandshakeTypeClientHello}
  107. clientPSK := &PreSharedKeyExtension{HandshakeType: HandshakeTypeClientHello}
  108. clientEarlyData := &EarlyDataExtension{}
  109. clientALPN := new(ALPNExtension)
  110. clientPSKModes := new(PSKKeyExchangeModesExtension)
  111. clientCookie := new(CookieExtension)
  112. // Handle external extensions.
  113. if state.Config.ExtensionHandler != nil {
  114. err := state.Config.ExtensionHandler.Receive(HandshakeTypeClientHello, &ch.Extensions)
  115. if err != nil {
  116. logf(logTypeHandshake, "[ServerStateStart] Error running external extension handler [%v]", err)
  117. return nil, nil, AlertInternalError
  118. }
  119. }
  120. foundExts, err := ch.Extensions.Parse(
  121. []ExtensionBody{
  122. supportedVersions,
  123. serverName,
  124. supportedGroups,
  125. signatureAlgorithms,
  126. clientEarlyData,
  127. clientKeyShares,
  128. clientPSK,
  129. clientALPN,
  130. clientPSKModes,
  131. clientCookie,
  132. })
  133. if err != nil {
  134. logf(logTypeHandshake, "[ServerStateStart] Error parsing extensions [%v]", err)
  135. return nil, nil, AlertDecodeError
  136. }
  137. clientSentCookie := len(clientCookie.Cookie) > 0
  138. if foundExts[ExtensionTypeServerName] {
  139. connParams.ServerName = string(*serverName)
  140. }
  141. // If the client didn't send supportedVersions or doesn't support 1.3,
  142. // then we're done here.
  143. if !foundExts[ExtensionTypeSupportedVersions] {
  144. logf(logTypeHandshake, "[ServerStateStart] Client did not send supported_versions")
  145. return nil, nil, AlertProtocolVersion
  146. }
  147. versionOK, _ := VersionNegotiation(supportedVersions.Versions, []uint16{supportedVersion})
  148. if !versionOK {
  149. logf(logTypeHandshake, "[ServerStateStart] Client does not support the same version")
  150. return nil, nil, AlertProtocolVersion
  151. }
  152. // The client sent a cookie. So this is probably the second ClientHello (sent as a response to a HRR)
  153. var firstClientHello *HandshakeMessage
  154. var initialCipherSuite CipherSuiteParams // the cipher suite that was negotiated when sending the HelloRetryRequest
  155. if clientSentCookie {
  156. plainCookie, err := state.Config.CookieProtector.DecodeToken(clientCookie.Cookie)
  157. if err != nil {
  158. logf(logTypeHandshake, fmt.Sprintf("[ServerStateStart] Error decoding token [%v]", err))
  159. return nil, nil, AlertDecryptError
  160. }
  161. cookie := &cookie{}
  162. if rb, err := syntax.Unmarshal(plainCookie, cookie); err != nil && rb != len(plainCookie) { // this should never happen
  163. logf(logTypeHandshake, fmt.Sprintf("[ServerStateStart] Error unmarshaling cookie [%v]", err))
  164. return nil, nil, AlertInternalError
  165. }
  166. // restore the hash of initial ClientHello from the cookie
  167. firstClientHello = &HandshakeMessage{
  168. msgType: HandshakeTypeMessageHash,
  169. body: cookie.ClientHelloHash,
  170. }
  171. // have the application validate its part of the cookie
  172. if state.Config.CookieHandler != nil && !state.Config.CookieHandler.Validate(state.conn, cookie.ApplicationCookie) {
  173. logf(logTypeHandshake, "[ServerStateStart] Cookie mismatch")
  174. return nil, nil, AlertAccessDenied
  175. }
  176. var ok bool
  177. initialCipherSuite, ok = cipherSuiteMap[cookie.CipherSuite]
  178. if !ok {
  179. logf(logTypeHandshake, fmt.Sprintf("[ServerStateStart] Cookie contained invalid cipher suite: %#x", cookie.CipherSuite))
  180. return nil, nil, AlertInternalError
  181. }
  182. }
  183. if len(ch.LegacySessionID) != 0 && len(ch.LegacySessionID) != 32 {
  184. logf(logTypeHandshake, "[ServerStateStart] invalid session ID")
  185. return nil, nil, AlertIllegalParameter
  186. }
  187. // Figure out if we can do DH
  188. canDoDH, dhGroup, dhPublic, dhSecret := DHNegotiation(clientKeyShares.Shares, state.Config.Groups)
  189. // Figure out if we can do PSK
  190. var canDoPSK bool
  191. var selectedPSK int
  192. var params CipherSuiteParams
  193. var psk *PreSharedKey
  194. if len(clientPSK.Identities) > 0 {
  195. contextBase := []byte{}
  196. if clientSentCookie {
  197. contextBase = append(contextBase, firstClientHello.Marshal()...)
  198. // fill in the cookie sent by the client. Needed to calculate the correct hash
  199. cookieExt := &CookieExtension{Cookie: clientCookie.Cookie}
  200. hrr, err := state.generateHRR(params.Suite,
  201. ch.LegacySessionID, cookieExt)
  202. if err != nil {
  203. return nil, nil, AlertInternalError
  204. }
  205. contextBase = append(contextBase, hrr.Marshal()...)
  206. }
  207. chTrunc, err := ch.Truncated()
  208. if err != nil {
  209. logf(logTypeHandshake, "[ServerStateStart] Error computing truncated ClientHello [%v]", err)
  210. return nil, nil, AlertDecodeError
  211. }
  212. context := append(contextBase, chTrunc...)
  213. canDoPSK, selectedPSK, psk, params, err = PSKNegotiation(clientPSK.Identities, clientPSK.Binders, context, state.Config.PSKs)
  214. if err != nil {
  215. logf(logTypeHandshake, "[ServerStateStart] Error in PSK negotiation [%v]", err)
  216. return nil, nil, AlertInternalError
  217. }
  218. }
  219. // Figure out if we actually should do DH / PSK
  220. connParams.UsingDH, connParams.UsingPSK = PSKModeNegotiation(canDoDH, canDoPSK, clientPSKModes.KEModes)
  221. // Select a ciphersuite
  222. connParams.CipherSuite, err = CipherSuiteNegotiation(psk, ch.CipherSuites, state.Config.CipherSuites)
  223. if err != nil {
  224. logf(logTypeHandshake, "[ServerStateStart] No common ciphersuite found [%v]", err)
  225. return nil, nil, AlertHandshakeFailure
  226. }
  227. if clientSentCookie && initialCipherSuite.Suite != connParams.CipherSuite {
  228. logf(logTypeHandshake, "[ServerStateStart] Would have selected a different CipherSuite after receiving the client's Cookie")
  229. return nil, nil, AlertInternalError
  230. }
  231. var helloRetryRequest *HandshakeMessage
  232. if state.Config.RequireCookie {
  233. // Send a cookie if required
  234. // NB: Need to do this here because it's after ciphersuite selection, which
  235. // has to be after PSK selection.
  236. var shouldSendHRR bool
  237. var cookieExt *CookieExtension
  238. if !clientSentCookie { // this is the first ClientHello that we receive
  239. var appCookie []byte
  240. if state.Config.CookieHandler == nil { // if Config.RequireCookie is set, but no CookieHandler was provided, we definitely need to send a cookie
  241. shouldSendHRR = true
  242. } else { // if the CookieHandler was set, we just send a cookie when the application provides one
  243. var err error
  244. appCookie, err = state.Config.CookieHandler.Generate(state.conn)
  245. if err != nil {
  246. logf(logTypeHandshake, "[ServerStateStart] Error generating cookie [%v]", err)
  247. return nil, nil, AlertInternalError
  248. }
  249. shouldSendHRR = appCookie != nil
  250. }
  251. if shouldSendHRR {
  252. params := cipherSuiteMap[connParams.CipherSuite]
  253. h := params.Hash.New()
  254. h.Write(clientHello.Marshal())
  255. plainCookie, err := syntax.Marshal(cookie{
  256. CipherSuite: connParams.CipherSuite,
  257. ClientHelloHash: h.Sum(nil),
  258. ApplicationCookie: appCookie,
  259. })
  260. if err != nil {
  261. logf(logTypeHandshake, "[ServerStateStart] Error marshalling cookie [%v]", err)
  262. return nil, nil, AlertInternalError
  263. }
  264. cookieData, err := state.Config.CookieProtector.NewToken(plainCookie)
  265. if err != nil {
  266. logf(logTypeHandshake, "[ServerStateStart] Error encoding cookie [%v]", err)
  267. return nil, nil, AlertInternalError
  268. }
  269. cookieExt = &CookieExtension{Cookie: cookieData}
  270. }
  271. } else {
  272. cookieExt = &CookieExtension{Cookie: clientCookie.Cookie}
  273. }
  274. // Generate a HRR. We will need it in both of the two cases:
  275. // 1. We need to send a Cookie. Then this HRR will be sent on the wire
  276. // 2. We need to validate a cookie. Then we need its hash
  277. // Ignoring errors because everything here is newly constructed, so there
  278. // shouldn't be marshal errors
  279. if shouldSendHRR || clientSentCookie {
  280. helloRetryRequest, err = state.generateHRR(connParams.CipherSuite,
  281. ch.LegacySessionID, cookieExt)
  282. if err != nil {
  283. return nil, nil, AlertInternalError
  284. }
  285. }
  286. if shouldSendHRR {
  287. toSend := []HandshakeAction{
  288. QueueHandshakeMessage{helloRetryRequest},
  289. SendQueuedHandshake{},
  290. }
  291. logf(logTypeHandshake, "[ServerStateStart] -> [ServerStateStart]")
  292. return state, toSend, AlertStatelessRetry
  293. }
  294. }
  295. // If we've got no entropy to make keys from, fail
  296. if !connParams.UsingDH && !connParams.UsingPSK {
  297. logf(logTypeHandshake, "[ServerStateStart] Neither DH nor PSK negotiated")
  298. return nil, nil, AlertHandshakeFailure
  299. }
  300. var pskSecret []byte
  301. var cert *Certificate
  302. var certScheme SignatureScheme
  303. if connParams.UsingPSK {
  304. pskSecret = psk.Key
  305. } else {
  306. psk = nil
  307. // If we're not using a PSK mode, then we need to have certain extensions
  308. if !(foundExts[ExtensionTypeServerName] &&
  309. foundExts[ExtensionTypeSupportedGroups] &&
  310. foundExts[ExtensionTypeSignatureAlgorithms]) {
  311. logf(logTypeHandshake, "[ServerStateStart] Insufficient extensions (%v)", foundExts)
  312. return nil, nil, AlertMissingExtension
  313. }
  314. // Select a certificate
  315. name := string(*serverName)
  316. var err error
  317. cert, certScheme, err = CertificateSelection(&name, signatureAlgorithms.Algorithms, state.Config.Certificates)
  318. if err != nil {
  319. logf(logTypeHandshake, "[ServerStateStart] No appropriate certificate found [%v]", err)
  320. return nil, nil, AlertAccessDenied
  321. }
  322. }
  323. if !connParams.UsingDH {
  324. dhSecret = nil
  325. }
  326. // Figure out if we're going to do early data
  327. var clientEarlyTrafficSecret []byte
  328. connParams.ClientSendingEarlyData = foundExts[ExtensionTypeEarlyData]
  329. connParams.UsingEarlyData, connParams.RejectedEarlyData = EarlyDataNegotiation(connParams.UsingPSK, foundExts[ExtensionTypeEarlyData], state.Config.AllowEarlyData)
  330. if connParams.UsingEarlyData {
  331. h := params.Hash.New()
  332. h.Write(clientHello.Marshal())
  333. chHash := h.Sum(nil)
  334. zero := bytes.Repeat([]byte{0}, params.Hash.Size())
  335. earlySecret := HkdfExtract(params.Hash, zero, pskSecret)
  336. clientEarlyTrafficSecret = deriveSecret(params, earlySecret, labelEarlyTrafficSecret, chHash)
  337. }
  338. // Select a next protocol
  339. connParams.NextProto, err = ALPNNegotiation(psk, clientALPN.Protocols, state.Config.NextProtos)
  340. if err != nil {
  341. logf(logTypeHandshake, "[ServerStateStart] No common application-layer protocol found [%v]", err)
  342. return nil, nil, AlertNoApplicationProtocol
  343. }
  344. state.hsCtx.receivedEndOfFlight()
  345. logf(logTypeHandshake, "[ServerStateStart] -> [ServerStateNegotiated]")
  346. state.hsCtx.SetVersion(tls12Version) // Everything after this should be 1.2.
  347. return serverStateNegotiated{
  348. Config: state.Config,
  349. Params: connParams,
  350. hsCtx: state.hsCtx,
  351. dhGroup: dhGroup,
  352. dhPublic: dhPublic,
  353. dhSecret: dhSecret,
  354. pskSecret: pskSecret,
  355. selectedPSK: selectedPSK,
  356. cert: cert,
  357. certScheme: certScheme,
  358. legacySessionId: ch.LegacySessionID,
  359. clientEarlyTrafficSecret: clientEarlyTrafficSecret,
  360. firstClientHello: firstClientHello,
  361. helloRetryRequest: helloRetryRequest,
  362. clientHello: clientHello,
  363. }, nil, AlertNoAlert
  364. }
  365. func (state *serverStateStart) generateHRR(cs CipherSuite, legacySessionId []byte,
  366. cookieExt *CookieExtension) (*HandshakeMessage, error) {
  367. var helloRetryRequest *HandshakeMessage
  368. hrr := &ServerHelloBody{
  369. Version: tls12Version,
  370. Random: hrrRandomSentinel,
  371. CipherSuite: cs,
  372. LegacySessionID: legacySessionId,
  373. LegacyCompressionMethod: 0,
  374. }
  375. sv := &SupportedVersionsExtension{
  376. HandshakeType: HandshakeTypeServerHello,
  377. Versions: []uint16{supportedVersion},
  378. }
  379. if err := hrr.Extensions.Add(sv); err != nil {
  380. logf(logTypeHandshake, "[ServerStateStart] Error adding SupportedVersion [%v]", err)
  381. return nil, err
  382. }
  383. if err := hrr.Extensions.Add(cookieExt); err != nil {
  384. logf(logTypeHandshake, "[ServerStateStart] Error adding CookieExtension [%v]", err)
  385. return nil, err
  386. }
  387. // Run the external extension handler.
  388. if state.Config.ExtensionHandler != nil {
  389. err := state.Config.ExtensionHandler.Send(HandshakeTypeHelloRetryRequest, &hrr.Extensions)
  390. if err != nil {
  391. logf(logTypeHandshake, "[ServerStateStart] Error running external extension sender [%v]", err)
  392. return nil, err
  393. }
  394. }
  395. helloRetryRequest, err := state.hsCtx.hOut.HandshakeMessageFromBody(hrr)
  396. if err != nil {
  397. logf(logTypeHandshake, "[ServerStateStart] Error marshaling HRR [%v]", err)
  398. return nil, err
  399. }
  400. return helloRetryRequest, nil
  401. }
  402. type serverStateNegotiated struct {
  403. Config *Config
  404. Params ConnectionParameters
  405. hsCtx *HandshakeContext
  406. dhGroup NamedGroup
  407. dhPublic []byte
  408. dhSecret []byte
  409. pskSecret []byte
  410. clientEarlyTrafficSecret []byte
  411. selectedPSK int
  412. cert *Certificate
  413. certScheme SignatureScheme
  414. legacySessionId []byte
  415. firstClientHello *HandshakeMessage
  416. helloRetryRequest *HandshakeMessage
  417. clientHello *HandshakeMessage
  418. }
  419. var _ HandshakeState = &serverStateNegotiated{}
  420. func (state serverStateNegotiated) State() State {
  421. return StateServerNegotiated
  422. }
  423. func (state serverStateNegotiated) Next(_ handshakeMessageReader) (HandshakeState, []HandshakeAction, Alert) {
  424. // Create the ServerHello
  425. sh := &ServerHelloBody{
  426. Version: tls12Version,
  427. CipherSuite: state.Params.CipherSuite,
  428. LegacySessionID: state.legacySessionId,
  429. LegacyCompressionMethod: 0,
  430. }
  431. if _, err := prng.Read(sh.Random[:]); err != nil {
  432. logf(logTypeHandshake, "[ServerStateNegotiated] Error creating server random [%v]", err)
  433. return nil, nil, AlertInternalError
  434. }
  435. err := sh.Extensions.Add(&SupportedVersionsExtension{
  436. HandshakeType: HandshakeTypeServerHello,
  437. Versions: []uint16{supportedVersion},
  438. })
  439. if err != nil {
  440. logf(logTypeHandshake, "[ServerStateNegotiated] Error adding supported_versions extension [%v]", err)
  441. return nil, nil, AlertInternalError
  442. }
  443. if state.Params.UsingDH {
  444. logf(logTypeHandshake, "[ServerStateNegotiated] sending DH extension")
  445. err := sh.Extensions.Add(&KeyShareExtension{
  446. HandshakeType: HandshakeTypeServerHello,
  447. Shares: []KeyShareEntry{{Group: state.dhGroup, KeyExchange: state.dhPublic}},
  448. })
  449. if err != nil {
  450. logf(logTypeHandshake, "[ServerStateNegotiated] Error adding key_shares extension [%v]", err)
  451. return nil, nil, AlertInternalError
  452. }
  453. }
  454. if state.Params.UsingPSK {
  455. logf(logTypeHandshake, "[ServerStateNegotiated] sending PSK extension")
  456. err := sh.Extensions.Add(&PreSharedKeyExtension{
  457. HandshakeType: HandshakeTypeServerHello,
  458. SelectedIdentity: uint16(state.selectedPSK),
  459. })
  460. if err != nil {
  461. logf(logTypeHandshake, "[ServerStateNegotiated] Error adding PSK extension [%v]", err)
  462. return nil, nil, AlertInternalError
  463. }
  464. }
  465. // Run the external extension handler.
  466. if state.Config.ExtensionHandler != nil {
  467. err := state.Config.ExtensionHandler.Send(HandshakeTypeServerHello, &sh.Extensions)
  468. if err != nil {
  469. logf(logTypeHandshake, "[ServerStateNegotiated] Error running external extension sender [%v]", err)
  470. return nil, nil, AlertInternalError
  471. }
  472. }
  473. serverHello, err := state.hsCtx.hOut.HandshakeMessageFromBody(sh)
  474. if err != nil {
  475. logf(logTypeHandshake, "[ServerStateNegotiated] Error marshaling ServerHello [%v]", err)
  476. return nil, nil, AlertInternalError
  477. }
  478. // Look up crypto params
  479. params, ok := cipherSuiteMap[sh.CipherSuite]
  480. if !ok {
  481. logf(logTypeCrypto, "Unsupported ciphersuite [%04x]", sh.CipherSuite)
  482. return nil, nil, AlertHandshakeFailure
  483. }
  484. // Start up the handshake hash
  485. handshakeHash := params.Hash.New()
  486. handshakeHash.Write(state.firstClientHello.Marshal())
  487. handshakeHash.Write(state.helloRetryRequest.Marshal())
  488. handshakeHash.Write(state.clientHello.Marshal())
  489. handshakeHash.Write(serverHello.Marshal())
  490. // Compute handshake secrets
  491. zero := bytes.Repeat([]byte{0}, params.Hash.Size())
  492. var earlySecret []byte
  493. if state.Params.UsingPSK {
  494. earlySecret = HkdfExtract(params.Hash, zero, state.pskSecret)
  495. } else {
  496. earlySecret = HkdfExtract(params.Hash, zero, zero)
  497. }
  498. if state.dhSecret == nil {
  499. state.dhSecret = zero
  500. }
  501. h0 := params.Hash.New().Sum(nil)
  502. h2 := handshakeHash.Sum(nil)
  503. preHandshakeSecret := deriveSecret(params, earlySecret, labelDerived, h0)
  504. handshakeSecret := HkdfExtract(params.Hash, preHandshakeSecret, state.dhSecret)
  505. clientHandshakeTrafficSecret := deriveSecret(params, handshakeSecret, labelClientHandshakeTrafficSecret, h2)
  506. serverHandshakeTrafficSecret := deriveSecret(params, handshakeSecret, labelServerHandshakeTrafficSecret, h2)
  507. preMasterSecret := deriveSecret(params, handshakeSecret, labelDerived, h0)
  508. masterSecret := HkdfExtract(params.Hash, preMasterSecret, zero)
  509. logf(logTypeCrypto, "early secret (init!): [%d] %x", len(earlySecret), earlySecret)
  510. logf(logTypeCrypto, "handshake secret: [%d] %x", len(handshakeSecret), handshakeSecret)
  511. logf(logTypeCrypto, "client handshake traffic secret: [%d] %x", len(clientHandshakeTrafficSecret), clientHandshakeTrafficSecret)
  512. logf(logTypeCrypto, "server handshake traffic secret: [%d] %x", len(serverHandshakeTrafficSecret), serverHandshakeTrafficSecret)
  513. logf(logTypeCrypto, "master secret: [%d] %x", len(masterSecret), masterSecret)
  514. clientHandshakeKeys := makeTrafficKeys(params, clientHandshakeTrafficSecret)
  515. serverHandshakeKeys := makeTrafficKeys(params, serverHandshakeTrafficSecret)
  516. // Send an EncryptedExtensions message (even if it's empty)
  517. eeList := ExtensionList{}
  518. if state.Params.NextProto != "" {
  519. logf(logTypeHandshake, "[server] sending ALPN extension")
  520. err = eeList.Add(&ALPNExtension{Protocols: []string{state.Params.NextProto}})
  521. if err != nil {
  522. logf(logTypeHandshake, "[ServerStateNegotiated] Error adding ALPN to EncryptedExtensions [%v]", err)
  523. return nil, nil, AlertInternalError
  524. }
  525. }
  526. if state.Params.UsingEarlyData {
  527. logf(logTypeHandshake, "[server] sending EDI extension")
  528. err = eeList.Add(&EarlyDataExtension{})
  529. if err != nil {
  530. logf(logTypeHandshake, "[ServerStateNegotiated] Error adding EDI to EncryptedExtensions [%v]", err)
  531. return nil, nil, AlertInternalError
  532. }
  533. }
  534. ee := &EncryptedExtensionsBody{eeList}
  535. // Run the external extension handler.
  536. if state.Config.ExtensionHandler != nil {
  537. err := state.Config.ExtensionHandler.Send(HandshakeTypeEncryptedExtensions, &ee.Extensions)
  538. if err != nil {
  539. logf(logTypeHandshake, "[ServerStateNegotiated] Error running external extension sender [%v]", err)
  540. return nil, nil, AlertInternalError
  541. }
  542. }
  543. eem, err := state.hsCtx.hOut.HandshakeMessageFromBody(ee)
  544. if err != nil {
  545. logf(logTypeHandshake, "[ServerStateNegotiated] Error marshaling EncryptedExtensions [%v]", err)
  546. return nil, nil, AlertInternalError
  547. }
  548. handshakeHash.Write(eem.Marshal())
  549. toSend := []HandshakeAction{
  550. QueueHandshakeMessage{serverHello},
  551. RekeyOut{epoch: EpochHandshakeData, KeySet: serverHandshakeKeys},
  552. QueueHandshakeMessage{eem},
  553. }
  554. // Authenticate with a certificate if required
  555. if !state.Params.UsingPSK {
  556. // Send a CertificateRequest message if we want client auth
  557. if state.Config.RequireClientAuth {
  558. state.Params.UsingClientAuth = true
  559. // XXX: We don't support sending any constraints besides a list of
  560. // supported signature algorithms
  561. cr := &CertificateRequestBody{}
  562. schemes := &SignatureAlgorithmsExtension{Algorithms: state.Config.SignatureSchemes}
  563. err := cr.Extensions.Add(schemes)
  564. if err != nil {
  565. logf(logTypeHandshake, "[ServerStateNegotiated] Error adding supported schemes to CertificateRequest [%v]", err)
  566. return nil, nil, AlertInternalError
  567. }
  568. crm, err := state.hsCtx.hOut.HandshakeMessageFromBody(cr)
  569. if err != nil {
  570. logf(logTypeHandshake, "[ServerStateNegotiated] Error marshaling CertificateRequest [%v]", err)
  571. return nil, nil, AlertInternalError
  572. }
  573. //TODO state.state.serverCertificateRequest = cr
  574. toSend = append(toSend, QueueHandshakeMessage{crm})
  575. handshakeHash.Write(crm.Marshal())
  576. }
  577. // Create and send Certificate, CertificateVerify
  578. certificate := &CertificateBody{
  579. CertificateList: make([]CertificateEntry, len(state.cert.Chain)),
  580. }
  581. for i, entry := range state.cert.Chain {
  582. certificate.CertificateList[i] = CertificateEntry{CertData: entry}
  583. }
  584. certm, err := state.hsCtx.hOut.HandshakeMessageFromBody(certificate)
  585. if err != nil {
  586. logf(logTypeHandshake, "[ServerStateNegotiated] Error marshaling Certificate [%v]", err)
  587. return nil, nil, AlertInternalError
  588. }
  589. toSend = append(toSend, QueueHandshakeMessage{certm})
  590. handshakeHash.Write(certm.Marshal())
  591. certificateVerify := &CertificateVerifyBody{Algorithm: state.certScheme}
  592. logf(logTypeHandshake, "Creating CertVerify: %04x %v", state.certScheme, params.Hash)
  593. hcv := handshakeHash.Sum(nil)
  594. logf(logTypeHandshake, "Handshake Hash to be verified: [%d] %x", len(hcv), hcv)
  595. err = certificateVerify.Sign(state.cert.PrivateKey, hcv)
  596. if err != nil {
  597. logf(logTypeHandshake, "[ServerStateNegotiated] Error signing CertificateVerify [%v]", err)
  598. return nil, nil, AlertInternalError
  599. }
  600. certvm, err := state.hsCtx.hOut.HandshakeMessageFromBody(certificateVerify)
  601. if err != nil {
  602. logf(logTypeHandshake, "[ServerStateNegotiated] Error marshaling CertificateVerify [%v]", err)
  603. return nil, nil, AlertInternalError
  604. }
  605. toSend = append(toSend, QueueHandshakeMessage{certvm})
  606. handshakeHash.Write(certvm.Marshal())
  607. }
  608. // Compute secrets resulting from the server's first flight
  609. h3 := handshakeHash.Sum(nil)
  610. logf(logTypeCrypto, "handshake hash 3 [%d] %x", len(h3), h3)
  611. logf(logTypeCrypto, "handshake hash for server Finished: [%d] %x", len(h3), h3)
  612. serverFinishedData := computeFinishedData(params, serverHandshakeTrafficSecret, h3)
  613. logf(logTypeCrypto, "server finished data: [%d] %x", len(serverFinishedData), serverFinishedData)
  614. // Assemble the Finished message
  615. fin := &FinishedBody{
  616. VerifyDataLen: len(serverFinishedData),
  617. VerifyData: serverFinishedData,
  618. }
  619. finm, _ := state.hsCtx.hOut.HandshakeMessageFromBody(fin)
  620. toSend = append(toSend, QueueHandshakeMessage{finm})
  621. handshakeHash.Write(finm.Marshal())
  622. toSend = append(toSend, SendQueuedHandshake{})
  623. // Compute traffic secrets
  624. h4 := handshakeHash.Sum(nil)
  625. logf(logTypeCrypto, "handshake hash 4 [%d] %x", len(h4), h4)
  626. logf(logTypeCrypto, "handshake hash for server Finished: [%d] %x", len(h4), h4)
  627. clientTrafficSecret := deriveSecret(params, masterSecret, labelClientApplicationTrafficSecret, h4)
  628. serverTrafficSecret := deriveSecret(params, masterSecret, labelServerApplicationTrafficSecret, h4)
  629. logf(logTypeCrypto, "client traffic secret: [%d] %x", len(clientTrafficSecret), clientTrafficSecret)
  630. logf(logTypeCrypto, "server traffic secret: [%d] %x", len(serverTrafficSecret), serverTrafficSecret)
  631. serverTrafficKeys := makeTrafficKeys(params, serverTrafficSecret)
  632. toSend = append(toSend, RekeyOut{epoch: EpochApplicationData, KeySet: serverTrafficKeys})
  633. exporterSecret := deriveSecret(params, masterSecret, labelExporterSecret, h4)
  634. logf(logTypeCrypto, "server exporter secret: [%d] %x", len(exporterSecret), exporterSecret)
  635. if state.Params.UsingEarlyData {
  636. clientEarlyTrafficKeys := makeTrafficKeys(params, state.clientEarlyTrafficSecret)
  637. logf(logTypeHandshake, "[ServerStateNegotiated] -> [ServerStateWaitEOED]")
  638. nextState := serverStateWaitEOED{
  639. Config: state.Config,
  640. Params: state.Params,
  641. hsCtx: state.hsCtx,
  642. cryptoParams: params,
  643. handshakeHash: handshakeHash,
  644. masterSecret: masterSecret,
  645. clientHandshakeTrafficSecret: clientHandshakeTrafficSecret,
  646. clientTrafficSecret: clientTrafficSecret,
  647. serverTrafficSecret: serverTrafficSecret,
  648. exporterSecret: exporterSecret,
  649. }
  650. toSend = append(toSend, []HandshakeAction{
  651. RekeyIn{epoch: EpochEarlyData, KeySet: clientEarlyTrafficKeys},
  652. }...)
  653. return nextState, toSend, AlertNoAlert
  654. }
  655. logf(logTypeHandshake, "[ServerStateNegotiated] -> [ServerStateWaitFlight2]")
  656. toSend = append(toSend, []HandshakeAction{
  657. RekeyIn{epoch: EpochHandshakeData, KeySet: clientHandshakeKeys},
  658. }...)
  659. var nextState HandshakeState
  660. nextState = serverStateWaitFlight2{
  661. Config: state.Config,
  662. Params: state.Params,
  663. hsCtx: state.hsCtx,
  664. cryptoParams: params,
  665. handshakeHash: handshakeHash,
  666. masterSecret: masterSecret,
  667. clientHandshakeTrafficSecret: clientHandshakeTrafficSecret,
  668. clientTrafficSecret: clientTrafficSecret,
  669. serverTrafficSecret: serverTrafficSecret,
  670. exporterSecret: exporterSecret,
  671. }
  672. if state.Params.RejectedEarlyData {
  673. nextState = serverStateReadPastEarlyData{
  674. hsCtx: state.hsCtx,
  675. next: &nextState,
  676. }
  677. }
  678. return nextState, toSend, AlertNoAlert
  679. }
  680. type serverStateWaitEOED struct {
  681. Config *Config
  682. Params ConnectionParameters
  683. hsCtx *HandshakeContext
  684. cryptoParams CipherSuiteParams
  685. masterSecret []byte
  686. clientHandshakeTrafficSecret []byte
  687. handshakeHash hash.Hash
  688. clientTrafficSecret []byte
  689. serverTrafficSecret []byte
  690. exporterSecret []byte
  691. }
  692. var _ HandshakeState = &serverStateWaitEOED{}
  693. func (state serverStateWaitEOED) State() State {
  694. return StateServerWaitEOED
  695. }
  696. func (state serverStateWaitEOED) Next(hr handshakeMessageReader) (HandshakeState, []HandshakeAction, Alert) {
  697. for {
  698. logf(logTypeHandshake, "Server reading early data...")
  699. assert(state.hsCtx.hIn.conn.cipher.epoch == EpochEarlyData)
  700. t, err := state.hsCtx.hIn.conn.PeekRecordType(!state.hsCtx.hIn.nonblocking)
  701. if err == AlertWouldBlock {
  702. return nil, nil, AlertWouldBlock
  703. }
  704. if err != nil {
  705. logf(logTypeHandshake, "Server Error reading record type (1): %v", err)
  706. return nil, nil, AlertBadRecordMAC
  707. }
  708. logf(logTypeHandshake, "Server got record type(1): %v", t)
  709. if t != RecordTypeApplicationData {
  710. break
  711. }
  712. // Read a record into the buffer. Note that this is safe
  713. // in blocking mode because we read the record in
  714. // PeekRecordType.
  715. pt, err := state.hsCtx.hIn.conn.ReadRecord()
  716. if err != nil {
  717. logf(logTypeHandshake, "Server error reading early data record: %v", err)
  718. return nil, nil, AlertInternalError
  719. }
  720. logf(logTypeHandshake, "Server read early data: %x", pt.fragment)
  721. state.hsCtx.earlyData = append(state.hsCtx.earlyData, pt.fragment...)
  722. }
  723. hm, alert := hr.ReadMessage()
  724. if alert != AlertNoAlert {
  725. return nil, nil, alert
  726. }
  727. if hm == nil || hm.msgType != HandshakeTypeEndOfEarlyData {
  728. logf(logTypeHandshake, "[ServerStateWaitEOED] Unexpected message")
  729. return nil, nil, AlertUnexpectedMessage
  730. }
  731. if len(hm.body) > 0 {
  732. logf(logTypeHandshake, "[ServerStateWaitEOED] Error decoding message [len > 0]")
  733. return nil, nil, AlertDecodeError
  734. }
  735. state.handshakeHash.Write(hm.Marshal())
  736. clientHandshakeKeys := makeTrafficKeys(state.cryptoParams, state.clientHandshakeTrafficSecret)
  737. logf(logTypeHandshake, "[ServerStateWaitEOED] -> [ServerStateWaitFlight2]")
  738. toSend := []HandshakeAction{
  739. RekeyIn{epoch: EpochHandshakeData, KeySet: clientHandshakeKeys},
  740. }
  741. waitFlight2 := serverStateWaitFlight2{
  742. Config: state.Config,
  743. Params: state.Params,
  744. hsCtx: state.hsCtx,
  745. cryptoParams: state.cryptoParams,
  746. handshakeHash: state.handshakeHash,
  747. masterSecret: state.masterSecret,
  748. clientHandshakeTrafficSecret: state.clientHandshakeTrafficSecret,
  749. clientTrafficSecret: state.clientTrafficSecret,
  750. serverTrafficSecret: state.serverTrafficSecret,
  751. exporterSecret: state.exporterSecret,
  752. }
  753. return waitFlight2, toSend, AlertNoAlert
  754. }
  755. var _ HandshakeState = &serverStateReadPastEarlyData{}
  756. type serverStateReadPastEarlyData struct {
  757. hsCtx *HandshakeContext
  758. next *HandshakeState
  759. }
  760. func (state serverStateReadPastEarlyData) Next(hr handshakeMessageReader) (HandshakeState, []HandshakeAction, Alert) {
  761. for {
  762. logf(logTypeHandshake, "Server reading past early data...")
  763. // Scan past all records that fail to decrypt
  764. _, err := state.hsCtx.hIn.conn.PeekRecordType(!state.hsCtx.hIn.nonblocking)
  765. if err == nil {
  766. break
  767. }
  768. if err == AlertWouldBlock {
  769. return nil, nil, AlertWouldBlock
  770. }
  771. // Continue on DecryptError
  772. _, ok := err.(DecryptError)
  773. if !ok {
  774. return nil, nil, AlertInternalError // Really need something else.
  775. }
  776. }
  777. return *state.next, nil, AlertNoAlert
  778. }
  779. func (state serverStateReadPastEarlyData) State() State {
  780. return StateServerReadPastEarlyData
  781. }
  782. type serverStateWaitFlight2 struct {
  783. Config *Config
  784. Params ConnectionParameters
  785. hsCtx *HandshakeContext
  786. cryptoParams CipherSuiteParams
  787. masterSecret []byte
  788. clientHandshakeTrafficSecret []byte
  789. handshakeHash hash.Hash
  790. clientTrafficSecret []byte
  791. serverTrafficSecret []byte
  792. exporterSecret []byte
  793. }
  794. var _ HandshakeState = &serverStateWaitFlight2{}
  795. func (state serverStateWaitFlight2) State() State {
  796. return StateServerWaitFlight2
  797. }
  798. func (state serverStateWaitFlight2) Next(_ handshakeMessageReader) (HandshakeState, []HandshakeAction, Alert) {
  799. if state.Params.UsingClientAuth {
  800. logf(logTypeHandshake, "[ServerStateWaitFlight2] -> [ServerStateWaitCert]")
  801. nextState := serverStateWaitCert{
  802. Config: state.Config,
  803. Params: state.Params,
  804. hsCtx: state.hsCtx,
  805. cryptoParams: state.cryptoParams,
  806. handshakeHash: state.handshakeHash,
  807. masterSecret: state.masterSecret,
  808. clientHandshakeTrafficSecret: state.clientHandshakeTrafficSecret,
  809. clientTrafficSecret: state.clientTrafficSecret,
  810. serverTrafficSecret: state.serverTrafficSecret,
  811. exporterSecret: state.exporterSecret,
  812. }
  813. return nextState, nil, AlertNoAlert
  814. }
  815. logf(logTypeHandshake, "[ServerStateWaitFlight2] -> [ServerStateWaitFinished]")
  816. nextState := serverStateWaitFinished{
  817. Params: state.Params,
  818. hsCtx: state.hsCtx,
  819. cryptoParams: state.cryptoParams,
  820. masterSecret: state.masterSecret,
  821. clientHandshakeTrafficSecret: state.clientHandshakeTrafficSecret,
  822. handshakeHash: state.handshakeHash,
  823. clientTrafficSecret: state.clientTrafficSecret,
  824. serverTrafficSecret: state.serverTrafficSecret,
  825. exporterSecret: state.exporterSecret,
  826. }
  827. return nextState, nil, AlertNoAlert
  828. }
  829. type serverStateWaitCert struct {
  830. Config *Config
  831. Params ConnectionParameters
  832. hsCtx *HandshakeContext
  833. cryptoParams CipherSuiteParams
  834. masterSecret []byte
  835. clientHandshakeTrafficSecret []byte
  836. handshakeHash hash.Hash
  837. clientTrafficSecret []byte
  838. serverTrafficSecret []byte
  839. exporterSecret []byte
  840. }
  841. var _ HandshakeState = &serverStateWaitCert{}
  842. func (state serverStateWaitCert) State() State {
  843. return StateServerWaitCert
  844. }
  845. func (state serverStateWaitCert) Next(hr handshakeMessageReader) (HandshakeState, []HandshakeAction, Alert) {
  846. hm, alert := hr.ReadMessage()
  847. if alert != AlertNoAlert {
  848. return nil, nil, alert
  849. }
  850. if hm == nil || hm.msgType != HandshakeTypeCertificate {
  851. logf(logTypeHandshake, "[ServerStateWaitCert] Unexpected message")
  852. return nil, nil, AlertUnexpectedMessage
  853. }
  854. cert := &CertificateBody{}
  855. if err := safeUnmarshal(cert, hm.body); err != nil {
  856. logf(logTypeHandshake, "[ServerStateWaitCert] Unexpected message")
  857. return nil, nil, AlertDecodeError
  858. }
  859. state.handshakeHash.Write(hm.Marshal())
  860. if len(cert.CertificateList) == 0 {
  861. logf(logTypeHandshake, "[ServerStateWaitCert] WARNING client did not provide a certificate")
  862. logf(logTypeHandshake, "[ServerStateWaitCert] -> [ServerStateWaitFinished]")
  863. nextState := serverStateWaitFinished{
  864. Params: state.Params,
  865. hsCtx: state.hsCtx,
  866. cryptoParams: state.cryptoParams,
  867. masterSecret: state.masterSecret,
  868. clientHandshakeTrafficSecret: state.clientHandshakeTrafficSecret,
  869. handshakeHash: state.handshakeHash,
  870. clientTrafficSecret: state.clientTrafficSecret,
  871. serverTrafficSecret: state.serverTrafficSecret,
  872. exporterSecret: state.exporterSecret,
  873. }
  874. return nextState, nil, AlertNoAlert
  875. }
  876. logf(logTypeHandshake, "[ServerStateWaitCert] -> [ServerStateWaitCV]")
  877. nextState := serverStateWaitCV{
  878. Config: state.Config,
  879. Params: state.Params,
  880. hsCtx: state.hsCtx,
  881. cryptoParams: state.cryptoParams,
  882. masterSecret: state.masterSecret,
  883. clientHandshakeTrafficSecret: state.clientHandshakeTrafficSecret,
  884. handshakeHash: state.handshakeHash,
  885. clientTrafficSecret: state.clientTrafficSecret,
  886. serverTrafficSecret: state.serverTrafficSecret,
  887. clientCertificate: cert,
  888. exporterSecret: state.exporterSecret,
  889. }
  890. return nextState, nil, AlertNoAlert
  891. }
  892. type serverStateWaitCV struct {
  893. Config *Config
  894. Params ConnectionParameters
  895. hsCtx *HandshakeContext
  896. cryptoParams CipherSuiteParams
  897. masterSecret []byte
  898. clientHandshakeTrafficSecret []byte
  899. handshakeHash hash.Hash
  900. clientTrafficSecret []byte
  901. serverTrafficSecret []byte
  902. exporterSecret []byte
  903. clientCertificate *CertificateBody
  904. }
  905. var _ HandshakeState = &serverStateWaitCV{}
  906. func (state serverStateWaitCV) State() State {
  907. return StateServerWaitCV
  908. }
  909. func (state serverStateWaitCV) Next(hr handshakeMessageReader) (HandshakeState, []HandshakeAction, Alert) {
  910. hm, alert := hr.ReadMessage()
  911. if alert != AlertNoAlert {
  912. return nil, nil, alert
  913. }
  914. if hm == nil || hm.msgType != HandshakeTypeCertificateVerify {
  915. logf(logTypeHandshake, "[ServerStateWaitCV] Unexpected message [%+v] [%s]", hm, reflect.TypeOf(hm))
  916. return nil, nil, AlertUnexpectedMessage
  917. }
  918. certVerify := &CertificateVerifyBody{}
  919. if err := safeUnmarshal(certVerify, hm.body); err != nil {
  920. logf(logTypeHandshake, "[ServerStateWaitCert] Error decoding message %v", err)
  921. return nil, nil, AlertDecodeError
  922. }
  923. rawCerts := make([][]byte, len(state.clientCertificate.CertificateList))
  924. certs := make([]*x509.Certificate, len(state.clientCertificate.CertificateList))
  925. for i, certEntry := range state.clientCertificate.CertificateList {
  926. certs[i] = certEntry.CertData
  927. rawCerts[i] = certEntry.CertData.Raw
  928. }
  929. // Verify client signature over handshake hash
  930. hcv := state.handshakeHash.Sum(nil)
  931. logf(logTypeHandshake, "Handshake Hash to be verified: [%d] %x", len(hcv), hcv)
  932. clientPublicKey := state.clientCertificate.CertificateList[0].CertData.PublicKey
  933. if err := certVerify.Verify(clientPublicKey, hcv); err != nil {
  934. logf(logTypeHandshake, "[ServerStateWaitCV] Failure in client auth verification [%v]", err)
  935. return nil, nil, AlertHandshakeFailure
  936. }
  937. if state.Config.VerifyPeerCertificate != nil {
  938. // TODO(#171): pass in the verified chains, once we support different client auth types
  939. if err := state.Config.VerifyPeerCertificate(rawCerts, nil); err != nil {
  940. logf(logTypeHandshake, "[ServerStateWaitCV] Application rejected client certificate: %s", err)
  941. return nil, nil, AlertBadCertificate
  942. }
  943. }
  944. // If it passes, record the certificateVerify in the transcript hash
  945. state.handshakeHash.Write(hm.Marshal())
  946. logf(logTypeHandshake, "[ServerStateWaitCV] -> [ServerStateWaitFinished]")
  947. nextState := serverStateWaitFinished{
  948. Params: state.Params,
  949. hsCtx: state.hsCtx,
  950. cryptoParams: state.cryptoParams,
  951. masterSecret: state.masterSecret,
  952. clientHandshakeTrafficSecret: state.clientHandshakeTrafficSecret,
  953. handshakeHash: state.handshakeHash,
  954. clientTrafficSecret: state.clientTrafficSecret,
  955. serverTrafficSecret: state.serverTrafficSecret,
  956. exporterSecret: state.exporterSecret,
  957. peerCertificates: certs,
  958. verifiedChains: nil, // TODO(#171): set this value
  959. }
  960. return nextState, nil, AlertNoAlert
  961. }
  962. type serverStateWaitFinished struct {
  963. Params ConnectionParameters
  964. hsCtx *HandshakeContext
  965. cryptoParams CipherSuiteParams
  966. masterSecret []byte
  967. clientHandshakeTrafficSecret []byte
  968. peerCertificates []*x509.Certificate
  969. verifiedChains [][]*x509.Certificate
  970. handshakeHash hash.Hash
  971. clientTrafficSecret []byte
  972. serverTrafficSecret []byte
  973. exporterSecret []byte
  974. }
  975. var _ HandshakeState = &serverStateWaitFinished{}
  976. func (state serverStateWaitFinished) State() State {
  977. return StateServerWaitFinished
  978. }
  979. func (state serverStateWaitFinished) Next(hr handshakeMessageReader) (HandshakeState, []HandshakeAction, Alert) {
  980. hm, alert := hr.ReadMessage()
  981. if alert != AlertNoAlert {
  982. return nil, nil, alert
  983. }
  984. if hm == nil || hm.msgType != HandshakeTypeFinished {
  985. logf(logTypeHandshake, "[ServerStateWaitFinished] Unexpected message")
  986. return nil, nil, AlertUnexpectedMessage
  987. }
  988. fin := &FinishedBody{VerifyDataLen: state.cryptoParams.Hash.Size()}
  989. if err := safeUnmarshal(fin, hm.body); err != nil {
  990. logf(logTypeHandshake, "[ServerStateWaitFinished] Error decoding message %v", err)
  991. return nil, nil, AlertDecodeError
  992. }
  993. // Verify client Finished data
  994. h5 := state.handshakeHash.Sum(nil)
  995. logf(logTypeCrypto, "handshake hash for client Finished: [%d] %x", len(h5), h5)
  996. clientFinishedData := computeFinishedData(state.cryptoParams, state.clientHandshakeTrafficSecret, h5)
  997. logf(logTypeCrypto, "client Finished data: [%d] %x", len(clientFinishedData), clientFinishedData)
  998. if !bytes.Equal(fin.VerifyData, clientFinishedData) {
  999. logf(logTypeHandshake, "[ServerStateWaitFinished] Client's Finished failed to verify")
  1000. return nil, nil, AlertHandshakeFailure
  1001. }
  1002. // Compute the resumption secret
  1003. state.handshakeHash.Write(hm.Marshal())
  1004. h6 := state.handshakeHash.Sum(nil)
  1005. logf(logTypeCrypto, "handshake hash 6 [%d]: %x", len(h6), h6)
  1006. resumptionSecret := deriveSecret(state.cryptoParams, state.masterSecret, labelResumptionSecret, h6)
  1007. logf(logTypeCrypto, "resumption secret: [%d] %x", len(resumptionSecret), resumptionSecret)
  1008. // Compute client traffic keys
  1009. clientTrafficKeys := makeTrafficKeys(state.cryptoParams, state.clientTrafficSecret)
  1010. state.hsCtx.receivedFinalFlight()
  1011. logf(logTypeHandshake, "[ServerStateWaitFinished] -> [StateConnected]")
  1012. nextState := stateConnected{
  1013. Params: state.Params,
  1014. hsCtx: state.hsCtx,
  1015. isClient: false,
  1016. cryptoParams: state.cryptoParams,
  1017. resumptionSecret: resumptionSecret,
  1018. clientTrafficSecret: state.clientTrafficSecret,
  1019. serverTrafficSecret: state.serverTrafficSecret,
  1020. exporterSecret: state.exporterSecret,
  1021. peerCertificates: state.peerCertificates,
  1022. verifiedChains: state.verifiedChains,
  1023. }
  1024. toSend := []HandshakeAction{
  1025. RekeyIn{epoch: EpochApplicationData, KeySet: clientTrafficKeys},
  1026. }
  1027. return nextState, toSend, AlertNoAlert
  1028. }