Alternative TLS implementation in Go
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

412 righe
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. if len(ckx.ciphertext) < 2 {
  29. return nil, errClientKeyExchange
  30. }
  31. ciphertext := ckx.ciphertext
  32. if version != VersionSSL30 {
  33. ciphertextLen := int(ckx.ciphertext[0])<<8 | int(ckx.ciphertext[1])
  34. if ciphertextLen != len(ckx.ciphertext)-2 {
  35. return nil, errClientKeyExchange
  36. }
  37. ciphertext = ckx.ciphertext[2:]
  38. }
  39. priv, ok := cert.PrivateKey.(crypto.Decrypter)
  40. if !ok {
  41. return nil, errors.New("tls: certificate private key does not implement crypto.Decrypter")
  42. }
  43. // Perform contant time RSA PKCS#1 v1.5 decryption
  44. preMasterSecret, err := priv.Decrypt(config.rand(), ciphertext, &rsa.PKCS1v15DecryptOptions{SessionKeyLen: 48})
  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. priv, ok := cert.PrivateKey.(crypto.Signer)
  213. if !ok {
  214. return nil, errors.New("tls: certificate private key does not implement crypto.Signer")
  215. }
  216. var sig []byte
  217. switch ka.sigType {
  218. case signatureECDSA:
  219. _, ok := priv.Public().(*ecdsa.PublicKey)
  220. if !ok {
  221. return nil, errors.New("ECDHE ECDSA requires an ECDSA server key")
  222. }
  223. case signatureRSA:
  224. _, ok := priv.Public().(*rsa.PublicKey)
  225. if !ok {
  226. return nil, errors.New("ECDHE RSA requires a RSA server key")
  227. }
  228. default:
  229. return nil, errors.New("unknown ECDHE signature algorithm")
  230. }
  231. sig, err = priv.Sign(config.rand(), digest, hashFunc)
  232. if err != nil {
  233. return nil, errors.New("failed to sign ECDHE parameters: " + err.Error())
  234. }
  235. skx := new(serverKeyExchangeMsg)
  236. sigAndHashLen := 0
  237. if ka.version >= VersionTLS12 {
  238. sigAndHashLen = 2
  239. }
  240. skx.key = make([]byte, len(serverECDHParams)+sigAndHashLen+2+len(sig))
  241. copy(skx.key, serverECDHParams)
  242. k := skx.key[len(serverECDHParams):]
  243. if ka.version >= VersionTLS12 {
  244. k[0] = tls12HashId
  245. k[1] = ka.sigType
  246. k = k[2:]
  247. }
  248. k[0] = byte(len(sig) >> 8)
  249. k[1] = byte(len(sig))
  250. copy(k[2:], sig)
  251. return skx, nil
  252. }
  253. func (ka *ecdheKeyAgreement) processClientKeyExchange(config *Config, cert *Certificate, ckx *clientKeyExchangeMsg, version uint16) ([]byte, error) {
  254. if len(ckx.ciphertext) == 0 || int(ckx.ciphertext[0]) != len(ckx.ciphertext)-1 {
  255. return nil, errClientKeyExchange
  256. }
  257. x, y := elliptic.Unmarshal(ka.curve, ckx.ciphertext[1:])
  258. if x == nil {
  259. return nil, errClientKeyExchange
  260. }
  261. if !ka.curve.IsOnCurve(x, y) {
  262. return nil, errClientKeyExchange
  263. }
  264. x, _ = ka.curve.ScalarMult(x, y, ka.privateKey)
  265. preMasterSecret := make([]byte, (ka.curve.Params().BitSize+7)>>3)
  266. xBytes := x.Bytes()
  267. copy(preMasterSecret[len(preMasterSecret)-len(xBytes):], xBytes)
  268. return preMasterSecret, nil
  269. }
  270. func (ka *ecdheKeyAgreement) processServerKeyExchange(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, skx *serverKeyExchangeMsg) error {
  271. if len(skx.key) < 4 {
  272. return errServerKeyExchange
  273. }
  274. if skx.key[0] != 3 { // named curve
  275. return errors.New("tls: server selected unsupported curve")
  276. }
  277. curveid := CurveID(skx.key[1])<<8 | CurveID(skx.key[2])
  278. var ok bool
  279. if ka.curve, ok = curveForCurveID(curveid); !ok {
  280. return errors.New("tls: server selected unsupported curve")
  281. }
  282. publicLen := int(skx.key[3])
  283. if publicLen+4 > len(skx.key) {
  284. return errServerKeyExchange
  285. }
  286. ka.x, ka.y = elliptic.Unmarshal(ka.curve, skx.key[4:4+publicLen])
  287. if ka.x == nil {
  288. return errServerKeyExchange
  289. }
  290. if !ka.curve.IsOnCurve(ka.x, ka.y) {
  291. return errServerKeyExchange
  292. }
  293. serverECDHParams := skx.key[:4+publicLen]
  294. sig := skx.key[4+publicLen:]
  295. if len(sig) < 2 {
  296. return errServerKeyExchange
  297. }
  298. var tls12HashId uint8
  299. if ka.version >= VersionTLS12 {
  300. // handle SignatureAndHashAlgorithm
  301. var sigAndHash []uint8
  302. sigAndHash, sig = sig[:2], sig[2:]
  303. if sigAndHash[1] != ka.sigType {
  304. return errServerKeyExchange
  305. }
  306. tls12HashId = sigAndHash[0]
  307. if len(sig) < 2 {
  308. return errServerKeyExchange
  309. }
  310. }
  311. sigLen := int(sig[0])<<8 | int(sig[1])
  312. if sigLen+2 != len(sig) {
  313. return errServerKeyExchange
  314. }
  315. sig = sig[2:]
  316. digest, hashFunc, err := hashForServerKeyExchange(ka.sigType, tls12HashId, ka.version, clientHello.random, serverHello.random, serverECDHParams)
  317. if err != nil {
  318. return err
  319. }
  320. switch ka.sigType {
  321. case signatureECDSA:
  322. pubKey, ok := cert.PublicKey.(*ecdsa.PublicKey)
  323. if !ok {
  324. return errors.New("ECDHE ECDSA requires a ECDSA server public key")
  325. }
  326. ecdsaSig := new(ecdsaSignature)
  327. if _, err := asn1.Unmarshal(sig, ecdsaSig); err != nil {
  328. return err
  329. }
  330. if ecdsaSig.R.Sign() <= 0 || ecdsaSig.S.Sign() <= 0 {
  331. return errors.New("ECDSA signature contained zero or negative values")
  332. }
  333. if !ecdsa.Verify(pubKey, digest, ecdsaSig.R, ecdsaSig.S) {
  334. return errors.New("ECDSA verification failure")
  335. }
  336. case signatureRSA:
  337. pubKey, ok := cert.PublicKey.(*rsa.PublicKey)
  338. if !ok {
  339. return errors.New("ECDHE RSA requires a RSA server public key")
  340. }
  341. if err := rsa.VerifyPKCS1v15(pubKey, hashFunc, digest, sig); err != nil {
  342. return err
  343. }
  344. default:
  345. return errors.New("unknown ECDHE signature algorithm")
  346. }
  347. return nil
  348. }
  349. func (ka *ecdheKeyAgreement) generateClientKeyExchange(config *Config, clientHello *clientHelloMsg, cert *x509.Certificate) ([]byte, *clientKeyExchangeMsg, error) {
  350. if ka.curve == nil {
  351. return nil, nil, errors.New("missing ServerKeyExchange message")
  352. }
  353. priv, mx, my, err := elliptic.GenerateKey(ka.curve, config.rand())
  354. if err != nil {
  355. return nil, nil, err
  356. }
  357. x, _ := ka.curve.ScalarMult(ka.x, ka.y, priv)
  358. preMasterSecret := make([]byte, (ka.curve.Params().BitSize+7)>>3)
  359. xBytes := x.Bytes()
  360. copy(preMasterSecret[len(preMasterSecret)-len(xBytes):], xBytes)
  361. serialized := elliptic.Marshal(ka.curve, mx, my)
  362. ckx := new(clientKeyExchangeMsg)
  363. ckx.ciphertext = make([]byte, 1+len(serialized))
  364. ckx.ciphertext[0] = byte(len(serialized))
  365. copy(ckx.ciphertext[1:], serialized)
  366. return preMasterSecret, ckx, nil
  367. }