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.

426 lignes
15 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/aes"
  7. "crypto/cipher"
  8. "crypto/des"
  9. "crypto/hmac"
  10. "crypto/rc4"
  11. "crypto/sha1"
  12. "crypto/sha256"
  13. "crypto/x509"
  14. "hash"
  15. "golang_org/x/crypto/chacha20poly1305"
  16. )
  17. // a keyAgreement implements the client and server side of a TLS key agreement
  18. // protocol by generating and processing key exchange messages.
  19. type keyAgreement interface {
  20. // On the server side, the first two methods are called in order.
  21. // In the case that the key agreement protocol doesn't use a
  22. // ServerKeyExchange message, generateServerKeyExchange can return nil,
  23. // nil.
  24. generateServerKeyExchange(*Config, *Certificate, *clientHelloMsg, *serverHelloMsg) (*serverKeyExchangeMsg, error)
  25. processClientKeyExchange(*Config, *Certificate, *clientKeyExchangeMsg, uint16) ([]byte, error)
  26. // On the client side, the next two methods are called in order.
  27. // This method may not be called if the server doesn't send a
  28. // ServerKeyExchange message.
  29. processServerKeyExchange(*Config, *clientHelloMsg, *serverHelloMsg, *x509.Certificate, *serverKeyExchangeMsg) error
  30. generateClientKeyExchange(*Config, *clientHelloMsg, *x509.Certificate) ([]byte, *clientKeyExchangeMsg, error)
  31. }
  32. const (
  33. // suiteECDH indicates that the cipher suite involves elliptic curve
  34. // Diffie-Hellman. This means that it should only be selected when the
  35. // client indicates that it supports ECC with a curve and point format
  36. // that we're happy with.
  37. suiteECDHE = 1 << iota
  38. // suiteECDSA indicates that the cipher suite involves an ECDSA
  39. // signature and therefore may only be selected when the server's
  40. // certificate is ECDSA. If this is not set then the cipher suite is
  41. // RSA based.
  42. suiteECDSA
  43. // suiteTLS12 indicates that the cipher suite should only be advertised
  44. // and accepted when using TLS 1.2.
  45. suiteTLS12
  46. // suiteTLS13 indicates that the ones and only cipher suites to be
  47. // advertised and accepted when using TLS 1.3.
  48. suiteTLS13
  49. // suiteSHA384 indicates that the cipher suite uses SHA384 as the
  50. // handshake hash.
  51. suiteSHA384
  52. // suiteDefaultOff indicates that this cipher suite is not included by
  53. // default.
  54. suiteDefaultOff
  55. )
  56. // A cipherSuite is a specific combination of key agreement, cipher and MAC
  57. // function. All cipher suites currently assume RSA key agreement.
  58. type cipherSuite struct {
  59. id uint16
  60. // the lengths, in bytes, of the key material needed for each component.
  61. keyLen int
  62. macLen int
  63. ivLen int
  64. ka func(version uint16) keyAgreement
  65. // flags is a bitmask of the suite* values, above.
  66. flags int
  67. cipher func(key, iv []byte, isRead bool) interface{}
  68. mac func(version uint16, macKey []byte) macFunction
  69. aead func(key, fixedNonce []byte) cipher.AEAD
  70. }
  71. var cipherSuites = []*cipherSuite{
  72. // TLS 1.3 ciphersuites specify only the AEAD and the HKDF hash.
  73. {TLS_CHACHA20_POLY1305_SHA256, 32, 0, 12, nil, suiteTLS13, nil, nil, aeadChaCha20Poly1305},
  74. {TLS_AES_128_GCM_SHA256, 16, 0, 4, nil, suiteTLS13, nil, nil, aeadAESGCM13},
  75. {TLS_AES_256_GCM_SHA384, 32, 0, 4, nil, suiteTLS13 | suiteSHA384, nil, nil, aeadAESGCM13},
  76. // Ciphersuite order is chosen so that ECDHE comes before plain RSA and
  77. // AEADs are the top preference.
  78. {TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, 32, 0, 12, ecdheRSAKA, suiteECDHE | suiteTLS12, nil, nil, aeadChaCha20Poly1305},
  79. {TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, 32, 0, 12, ecdheECDSAKA, suiteECDHE | suiteECDSA | suiteTLS12, nil, nil, aeadChaCha20Poly1305},
  80. {TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 16, 0, 4, ecdheRSAKA, suiteECDHE | suiteTLS12, nil, nil, aeadAESGCM12},
  81. {TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 16, 0, 4, ecdheECDSAKA, suiteECDHE | suiteECDSA | suiteTLS12, nil, nil, aeadAESGCM12},
  82. {TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, 32, 0, 4, ecdheRSAKA, suiteECDHE | suiteTLS12 | suiteSHA384, nil, nil, aeadAESGCM12},
  83. {TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, 32, 0, 4, ecdheECDSAKA, suiteECDHE | suiteECDSA | suiteTLS12 | suiteSHA384, nil, nil, aeadAESGCM12},
  84. {TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, 16, 32, 16, ecdheRSAKA, suiteECDHE | suiteTLS12 | suiteDefaultOff, cipherAES, macSHA256, nil},
  85. {TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, 16, 20, 16, ecdheRSAKA, suiteECDHE, cipherAES, macSHA1, nil},
  86. {TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, 16, 32, 16, ecdheECDSAKA, suiteECDHE | suiteECDSA | suiteTLS12 | suiteDefaultOff, cipherAES, macSHA256, nil},
  87. {TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, 16, 20, 16, ecdheECDSAKA, suiteECDHE | suiteECDSA, cipherAES, macSHA1, nil},
  88. {TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, 32, 20, 16, ecdheRSAKA, suiteECDHE, cipherAES, macSHA1, nil},
  89. {TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, 32, 20, 16, ecdheECDSAKA, suiteECDHE | suiteECDSA, cipherAES, macSHA1, nil},
  90. {TLS_RSA_WITH_AES_128_GCM_SHA256, 16, 0, 4, rsaKA, suiteTLS12, nil, nil, aeadAESGCM12},
  91. {TLS_RSA_WITH_AES_256_GCM_SHA384, 32, 0, 4, rsaKA, suiteTLS12 | suiteSHA384, nil, nil, aeadAESGCM12},
  92. {TLS_RSA_WITH_AES_128_CBC_SHA256, 16, 32, 16, rsaKA, suiteTLS12 | suiteDefaultOff, cipherAES, macSHA256, nil},
  93. {TLS_RSA_WITH_AES_128_CBC_SHA, 16, 20, 16, rsaKA, 0, cipherAES, macSHA1, nil},
  94. {TLS_RSA_WITH_AES_256_CBC_SHA, 32, 20, 16, rsaKA, 0, cipherAES, macSHA1, nil},
  95. {TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, 24, 20, 8, ecdheRSAKA, suiteECDHE, cipher3DES, macSHA1, nil},
  96. {TLS_RSA_WITH_3DES_EDE_CBC_SHA, 24, 20, 8, rsaKA, 0, cipher3DES, macSHA1, nil},
  97. // RC4-based cipher suites are disabled by default.
  98. {TLS_RSA_WITH_RC4_128_SHA, 16, 20, 0, rsaKA, suiteDefaultOff, cipherRC4, macSHA1, nil},
  99. {TLS_ECDHE_RSA_WITH_RC4_128_SHA, 16, 20, 0, ecdheRSAKA, suiteECDHE | suiteDefaultOff, cipherRC4, macSHA1, nil},
  100. {TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, 16, 20, 0, ecdheECDSAKA, suiteECDHE | suiteECDSA | suiteDefaultOff, cipherRC4, macSHA1, nil},
  101. }
  102. func cipherRC4(key, iv []byte, isRead bool) interface{} {
  103. cipher, _ := rc4.NewCipher(key)
  104. return cipher
  105. }
  106. func cipher3DES(key, iv []byte, isRead bool) interface{} {
  107. block, _ := des.NewTripleDESCipher(key)
  108. if isRead {
  109. return cipher.NewCBCDecrypter(block, iv)
  110. }
  111. return cipher.NewCBCEncrypter(block, iv)
  112. }
  113. func cipherAES(key, iv []byte, isRead bool) interface{} {
  114. block, _ := aes.NewCipher(key)
  115. if isRead {
  116. return cipher.NewCBCDecrypter(block, iv)
  117. }
  118. return cipher.NewCBCEncrypter(block, iv)
  119. }
  120. // macSHA1 returns a macFunction for the given protocol version.
  121. func macSHA1(version uint16, key []byte) macFunction {
  122. if version == VersionSSL30 {
  123. mac := ssl30MAC{
  124. h: sha1.New(),
  125. key: make([]byte, len(key)),
  126. }
  127. copy(mac.key, key)
  128. return mac
  129. }
  130. return tls10MAC{hmac.New(newConstantTimeHash(sha1.New), key)}
  131. }
  132. // macSHA256 returns a SHA-256 based MAC. These are only supported in TLS 1.2
  133. // so the given version is ignored.
  134. func macSHA256(version uint16, key []byte) macFunction {
  135. return tls10MAC{hmac.New(sha256.New, key)}
  136. }
  137. type macFunction interface {
  138. Size() int
  139. MAC(digestBuf, seq, header, data, extra []byte) []byte
  140. }
  141. type aead interface {
  142. cipher.AEAD
  143. // explicitIVLen returns the number of bytes used by the explicit nonce
  144. // that is included in the record. This is eight for older AEADs and
  145. // zero for modern ones.
  146. explicitNonceLen() int
  147. }
  148. // fixedNonceAEAD wraps an AEAD and prefixes a fixed portion of the nonce to
  149. // each call.
  150. type fixedNonceAEAD struct {
  151. // nonce contains the fixed part of the nonce in the first four bytes.
  152. nonce [12]byte
  153. aead cipher.AEAD
  154. }
  155. func (f *fixedNonceAEAD) NonceSize() int { return 8 }
  156. func (f *fixedNonceAEAD) Overhead() int { return f.aead.Overhead() }
  157. func (f *fixedNonceAEAD) explicitNonceLen() int { return 8 }
  158. func (f *fixedNonceAEAD) Seal(out, nonce, plaintext, additionalData []byte) []byte {
  159. copy(f.nonce[4:], nonce)
  160. return f.aead.Seal(out, f.nonce[:], plaintext, additionalData)
  161. }
  162. func (f *fixedNonceAEAD) Open(out, nonce, plaintext, additionalData []byte) ([]byte, error) {
  163. copy(f.nonce[4:], nonce)
  164. return f.aead.Open(out, f.nonce[:], plaintext, additionalData)
  165. }
  166. // xoredNonceAEAD wraps an AEAD by XORing in a fixed pattern to the nonce
  167. // before each call.
  168. type xorNonceAEAD struct {
  169. nonceMask [12]byte
  170. aead cipher.AEAD
  171. }
  172. func (f *xorNonceAEAD) NonceSize() int { return 8 }
  173. func (f *xorNonceAEAD) Overhead() int { return f.aead.Overhead() }
  174. func (f *xorNonceAEAD) explicitNonceLen() int { return 0 }
  175. func (f *xorNonceAEAD) Seal(out, nonce, plaintext, additionalData []byte) []byte {
  176. for i, b := range nonce {
  177. f.nonceMask[4+i] ^= b
  178. }
  179. result := f.aead.Seal(out, f.nonceMask[:], plaintext, additionalData)
  180. for i, b := range nonce {
  181. f.nonceMask[4+i] ^= b
  182. }
  183. return result
  184. }
  185. func (f *xorNonceAEAD) Open(out, nonce, plaintext, additionalData []byte) ([]byte, error) {
  186. for i, b := range nonce {
  187. f.nonceMask[4+i] ^= b
  188. }
  189. result, err := f.aead.Open(out, f.nonceMask[:], plaintext, additionalData)
  190. for i, b := range nonce {
  191. f.nonceMask[4+i] ^= b
  192. }
  193. return result, err
  194. }
  195. func aeadAESGCM12(key, fixedNonce []byte) cipher.AEAD {
  196. aes, err := aes.NewCipher(key)
  197. if err != nil {
  198. panic(err)
  199. }
  200. aead, err := cipher.NewGCM(aes)
  201. if err != nil {
  202. panic(err)
  203. }
  204. ret := &fixedNonceAEAD{aead: aead}
  205. copy(ret.nonce[:], fixedNonce)
  206. return ret
  207. }
  208. func aeadAESGCM13(key, fixedNonce []byte) cipher.AEAD {
  209. aes, err := aes.NewCipher(key)
  210. if err != nil {
  211. panic(err)
  212. }
  213. aead, err := cipher.NewGCM(aes)
  214. if err != nil {
  215. panic(err)
  216. }
  217. ret := &xorNonceAEAD{aead: aead}
  218. copy(ret.nonceMask[:], fixedNonce)
  219. return ret
  220. }
  221. func aeadChaCha20Poly1305(key, fixedNonce []byte) cipher.AEAD {
  222. aead, err := chacha20poly1305.New(key)
  223. if err != nil {
  224. panic(err)
  225. }
  226. ret := &xorNonceAEAD{aead: aead}
  227. copy(ret.nonceMask[:], fixedNonce)
  228. return ret
  229. }
  230. // ssl30MAC implements the SSLv3 MAC function, as defined in
  231. // www.mozilla.org/projects/security/pki/nss/ssl/draft302.txt section 5.2.3.1
  232. type ssl30MAC struct {
  233. h hash.Hash
  234. key []byte
  235. }
  236. func (s ssl30MAC) Size() int {
  237. return s.h.Size()
  238. }
  239. var ssl30Pad1 = [48]byte{0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36}
  240. var ssl30Pad2 = [48]byte{0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c}
  241. // MAC does not offer constant timing guarantees for SSL v3.0, since it's deemed
  242. // useless considering the similar, protocol-level POODLE vulnerability.
  243. func (s ssl30MAC) MAC(digestBuf, seq, header, data, extra []byte) []byte {
  244. padLength := 48
  245. if s.h.Size() == 20 {
  246. padLength = 40
  247. }
  248. s.h.Reset()
  249. s.h.Write(s.key)
  250. s.h.Write(ssl30Pad1[:padLength])
  251. s.h.Write(seq)
  252. s.h.Write(header[:1])
  253. s.h.Write(header[3:5])
  254. s.h.Write(data)
  255. digestBuf = s.h.Sum(digestBuf[:0])
  256. s.h.Reset()
  257. s.h.Write(s.key)
  258. s.h.Write(ssl30Pad2[:padLength])
  259. s.h.Write(digestBuf)
  260. return s.h.Sum(digestBuf[:0])
  261. }
  262. type constantTimeHash interface {
  263. hash.Hash
  264. ConstantTimeSum(b []byte) []byte
  265. }
  266. // cthWrapper wraps any hash.Hash that implements ConstantTimeSum, and replaces
  267. // with that all calls to Sum. It's used to obtain a ConstantTimeSum-based HMAC.
  268. type cthWrapper struct {
  269. h constantTimeHash
  270. }
  271. func (c *cthWrapper) Size() int { return c.h.Size() }
  272. func (c *cthWrapper) BlockSize() int { return c.h.BlockSize() }
  273. func (c *cthWrapper) Reset() { c.h.Reset() }
  274. func (c *cthWrapper) Write(p []byte) (int, error) { return c.h.Write(p) }
  275. func (c *cthWrapper) Sum(b []byte) []byte { return c.h.ConstantTimeSum(b) }
  276. func newConstantTimeHash(h func() hash.Hash) func() hash.Hash {
  277. return func() hash.Hash {
  278. return &cthWrapper{h().(constantTimeHash)}
  279. }
  280. }
  281. // tls10MAC implements the TLS 1.0 MAC function. RFC 2246, section 6.2.3.
  282. type tls10MAC struct {
  283. h hash.Hash
  284. }
  285. func (s tls10MAC) Size() int {
  286. return s.h.Size()
  287. }
  288. // MAC is guaranteed to take constant time, as long as
  289. // len(seq)+len(header)+len(data)+len(extra) is constant. extra is not fed into
  290. // the MAC, but is only provided to make the timing profile constant.
  291. func (s tls10MAC) MAC(digestBuf, seq, header, data, extra []byte) []byte {
  292. s.h.Reset()
  293. s.h.Write(seq)
  294. s.h.Write(header)
  295. s.h.Write(data)
  296. res := s.h.Sum(digestBuf[:0])
  297. if extra != nil {
  298. s.h.Write(extra)
  299. }
  300. return res
  301. }
  302. func rsaKA(version uint16) keyAgreement {
  303. return rsaKeyAgreement{}
  304. }
  305. func ecdheECDSAKA(version uint16) keyAgreement {
  306. return &ecdheKeyAgreement{
  307. sigType: signatureECDSA,
  308. version: version,
  309. }
  310. }
  311. func ecdheRSAKA(version uint16) keyAgreement {
  312. return &ecdheKeyAgreement{
  313. sigType: signatureRSA,
  314. version: version,
  315. }
  316. }
  317. // mutualCipherSuite returns a cipherSuite given a list of supported
  318. // ciphersuites and the id requested by the peer.
  319. func mutualCipherSuite(have []uint16, want uint16) *cipherSuite {
  320. for _, id := range have {
  321. if id == want {
  322. for _, suite := range cipherSuites {
  323. if suite.id == want {
  324. return suite
  325. }
  326. }
  327. return nil
  328. }
  329. }
  330. return nil
  331. }
  332. // A list of cipher suite IDs that are, or have been, implemented by this
  333. // package.
  334. //
  335. // Taken from http://www.iana.org/assignments/tls-parameters/tls-parameters.xml
  336. const (
  337. // TLS 1.0 - 1.2 cipher suites. To be used in Config.CipherSuites.
  338. TLS_RSA_WITH_RC4_128_SHA uint16 = 0x0005
  339. TLS_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0x000a
  340. TLS_RSA_WITH_AES_128_CBC_SHA uint16 = 0x002f
  341. TLS_RSA_WITH_AES_256_CBC_SHA uint16 = 0x0035
  342. TLS_RSA_WITH_AES_128_CBC_SHA256 uint16 = 0x003c
  343. TLS_RSA_WITH_AES_128_GCM_SHA256 uint16 = 0x009c
  344. TLS_RSA_WITH_AES_256_GCM_SHA384 uint16 = 0x009d
  345. TLS_ECDHE_ECDSA_WITH_RC4_128_SHA uint16 = 0xc007
  346. TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA uint16 = 0xc009
  347. TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA uint16 = 0xc00a
  348. TLS_ECDHE_RSA_WITH_RC4_128_SHA uint16 = 0xc011
  349. TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA uint16 = 0xc012
  350. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA uint16 = 0xc013
  351. TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA uint16 = 0xc014
  352. TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 uint16 = 0xc023
  353. TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 uint16 = 0xc027
  354. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 uint16 = 0xc02f
  355. TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 uint16 = 0xc02b
  356. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 uint16 = 0xc030
  357. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 uint16 = 0xc02c
  358. TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 uint16 = 0xcca8
  359. TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 uint16 = 0xcca9
  360. // TLS 1.3+ cipher suites. To be used in Config.TLS13CipherSuites.
  361. TLS_AES_128_GCM_SHA256 uint16 = 0x1301
  362. TLS_AES_256_GCM_SHA384 uint16 = 0x1302
  363. TLS_CHACHA20_POLY1305_SHA256 uint16 = 0x1303
  364. // TLS_FALLBACK_SCSV isn't a standard cipher suite but an indicator
  365. // that the client is doing version fallback. See
  366. // https://tools.ietf.org/html/rfc7507.
  367. TLS_FALLBACK_SCSV uint16 = 0x5600
  368. )