handshake_server.go 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974
  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. circlSign "github.com/cloudflare/circl/sign"
  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. c.didResume = true
  71. if err := hs.doResumeHandshake(); err != nil {
  72. return err
  73. }
  74. if err := hs.establishKeys(); err != nil {
  75. return err
  76. }
  77. if err := hs.sendSessionTicket(); err != nil {
  78. return err
  79. }
  80. if err := hs.sendFinished(c.serverFinished[:]); err != nil {
  81. return err
  82. }
  83. if _, err := c.flush(); err != nil {
  84. return err
  85. }
  86. c.clientFinishedIsFirst = false
  87. if err := hs.readFinished(nil); err != nil {
  88. return err
  89. }
  90. } else {
  91. // The client didn't include a session ticket, or it wasn't
  92. // valid so we do a full handshake.
  93. if err := hs.pickCipherSuite(); err != nil {
  94. return err
  95. }
  96. if err := hs.doFullHandshake(); err != nil {
  97. return err
  98. }
  99. if err := hs.establishKeys(); err != nil {
  100. return err
  101. }
  102. if err := hs.readFinished(c.clientFinished[:]); err != nil {
  103. return err
  104. }
  105. c.clientFinishedIsFirst = true
  106. c.buffering = true
  107. if err := hs.sendSessionTicket(); err != nil {
  108. return err
  109. }
  110. if err := hs.sendFinished(nil); err != nil {
  111. return err
  112. }
  113. if _, err := c.flush(); err != nil {
  114. return err
  115. }
  116. }
  117. c.ekm = ekmFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.clientHello.random, hs.hello.random)
  118. c.isHandshakeComplete.Store(true)
  119. return nil
  120. }
  121. // readClientHello reads a ClientHello message and selects the protocol version.
  122. func (c *Conn) readClientHello(ctx context.Context) (*clientHelloMsg, error) {
  123. // clientHelloMsg is included in the transcript, but we haven't initialized
  124. // it yet. The respective handshake functions will record it themselves.
  125. msg, err := c.readHandshake(nil)
  126. if err != nil {
  127. return nil, err
  128. }
  129. clientHello, ok := msg.(*clientHelloMsg)
  130. if !ok {
  131. c.sendAlert(alertUnexpectedMessage)
  132. return nil, unexpectedMessageError(clientHello, msg)
  133. }
  134. var configForClient *Config
  135. originalConfig := c.config
  136. if c.config.GetConfigForClient != nil {
  137. chi := clientHelloInfo(ctx, c, clientHello)
  138. if configForClient, err = c.config.GetConfigForClient(chi); err != nil {
  139. c.sendAlert(alertInternalError)
  140. return nil, err
  141. } else if configForClient != nil {
  142. c.config = configForClient
  143. }
  144. }
  145. c.ticketKeys = originalConfig.ticketKeys(configForClient)
  146. clientVersions := clientHello.supportedVersions
  147. if len(clientHello.supportedVersions) == 0 {
  148. clientVersions = supportedVersionsFromMax(clientHello.vers)
  149. }
  150. c.vers, ok = c.config.mutualVersion(roleServer, clientVersions)
  151. if !ok {
  152. c.sendAlert(alertProtocolVersion)
  153. return nil, fmt.Errorf("tls: client offered only unsupported versions: %x", clientVersions)
  154. }
  155. c.haveVers = true
  156. c.in.version = c.vers
  157. c.out.version = c.vers
  158. // [UTLS SECTION BEGIN]
  159. // Disable unsupported godebug package
  160. // if c.config.MinVersion == 0 && c.vers < VersionTLS12 {
  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, 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, supportedCurves []CurveID, supportedPoints []uint8) bool {
  295. supportsCurve := false
  296. for _, curve := range supportedCurves {
  297. if c.supportsCurve(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 && rsaKexCiphers[hs.suite.id] {
  343. // tlsrsakex.IncNonDefault()
  344. // }
  345. // [UTLS SECTION END]
  346. for _, id := range hs.clientHello.cipherSuites {
  347. if id == TLS_FALLBACK_SCSV {
  348. // The client is doing a fallback connection. See RFC 7507.
  349. if hs.clientHello.vers < c.config.maxSupportedVersion(roleServer) {
  350. c.sendAlert(alertInappropriateFallback)
  351. return errors.New("tls: client using inappropriate protocol fallback")
  352. }
  353. break
  354. }
  355. }
  356. return nil
  357. }
  358. func (hs *serverHandshakeState) cipherSuiteOk(c *cipherSuite) bool {
  359. if c.flags&suiteECDHE != 0 {
  360. if !hs.ecdheOk {
  361. return false
  362. }
  363. if c.flags&suiteECSign != 0 {
  364. if !hs.ecSignOk {
  365. return false
  366. }
  367. } else if !hs.rsaSignOk {
  368. return false
  369. }
  370. } else if !hs.rsaDecryptOk {
  371. return false
  372. }
  373. if hs.c.vers < VersionTLS12 && c.flags&suiteTLS12 != 0 {
  374. return false
  375. }
  376. return true
  377. }
  378. // checkForResumption reports whether we should perform resumption on this connection.
  379. func (hs *serverHandshakeState) checkForResumption() error {
  380. c := hs.c
  381. if c.config.SessionTicketsDisabled {
  382. return nil
  383. }
  384. var sessionState *SessionState
  385. if c.config.UnwrapSession != nil {
  386. ss, err := c.config.UnwrapSession(hs.clientHello.sessionTicket, c.connectionStateLocked())
  387. if err != nil {
  388. return err
  389. }
  390. if ss == nil {
  391. return nil
  392. }
  393. sessionState = ss
  394. } else {
  395. plaintext := c.config.decryptTicket(hs.clientHello.sessionTicket, c.ticketKeys)
  396. if plaintext == nil {
  397. return nil
  398. }
  399. ss, err := ParseSessionState(plaintext)
  400. if err != nil {
  401. return nil
  402. }
  403. sessionState = ss
  404. }
  405. // TLS 1.2 tickets don't natively have a lifetime, but we want to avoid
  406. // re-wrapping the same master secret in different tickets over and over for
  407. // too long, weakening forward secrecy.
  408. createdAt := time.Unix(int64(sessionState.createdAt), 0)
  409. if c.config.time().Sub(createdAt) > maxSessionTicketLifetime {
  410. return nil
  411. }
  412. // Never resume a session for a different TLS version.
  413. if c.vers != sessionState.version {
  414. return nil
  415. }
  416. cipherSuiteOk := false
  417. // Check that the client is still offering the ciphersuite in the session.
  418. for _, id := range hs.clientHello.cipherSuites {
  419. if id == sessionState.cipherSuite {
  420. cipherSuiteOk = true
  421. break
  422. }
  423. }
  424. if !cipherSuiteOk {
  425. return nil
  426. }
  427. // Check that we also support the ciphersuite from the session.
  428. suite := selectCipherSuite([]uint16{sessionState.cipherSuite},
  429. c.config.cipherSuites(), hs.cipherSuiteOk)
  430. if suite == nil {
  431. return nil
  432. }
  433. sessionHasClientCerts := len(sessionState.peerCertificates) != 0
  434. needClientCerts := requiresClientCert(c.config.ClientAuth)
  435. if needClientCerts && !sessionHasClientCerts {
  436. return nil
  437. }
  438. if sessionHasClientCerts && c.config.ClientAuth == NoClientCert {
  439. return nil
  440. }
  441. if sessionHasClientCerts && c.config.time().After(sessionState.peerCertificates[0].NotAfter) {
  442. return nil
  443. }
  444. if sessionHasClientCerts && c.config.ClientAuth >= VerifyClientCertIfGiven &&
  445. len(sessionState.verifiedChains) == 0 {
  446. return nil
  447. }
  448. // RFC 7627, Section 5.3
  449. if !sessionState.extMasterSecret && hs.clientHello.extendedMasterSecret {
  450. return nil
  451. }
  452. if sessionState.extMasterSecret && !hs.clientHello.extendedMasterSecret {
  453. // Aborting is somewhat harsh, but it's a MUST and it would indicate a
  454. // weird downgrade in client capabilities.
  455. return errors.New("tls: session supported extended_master_secret but client does not")
  456. }
  457. c.peerCertificates = sessionState.peerCertificates
  458. c.ocspResponse = sessionState.ocspResponse
  459. c.scts = sessionState.scts
  460. c.verifiedChains = sessionState.verifiedChains
  461. c.extMasterSecret = sessionState.extMasterSecret
  462. hs.sessionState = sessionState
  463. hs.suite = suite
  464. c.didResume = true
  465. return nil
  466. }
  467. func (hs *serverHandshakeState) doResumeHandshake() error {
  468. c := hs.c
  469. hs.hello.cipherSuite = hs.suite.id
  470. c.cipherSuite = hs.suite.id
  471. // We echo the client's session ID in the ServerHello to let it know
  472. // that we're doing a resumption.
  473. hs.hello.sessionId = hs.clientHello.sessionId
  474. // We always send a new session ticket, even if it wraps the same master
  475. // secret and it's potentially encrypted with the same key, to help the
  476. // client avoid cross-connection tracking from a network observer.
  477. hs.hello.ticketSupported = true
  478. hs.finishedHash = newFinishedHash(c.vers, hs.suite)
  479. hs.finishedHash.discardHandshakeBuffer()
  480. if err := transcriptMsg(hs.clientHello, &hs.finishedHash); err != nil {
  481. return err
  482. }
  483. if _, err := hs.c.writeHandshakeRecord(hs.hello, &hs.finishedHash); err != nil {
  484. return err
  485. }
  486. if c.config.VerifyConnection != nil {
  487. if err := c.config.VerifyConnection(c.connectionStateLocked()); err != nil {
  488. c.sendAlert(alertBadCertificate)
  489. return err
  490. }
  491. }
  492. hs.masterSecret = hs.sessionState.secret
  493. return nil
  494. }
  495. func (hs *serverHandshakeState) doFullHandshake() error {
  496. c := hs.c
  497. if hs.clientHello.ocspStapling && len(hs.cert.OCSPStaple) > 0 {
  498. hs.hello.ocspStapling = true
  499. }
  500. hs.hello.ticketSupported = hs.clientHello.ticketSupported && !c.config.SessionTicketsDisabled
  501. hs.hello.cipherSuite = hs.suite.id
  502. hs.finishedHash = newFinishedHash(hs.c.vers, hs.suite)
  503. if c.config.ClientAuth == NoClientCert {
  504. // No need to keep a full record of the handshake if client
  505. // certificates won't be used.
  506. hs.finishedHash.discardHandshakeBuffer()
  507. }
  508. if err := transcriptMsg(hs.clientHello, &hs.finishedHash); err != nil {
  509. return err
  510. }
  511. if _, err := hs.c.writeHandshakeRecord(hs.hello, &hs.finishedHash); err != nil {
  512. return err
  513. }
  514. certMsg := new(certificateMsg)
  515. certMsg.certificates = hs.cert.Certificate
  516. if _, err := hs.c.writeHandshakeRecord(certMsg, &hs.finishedHash); err != nil {
  517. return err
  518. }
  519. if hs.hello.ocspStapling {
  520. certStatus := new(certificateStatusMsg)
  521. certStatus.response = hs.cert.OCSPStaple
  522. if _, err := hs.c.writeHandshakeRecord(certStatus, &hs.finishedHash); err != nil {
  523. return err
  524. }
  525. }
  526. keyAgreement := hs.suite.ka(c.vers)
  527. skx, err := keyAgreement.generateServerKeyExchange(c.config, hs.cert, hs.clientHello, hs.hello)
  528. if err != nil {
  529. c.sendAlert(alertHandshakeFailure)
  530. return err
  531. }
  532. if skx != nil {
  533. if _, err := hs.c.writeHandshakeRecord(skx, &hs.finishedHash); err != nil {
  534. return err
  535. }
  536. }
  537. var certReq *certificateRequestMsg
  538. if c.config.ClientAuth >= RequestClientCert {
  539. // Request a client certificate
  540. certReq = new(certificateRequestMsg)
  541. certReq.certificateTypes = []byte{
  542. byte(certTypeRSASign),
  543. byte(certTypeECDSASign),
  544. }
  545. if c.vers >= VersionTLS12 {
  546. certReq.hasSignatureAlgorithm = true
  547. certReq.supportedSignatureAlgorithms = c.config.supportedSignatureAlgorithms() // [UTLS] ported from cloudflare/go
  548. }
  549. // An empty list of certificateAuthorities signals to
  550. // the client that it may send any certificate in response
  551. // to our request. When we know the CAs we trust, then
  552. // we can send them down, so that the client can choose
  553. // an appropriate certificate to give to us.
  554. if c.config.ClientCAs != nil {
  555. certReq.certificateAuthorities = c.config.ClientCAs.Subjects()
  556. }
  557. if _, err := hs.c.writeHandshakeRecord(certReq, &hs.finishedHash); err != nil {
  558. return err
  559. }
  560. }
  561. helloDone := new(serverHelloDoneMsg)
  562. if _, err := hs.c.writeHandshakeRecord(helloDone, &hs.finishedHash); err != nil {
  563. return err
  564. }
  565. if _, err := c.flush(); err != nil {
  566. return err
  567. }
  568. var pub crypto.PublicKey // public key for client auth, if any
  569. msg, err := c.readHandshake(&hs.finishedHash)
  570. if err != nil {
  571. return err
  572. }
  573. // If we requested a client certificate, then the client must send a
  574. // certificate message, even if it's empty.
  575. if c.config.ClientAuth >= RequestClientCert {
  576. certMsg, ok := msg.(*certificateMsg)
  577. if !ok {
  578. c.sendAlert(alertUnexpectedMessage)
  579. return unexpectedMessageError(certMsg, msg)
  580. }
  581. if err := c.processCertsFromClient(Certificate{
  582. Certificate: certMsg.certificates,
  583. }); err != nil {
  584. return err
  585. }
  586. if len(certMsg.certificates) != 0 {
  587. pub = c.peerCertificates[0].PublicKey
  588. }
  589. msg, err = c.readHandshake(&hs.finishedHash)
  590. if err != nil {
  591. return err
  592. }
  593. }
  594. if c.config.VerifyConnection != nil {
  595. if err := c.config.VerifyConnection(c.connectionStateLocked()); err != nil {
  596. c.sendAlert(alertBadCertificate)
  597. return err
  598. }
  599. }
  600. // Get client key exchange
  601. ckx, ok := msg.(*clientKeyExchangeMsg)
  602. if !ok {
  603. c.sendAlert(alertUnexpectedMessage)
  604. return unexpectedMessageError(ckx, msg)
  605. }
  606. preMasterSecret, err := keyAgreement.processClientKeyExchange(c.config, hs.cert, ckx, c.vers)
  607. if err != nil {
  608. c.sendAlert(alertHandshakeFailure)
  609. return err
  610. }
  611. if hs.hello.extendedMasterSecret {
  612. c.extMasterSecret = true
  613. hs.masterSecret = extMasterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret,
  614. hs.finishedHash.Sum())
  615. } else {
  616. hs.masterSecret = masterFromPreMasterSecret(c.vers, hs.suite, preMasterSecret,
  617. hs.clientHello.random, hs.hello.random)
  618. }
  619. if err := c.config.writeKeyLog(keyLogLabelTLS12, hs.clientHello.random, hs.masterSecret); err != nil {
  620. c.sendAlert(alertInternalError)
  621. return err
  622. }
  623. // If we received a client cert in response to our certificate request message,
  624. // the client will send us a certificateVerifyMsg immediately after the
  625. // clientKeyExchangeMsg. This message is a digest of all preceding
  626. // handshake-layer messages that is signed using the private key corresponding
  627. // to the client's certificate. This allows us to verify that the client is in
  628. // possession of the private key of the certificate.
  629. if len(c.peerCertificates) > 0 {
  630. // certificateVerifyMsg is included in the transcript, but not until
  631. // after we verify the handshake signature, since the state before
  632. // this message was sent is used.
  633. msg, err = c.readHandshake(nil)
  634. if err != nil {
  635. return err
  636. }
  637. certVerify, ok := msg.(*certificateVerifyMsg)
  638. if !ok {
  639. c.sendAlert(alertUnexpectedMessage)
  640. return unexpectedMessageError(certVerify, msg)
  641. }
  642. var sigType uint8
  643. var sigHash crypto.Hash
  644. if c.vers >= VersionTLS12 {
  645. if !isSupportedSignatureAlgorithm(certVerify.signatureAlgorithm, certReq.supportedSignatureAlgorithms) {
  646. c.sendAlert(alertIllegalParameter)
  647. return errors.New("tls: client certificate used with invalid signature algorithm")
  648. }
  649. sigType, sigHash, err = typeAndHashFromSignatureScheme(certVerify.signatureAlgorithm)
  650. if err != nil {
  651. return c.sendAlert(alertInternalError)
  652. }
  653. } else {
  654. sigType, sigHash, err = legacyTypeAndHashFromPublicKey(pub)
  655. if err != nil {
  656. c.sendAlert(alertIllegalParameter)
  657. return err
  658. }
  659. }
  660. signed := hs.finishedHash.hashForClientCertificate(sigType, sigHash)
  661. if err := verifyHandshakeSignature(sigType, pub, sigHash, signed, certVerify.signature); err != nil {
  662. c.sendAlert(alertDecryptError)
  663. return errors.New("tls: invalid signature by the client certificate: " + err.Error())
  664. }
  665. if err := transcriptMsg(certVerify, &hs.finishedHash); err != nil {
  666. return err
  667. }
  668. }
  669. hs.finishedHash.discardHandshakeBuffer()
  670. return nil
  671. }
  672. func (hs *serverHandshakeState) establishKeys() error {
  673. c := hs.c
  674. clientMAC, serverMAC, clientKey, serverKey, clientIV, serverIV :=
  675. keysFromMasterSecret(c.vers, hs.suite, hs.masterSecret, hs.clientHello.random, hs.hello.random, hs.suite.macLen, hs.suite.keyLen, hs.suite.ivLen)
  676. var clientCipher, serverCipher any
  677. var clientHash, serverHash hash.Hash
  678. if hs.suite.aead == nil {
  679. clientCipher = hs.suite.cipher(clientKey, clientIV, true /* for reading */)
  680. clientHash = hs.suite.mac(clientMAC)
  681. serverCipher = hs.suite.cipher(serverKey, serverIV, false /* not for reading */)
  682. serverHash = hs.suite.mac(serverMAC)
  683. } else {
  684. clientCipher = hs.suite.aead(clientKey, clientIV)
  685. serverCipher = hs.suite.aead(serverKey, serverIV)
  686. }
  687. c.in.prepareCipherSpec(c.vers, clientCipher, clientHash)
  688. c.out.prepareCipherSpec(c.vers, serverCipher, serverHash)
  689. return nil
  690. }
  691. func (hs *serverHandshakeState) readFinished(out []byte) error {
  692. c := hs.c
  693. if err := c.readChangeCipherSpec(); err != nil {
  694. return err
  695. }
  696. // finishedMsg is included in the transcript, but not until after we
  697. // check the client version, since the state before this message was
  698. // sent is used during verification.
  699. msg, err := c.readHandshake(nil)
  700. if err != nil {
  701. return err
  702. }
  703. clientFinished, ok := msg.(*finishedMsg)
  704. if !ok {
  705. c.sendAlert(alertUnexpectedMessage)
  706. return unexpectedMessageError(clientFinished, msg)
  707. }
  708. verify := hs.finishedHash.clientSum(hs.masterSecret)
  709. if len(verify) != len(clientFinished.verifyData) ||
  710. subtle.ConstantTimeCompare(verify, clientFinished.verifyData) != 1 {
  711. c.sendAlert(alertHandshakeFailure)
  712. return errors.New("tls: client's Finished message is incorrect")
  713. }
  714. if err := transcriptMsg(clientFinished, &hs.finishedHash); err != nil {
  715. return err
  716. }
  717. copy(out, verify)
  718. return nil
  719. }
  720. func (hs *serverHandshakeState) sendSessionTicket() error {
  721. // ticketSupported is set in a resumption handshake if the
  722. // ticket from the client was encrypted with an old session
  723. // ticket key and thus a refreshed ticket should be sent.
  724. if !hs.hello.ticketSupported {
  725. return nil
  726. }
  727. c := hs.c
  728. m := new(newSessionTicketMsg)
  729. state, err := c.sessionState()
  730. if err != nil {
  731. return err
  732. }
  733. state.secret = hs.masterSecret
  734. if hs.sessionState != nil {
  735. // If this is re-wrapping an old key, then keep
  736. // the original time it was created.
  737. state.createdAt = hs.sessionState.createdAt
  738. }
  739. if c.config.WrapSession != nil {
  740. m.ticket, err = c.config.WrapSession(c.connectionStateLocked(), state)
  741. if err != nil {
  742. return err
  743. }
  744. } else {
  745. stateBytes, err := state.Bytes()
  746. if err != nil {
  747. return err
  748. }
  749. m.ticket, err = c.config.encryptTicket(stateBytes, c.ticketKeys)
  750. if err != nil {
  751. return err
  752. }
  753. }
  754. if _, err := hs.c.writeHandshakeRecord(m, &hs.finishedHash); err != nil {
  755. return err
  756. }
  757. return nil
  758. }
  759. func (hs *serverHandshakeState) sendFinished(out []byte) error {
  760. c := hs.c
  761. if err := c.writeChangeCipherRecord(); err != nil {
  762. return err
  763. }
  764. finished := new(finishedMsg)
  765. finished.verifyData = hs.finishedHash.serverSum(hs.masterSecret)
  766. if _, err := hs.c.writeHandshakeRecord(finished, &hs.finishedHash); err != nil {
  767. return err
  768. }
  769. copy(out, finished.verifyData)
  770. return nil
  771. }
  772. // processCertsFromClient takes a chain of client certificates either from a
  773. // Certificates message and verifies them.
  774. func (c *Conn) processCertsFromClient(certificate Certificate) error {
  775. certificates := certificate.Certificate
  776. certs := make([]*x509.Certificate, len(certificates))
  777. var err error
  778. for i, asn1Data := range certificates {
  779. if certs[i], err = x509.ParseCertificate(asn1Data); err != nil {
  780. c.sendAlert(alertBadCertificate)
  781. return errors.New("tls: failed to parse client certificate: " + err.Error())
  782. }
  783. if certs[i].PublicKeyAlgorithm == x509.RSA {
  784. n := certs[i].PublicKey.(*rsa.PublicKey).N.BitLen()
  785. if max, ok := checkKeySize(n); !ok {
  786. c.sendAlert(alertBadCertificate)
  787. return fmt.Errorf("tls: client sent certificate containing RSA key larger than %d bits", max)
  788. }
  789. }
  790. }
  791. if len(certs) == 0 && requiresClientCert(c.config.ClientAuth) {
  792. if c.vers == VersionTLS13 {
  793. c.sendAlert(alertCertificateRequired)
  794. } else {
  795. c.sendAlert(alertBadCertificate)
  796. }
  797. return errors.New("tls: client didn't provide a certificate")
  798. }
  799. if c.config.ClientAuth >= VerifyClientCertIfGiven && len(certs) > 0 {
  800. opts := x509.VerifyOptions{
  801. Roots: c.config.ClientCAs,
  802. CurrentTime: c.config.time(),
  803. Intermediates: x509.NewCertPool(),
  804. KeyUsages: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth},
  805. }
  806. for _, cert := range certs[1:] {
  807. opts.Intermediates.AddCert(cert)
  808. }
  809. chains, err := certs[0].Verify(opts)
  810. if err != nil {
  811. var errCertificateInvalid x509.CertificateInvalidError
  812. if errors.As(err, &x509.UnknownAuthorityError{}) {
  813. c.sendAlert(alertUnknownCA)
  814. } else if errors.As(err, &errCertificateInvalid) && errCertificateInvalid.Reason == x509.Expired {
  815. c.sendAlert(alertCertificateExpired)
  816. } else {
  817. c.sendAlert(alertBadCertificate)
  818. }
  819. return &CertificateVerificationError{UnverifiedCertificates: certs, Err: err}
  820. }
  821. c.verifiedChains = chains
  822. }
  823. c.peerCertificates = certs
  824. c.ocspResponse = certificate.OCSPStaple
  825. c.scts = certificate.SignedCertificateTimestamps
  826. if len(certs) > 0 {
  827. switch certs[0].PublicKey.(type) {
  828. case *ecdsa.PublicKey, *rsa.PublicKey, ed25519.PublicKey, circlSign.PublicKey: // [UTLS] ported from cloudflare/go
  829. default:
  830. c.sendAlert(alertUnsupportedCertificate)
  831. return fmt.Errorf("tls: client certificate contains an unsupported public key of type %T", certs[0].PublicKey)
  832. }
  833. }
  834. if c.config.VerifyPeerCertificate != nil {
  835. if err := c.config.VerifyPeerCertificate(certificates, c.verifiedChains); err != nil {
  836. c.sendAlert(alertBadCertificate)
  837. return err
  838. }
  839. }
  840. return nil
  841. }
  842. func clientHelloInfo(ctx context.Context, c *Conn, clientHello *clientHelloMsg) *ClientHelloInfo {
  843. supportedVersions := clientHello.supportedVersions
  844. if len(clientHello.supportedVersions) == 0 {
  845. supportedVersions = supportedVersionsFromMax(clientHello.vers)
  846. }
  847. return &ClientHelloInfo{
  848. CipherSuites: clientHello.cipherSuites,
  849. ServerName: clientHello.serverName,
  850. SupportedCurves: clientHello.supportedCurves,
  851. SupportedPoints: clientHello.supportedPoints,
  852. SignatureSchemes: clientHello.supportedSignatureAlgorithms,
  853. SupportedProtos: clientHello.alpnProtocols,
  854. SupportedVersions: supportedVersions,
  855. Conn: c.conn,
  856. config: c.config,
  857. ctx: ctx,
  858. }
  859. }