handshake_server.go 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978
  1. // Copyright 2009 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package tls
  5. import (
  6. "context"
  7. "crypto"
  8. "crypto/ecdsa"
  9. "crypto/ed25519"
  10. "crypto/rsa"
  11. "crypto/subtle"
  12. "crypto/x509"
  13. "errors"
  14. "fmt"
  15. "hash"
  16. "io"
  17. "time"
  18. "github.com/Psiphon-Labs/utls/byteorder"
  19. )
  20. // serverHandshakeState contains details of a server handshake in progress.
  21. // It's discarded once the handshake has completed.
  22. type serverHandshakeState struct {
  23. c *Conn
  24. ctx context.Context
  25. clientHello *clientHelloMsg
  26. hello *serverHelloMsg
  27. suite *cipherSuite
  28. ecdheOk bool
  29. ecSignOk bool
  30. rsaDecryptOk bool
  31. rsaSignOk bool
  32. sessionState *SessionState
  33. finishedHash finishedHash
  34. masterSecret []byte
  35. cert *Certificate
  36. }
  37. // serverHandshake performs a TLS handshake as a server.
  38. func (c *Conn) serverHandshake(ctx context.Context) error {
  39. clientHello, err := c.readClientHello(ctx)
  40. if err != nil {
  41. return err
  42. }
  43. if c.vers == VersionTLS13 {
  44. hs := serverHandshakeStateTLS13{
  45. c: c,
  46. ctx: ctx,
  47. clientHello: clientHello,
  48. }
  49. return hs.handshake()
  50. }
  51. hs := serverHandshakeState{
  52. c: c,
  53. ctx: ctx,
  54. clientHello: clientHello,
  55. }
  56. return hs.handshake()
  57. }
  58. func (hs *serverHandshakeState) handshake() error {
  59. c := hs.c
  60. if err := hs.processClientHello(); err != nil {
  61. return err
  62. }
  63. // For an overview of TLS handshaking, see RFC 5246, Section 7.3.
  64. c.buffering = true
  65. if err := hs.checkForResumption(); err != nil {
  66. return err
  67. }
  68. if hs.sessionState != nil {
  69. // The client has included a session ticket and so we do an abbreviated handshake.
  70. if err := hs.doResumeHandshake(); err != nil {
  71. return err
  72. }
  73. if err := hs.establishKeys(); err != nil {
  74. return err
  75. }
  76. if err := hs.sendSessionTicket(); err != nil {
  77. return err
  78. }
  79. if err := hs.sendFinished(c.serverFinished[:]); err != nil {
  80. return err
  81. }
  82. if _, err := c.flush(); err != nil {
  83. return err
  84. }
  85. c.clientFinishedIsFirst = false
  86. if err := hs.readFinished(nil); err != nil {
  87. return err
  88. }
  89. } else {
  90. // The client didn't include a session ticket, or it wasn't
  91. // valid so we do a full handshake.
  92. if err := hs.pickCipherSuite(); err != nil {
  93. return err
  94. }
  95. if err := hs.doFullHandshake(); err != nil {
  96. return err
  97. }
  98. if err := hs.establishKeys(); err != nil {
  99. return err
  100. }
  101. if err := hs.readFinished(c.clientFinished[:]); err != nil {
  102. return err
  103. }
  104. c.clientFinishedIsFirst = true
  105. c.buffering = true
  106. if err := hs.sendSessionTicket(); err != nil {
  107. return err
  108. }
  109. if err := hs.sendFinished(nil); err != nil {
  110. return err
  111. }
  112. if _, err := c.flush(); err != nil {
  113. return err
  114. }
  115. }
  116. c.ekm = ekmFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.clientHello.random, hs.hello.random)
  117. c.isHandshakeComplete.Store(true)
  118. return nil
  119. }
  120. // readClientHello reads a ClientHello message and selects the protocol version.
  121. func (c *Conn) readClientHello(ctx context.Context) (*clientHelloMsg, error) {
  122. // clientHelloMsg is included in the transcript, but we haven't initialized
  123. // it yet. The respective handshake functions will record it themselves.
  124. msg, err := c.readHandshake(nil)
  125. if err != nil {
  126. return nil, err
  127. }
  128. clientHello, ok := msg.(*clientHelloMsg)
  129. if !ok {
  130. c.sendAlert(alertUnexpectedMessage)
  131. return nil, unexpectedMessageError(clientHello, msg)
  132. }
  133. var configForClient *Config
  134. originalConfig := c.config
  135. if c.config.GetConfigForClient != nil {
  136. chi := clientHelloInfo(ctx, c, clientHello)
  137. if configForClient, err = c.config.GetConfigForClient(chi); err != nil {
  138. c.sendAlert(alertInternalError)
  139. return nil, err
  140. } else if configForClient != nil {
  141. c.config = configForClient
  142. }
  143. }
  144. c.ticketKeys = originalConfig.ticketKeys(configForClient)
  145. clientVersions := clientHello.supportedVersions
  146. if len(clientHello.supportedVersions) == 0 {
  147. clientVersions = supportedVersionsFromMax(clientHello.vers)
  148. }
  149. c.vers, ok = c.config.mutualVersion(roleServer, clientVersions)
  150. if !ok {
  151. c.sendAlert(alertProtocolVersion)
  152. return nil, fmt.Errorf("tls: client offered only unsupported versions: %x", clientVersions)
  153. }
  154. c.haveVers = true
  155. c.in.version = c.vers
  156. c.out.version = c.vers
  157. // [UTLS SECTION BEGING]
  158. // Disable unsupported godebug package
  159. // if c.config.MinVersion == 0 && c.vers < VersionTLS12 {
  160. // tls10server.Value() // ensure godebug is initialized
  161. // tls10server.IncNonDefault()
  162. // }
  163. // [UTLS SECTION END]
  164. return clientHello, nil
  165. }
  166. func (hs *serverHandshakeState) processClientHello() error {
  167. c := hs.c
  168. hs.hello = new(serverHelloMsg)
  169. hs.hello.vers = c.vers
  170. foundCompression := false
  171. // We only support null compression, so check that the client offered it.
  172. for _, compression := range hs.clientHello.compressionMethods {
  173. if compression == compressionNone {
  174. foundCompression = true
  175. break
  176. }
  177. }
  178. if !foundCompression {
  179. c.sendAlert(alertHandshakeFailure)
  180. return errors.New("tls: client does not support uncompressed connections")
  181. }
  182. hs.hello.random = make([]byte, 32)
  183. serverRandom := hs.hello.random
  184. // Downgrade protection canaries. See RFC 8446, Section 4.1.3.
  185. maxVers := c.config.maxSupportedVersion(roleServer)
  186. if maxVers >= VersionTLS12 && c.vers < maxVers || testingOnlyForceDowngradeCanary {
  187. if c.vers == VersionTLS12 {
  188. copy(serverRandom[24:], downgradeCanaryTLS12)
  189. } else {
  190. copy(serverRandom[24:], downgradeCanaryTLS11)
  191. }
  192. serverRandom = serverRandom[:24]
  193. }
  194. _, err := io.ReadFull(c.config.rand(), serverRandom)
  195. if err != nil {
  196. c.sendAlert(alertInternalError)
  197. return err
  198. }
  199. if len(hs.clientHello.secureRenegotiation) != 0 {
  200. c.sendAlert(alertHandshakeFailure)
  201. return errors.New("tls: initial handshake had non-empty renegotiation extension")
  202. }
  203. hs.hello.extendedMasterSecret = hs.clientHello.extendedMasterSecret
  204. hs.hello.secureRenegotiationSupported = hs.clientHello.secureRenegotiationSupported
  205. hs.hello.compressionMethod = compressionNone
  206. if len(hs.clientHello.serverName) > 0 {
  207. c.serverName = hs.clientHello.serverName
  208. }
  209. selectedProto, err := negotiateALPN(c.config.NextProtos, hs.clientHello.alpnProtocols, false)
  210. if err != nil {
  211. c.sendAlert(alertNoApplicationProtocol)
  212. return err
  213. }
  214. hs.hello.alpnProtocol = selectedProto
  215. c.clientProtocol = selectedProto
  216. hs.cert, err = c.config.getCertificate(clientHelloInfo(hs.ctx, c, hs.clientHello))
  217. if err != nil {
  218. if err == errNoCertificates {
  219. c.sendAlert(alertUnrecognizedName)
  220. } else {
  221. c.sendAlert(alertInternalError)
  222. }
  223. return err
  224. }
  225. if hs.clientHello.scts {
  226. hs.hello.scts = hs.cert.SignedCertificateTimestamps
  227. }
  228. hs.ecdheOk = supportsECDHE(c.config, c.vers, hs.clientHello.supportedCurves, hs.clientHello.supportedPoints)
  229. if hs.ecdheOk && len(hs.clientHello.supportedPoints) > 0 {
  230. // Although omitting the ec_point_formats extension is permitted, some
  231. // old OpenSSL version will refuse to handshake if not present.
  232. //
  233. // Per RFC 4492, section 5.1.2, implementations MUST support the
  234. // uncompressed point format. See golang.org/issue/31943.
  235. hs.hello.supportedPoints = []uint8{pointFormatUncompressed}
  236. }
  237. if priv, ok := hs.cert.PrivateKey.(crypto.Signer); ok {
  238. switch priv.Public().(type) {
  239. case *ecdsa.PublicKey:
  240. hs.ecSignOk = true
  241. case ed25519.PublicKey:
  242. hs.ecSignOk = true
  243. case *rsa.PublicKey:
  244. hs.rsaSignOk = true
  245. default:
  246. c.sendAlert(alertInternalError)
  247. return fmt.Errorf("tls: unsupported signing key type (%T)", priv.Public())
  248. }
  249. }
  250. if priv, ok := hs.cert.PrivateKey.(crypto.Decrypter); ok {
  251. switch priv.Public().(type) {
  252. case *rsa.PublicKey:
  253. hs.rsaDecryptOk = true
  254. default:
  255. c.sendAlert(alertInternalError)
  256. return fmt.Errorf("tls: unsupported decryption key type (%T)", priv.Public())
  257. }
  258. }
  259. return nil
  260. }
  261. // negotiateALPN picks a shared ALPN protocol that both sides support in server
  262. // preference order. If ALPN is not configured or the peer doesn't support it,
  263. // it returns "" and no error.
  264. func negotiateALPN(serverProtos, clientProtos []string, quic bool) (string, error) {
  265. if len(serverProtos) == 0 || len(clientProtos) == 0 {
  266. if quic && len(serverProtos) != 0 {
  267. // RFC 9001, Section 8.1
  268. return "", fmt.Errorf("tls: client did not request an application protocol")
  269. }
  270. return "", nil
  271. }
  272. var http11fallback bool
  273. for _, s := range serverProtos {
  274. for _, c := range clientProtos {
  275. if s == c {
  276. return s, nil
  277. }
  278. if s == "h2" && c == "http/1.1" {
  279. http11fallback = true
  280. }
  281. }
  282. }
  283. // As a special case, let http/1.1 clients connect to h2 servers as if they
  284. // didn't support ALPN. We used not to enforce protocol overlap, so over
  285. // time a number of HTTP servers were configured with only "h2", but
  286. // expected to accept connections from "http/1.1" clients. See Issue 46310.
  287. if http11fallback {
  288. return "", nil
  289. }
  290. return "", fmt.Errorf("tls: client requested unsupported application protocols (%s)", clientProtos)
  291. }
  292. // supportsECDHE returns whether ECDHE key exchanges can be used with this
  293. // pre-TLS 1.3 client.
  294. func supportsECDHE(c *Config, version uint16, supportedCurves []CurveID, supportedPoints []uint8) bool {
  295. supportsCurve := false
  296. for _, curve := range supportedCurves {
  297. if c.supportsCurve(version, curve) {
  298. supportsCurve = true
  299. break
  300. }
  301. }
  302. supportsPointFormat := false
  303. for _, pointFormat := range supportedPoints {
  304. if pointFormat == pointFormatUncompressed {
  305. supportsPointFormat = true
  306. break
  307. }
  308. }
  309. // Per RFC 8422, Section 5.1.2, if the Supported Point Formats extension is
  310. // missing, uncompressed points are supported. If supportedPoints is empty,
  311. // the extension must be missing, as an empty extension body is rejected by
  312. // the parser. See https://go.dev/issue/49126.
  313. if len(supportedPoints) == 0 {
  314. supportsPointFormat = true
  315. }
  316. return supportsCurve && supportsPointFormat
  317. }
  318. func (hs *serverHandshakeState) pickCipherSuite() error {
  319. c := hs.c
  320. preferenceOrder := cipherSuitesPreferenceOrder
  321. if !hasAESGCMHardwareSupport || !aesgcmPreferred(hs.clientHello.cipherSuites) {
  322. preferenceOrder = cipherSuitesPreferenceOrderNoAES
  323. }
  324. configCipherSuites := c.config.cipherSuites()
  325. preferenceList := make([]uint16, 0, len(configCipherSuites))
  326. for _, suiteID := range preferenceOrder {
  327. for _, id := range configCipherSuites {
  328. if id == suiteID {
  329. preferenceList = append(preferenceList, id)
  330. break
  331. }
  332. }
  333. }
  334. hs.suite = selectCipherSuite(preferenceList, hs.clientHello.cipherSuites, hs.cipherSuiteOk)
  335. if hs.suite == nil {
  336. c.sendAlert(alertHandshakeFailure)
  337. return errors.New("tls: no cipher suite supported by both client and server")
  338. }
  339. c.cipherSuite = hs.suite.id
  340. // [UTLS SECTION BEGIN]
  341. // Disable unsupported godebug package
  342. // if c.config.CipherSuites == nil && !needFIPS() && rsaKexCiphers[hs.suite.id] {
  343. // tlsrsakex.Value() // ensure godebug is initialized
  344. // tlsrsakex.IncNonDefault()
  345. // }
  346. //
  347. // if c.config.CipherSuites == nil && !needFIPS() && tdesCiphers[hs.suite.id] {
  348. // tls3des.Value() // ensure godebug is initialized
  349. // tls3des.IncNonDefault()
  350. // }
  351. // [UTLS SECTION END]
  352. for _, id := range hs.clientHello.cipherSuites {
  353. if id == TLS_FALLBACK_SCSV {
  354. // The client is doing a fallback connection. See RFC 7507.
  355. if hs.clientHello.vers < c.config.maxSupportedVersion(roleServer) {
  356. c.sendAlert(alertInappropriateFallback)
  357. return errors.New("tls: client using inappropriate protocol fallback")
  358. }
  359. break
  360. }
  361. }
  362. return nil
  363. }
  364. func (hs *serverHandshakeState) cipherSuiteOk(c *cipherSuite) bool {
  365. if c.flags&suiteECDHE != 0 {
  366. if !hs.ecdheOk {
  367. return false
  368. }
  369. if c.flags&suiteECSign != 0 {
  370. if !hs.ecSignOk {
  371. return false
  372. }
  373. } else if !hs.rsaSignOk {
  374. return false
  375. }
  376. } else if !hs.rsaDecryptOk {
  377. return false
  378. }
  379. if hs.c.vers < VersionTLS12 && c.flags&suiteTLS12 != 0 {
  380. return false
  381. }
  382. return true
  383. }
  384. // checkForResumption reports whether we should perform resumption on this connection.
  385. func (hs *serverHandshakeState) checkForResumption() error {
  386. c := hs.c
  387. if c.config.SessionTicketsDisabled {
  388. return nil
  389. }
  390. var sessionState *SessionState
  391. if c.config.UnwrapSession != nil {
  392. ss, err := c.config.UnwrapSession(hs.clientHello.sessionTicket, c.connectionStateLocked())
  393. if err != nil {
  394. return err
  395. }
  396. if ss == nil {
  397. return nil
  398. }
  399. sessionState = ss
  400. } else {
  401. plaintext := c.config.decryptTicket(hs.clientHello.sessionTicket, c.ticketKeys)
  402. if plaintext == nil {
  403. return nil
  404. }
  405. ss, err := ParseSessionState(plaintext)
  406. if err != nil {
  407. return nil
  408. }
  409. sessionState = ss
  410. }
  411. // TLS 1.2 tickets don't natively have a lifetime, but we want to avoid
  412. // re-wrapping the same master secret in different tickets over and over for
  413. // too long, weakening forward secrecy.
  414. createdAt := time.Unix(int64(sessionState.createdAt), 0)
  415. if c.config.time().Sub(createdAt) > maxSessionTicketLifetime {
  416. return nil
  417. }
  418. // Never resume a session for a different TLS version.
  419. if c.vers != sessionState.version {
  420. return nil
  421. }
  422. cipherSuiteOk := false
  423. // Check that the client is still offering the ciphersuite in the session.
  424. for _, id := range hs.clientHello.cipherSuites {
  425. if id == sessionState.cipherSuite {
  426. cipherSuiteOk = true
  427. break
  428. }
  429. }
  430. if !cipherSuiteOk {
  431. return nil
  432. }
  433. // Check that we also support the ciphersuite from the session.
  434. suite := selectCipherSuite([]uint16{sessionState.cipherSuite},
  435. c.config.cipherSuites(), hs.cipherSuiteOk)
  436. if suite == nil {
  437. return nil
  438. }
  439. sessionHasClientCerts := len(sessionState.peerCertificates) != 0
  440. needClientCerts := requiresClientCert(c.config.ClientAuth)
  441. if needClientCerts && !sessionHasClientCerts {
  442. return nil
  443. }
  444. if sessionHasClientCerts && c.config.ClientAuth == NoClientCert {
  445. return nil
  446. }
  447. if sessionHasClientCerts && c.config.time().After(sessionState.peerCertificates[0].NotAfter) {
  448. return nil
  449. }
  450. if sessionHasClientCerts && c.config.ClientAuth >= VerifyClientCertIfGiven &&
  451. len(sessionState.verifiedChains) == 0 {
  452. return nil
  453. }
  454. // RFC 7627, Section 5.3
  455. if !sessionState.extMasterSecret && hs.clientHello.extendedMasterSecret {
  456. return nil
  457. }
  458. if sessionState.extMasterSecret && !hs.clientHello.extendedMasterSecret {
  459. // Aborting is somewhat harsh, but it's a MUST and it would indicate a
  460. // weird downgrade in client capabilities.
  461. return errors.New("tls: session supported extended_master_secret but client does not")
  462. }
  463. c.peerCertificates = sessionState.peerCertificates
  464. c.ocspResponse = sessionState.ocspResponse
  465. c.scts = sessionState.scts
  466. c.verifiedChains = sessionState.verifiedChains
  467. c.extMasterSecret = sessionState.extMasterSecret
  468. hs.sessionState = sessionState
  469. hs.suite = suite
  470. c.didResume = true
  471. return nil
  472. }
  473. func (hs *serverHandshakeState) doResumeHandshake() error {
  474. c := hs.c
  475. hs.hello.cipherSuite = hs.suite.id
  476. c.cipherSuite = hs.suite.id
  477. // We echo the client's session ID in the ServerHello to let it know
  478. // that we're doing a resumption.
  479. hs.hello.sessionId = hs.clientHello.sessionId
  480. // We always send a new session ticket, even if it wraps the same master
  481. // secret and it's potentially encrypted with the same key, to help the
  482. // client avoid cross-connection tracking from a network observer.
  483. hs.hello.ticketSupported = true
  484. hs.finishedHash = newFinishedHash(c.vers, hs.suite)
  485. hs.finishedHash.discardHandshakeBuffer()
  486. if err := transcriptMsg(hs.clientHello, &hs.finishedHash); err != nil {
  487. return err
  488. }
  489. if _, err := hs.c.writeHandshakeRecord(hs.hello, &hs.finishedHash); err != nil {
  490. return err
  491. }
  492. if c.config.VerifyConnection != nil {
  493. if err := c.config.VerifyConnection(c.connectionStateLocked()); err != nil {
  494. c.sendAlert(alertBadCertificate)
  495. return err
  496. }
  497. }
  498. hs.masterSecret = hs.sessionState.secret
  499. return nil
  500. }
  501. func (hs *serverHandshakeState) doFullHandshake() error {
  502. c := hs.c
  503. if hs.clientHello.ocspStapling && len(hs.cert.OCSPStaple) > 0 {
  504. hs.hello.ocspStapling = true
  505. }
  506. hs.hello.ticketSupported = hs.clientHello.ticketSupported && !c.config.SessionTicketsDisabled
  507. hs.hello.cipherSuite = hs.suite.id
  508. hs.finishedHash = newFinishedHash(hs.c.vers, hs.suite)
  509. if c.config.ClientAuth == NoClientCert {
  510. // No need to keep a full record of the handshake if client
  511. // certificates won't be used.
  512. hs.finishedHash.discardHandshakeBuffer()
  513. }
  514. if err := transcriptMsg(hs.clientHello, &hs.finishedHash); err != nil {
  515. return err
  516. }
  517. if _, err := hs.c.writeHandshakeRecord(hs.hello, &hs.finishedHash); err != nil {
  518. return err
  519. }
  520. certMsg := new(certificateMsg)
  521. certMsg.certificates = hs.cert.Certificate
  522. if _, err := hs.c.writeHandshakeRecord(certMsg, &hs.finishedHash); err != nil {
  523. return err
  524. }
  525. if hs.hello.ocspStapling {
  526. certStatus := new(certificateStatusMsg)
  527. certStatus.response = hs.cert.OCSPStaple
  528. if _, err := hs.c.writeHandshakeRecord(certStatus, &hs.finishedHash); err != nil {
  529. return err
  530. }
  531. }
  532. keyAgreement := hs.suite.ka(c.vers)
  533. skx, err := keyAgreement.generateServerKeyExchange(c.config, hs.cert, hs.clientHello, hs.hello)
  534. if err != nil {
  535. c.sendAlert(alertHandshakeFailure)
  536. return err
  537. }
  538. if skx != nil {
  539. if len(skx.key) >= 3 && skx.key[0] == 3 /* named curve */ {
  540. c.curveID = CurveID(byteorder.BeUint16(skx.key[1:]))
  541. }
  542. if _, err := hs.c.writeHandshakeRecord(skx, &hs.finishedHash); err != nil {
  543. return err
  544. }
  545. }
  546. var certReq *certificateRequestMsg
  547. if c.config.ClientAuth >= RequestClientCert {
  548. // Request a client certificate
  549. certReq = new(certificateRequestMsg)
  550. certReq.certificateTypes = []byte{
  551. byte(certTypeRSASign),
  552. byte(certTypeECDSASign),
  553. }
  554. if c.vers >= VersionTLS12 {
  555. certReq.hasSignatureAlgorithm = true
  556. certReq.supportedSignatureAlgorithms = supportedSignatureAlgorithms()
  557. }
  558. // An empty list of certificateAuthorities signals to
  559. // the client that it may send any certificate in response
  560. // to our request. When we know the CAs we trust, then
  561. // we can send them down, so that the client can choose
  562. // an appropriate certificate to give to us.
  563. if c.config.ClientCAs != nil {
  564. certReq.certificateAuthorities = c.config.ClientCAs.Subjects()
  565. }
  566. if _, err := hs.c.writeHandshakeRecord(certReq, &hs.finishedHash); err != nil {
  567. return err
  568. }
  569. }
  570. helloDone := new(serverHelloDoneMsg)
  571. if _, err := hs.c.writeHandshakeRecord(helloDone, &hs.finishedHash); err != nil {
  572. return err
  573. }
  574. if _, err := c.flush(); err != nil {
  575. return err
  576. }
  577. var pub crypto.PublicKey // public key for client auth, if any
  578. msg, err := c.readHandshake(&hs.finishedHash)
  579. if err != nil {
  580. return err
  581. }
  582. // If we requested a client certificate, then the client must send a
  583. // certificate message, even if it's empty.
  584. if c.config.ClientAuth >= RequestClientCert {
  585. certMsg, ok := msg.(*certificateMsg)
  586. if !ok {
  587. c.sendAlert(alertUnexpectedMessage)
  588. return unexpectedMessageError(certMsg, msg)
  589. }
  590. if err := c.processCertsFromClient(Certificate{
  591. Certificate: certMsg.certificates,
  592. }); err != nil {
  593. return err
  594. }
  595. if len(certMsg.certificates) != 0 {
  596. pub = c.peerCertificates[0].PublicKey
  597. }
  598. msg, err = c.readHandshake(&hs.finishedHash)
  599. if err != nil {
  600. return err
  601. }
  602. }
  603. if c.config.VerifyConnection != nil {
  604. if err := c.config.VerifyConnection(c.connectionStateLocked()); err != nil {
  605. c.sendAlert(alertBadCertificate)
  606. return err
  607. }
  608. }
  609. // Get client key exchange
  610. ckx, ok := msg.(*clientKeyExchangeMsg)
  611. if !ok {
  612. c.sendAlert(alertUnexpectedMessage)
  613. return unexpectedMessageError(ckx, msg)
  614. }
  615. preMasterSecret, err := keyAgreement.processClientKeyExchange(c.config, hs.cert, ckx, c.vers)
  616. if err != nil {
  617. c.sendAlert(alertHandshakeFailure)
  618. return err
  619. }
  620. if hs.hello.extendedMasterSecret {
  621. c.extMasterSecret = true
  622. hs.masterSecret = extMasterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret,
  623. hs.finishedHash.Sum())
  624. } else {
  625. hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret,
  626. hs.clientHello.random, hs.hello.random)
  627. }
  628. if err := c.config.writeKeyLog(keyLogLabelTLS12, hs.clientHello.random, hs.masterSecret); err != nil {
  629. c.sendAlert(alertInternalError)
  630. return err
  631. }
  632. // If we received a client cert in response to our certificate request message,
  633. // the client will send us a certificateVerifyMsg immediately after the
  634. // clientKeyExchangeMsg. This message is a digest of all preceding
  635. // handshake-layer messages that is signed using the private key corresponding
  636. // to the client's certificate. This allows us to verify that the client is in
  637. // possession of the private key of the certificate.
  638. if len(c.peerCertificates) > 0 {
  639. // certificateVerifyMsg is included in the transcript, but not until
  640. // after we verify the handshake signature, since the state before
  641. // this message was sent is used.
  642. msg, err = c.readHandshake(nil)
  643. if err != nil {
  644. return err
  645. }
  646. certVerify, ok := msg.(*certificateVerifyMsg)
  647. if !ok {
  648. c.sendAlert(alertUnexpectedMessage)
  649. return unexpectedMessageError(certVerify, msg)
  650. }
  651. var sigType uint8
  652. var sigHash crypto.Hash
  653. if c.vers >= VersionTLS12 {
  654. if !isSupportedSignatureAlgorithm(certVerify.signatureAlgorithm, certReq.supportedSignatureAlgorithms) {
  655. c.sendAlert(alertIllegalParameter)
  656. return errors.New("tls: client certificate used with invalid signature algorithm")
  657. }
  658. sigType, sigHash, err = typeAndHashFromSignatureScheme(certVerify.signatureAlgorithm)
  659. if err != nil {
  660. return c.sendAlert(alertInternalError)
  661. }
  662. } else {
  663. sigType, sigHash, err = legacyTypeAndHashFromPublicKey(pub)
  664. if err != nil {
  665. c.sendAlert(alertIllegalParameter)
  666. return err
  667. }
  668. }
  669. signed := hs.finishedHash.hashForClientCertificate(sigType, sigHash)
  670. if err := verifyHandshakeSignature(sigType, pub, sigHash, signed, certVerify.signature); err != nil {
  671. c.sendAlert(alertDecryptError)
  672. return errors.New("tls: invalid signature by the client certificate: " + err.Error())
  673. }
  674. if err := transcriptMsg(certVerify, &hs.finishedHash); err != nil {
  675. return err
  676. }
  677. }
  678. hs.finishedHash.discardHandshakeBuffer()
  679. return nil
  680. }
  681. func (hs *serverHandshakeState) establishKeys() error {
  682. c := hs.c
  683. clientMAC, serverMAC, clientKey, serverKey, clientIV, serverIV :=
  684. keysFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.clientHello.random, hs.hello.random, hs.suite.macLen, hs.suite.keyLen, hs.suite.ivLen)
  685. var clientCipher, serverCipher any
  686. var clientHash, serverHash hash.Hash
  687. if hs.suite.aead == nil {
  688. clientCipher = hs.suite.cipher(clientKey, clientIV, true /* for reading */)
  689. clientHash = hs.suite.mac(clientMAC)
  690. serverCipher = hs.suite.cipher(serverKey, serverIV, false /* not for reading */)
  691. serverHash = hs.suite.mac(serverMAC)
  692. } else {
  693. clientCipher = hs.suite.aead(clientKey, clientIV)
  694. serverCipher = hs.suite.aead(serverKey, serverIV)
  695. }
  696. c.in.prepareCipherSpec(c.vers, clientCipher, clientHash)
  697. c.out.prepareCipherSpec(c.vers, serverCipher, serverHash)
  698. return nil
  699. }
  700. func (hs *serverHandshakeState) readFinished(out []byte) error {
  701. c := hs.c
  702. if err := c.readChangeCipherSpec(); err != nil {
  703. return err
  704. }
  705. // finishedMsg is included in the transcript, but not until after we
  706. // check the client version, since the state before this message was
  707. // sent is used during verification.
  708. msg, err := c.readHandshake(nil)
  709. if err != nil {
  710. return err
  711. }
  712. clientFinished, ok := msg.(*finishedMsg)
  713. if !ok {
  714. c.sendAlert(alertUnexpectedMessage)
  715. return unexpectedMessageError(clientFinished, msg)
  716. }
  717. verify := hs.finishedHash.clientSum(hs.masterSecret)
  718. if len(verify) != len(clientFinished.verifyData) ||
  719. subtle.ConstantTimeCompare(verify, clientFinished.verifyData) != 1 {
  720. c.sendAlert(alertHandshakeFailure)
  721. return errors.New("tls: client's Finished message is incorrect")
  722. }
  723. if err := transcriptMsg(clientFinished, &hs.finishedHash); err != nil {
  724. return err
  725. }
  726. copy(out, verify)
  727. return nil
  728. }
  729. func (hs *serverHandshakeState) sendSessionTicket() error {
  730. if !hs.hello.ticketSupported {
  731. return nil
  732. }
  733. c := hs.c
  734. m := new(newSessionTicketMsg)
  735. state := c.sessionState()
  736. state.secret = hs.masterSecret
  737. if hs.sessionState != nil {
  738. // If this is re-wrapping an old key, then keep
  739. // the original time it was created.
  740. state.createdAt = hs.sessionState.createdAt
  741. }
  742. if c.config.WrapSession != nil {
  743. var err error
  744. m.ticket, err = c.config.WrapSession(c.connectionStateLocked(), state)
  745. if err != nil {
  746. return err
  747. }
  748. } else {
  749. stateBytes, err := state.Bytes()
  750. if err != nil {
  751. return err
  752. }
  753. m.ticket, err = c.config.encryptTicket(stateBytes, c.ticketKeys)
  754. if err != nil {
  755. return err
  756. }
  757. }
  758. if _, err := hs.c.writeHandshakeRecord(m, &hs.finishedHash); err != nil {
  759. return err
  760. }
  761. return nil
  762. }
  763. func (hs *serverHandshakeState) sendFinished(out []byte) error {
  764. c := hs.c
  765. if err := c.writeChangeCipherRecord(); err != nil {
  766. return err
  767. }
  768. finished := new(finishedMsg)
  769. finished.verifyData = hs.finishedHash.serverSum(hs.masterSecret)
  770. if _, err := hs.c.writeHandshakeRecord(finished, &hs.finishedHash); err != nil {
  771. return err
  772. }
  773. copy(out, finished.verifyData)
  774. return nil
  775. }
  776. // processCertsFromClient takes a chain of client certificates either from a
  777. // Certificates message and verifies them.
  778. func (c *Conn) processCertsFromClient(certificate Certificate) error {
  779. certificates := certificate.Certificate
  780. certs := make([]*x509.Certificate, len(certificates))
  781. var err error
  782. for i, asn1Data := range certificates {
  783. if certs[i], err = x509.ParseCertificate(asn1Data); err != nil {
  784. c.sendAlert(alertBadCertificate)
  785. return errors.New("tls: failed to parse client certificate: " + err.Error())
  786. }
  787. if certs[i].PublicKeyAlgorithm == x509.RSA {
  788. n := certs[i].PublicKey.(*rsa.PublicKey).N.BitLen()
  789. if max, ok := checkKeySize(n); !ok {
  790. c.sendAlert(alertBadCertificate)
  791. return fmt.Errorf("tls: client sent certificate containing RSA key larger than %d bits", max)
  792. }
  793. }
  794. }
  795. if len(certs) == 0 && requiresClientCert(c.config.ClientAuth) {
  796. if c.vers == VersionTLS13 {
  797. c.sendAlert(alertCertificateRequired)
  798. } else {
  799. c.sendAlert(alertBadCertificate)
  800. }
  801. return errors.New("tls: client didn't provide a certificate")
  802. }
  803. if c.config.ClientAuth >= VerifyClientCertIfGiven && len(certs) > 0 {
  804. opts := x509.VerifyOptions{
  805. Roots: c.config.ClientCAs,
  806. CurrentTime: c.config.time(),
  807. Intermediates: x509.NewCertPool(),
  808. KeyUsages: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth},
  809. }
  810. for _, cert := range certs[1:] {
  811. opts.Intermediates.AddCert(cert)
  812. }
  813. chains, err := certs[0].Verify(opts)
  814. if err != nil {
  815. var errCertificateInvalid x509.CertificateInvalidError
  816. if errors.As(err, &x509.UnknownAuthorityError{}) {
  817. c.sendAlert(alertUnknownCA)
  818. } else if errors.As(err, &errCertificateInvalid) && errCertificateInvalid.Reason == x509.Expired {
  819. c.sendAlert(alertCertificateExpired)
  820. } else {
  821. c.sendAlert(alertBadCertificate)
  822. }
  823. return &CertificateVerificationError{UnverifiedCertificates: certs, Err: err}
  824. }
  825. c.verifiedChains = chains
  826. }
  827. c.peerCertificates = certs
  828. c.ocspResponse = certificate.OCSPStaple
  829. c.scts = certificate.SignedCertificateTimestamps
  830. if len(certs) > 0 {
  831. switch certs[0].PublicKey.(type) {
  832. case *ecdsa.PublicKey, *rsa.PublicKey, ed25519.PublicKey:
  833. default:
  834. c.sendAlert(alertUnsupportedCertificate)
  835. return fmt.Errorf("tls: client certificate contains an unsupported public key of type %T", certs[0].PublicKey)
  836. }
  837. }
  838. if c.config.VerifyPeerCertificate != nil {
  839. if err := c.config.VerifyPeerCertificate(certificates, c.verifiedChains); err != nil {
  840. c.sendAlert(alertBadCertificate)
  841. return err
  842. }
  843. }
  844. return nil
  845. }
  846. func clientHelloInfo(ctx context.Context, c *Conn, clientHello *clientHelloMsg) *ClientHelloInfo {
  847. supportedVersions := clientHello.supportedVersions
  848. if len(clientHello.supportedVersions) == 0 {
  849. supportedVersions = supportedVersionsFromMax(clientHello.vers)
  850. }
  851. return &ClientHelloInfo{
  852. CipherSuites: clientHello.cipherSuites,
  853. ServerName: clientHello.serverName,
  854. SupportedCurves: clientHello.supportedCurves,
  855. SupportedPoints: clientHello.supportedPoints,
  856. SignatureSchemes: clientHello.supportedSignatureAlgorithms,
  857. SupportedProtos: clientHello.alpnProtocols,
  858. SupportedVersions: supportedVersions,
  859. Conn: c.conn,
  860. config: c.config,
  861. ctx: ctx,
  862. }
  863. }