Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 
 

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