Alternative TLS implementation in Go
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

596 lignes
16 KiB

  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. }