25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 
 
 
 

288 satır
7.6 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. "io"
  11. "os"
  12. )
  13. func (c *Conn) serverHandshake() os.Error {
  14. config := c.config
  15. msg, err := c.readHandshake()
  16. if err != nil {
  17. return err
  18. }
  19. clientHello, ok := msg.(*clientHelloMsg)
  20. if !ok {
  21. return c.sendAlert(alertUnexpectedMessage)
  22. }
  23. vers, ok := mutualVersion(clientHello.vers)
  24. if !ok {
  25. return c.sendAlert(alertProtocolVersion)
  26. }
  27. c.vers = vers
  28. c.haveVers = true
  29. finishedHash := newFinishedHash()
  30. finishedHash.Write(clientHello.marshal())
  31. hello := new(serverHelloMsg)
  32. supportedCurve := false
  33. Curves:
  34. for _, curve := range clientHello.supportedCurves {
  35. switch curve {
  36. case curveP256, curveP384, curveP521:
  37. supportedCurve = true
  38. break Curves
  39. }
  40. }
  41. supportedPointFormat := false
  42. for _, pointFormat := range clientHello.supportedPoints {
  43. if pointFormat == pointFormatUncompressed {
  44. supportedPointFormat = true
  45. break
  46. }
  47. }
  48. ellipticOk := supportedCurve && supportedPointFormat
  49. var suite *cipherSuite
  50. var suiteId uint16
  51. FindCipherSuite:
  52. for _, id := range clientHello.cipherSuites {
  53. for _, supported := range config.cipherSuites() {
  54. if id == supported {
  55. suite = cipherSuites[id]
  56. // Don't select a ciphersuite which we can't
  57. // support for this client.
  58. if suite.elliptic && !ellipticOk {
  59. continue
  60. }
  61. suiteId = id
  62. break FindCipherSuite
  63. }
  64. }
  65. }
  66. foundCompression := false
  67. // We only support null compression, so check that the client offered it.
  68. for _, compression := range clientHello.compressionMethods {
  69. if compression == compressionNone {
  70. foundCompression = true
  71. break
  72. }
  73. }
  74. if suite == nil || !foundCompression {
  75. return c.sendAlert(alertHandshakeFailure)
  76. }
  77. hello.vers = vers
  78. hello.cipherSuite = suiteId
  79. t := uint32(config.time())
  80. hello.random = make([]byte, 32)
  81. hello.random[0] = byte(t >> 24)
  82. hello.random[1] = byte(t >> 16)
  83. hello.random[2] = byte(t >> 8)
  84. hello.random[3] = byte(t)
  85. _, err = io.ReadFull(config.rand(), hello.random[4:])
  86. if err != nil {
  87. return c.sendAlert(alertInternalError)
  88. }
  89. hello.compressionMethod = compressionNone
  90. if clientHello.nextProtoNeg {
  91. hello.nextProtoNeg = true
  92. hello.nextProtos = config.NextProtos
  93. }
  94. finishedHash.Write(hello.marshal())
  95. c.writeRecord(recordTypeHandshake, hello.marshal())
  96. if len(config.Certificates) == 0 {
  97. return c.sendAlert(alertInternalError)
  98. }
  99. certMsg := new(certificateMsg)
  100. certMsg.certificates = config.Certificates[0].Certificate
  101. finishedHash.Write(certMsg.marshal())
  102. c.writeRecord(recordTypeHandshake, certMsg.marshal())
  103. keyAgreement := suite.ka()
  104. skx, err := keyAgreement.generateServerKeyExchange(config, clientHello, hello)
  105. if err != nil {
  106. c.sendAlert(alertHandshakeFailure)
  107. return err
  108. }
  109. if skx != nil {
  110. finishedHash.Write(skx.marshal())
  111. c.writeRecord(recordTypeHandshake, skx.marshal())
  112. }
  113. if config.AuthenticateClient {
  114. // Request a client certificate
  115. certReq := new(certificateRequestMsg)
  116. certReq.certificateTypes = []byte{certTypeRSASign}
  117. // An empty list of certificateAuthorities signals to
  118. // the client that it may send any certificate in response
  119. // to our request.
  120. finishedHash.Write(certReq.marshal())
  121. c.writeRecord(recordTypeHandshake, certReq.marshal())
  122. }
  123. helloDone := new(serverHelloDoneMsg)
  124. finishedHash.Write(helloDone.marshal())
  125. c.writeRecord(recordTypeHandshake, helloDone.marshal())
  126. var pub *rsa.PublicKey
  127. if config.AuthenticateClient {
  128. // Get client certificate
  129. msg, err = c.readHandshake()
  130. if err != nil {
  131. return err
  132. }
  133. certMsg, ok = msg.(*certificateMsg)
  134. if !ok {
  135. return c.sendAlert(alertUnexpectedMessage)
  136. }
  137. finishedHash.Write(certMsg.marshal())
  138. certs := make([]*x509.Certificate, len(certMsg.certificates))
  139. for i, asn1Data := range certMsg.certificates {
  140. cert, err := x509.ParseCertificate(asn1Data)
  141. if err != nil {
  142. c.sendAlert(alertBadCertificate)
  143. return os.ErrorString("could not parse client's certificate: " + err.String())
  144. }
  145. certs[i] = cert
  146. }
  147. // TODO(agl): do better validation of certs: max path length, name restrictions etc.
  148. for i := 1; i < len(certs); i++ {
  149. if err := certs[i-1].CheckSignatureFrom(certs[i]); err != nil {
  150. c.sendAlert(alertBadCertificate)
  151. return os.ErrorString("could not validate certificate signature: " + err.String())
  152. }
  153. }
  154. if len(certs) > 0 {
  155. key, ok := certs[0].PublicKey.(*rsa.PublicKey)
  156. if !ok {
  157. return c.sendAlert(alertUnsupportedCertificate)
  158. }
  159. pub = key
  160. c.peerCertificates = certs
  161. }
  162. }
  163. // Get client key exchange
  164. msg, err = c.readHandshake()
  165. if err != nil {
  166. return err
  167. }
  168. ckx, ok := msg.(*clientKeyExchangeMsg)
  169. if !ok {
  170. return c.sendAlert(alertUnexpectedMessage)
  171. }
  172. finishedHash.Write(ckx.marshal())
  173. // If we received a client cert in response to our certificate request message,
  174. // the client will send us a certificateVerifyMsg immediately after the
  175. // clientKeyExchangeMsg. This message is a MD5SHA1 digest of all preceeding
  176. // handshake-layer messages that is signed using the private key corresponding
  177. // to the client's certificate. This allows us to verify that the client is in
  178. // posession of the private key of the certificate.
  179. if len(c.peerCertificates) > 0 {
  180. msg, err = c.readHandshake()
  181. if err != nil {
  182. return err
  183. }
  184. certVerify, ok := msg.(*certificateVerifyMsg)
  185. if !ok {
  186. return c.sendAlert(alertUnexpectedMessage)
  187. }
  188. digest := make([]byte, 36)
  189. copy(digest[0:16], finishedHash.serverMD5.Sum())
  190. copy(digest[16:36], finishedHash.serverSHA1.Sum())
  191. err = rsa.VerifyPKCS1v15(pub, crypto.MD5SHA1, digest, certVerify.signature)
  192. if err != nil {
  193. c.sendAlert(alertBadCertificate)
  194. return os.ErrorString("could not validate signature of connection nonces: " + err.String())
  195. }
  196. finishedHash.Write(certVerify.marshal())
  197. }
  198. preMasterSecret, err := keyAgreement.processClientKeyExchange(config, ckx)
  199. if err != nil {
  200. c.sendAlert(alertHandshakeFailure)
  201. return err
  202. }
  203. masterSecret, clientMAC, serverMAC, clientKey, serverKey, clientIV, serverIV :=
  204. keysFromPreMasterSecret10(preMasterSecret, clientHello.random, hello.random, suite.macLen, suite.keyLen, suite.ivLen)
  205. clientCipher := suite.cipher(clientKey, clientIV, true /* for reading */ )
  206. clientHash := suite.mac(clientMAC)
  207. c.in.prepareCipherSpec(clientCipher, clientHash)
  208. c.readRecord(recordTypeChangeCipherSpec)
  209. if err := c.error(); err != nil {
  210. return err
  211. }
  212. if hello.nextProtoNeg {
  213. msg, err = c.readHandshake()
  214. if err != nil {
  215. return err
  216. }
  217. nextProto, ok := msg.(*nextProtoMsg)
  218. if !ok {
  219. return c.sendAlert(alertUnexpectedMessage)
  220. }
  221. finishedHash.Write(nextProto.marshal())
  222. c.clientProtocol = nextProto.proto
  223. }
  224. msg, err = c.readHandshake()
  225. if err != nil {
  226. return err
  227. }
  228. clientFinished, ok := msg.(*finishedMsg)
  229. if !ok {
  230. return c.sendAlert(alertUnexpectedMessage)
  231. }
  232. verify := finishedHash.clientSum(masterSecret)
  233. if len(verify) != len(clientFinished.verifyData) ||
  234. subtle.ConstantTimeCompare(verify, clientFinished.verifyData) != 1 {
  235. return c.sendAlert(alertHandshakeFailure)
  236. }
  237. finishedHash.Write(clientFinished.marshal())
  238. serverCipher := suite.cipher(serverKey, serverIV, false /* not for reading */ )
  239. serverHash := suite.mac(serverMAC)
  240. c.out.prepareCipherSpec(serverCipher, serverHash)
  241. c.writeRecord(recordTypeChangeCipherSpec, []byte{1})
  242. finished := new(finishedMsg)
  243. finished.verifyData = finishedHash.serverSum(masterSecret)
  244. c.writeRecord(recordTypeHandshake, finished.marshal())
  245. c.handshakeComplete = true
  246. c.cipherSuite = suiteId
  247. return nil
  248. }