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

handshake_server.go 16 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595
  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. "crypto"
  7. "crypto/rsa"
  8. "crypto/subtle"
  9. "crypto/x509"
  10. "errors"
  11. "io"
  12. )
  13. // serverHandshakeState contains details of a server handshake in progress.
  14. // It's discarded once the handshake has completed.
  15. type serverHandshakeState struct {
  16. c *Conn
  17. clientHello *clientHelloMsg
  18. hello *serverHelloMsg
  19. suite *cipherSuite
  20. ellipticOk bool
  21. sessionState *sessionState
  22. finishedHash finishedHash
  23. masterSecret []byte
  24. certsFromClient [][]byte
  25. }
  26. // serverHandshake performs a TLS handshake as a server.
  27. func (c *Conn) serverHandshake() error {
  28. config := c.config
  29. // If this is the first server handshake, we generate a random key to
  30. // encrypt the tickets with.
  31. config.serverInitOnce.Do(func() {
  32. if config.SessionTicketsDisabled {
  33. return
  34. }
  35. // If the key has already been set then we have nothing to do.
  36. for _, b := range config.SessionTicketKey {
  37. if b != 0 {
  38. return
  39. }
  40. }
  41. if _, err := io.ReadFull(config.rand(), config.SessionTicketKey[:]); err != nil {
  42. config.SessionTicketsDisabled = true
  43. }
  44. })
  45. hs := serverHandshakeState{
  46. c: c,
  47. }
  48. isResume, err := hs.readClientHello()
  49. if err != nil {
  50. return err
  51. }
  52. // For an overview of TLS handshaking, see https://tools.ietf.org/html/rfc5246#section-7.3
  53. if isResume {
  54. // The client has included a session ticket and so we do an abbreviated handshake.
  55. if err := hs.doResumeHandshake(); err != nil {
  56. return err
  57. }
  58. if err := hs.establishKeys(); err != nil {
  59. return err
  60. }
  61. if err := hs.sendFinished(); err != nil {
  62. return err
  63. }
  64. if err := hs.readFinished(); err != nil {
  65. return err
  66. }
  67. c.didResume = true
  68. } else {
  69. // The client didn't include a session ticket, or it wasn't
  70. // valid so we do a full handshake.
  71. if err := hs.doFullHandshake(); err != nil {
  72. return err
  73. }
  74. if err := hs.establishKeys(); err != nil {
  75. return err
  76. }
  77. if err := hs.readFinished(); err != nil {
  78. return err
  79. }
  80. if err := hs.sendSessionTicket(); err != nil {
  81. return err
  82. }
  83. if err := hs.sendFinished(); err != nil {
  84. return err
  85. }
  86. }
  87. c.handshakeComplete = true
  88. return nil
  89. }
  90. // readClientHello reads a ClientHello message from the client and decides
  91. // whether we will perform session resumption.
  92. func (hs *serverHandshakeState) readClientHello() (isResume bool, err error) {
  93. config := hs.c.config
  94. c := hs.c
  95. msg, err := c.readHandshake()
  96. if err != nil {
  97. return false, err
  98. }
  99. var ok bool
  100. hs.clientHello, ok = msg.(*clientHelloMsg)
  101. if !ok {
  102. return false, c.sendAlert(alertUnexpectedMessage)
  103. }
  104. c.vers, ok = mutualVersion(hs.clientHello.vers)
  105. if !ok {
  106. return false, c.sendAlert(alertProtocolVersion)
  107. }
  108. c.haveVers = true
  109. hs.finishedHash = newFinishedHash(c.vers)
  110. hs.finishedHash.Write(hs.clientHello.marshal())
  111. hs.hello = new(serverHelloMsg)
  112. supportedCurve := false
  113. Curves:
  114. for _, curve := range hs.clientHello.supportedCurves {
  115. switch curve {
  116. case curveP256, curveP384, curveP521:
  117. supportedCurve = true
  118. break Curves
  119. }
  120. }
  121. supportedPointFormat := false
  122. for _, pointFormat := range hs.clientHello.supportedPoints {
  123. if pointFormat == pointFormatUncompressed {
  124. supportedPointFormat = true
  125. break
  126. }
  127. }
  128. hs.ellipticOk = supportedCurve && supportedPointFormat
  129. foundCompression := false
  130. // We only support null compression, so check that the client offered it.
  131. for _, compression := range hs.clientHello.compressionMethods {
  132. if compression == compressionNone {
  133. foundCompression = true
  134. break
  135. }
  136. }
  137. if !foundCompression {
  138. return false, c.sendAlert(alertHandshakeFailure)
  139. }
  140. hs.hello.vers = c.vers
  141. t := uint32(config.time().Unix())
  142. hs.hello.random = make([]byte, 32)
  143. hs.hello.random[0] = byte(t >> 24)
  144. hs.hello.random[1] = byte(t >> 16)
  145. hs.hello.random[2] = byte(t >> 8)
  146. hs.hello.random[3] = byte(t)
  147. _, err = io.ReadFull(config.rand(), hs.hello.random[4:])
  148. if err != nil {
  149. return false, c.sendAlert(alertInternalError)
  150. }
  151. hs.hello.compressionMethod = compressionNone
  152. if len(hs.clientHello.serverName) > 0 {
  153. c.serverName = hs.clientHello.serverName
  154. }
  155. if hs.clientHello.nextProtoNeg {
  156. hs.hello.nextProtoNeg = true
  157. hs.hello.nextProtos = config.NextProtos
  158. }
  159. if hs.checkForResumption() {
  160. return true, nil
  161. }
  162. for _, id := range hs.clientHello.cipherSuites {
  163. if hs.suite = c.tryCipherSuite(id, hs.ellipticOk); hs.suite != nil {
  164. break
  165. }
  166. }
  167. if hs.suite == nil {
  168. return false, c.sendAlert(alertHandshakeFailure)
  169. }
  170. return false, nil
  171. }
  172. // checkForResumption returns true if we should perform resumption on this connection.
  173. func (hs *serverHandshakeState) checkForResumption() bool {
  174. c := hs.c
  175. var ok bool
  176. if hs.sessionState, ok = c.decryptTicket(hs.clientHello.sessionTicket); !ok {
  177. return false
  178. }
  179. if hs.sessionState.vers > hs.clientHello.vers {
  180. return false
  181. }
  182. if vers, ok := mutualVersion(hs.sessionState.vers); !ok || vers != hs.sessionState.vers {
  183. return false
  184. }
  185. cipherSuiteOk := false
  186. // Check that the client is still offering the ciphersuite in the session.
  187. for _, id := range hs.clientHello.cipherSuites {
  188. if id == hs.sessionState.cipherSuite {
  189. cipherSuiteOk = true
  190. break
  191. }
  192. }
  193. if !cipherSuiteOk {
  194. return false
  195. }
  196. // Check that we also support the ciphersuite from the session.
  197. hs.suite = c.tryCipherSuite(hs.sessionState.cipherSuite, hs.ellipticOk)
  198. if hs.suite == nil {
  199. return false
  200. }
  201. sessionHasClientCerts := len(hs.sessionState.certificates) != 0
  202. needClientCerts := c.config.ClientAuth == RequireAnyClientCert || c.config.ClientAuth == RequireAndVerifyClientCert
  203. if needClientCerts && !sessionHasClientCerts {
  204. return false
  205. }
  206. if sessionHasClientCerts && c.config.ClientAuth == NoClientCert {
  207. return false
  208. }
  209. return true
  210. }
  211. func (hs *serverHandshakeState) doResumeHandshake() error {
  212. c := hs.c
  213. hs.hello.cipherSuite = hs.suite.id
  214. // We echo the client's session ID in the ServerHello to let it know
  215. // that we're doing a resumption.
  216. hs.hello.sessionId = hs.clientHello.sessionId
  217. hs.finishedHash.Write(hs.hello.marshal())
  218. c.writeRecord(recordTypeHandshake, hs.hello.marshal())
  219. if len(hs.sessionState.certificates) > 0 {
  220. if _, err := hs.processCertsFromClient(hs.sessionState.certificates); err != nil {
  221. return err
  222. }
  223. }
  224. hs.masterSecret = hs.sessionState.masterSecret
  225. return nil
  226. }
  227. func (hs *serverHandshakeState) doFullHandshake() error {
  228. config := hs.c.config
  229. c := hs.c
  230. if len(config.Certificates) == 0 {
  231. return c.sendAlert(alertInternalError)
  232. }
  233. cert := &config.Certificates[0]
  234. if len(hs.clientHello.serverName) > 0 {
  235. cert = config.getCertificateForName(hs.clientHello.serverName)
  236. }
  237. if hs.clientHello.ocspStapling && len(cert.OCSPStaple) > 0 {
  238. hs.hello.ocspStapling = true
  239. }
  240. hs.hello.ticketSupported = hs.clientHello.ticketSupported && !config.SessionTicketsDisabled
  241. hs.hello.cipherSuite = hs.suite.id
  242. hs.finishedHash.Write(hs.hello.marshal())
  243. c.writeRecord(recordTypeHandshake, hs.hello.marshal())
  244. certMsg := new(certificateMsg)
  245. certMsg.certificates = cert.Certificate
  246. hs.finishedHash.Write(certMsg.marshal())
  247. c.writeRecord(recordTypeHandshake, certMsg.marshal())
  248. if hs.hello.ocspStapling {
  249. certStatus := new(certificateStatusMsg)
  250. certStatus.statusType = statusTypeOCSP
  251. certStatus.response = cert.OCSPStaple
  252. hs.finishedHash.Write(certStatus.marshal())
  253. c.writeRecord(recordTypeHandshake, certStatus.marshal())
  254. }
  255. keyAgreement := hs.suite.ka()
  256. skx, err := keyAgreement.generateServerKeyExchange(config, cert, hs.clientHello, hs.hello)
  257. if err != nil {
  258. c.sendAlert(alertHandshakeFailure)
  259. return err
  260. }
  261. if skx != nil {
  262. hs.finishedHash.Write(skx.marshal())
  263. c.writeRecord(recordTypeHandshake, skx.marshal())
  264. }
  265. if config.ClientAuth >= RequestClientCert {
  266. // Request a client certificate
  267. certReq := new(certificateRequestMsg)
  268. certReq.certificateTypes = []byte{certTypeRSASign}
  269. // An empty list of certificateAuthorities signals to
  270. // the client that it may send any certificate in response
  271. // to our request. When we know the CAs we trust, then
  272. // we can send them down, so that the client can choose
  273. // an appropriate certificate to give to us.
  274. if config.ClientCAs != nil {
  275. certReq.certificateAuthorities = config.ClientCAs.Subjects()
  276. }
  277. hs.finishedHash.Write(certReq.marshal())
  278. c.writeRecord(recordTypeHandshake, certReq.marshal())
  279. }
  280. helloDone := new(serverHelloDoneMsg)
  281. hs.finishedHash.Write(helloDone.marshal())
  282. c.writeRecord(recordTypeHandshake, helloDone.marshal())
  283. var pub *rsa.PublicKey // public key for client auth, if any
  284. msg, err := c.readHandshake()
  285. if err != nil {
  286. return err
  287. }
  288. var ok bool
  289. // If we requested a client certificate, then the client must send a
  290. // certificate message, even if it's empty.
  291. if config.ClientAuth >= RequestClientCert {
  292. if certMsg, ok = msg.(*certificateMsg); !ok {
  293. return c.sendAlert(alertHandshakeFailure)
  294. }
  295. hs.finishedHash.Write(certMsg.marshal())
  296. if len(certMsg.certificates) == 0 {
  297. // The client didn't actually send a certificate
  298. switch config.ClientAuth {
  299. case RequireAnyClientCert, RequireAndVerifyClientCert:
  300. c.sendAlert(alertBadCertificate)
  301. return errors.New("tls: client didn't provide a certificate")
  302. }
  303. }
  304. pub, err = hs.processCertsFromClient(certMsg.certificates)
  305. if err != nil {
  306. return err
  307. }
  308. msg, err = c.readHandshake()
  309. if err != nil {
  310. return err
  311. }
  312. }
  313. // Get client key exchange
  314. ckx, ok := msg.(*clientKeyExchangeMsg)
  315. if !ok {
  316. return c.sendAlert(alertUnexpectedMessage)
  317. }
  318. hs.finishedHash.Write(ckx.marshal())
  319. // If we received a client cert in response to our certificate request message,
  320. // the client will send us a certificateVerifyMsg immediately after the
  321. // clientKeyExchangeMsg. This message is a MD5SHA1 digest of all preceding
  322. // handshake-layer messages that is signed using the private key corresponding
  323. // to the client's certificate. This allows us to verify that the client is in
  324. // possession of the private key of the certificate.
  325. if len(c.peerCertificates) > 0 {
  326. msg, err = c.readHandshake()
  327. if err != nil {
  328. return err
  329. }
  330. certVerify, ok := msg.(*certificateVerifyMsg)
  331. if !ok {
  332. return c.sendAlert(alertUnexpectedMessage)
  333. }
  334. digest := make([]byte, 0, 36)
  335. digest = hs.finishedHash.serverMD5.Sum(digest)
  336. digest = hs.finishedHash.serverSHA1.Sum(digest)
  337. err = rsa.VerifyPKCS1v15(pub, crypto.MD5SHA1, digest, certVerify.signature)
  338. if err != nil {
  339. c.sendAlert(alertBadCertificate)
  340. return errors.New("could not validate signature of connection nonces: " + err.Error())
  341. }
  342. hs.finishedHash.Write(certVerify.marshal())
  343. }
  344. preMasterSecret, err := keyAgreement.processClientKeyExchange(config, cert, ckx, c.vers)
  345. if err != nil {
  346. c.sendAlert(alertHandshakeFailure)
  347. return err
  348. }
  349. hs.masterSecret = masterFromPreMasterSecret(c.vers, preMasterSecret, hs.clientHello.random, hs.hello.random)
  350. return nil
  351. }
  352. func (hs *serverHandshakeState) establishKeys() error {
  353. c := hs.c
  354. clientMAC, serverMAC, clientKey, serverKey, clientIV, serverIV :=
  355. keysFromMasterSecret(c.vers, hs.masterSecret, hs.clientHello.random, hs.hello.random, hs.suite.macLen, hs.suite.keyLen, hs.suite.ivLen)
  356. clientCipher := hs.suite.cipher(clientKey, clientIV, true /* for reading */)
  357. clientHash := hs.suite.mac(c.vers, clientMAC)
  358. c.in.prepareCipherSpec(c.vers, clientCipher, clientHash)
  359. serverCipher := hs.suite.cipher(serverKey, serverIV, false /* not for reading */)
  360. serverHash := hs.suite.mac(c.vers, serverMAC)
  361. c.out.prepareCipherSpec(c.vers, serverCipher, serverHash)
  362. return nil
  363. }
  364. func (hs *serverHandshakeState) readFinished() error {
  365. c := hs.c
  366. c.readRecord(recordTypeChangeCipherSpec)
  367. if err := c.error(); err != nil {
  368. return err
  369. }
  370. if hs.hello.nextProtoNeg {
  371. msg, err := c.readHandshake()
  372. if err != nil {
  373. return err
  374. }
  375. nextProto, ok := msg.(*nextProtoMsg)
  376. if !ok {
  377. return c.sendAlert(alertUnexpectedMessage)
  378. }
  379. hs.finishedHash.Write(nextProto.marshal())
  380. c.clientProtocol = nextProto.proto
  381. }
  382. msg, err := c.readHandshake()
  383. if err != nil {
  384. return err
  385. }
  386. clientFinished, ok := msg.(*finishedMsg)
  387. if !ok {
  388. return c.sendAlert(alertUnexpectedMessage)
  389. }
  390. verify := hs.finishedHash.clientSum(hs.masterSecret)
  391. if len(verify) != len(clientFinished.verifyData) ||
  392. subtle.ConstantTimeCompare(verify, clientFinished.verifyData) != 1 {
  393. return c.sendAlert(alertHandshakeFailure)
  394. }
  395. hs.finishedHash.Write(clientFinished.marshal())
  396. return nil
  397. }
  398. func (hs *serverHandshakeState) sendSessionTicket() error {
  399. if !hs.hello.ticketSupported {
  400. return nil
  401. }
  402. c := hs.c
  403. m := new(newSessionTicketMsg)
  404. var err error
  405. state := sessionState{
  406. vers: c.vers,
  407. cipherSuite: hs.suite.id,
  408. masterSecret: hs.masterSecret,
  409. certificates: hs.certsFromClient,
  410. }
  411. m.ticket, err = c.encryptTicket(&state)
  412. if err != nil {
  413. return err
  414. }
  415. hs.finishedHash.Write(m.marshal())
  416. c.writeRecord(recordTypeHandshake, m.marshal())
  417. return nil
  418. }
  419. func (hs *serverHandshakeState) sendFinished() error {
  420. c := hs.c
  421. c.writeRecord(recordTypeChangeCipherSpec, []byte{1})
  422. finished := new(finishedMsg)
  423. finished.verifyData = hs.finishedHash.serverSum(hs.masterSecret)
  424. hs.finishedHash.Write(finished.marshal())
  425. c.writeRecord(recordTypeHandshake, finished.marshal())
  426. c.cipherSuite = hs.suite.id
  427. return nil
  428. }
  429. // processCertsFromClient takes a chain of client certificates either from a
  430. // Certificates message or from a sessionState and verifies them. It returns
  431. // the public key of the leaf certificate.
  432. func (hs *serverHandshakeState) processCertsFromClient(certificates [][]byte) (*rsa.PublicKey, error) {
  433. c := hs.c
  434. hs.certsFromClient = certificates
  435. certs := make([]*x509.Certificate, len(certificates))
  436. var err error
  437. for i, asn1Data := range certificates {
  438. if certs[i], err = x509.ParseCertificate(asn1Data); err != nil {
  439. c.sendAlert(alertBadCertificate)
  440. return nil, errors.New("tls: failed to parse client certificate: " + err.Error())
  441. }
  442. }
  443. if c.config.ClientAuth >= VerifyClientCertIfGiven && len(certs) > 0 {
  444. opts := x509.VerifyOptions{
  445. Roots: c.config.ClientCAs,
  446. CurrentTime: c.config.time(),
  447. Intermediates: x509.NewCertPool(),
  448. KeyUsages: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth},
  449. }
  450. for _, cert := range certs[1:] {
  451. opts.Intermediates.AddCert(cert)
  452. }
  453. chains, err := certs[0].Verify(opts)
  454. if err != nil {
  455. c.sendAlert(alertBadCertificate)
  456. return nil, errors.New("tls: failed to verify client's certificate: " + err.Error())
  457. }
  458. ok := false
  459. for _, ku := range certs[0].ExtKeyUsage {
  460. if ku == x509.ExtKeyUsageClientAuth {
  461. ok = true
  462. break
  463. }
  464. }
  465. if !ok {
  466. c.sendAlert(alertHandshakeFailure)
  467. return nil, errors.New("tls: client's certificate's extended key usage doesn't permit it to be used for client authentication")
  468. }
  469. c.verifiedChains = chains
  470. }
  471. if len(certs) > 0 {
  472. pub, ok := certs[0].PublicKey.(*rsa.PublicKey)
  473. if !ok {
  474. return nil, c.sendAlert(alertUnsupportedCertificate)
  475. }
  476. c.peerCertificates = certs
  477. return pub, nil
  478. }
  479. return nil, nil
  480. }
  481. // tryCipherSuite returns a cipherSuite with the given id if that cipher suite
  482. // is acceptable to use.
  483. func (c *Conn) tryCipherSuite(id uint16, ellipticOk bool) *cipherSuite {
  484. for _, supported := range c.config.cipherSuites() {
  485. if id == supported {
  486. var candidate *cipherSuite
  487. for _, s := range cipherSuites {
  488. if s.id == id {
  489. candidate = s
  490. break
  491. }
  492. }
  493. if candidate == nil {
  494. continue
  495. }
  496. // Don't select a ciphersuite which we can't
  497. // support for this client.
  498. if candidate.elliptic && !ellipticOk {
  499. continue
  500. }
  501. return candidate
  502. }
  503. }
  504. return nil
  505. }