Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 
 
 

414 wiersze
12 KiB

  1. // Copyright 2010 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/ecdsa"
  8. "crypto/elliptic"
  9. "crypto/md5"
  10. "crypto/rsa"
  11. "crypto/sha1"
  12. "crypto/sha256"
  13. "crypto/x509"
  14. "encoding/asn1"
  15. "errors"
  16. "io"
  17. "math/big"
  18. )
  19. var errClientKeyExchange = errors.New("tls: invalid ClientKeyExchange message")
  20. var errServerKeyExchange = errors.New("tls: invalid ServerKeyExchange message")
  21. // rsaKeyAgreement implements the standard TLS key agreement where the client
  22. // encrypts the pre-master secret to the server's public key.
  23. type rsaKeyAgreement struct{}
  24. func (ka rsaKeyAgreement) generateServerKeyExchange(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg) (*serverKeyExchangeMsg, error) {
  25. return nil, nil
  26. }
  27. func (ka rsaKeyAgreement) processClientKeyExchange(config *Config, cert *Certificate, ckx *clientKeyExchangeMsg, version uint16) ([]byte, error) {
  28. preMasterSecret := make([]byte, 48)
  29. _, err := io.ReadFull(config.rand(), preMasterSecret[2:])
  30. if err != nil {
  31. return nil, err
  32. }
  33. if len(ckx.ciphertext) < 2 {
  34. return nil, errClientKeyExchange
  35. }
  36. ciphertext := ckx.ciphertext
  37. if version != VersionSSL30 {
  38. ciphertextLen := int(ckx.ciphertext[0])<<8 | int(ckx.ciphertext[1])
  39. if ciphertextLen != len(ckx.ciphertext)-2 {
  40. return nil, errClientKeyExchange
  41. }
  42. ciphertext = ckx.ciphertext[2:]
  43. }
  44. err = rsa.DecryptPKCS1v15SessionKey(config.rand(), cert.PrivateKey.(*rsa.PrivateKey), ciphertext, preMasterSecret)
  45. if err != nil {
  46. return nil, err
  47. }
  48. // We don't check the version number in the premaster secret. For one,
  49. // by checking it, we would leak information about the validity of the
  50. // encrypted pre-master secret. Secondly, it provides only a small
  51. // benefit against a downgrade attack and some implementations send the
  52. // wrong version anyway. See the discussion at the end of section
  53. // 7.4.7.1 of RFC 4346.
  54. return preMasterSecret, nil
  55. }
  56. func (ka rsaKeyAgreement) processServerKeyExchange(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, skx *serverKeyExchangeMsg) error {
  57. return errors.New("tls: unexpected ServerKeyExchange")
  58. }
  59. func (ka rsaKeyAgreement) generateClientKeyExchange(config *Config, clientHello *clientHelloMsg, cert *x509.Certificate) ([]byte, *clientKeyExchangeMsg, error) {
  60. preMasterSecret := make([]byte, 48)
  61. preMasterSecret[0] = byte(clientHello.vers >> 8)
  62. preMasterSecret[1] = byte(clientHello.vers)
  63. _, err := io.ReadFull(config.rand(), preMasterSecret[2:])
  64. if err != nil {
  65. return nil, nil, err
  66. }
  67. encrypted, err := rsa.EncryptPKCS1v15(config.rand(), cert.PublicKey.(*rsa.PublicKey), preMasterSecret)
  68. if err != nil {
  69. return nil, nil, err
  70. }
  71. ckx := new(clientKeyExchangeMsg)
  72. ckx.ciphertext = make([]byte, len(encrypted)+2)
  73. ckx.ciphertext[0] = byte(len(encrypted) >> 8)
  74. ckx.ciphertext[1] = byte(len(encrypted))
  75. copy(ckx.ciphertext[2:], encrypted)
  76. return preMasterSecret, ckx, nil
  77. }
  78. // sha1Hash calculates a SHA1 hash over the given byte slices.
  79. func sha1Hash(slices [][]byte) []byte {
  80. hsha1 := sha1.New()
  81. for _, slice := range slices {
  82. hsha1.Write(slice)
  83. }
  84. return hsha1.Sum(nil)
  85. }
  86. // md5SHA1Hash implements TLS 1.0's hybrid hash function which consists of the
  87. // concatenation of an MD5 and SHA1 hash.
  88. func md5SHA1Hash(slices [][]byte) []byte {
  89. md5sha1 := make([]byte, md5.Size+sha1.Size)
  90. hmd5 := md5.New()
  91. for _, slice := range slices {
  92. hmd5.Write(slice)
  93. }
  94. copy(md5sha1, hmd5.Sum(nil))
  95. copy(md5sha1[md5.Size:], sha1Hash(slices))
  96. return md5sha1
  97. }
  98. // sha256Hash implements TLS 1.2's hash function.
  99. func sha256Hash(slices [][]byte) []byte {
  100. h := sha256.New()
  101. for _, slice := range slices {
  102. h.Write(slice)
  103. }
  104. return h.Sum(nil)
  105. }
  106. // hashForServerKeyExchange hashes the given slices and returns their digest
  107. // and the identifier of the hash function used. The hashFunc argument is only
  108. // used for >= TLS 1.2 and precisely identifies the hash function to use.
  109. func hashForServerKeyExchange(sigType, hashFunc uint8, version uint16, slices ...[]byte) ([]byte, crypto.Hash, error) {
  110. if version >= VersionTLS12 {
  111. switch hashFunc {
  112. case hashSHA256:
  113. return sha256Hash(slices), crypto.SHA256, nil
  114. case hashSHA1:
  115. return sha1Hash(slices), crypto.SHA1, nil
  116. default:
  117. return nil, crypto.Hash(0), errors.New("tls: unknown hash function used by peer")
  118. }
  119. }
  120. if sigType == signatureECDSA {
  121. return sha1Hash(slices), crypto.SHA1, nil
  122. }
  123. return md5SHA1Hash(slices), crypto.MD5SHA1, nil
  124. }
  125. // pickTLS12HashForSignature returns a TLS 1.2 hash identifier for signing a
  126. // ServerKeyExchange given the signature type being used and the client's
  127. // advertised list of supported signature and hash combinations.
  128. func pickTLS12HashForSignature(sigType uint8, clientSignatureAndHashes []signatureAndHash) (uint8, error) {
  129. if len(clientSignatureAndHashes) == 0 {
  130. // If the client didn't specify any signature_algorithms
  131. // extension then we can assume that it supports SHA1. See
  132. // http://tools.ietf.org/html/rfc5246#section-7.4.1.4.1
  133. return hashSHA1, nil
  134. }
  135. for _, sigAndHash := range clientSignatureAndHashes {
  136. if sigAndHash.signature != sigType {
  137. continue
  138. }
  139. switch sigAndHash.hash {
  140. case hashSHA1, hashSHA256:
  141. return sigAndHash.hash, nil
  142. }
  143. }
  144. return 0, errors.New("tls: client doesn't support any common hash functions")
  145. }
  146. func curveForCurveID(id CurveID) (elliptic.Curve, bool) {
  147. switch id {
  148. case CurveP256:
  149. return elliptic.P256(), true
  150. case CurveP384:
  151. return elliptic.P384(), true
  152. case CurveP521:
  153. return elliptic.P521(), true
  154. default:
  155. return nil, false
  156. }
  157. }
  158. // ecdheRSAKeyAgreement implements a TLS key agreement where the server
  159. // generates a ephemeral EC public/private key pair and signs it. The
  160. // pre-master secret is then calculated using ECDH. The signature may
  161. // either be ECDSA or RSA.
  162. type ecdheKeyAgreement struct {
  163. version uint16
  164. sigType uint8
  165. privateKey []byte
  166. curve elliptic.Curve
  167. x, y *big.Int
  168. }
  169. func (ka *ecdheKeyAgreement) generateServerKeyExchange(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg) (*serverKeyExchangeMsg, error) {
  170. var curveid CurveID
  171. preferredCurves := config.curvePreferences()
  172. NextCandidate:
  173. for _, candidate := range preferredCurves {
  174. for _, c := range clientHello.supportedCurves {
  175. if candidate == c {
  176. curveid = c
  177. break NextCandidate
  178. }
  179. }
  180. }
  181. if curveid == 0 {
  182. return nil, errors.New("tls: no supported elliptic curves offered")
  183. }
  184. var ok bool
  185. if ka.curve, ok = curveForCurveID(curveid); !ok {
  186. return nil, errors.New("tls: preferredCurves includes unsupported curve")
  187. }
  188. var x, y *big.Int
  189. var err error
  190. ka.privateKey, x, y, err = elliptic.GenerateKey(ka.curve, config.rand())
  191. if err != nil {
  192. return nil, err
  193. }
  194. ecdhePublic := elliptic.Marshal(ka.curve, x, y)
  195. // http://tools.ietf.org/html/rfc4492#section-5.4
  196. serverECDHParams := make([]byte, 1+2+1+len(ecdhePublic))
  197. serverECDHParams[0] = 3 // named curve
  198. serverECDHParams[1] = byte(curveid >> 8)
  199. serverECDHParams[2] = byte(curveid)
  200. serverECDHParams[3] = byte(len(ecdhePublic))
  201. copy(serverECDHParams[4:], ecdhePublic)
  202. var tls12HashId uint8
  203. if ka.version >= VersionTLS12 {
  204. if tls12HashId, err = pickTLS12HashForSignature(ka.sigType, clientHello.signatureAndHashes); err != nil {
  205. return nil, err
  206. }
  207. }
  208. digest, hashFunc, err := hashForServerKeyExchange(ka.sigType, tls12HashId, ka.version, clientHello.random, hello.random, serverECDHParams)
  209. if err != nil {
  210. return nil, err
  211. }
  212. var sig []byte
  213. switch ka.sigType {
  214. case signatureECDSA:
  215. privKey, ok := cert.PrivateKey.(*ecdsa.PrivateKey)
  216. if !ok {
  217. return nil, errors.New("ECDHE ECDSA requires an ECDSA server private key")
  218. }
  219. r, s, err := ecdsa.Sign(config.rand(), privKey, digest)
  220. if err != nil {
  221. return nil, errors.New("failed to sign ECDHE parameters: " + err.Error())
  222. }
  223. sig, err = asn1.Marshal(ecdsaSignature{r, s})
  224. case signatureRSA:
  225. privKey, ok := cert.PrivateKey.(*rsa.PrivateKey)
  226. if !ok {
  227. return nil, errors.New("ECDHE RSA requires a RSA server private key")
  228. }
  229. sig, err = rsa.SignPKCS1v15(config.rand(), privKey, hashFunc, digest)
  230. if err != nil {
  231. return nil, errors.New("failed to sign ECDHE parameters: " + err.Error())
  232. }
  233. default:
  234. return nil, errors.New("unknown ECDHE signature algorithm")
  235. }
  236. skx := new(serverKeyExchangeMsg)
  237. sigAndHashLen := 0
  238. if ka.version >= VersionTLS12 {
  239. sigAndHashLen = 2
  240. }
  241. skx.key = make([]byte, len(serverECDHParams)+sigAndHashLen+2+len(sig))
  242. copy(skx.key, serverECDHParams)
  243. k := skx.key[len(serverECDHParams):]
  244. if ka.version >= VersionTLS12 {
  245. k[0] = tls12HashId
  246. k[1] = ka.sigType
  247. k = k[2:]
  248. }
  249. k[0] = byte(len(sig) >> 8)
  250. k[1] = byte(len(sig))
  251. copy(k[2:], sig)
  252. return skx, nil
  253. }
  254. func (ka *ecdheKeyAgreement) processClientKeyExchange(config *Config, cert *Certificate, ckx *clientKeyExchangeMsg, version uint16) ([]byte, error) {
  255. if len(ckx.ciphertext) == 0 || int(ckx.ciphertext[0]) != len(ckx.ciphertext)-1 {
  256. return nil, errClientKeyExchange
  257. }
  258. x, y := elliptic.Unmarshal(ka.curve, ckx.ciphertext[1:])
  259. if x == nil {
  260. return nil, errClientKeyExchange
  261. }
  262. if !ka.curve.IsOnCurve(x, y) {
  263. return nil, errClientKeyExchange
  264. }
  265. x, _ = ka.curve.ScalarMult(x, y, ka.privateKey)
  266. preMasterSecret := make([]byte, (ka.curve.Params().BitSize+7)>>3)
  267. xBytes := x.Bytes()
  268. copy(preMasterSecret[len(preMasterSecret)-len(xBytes):], xBytes)
  269. return preMasterSecret, nil
  270. }
  271. func (ka *ecdheKeyAgreement) processServerKeyExchange(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, skx *serverKeyExchangeMsg) error {
  272. if len(skx.key) < 4 {
  273. return errServerKeyExchange
  274. }
  275. if skx.key[0] != 3 { // named curve
  276. return errors.New("tls: server selected unsupported curve")
  277. }
  278. curveid := CurveID(skx.key[1])<<8 | CurveID(skx.key[2])
  279. var ok bool
  280. if ka.curve, ok = curveForCurveID(curveid); !ok {
  281. return errors.New("tls: server selected unsupported curve")
  282. }
  283. publicLen := int(skx.key[3])
  284. if publicLen+4 > len(skx.key) {
  285. return errServerKeyExchange
  286. }
  287. ka.x, ka.y = elliptic.Unmarshal(ka.curve, skx.key[4:4+publicLen])
  288. if ka.x == nil {
  289. return errServerKeyExchange
  290. }
  291. if !ka.curve.IsOnCurve(ka.x, ka.y) {
  292. return errServerKeyExchange
  293. }
  294. serverECDHParams := skx.key[:4+publicLen]
  295. sig := skx.key[4+publicLen:]
  296. if len(sig) < 2 {
  297. return errServerKeyExchange
  298. }
  299. var tls12HashId uint8
  300. if ka.version >= VersionTLS12 {
  301. // handle SignatureAndHashAlgorithm
  302. var sigAndHash []uint8
  303. sigAndHash, sig = sig[:2], sig[2:]
  304. if sigAndHash[1] != ka.sigType {
  305. return errServerKeyExchange
  306. }
  307. tls12HashId = sigAndHash[0]
  308. if len(sig) < 2 {
  309. return errServerKeyExchange
  310. }
  311. }
  312. sigLen := int(sig[0])<<8 | int(sig[1])
  313. if sigLen+2 != len(sig) {
  314. return errServerKeyExchange
  315. }
  316. sig = sig[2:]
  317. digest, hashFunc, err := hashForServerKeyExchange(ka.sigType, tls12HashId, ka.version, clientHello.random, serverHello.random, serverECDHParams)
  318. if err != nil {
  319. return err
  320. }
  321. switch ka.sigType {
  322. case signatureECDSA:
  323. pubKey, ok := cert.PublicKey.(*ecdsa.PublicKey)
  324. if !ok {
  325. return errors.New("ECDHE ECDSA requires a ECDSA server public key")
  326. }
  327. ecdsaSig := new(ecdsaSignature)
  328. if _, err := asn1.Unmarshal(sig, ecdsaSig); err != nil {
  329. return err
  330. }
  331. if ecdsaSig.R.Sign() <= 0 || ecdsaSig.S.Sign() <= 0 {
  332. return errors.New("ECDSA signature contained zero or negative values")
  333. }
  334. if !ecdsa.Verify(pubKey, digest, ecdsaSig.R, ecdsaSig.S) {
  335. return errors.New("ECDSA verification failure")
  336. }
  337. case signatureRSA:
  338. pubKey, ok := cert.PublicKey.(*rsa.PublicKey)
  339. if !ok {
  340. return errors.New("ECDHE RSA requires a RSA server public key")
  341. }
  342. if err := rsa.VerifyPKCS1v15(pubKey, hashFunc, digest, sig); err != nil {
  343. return err
  344. }
  345. default:
  346. return errors.New("unknown ECDHE signature algorithm")
  347. }
  348. return nil
  349. }
  350. func (ka *ecdheKeyAgreement) generateClientKeyExchange(config *Config, clientHello *clientHelloMsg, cert *x509.Certificate) ([]byte, *clientKeyExchangeMsg, error) {
  351. if ka.curve == nil {
  352. return nil, nil, errors.New("missing ServerKeyExchange message")
  353. }
  354. priv, mx, my, err := elliptic.GenerateKey(ka.curve, config.rand())
  355. if err != nil {
  356. return nil, nil, err
  357. }
  358. x, _ := ka.curve.ScalarMult(ka.x, ka.y, priv)
  359. preMasterSecret := make([]byte, (ka.curve.Params().BitSize+7)>>3)
  360. xBytes := x.Bytes()
  361. copy(preMasterSecret[len(preMasterSecret)-len(xBytes):], xBytes)
  362. serialized := elliptic.Marshal(ka.curve, mx, my)
  363. ckx := new(clientKeyExchangeMsg)
  364. ckx.ciphertext = make([]byte, 1+len(serialized))
  365. ckx.ciphertext[0] = byte(len(serialized))
  366. copy(ckx.ciphertext[1:], serialized)
  367. return preMasterSecret, ckx, nil
  368. }