Alternative TLS implementation in Go
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

283 líneas
8.2 KiB

  1. // Copyright 2012 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. "bytes"
  7. "fmt"
  8. "io"
  9. "net"
  10. "strings"
  11. "testing"
  12. "time"
  13. )
  14. var rsaCertPEM = `-----BEGIN CERTIFICATE-----
  15. MIIB0zCCAX2gAwIBAgIJAI/M7BYjwB+uMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
  16. BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
  17. aWRnaXRzIFB0eSBMdGQwHhcNMTIwOTEyMjE1MjAyWhcNMTUwOTEyMjE1MjAyWjBF
  18. MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
  19. ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANLJ
  20. hPHhITqQbPklG3ibCVxwGMRfp/v4XqhfdQHdcVfHap6NQ5Wok/4xIA+ui35/MmNa
  21. rtNuC+BdZ1tMuVCPFZcCAwEAAaNQME4wHQYDVR0OBBYEFJvKs8RfJaXTH08W+SGv
  22. zQyKn0H8MB8GA1UdIwQYMBaAFJvKs8RfJaXTH08W+SGvzQyKn0H8MAwGA1UdEwQF
  23. MAMBAf8wDQYJKoZIhvcNAQEFBQADQQBJlffJHybjDGxRMqaRmDhX0+6v02TUKZsW
  24. r5QuVbpQhH6u+0UgcW0jp9QwpxoPTLTWGXEWBBBurxFwiCBhkQ+V
  25. -----END CERTIFICATE-----
  26. `
  27. var rsaKeyPEM = `-----BEGIN RSA PRIVATE KEY-----
  28. MIIBOwIBAAJBANLJhPHhITqQbPklG3ibCVxwGMRfp/v4XqhfdQHdcVfHap6NQ5Wo
  29. k/4xIA+ui35/MmNartNuC+BdZ1tMuVCPFZcCAwEAAQJAEJ2N+zsR0Xn8/Q6twa4G
  30. 6OB1M1WO+k+ztnX/1SvNeWu8D6GImtupLTYgjZcHufykj09jiHmjHx8u8ZZB/o1N
  31. MQIhAPW+eyZo7ay3lMz1V01WVjNKK9QSn1MJlb06h/LuYv9FAiEA25WPedKgVyCW
  32. SmUwbPw8fnTcpqDWE3yTO3vKcebqMSsCIBF3UmVue8YU3jybC3NxuXq3wNm34R8T
  33. xVLHwDXh/6NJAiEAl2oHGGLz64BuAfjKrqwz7qMYr9HCLIe/YsoWq/olzScCIQDi
  34. D2lWusoe2/nEqfDVVWGWlyJ7yOmqaVm/iNUN9B2N2g==
  35. -----END RSA PRIVATE KEY-----
  36. `
  37. // keyPEM is the same as rsaKeyPEM, but declares itself as just
  38. // "PRIVATE KEY", not "RSA PRIVATE KEY". http://golang.org/issue/4477
  39. var keyPEM = `-----BEGIN PRIVATE KEY-----
  40. MIIBOwIBAAJBANLJhPHhITqQbPklG3ibCVxwGMRfp/v4XqhfdQHdcVfHap6NQ5Wo
  41. k/4xIA+ui35/MmNartNuC+BdZ1tMuVCPFZcCAwEAAQJAEJ2N+zsR0Xn8/Q6twa4G
  42. 6OB1M1WO+k+ztnX/1SvNeWu8D6GImtupLTYgjZcHufykj09jiHmjHx8u8ZZB/o1N
  43. MQIhAPW+eyZo7ay3lMz1V01WVjNKK9QSn1MJlb06h/LuYv9FAiEA25WPedKgVyCW
  44. SmUwbPw8fnTcpqDWE3yTO3vKcebqMSsCIBF3UmVue8YU3jybC3NxuXq3wNm34R8T
  45. xVLHwDXh/6NJAiEAl2oHGGLz64BuAfjKrqwz7qMYr9HCLIe/YsoWq/olzScCIQDi
  46. D2lWusoe2/nEqfDVVWGWlyJ7yOmqaVm/iNUN9B2N2g==
  47. -----END PRIVATE KEY-----
  48. `
  49. var ecdsaCertPEM = `-----BEGIN CERTIFICATE-----
  50. MIIB/jCCAWICCQDscdUxw16XFDAJBgcqhkjOPQQBMEUxCzAJBgNVBAYTAkFVMRMw
  51. EQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0
  52. eSBMdGQwHhcNMTIxMTE0MTI0MDQ4WhcNMTUxMTE0MTI0MDQ4WjBFMQswCQYDVQQG
  53. EwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lk
  54. Z2l0cyBQdHkgTHRkMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBY9+my9OoeSUR
  55. lDQdV/x8LsOuLilthhiS1Tz4aGDHIPwC1mlvnf7fg5lecYpMCrLLhauAc1UJXcgl
  56. 01xoLuzgtAEAgv2P/jgytzRSpUYvgLBt1UA0leLYBy6mQQbrNEuqT3INapKIcUv8
  57. XxYP0xMEUksLPq6Ca+CRSqTtrd/23uTnapkwCQYHKoZIzj0EAQOBigAwgYYCQXJo
  58. A7Sl2nLVf+4Iu/tAX/IF4MavARKC4PPHK3zfuGfPR3oCCcsAoz3kAzOeijvd0iXb
  59. H5jBImIxPL4WxQNiBTexAkF8D1EtpYuWdlVQ80/h/f4pBcGiXPqX5h2PQSQY7hP1
  60. +jwM1FGS4fREIOvlBYr/SzzQRtwrvrzGYxDEDbsC0ZGRnA==
  61. -----END CERTIFICATE-----
  62. `
  63. var ecdsaKeyPEM = `-----BEGIN EC PARAMETERS-----
  64. BgUrgQQAIw==
  65. -----END EC PARAMETERS-----
  66. -----BEGIN EC PRIVATE KEY-----
  67. MIHcAgEBBEIBrsoKp0oqcv6/JovJJDoDVSGWdirrkgCWxrprGlzB9o0X8fV675X0
  68. NwuBenXFfeZvVcwluO7/Q9wkYoPd/t3jGImgBwYFK4EEACOhgYkDgYYABAFj36bL
  69. 06h5JRGUNB1X/Hwuw64uKW2GGJLVPPhoYMcg/ALWaW+d/t+DmV5xikwKssuFq4Bz
  70. VQldyCXTXGgu7OC0AQCC/Y/+ODK3NFKlRi+AsG3VQDSV4tgHLqZBBus0S6pPcg1q
  71. kohxS/xfFg/TEwRSSws+roJr4JFKpO2t3/be5OdqmQ==
  72. -----END EC PRIVATE KEY-----
  73. `
  74. var keyPairTests = []struct {
  75. algo string
  76. cert string
  77. key string
  78. }{
  79. {"ECDSA", ecdsaCertPEM, ecdsaKeyPEM},
  80. {"RSA", rsaCertPEM, rsaKeyPEM},
  81. {"RSA-untyped", rsaCertPEM, keyPEM}, // golang.org/issue/4477
  82. }
  83. func TestX509KeyPair(t *testing.T) {
  84. var pem []byte
  85. for _, test := range keyPairTests {
  86. pem = []byte(test.cert + test.key)
  87. if _, err := X509KeyPair(pem, pem); err != nil {
  88. t.Errorf("Failed to load %s cert followed by %s key: %s", test.algo, test.algo, err)
  89. }
  90. pem = []byte(test.key + test.cert)
  91. if _, err := X509KeyPair(pem, pem); err != nil {
  92. t.Errorf("Failed to load %s key followed by %s cert: %s", test.algo, test.algo, err)
  93. }
  94. }
  95. }
  96. func TestX509MixedKeyPair(t *testing.T) {
  97. if _, err := X509KeyPair([]byte(rsaCertPEM), []byte(ecdsaKeyPEM)); err == nil {
  98. t.Error("Load of RSA certificate succeeded with ECDSA private key")
  99. }
  100. if _, err := X509KeyPair([]byte(ecdsaCertPEM), []byte(rsaKeyPEM)); err == nil {
  101. t.Error("Load of ECDSA certificate succeeded with RSA private key")
  102. }
  103. }
  104. func newLocalListener(t *testing.T) net.Listener {
  105. ln, err := net.Listen("tcp", "127.0.0.1:0")
  106. if err != nil {
  107. ln, err = net.Listen("tcp6", "[::1]:0")
  108. }
  109. if err != nil {
  110. t.Fatal(err)
  111. }
  112. return ln
  113. }
  114. func TestDialTimeout(t *testing.T) {
  115. if testing.Short() {
  116. t.Skip("skipping in short mode")
  117. }
  118. listener := newLocalListener(t)
  119. addr := listener.Addr().String()
  120. defer listener.Close()
  121. complete := make(chan bool)
  122. defer close(complete)
  123. go func() {
  124. conn, err := listener.Accept()
  125. if err != nil {
  126. t.Error(err)
  127. return
  128. }
  129. <-complete
  130. conn.Close()
  131. }()
  132. dialer := &net.Dialer{
  133. Timeout: 10 * time.Millisecond,
  134. }
  135. var err error
  136. if _, err = DialWithDialer(dialer, "tcp", addr, nil); err == nil {
  137. t.Fatal("DialWithTimeout completed successfully")
  138. }
  139. if !strings.Contains(err.Error(), "timed out") {
  140. t.Errorf("resulting error not a timeout: %s", err)
  141. }
  142. }
  143. // tests that Conn.Read returns (non-zero, io.EOF) instead of
  144. // (non-zero, nil) when a Close (alertCloseNotify) is sitting right
  145. // behind the application data in the buffer.
  146. func TestConnReadNonzeroAndEOF(t *testing.T) {
  147. // This test is racy: it assumes that after a write to a
  148. // localhost TCP connection, the peer TCP connection can
  149. // immediately read it. Because it's racy, we skip this test
  150. // in short mode, and then retry it several times with an
  151. // increasing sleep in between our final write (via srv.Close
  152. // below) and the following read.
  153. if testing.Short() {
  154. t.Skip("skipping in short mode")
  155. }
  156. var err error
  157. for delay := time.Millisecond; delay <= 64*time.Millisecond; delay *= 2 {
  158. if err = testConnReadNonzeroAndEOF(t, delay); err == nil {
  159. return
  160. }
  161. }
  162. t.Error(err)
  163. }
  164. func testConnReadNonzeroAndEOF(t *testing.T, delay time.Duration) error {
  165. ln := newLocalListener(t)
  166. defer ln.Close()
  167. srvCh := make(chan *Conn, 1)
  168. var serr error
  169. go func() {
  170. sconn, err := ln.Accept()
  171. if err != nil {
  172. serr = err
  173. srvCh <- nil
  174. return
  175. }
  176. serverConfig := *testConfig
  177. srv := Server(sconn, &serverConfig)
  178. if err := srv.Handshake(); err != nil {
  179. serr = fmt.Errorf("handshake: %v", err)
  180. srvCh <- nil
  181. return
  182. }
  183. srvCh <- srv
  184. }()
  185. clientConfig := *testConfig
  186. conn, err := Dial("tcp", ln.Addr().String(), &clientConfig)
  187. if err != nil {
  188. t.Fatal(err)
  189. }
  190. defer conn.Close()
  191. srv := <-srvCh
  192. if srv == nil {
  193. return serr
  194. }
  195. buf := make([]byte, 6)
  196. srv.Write([]byte("foobar"))
  197. n, err := conn.Read(buf)
  198. if n != 6 || err != nil || string(buf) != "foobar" {
  199. return fmt.Errorf("Read = %d, %v, data %q; want 6, nil, foobar", n, err, buf)
  200. }
  201. srv.Write([]byte("abcdef"))
  202. srv.Close()
  203. time.Sleep(delay)
  204. n, err = conn.Read(buf)
  205. if n != 6 || string(buf) != "abcdef" {
  206. return fmt.Errorf("Read = %d, buf= %q; want 6, abcdef", n, buf)
  207. }
  208. if err != io.EOF {
  209. return fmt.Errorf("Second Read error = %v; want io.EOF", err)
  210. }
  211. return nil
  212. }
  213. func TestTLSUniqueMatches(t *testing.T) {
  214. ln := newLocalListener(t)
  215. defer ln.Close()
  216. serverTLSUniques := make(chan []byte)
  217. go func() {
  218. for i := 0; i < 2; i++ {
  219. sconn, err := ln.Accept()
  220. if err != nil {
  221. t.Fatal(err)
  222. }
  223. serverConfig := *testConfig
  224. srv := Server(sconn, &serverConfig)
  225. if err := srv.Handshake(); err != nil {
  226. t.Fatal(err)
  227. }
  228. serverTLSUniques <- srv.ConnectionState().TLSUnique
  229. }
  230. }()
  231. clientConfig := *testConfig
  232. clientConfig.ClientSessionCache = NewLRUClientSessionCache(1)
  233. conn, err := Dial("tcp", ln.Addr().String(), &clientConfig)
  234. if err != nil {
  235. t.Fatal(err)
  236. }
  237. if !bytes.Equal(conn.ConnectionState().TLSUnique, <-serverTLSUniques) {
  238. t.Error("client and server channel bindings differ")
  239. }
  240. conn.Close()
  241. conn, err = Dial("tcp", ln.Addr().String(), &clientConfig)
  242. if err != nil {
  243. t.Fatal(err)
  244. }
  245. defer conn.Close()
  246. if !conn.ConnectionState().DidResume {
  247. t.Error("second session did not use resumption")
  248. }
  249. if !bytes.Equal(conn.ConnectionState().TLSUnique, <-serverTLSUniques) {
  250. t.Error("client and server channel bindings differ when session resumption is used")
  251. }
  252. }