tls_test.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815
  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. "crypto/x509"
  8. "errors"
  9. "fmt"
  10. //"internal/testenv"
  11. "io"
  12. "io/ioutil"
  13. "math"
  14. "math/rand"
  15. "net"
  16. "os"
  17. "reflect"
  18. "strings"
  19. "testing"
  20. "testing/quick"
  21. "time"
  22. )
  23. var rsaCertPEM = `-----BEGIN CERTIFICATE-----
  24. MIIB0zCCAX2gAwIBAgIJAI/M7BYjwB+uMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
  25. BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
  26. aWRnaXRzIFB0eSBMdGQwHhcNMTIwOTEyMjE1MjAyWhcNMTUwOTEyMjE1MjAyWjBF
  27. MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
  28. ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANLJ
  29. hPHhITqQbPklG3ibCVxwGMRfp/v4XqhfdQHdcVfHap6NQ5Wok/4xIA+ui35/MmNa
  30. rtNuC+BdZ1tMuVCPFZcCAwEAAaNQME4wHQYDVR0OBBYEFJvKs8RfJaXTH08W+SGv
  31. zQyKn0H8MB8GA1UdIwQYMBaAFJvKs8RfJaXTH08W+SGvzQyKn0H8MAwGA1UdEwQF
  32. MAMBAf8wDQYJKoZIhvcNAQEFBQADQQBJlffJHybjDGxRMqaRmDhX0+6v02TUKZsW
  33. r5QuVbpQhH6u+0UgcW0jp9QwpxoPTLTWGXEWBBBurxFwiCBhkQ+V
  34. -----END CERTIFICATE-----
  35. `
  36. var rsaKeyPEM = `-----BEGIN RSA PRIVATE KEY-----
  37. MIIBOwIBAAJBANLJhPHhITqQbPklG3ibCVxwGMRfp/v4XqhfdQHdcVfHap6NQ5Wo
  38. k/4xIA+ui35/MmNartNuC+BdZ1tMuVCPFZcCAwEAAQJAEJ2N+zsR0Xn8/Q6twa4G
  39. 6OB1M1WO+k+ztnX/1SvNeWu8D6GImtupLTYgjZcHufykj09jiHmjHx8u8ZZB/o1N
  40. MQIhAPW+eyZo7ay3lMz1V01WVjNKK9QSn1MJlb06h/LuYv9FAiEA25WPedKgVyCW
  41. SmUwbPw8fnTcpqDWE3yTO3vKcebqMSsCIBF3UmVue8YU3jybC3NxuXq3wNm34R8T
  42. xVLHwDXh/6NJAiEAl2oHGGLz64BuAfjKrqwz7qMYr9HCLIe/YsoWq/olzScCIQDi
  43. D2lWusoe2/nEqfDVVWGWlyJ7yOmqaVm/iNUN9B2N2g==
  44. -----END RSA PRIVATE KEY-----
  45. `
  46. // keyPEM is the same as rsaKeyPEM, but declares itself as just
  47. // "PRIVATE KEY", not "RSA PRIVATE KEY". https://golang.org/issue/4477
  48. var keyPEM = `-----BEGIN PRIVATE KEY-----
  49. MIIBOwIBAAJBANLJhPHhITqQbPklG3ibCVxwGMRfp/v4XqhfdQHdcVfHap6NQ5Wo
  50. k/4xIA+ui35/MmNartNuC+BdZ1tMuVCPFZcCAwEAAQJAEJ2N+zsR0Xn8/Q6twa4G
  51. 6OB1M1WO+k+ztnX/1SvNeWu8D6GImtupLTYgjZcHufykj09jiHmjHx8u8ZZB/o1N
  52. MQIhAPW+eyZo7ay3lMz1V01WVjNKK9QSn1MJlb06h/LuYv9FAiEA25WPedKgVyCW
  53. SmUwbPw8fnTcpqDWE3yTO3vKcebqMSsCIBF3UmVue8YU3jybC3NxuXq3wNm34R8T
  54. xVLHwDXh/6NJAiEAl2oHGGLz64BuAfjKrqwz7qMYr9HCLIe/YsoWq/olzScCIQDi
  55. D2lWusoe2/nEqfDVVWGWlyJ7yOmqaVm/iNUN9B2N2g==
  56. -----END PRIVATE KEY-----
  57. `
  58. var ecdsaCertPEM = `-----BEGIN CERTIFICATE-----
  59. MIIB/jCCAWICCQDscdUxw16XFDAJBgcqhkjOPQQBMEUxCzAJBgNVBAYTAkFVMRMw
  60. EQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0
  61. eSBMdGQwHhcNMTIxMTE0MTI0MDQ4WhcNMTUxMTE0MTI0MDQ4WjBFMQswCQYDVQQG
  62. EwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lk
  63. Z2l0cyBQdHkgTHRkMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBY9+my9OoeSUR
  64. lDQdV/x8LsOuLilthhiS1Tz4aGDHIPwC1mlvnf7fg5lecYpMCrLLhauAc1UJXcgl
  65. 01xoLuzgtAEAgv2P/jgytzRSpUYvgLBt1UA0leLYBy6mQQbrNEuqT3INapKIcUv8
  66. XxYP0xMEUksLPq6Ca+CRSqTtrd/23uTnapkwCQYHKoZIzj0EAQOBigAwgYYCQXJo
  67. A7Sl2nLVf+4Iu/tAX/IF4MavARKC4PPHK3zfuGfPR3oCCcsAoz3kAzOeijvd0iXb
  68. H5jBImIxPL4WxQNiBTexAkF8D1EtpYuWdlVQ80/h/f4pBcGiXPqX5h2PQSQY7hP1
  69. +jwM1FGS4fREIOvlBYr/SzzQRtwrvrzGYxDEDbsC0ZGRnA==
  70. -----END CERTIFICATE-----
  71. `
  72. var ecdsaKeyPEM = `-----BEGIN EC PARAMETERS-----
  73. BgUrgQQAIw==
  74. -----END EC PARAMETERS-----
  75. -----BEGIN EC PRIVATE KEY-----
  76. MIHcAgEBBEIBrsoKp0oqcv6/JovJJDoDVSGWdirrkgCWxrprGlzB9o0X8fV675X0
  77. NwuBenXFfeZvVcwluO7/Q9wkYoPd/t3jGImgBwYFK4EEACOhgYkDgYYABAFj36bL
  78. 06h5JRGUNB1X/Hwuw64uKW2GGJLVPPhoYMcg/ALWaW+d/t+DmV5xikwKssuFq4Bz
  79. VQldyCXTXGgu7OC0AQCC/Y/+ODK3NFKlRi+AsG3VQDSV4tgHLqZBBus0S6pPcg1q
  80. kohxS/xfFg/TEwRSSws+roJr4JFKpO2t3/be5OdqmQ==
  81. -----END EC PRIVATE KEY-----
  82. `
  83. var keyPairTests = []struct {
  84. algo string
  85. cert string
  86. key string
  87. }{
  88. {"ECDSA", ecdsaCertPEM, ecdsaKeyPEM},
  89. {"RSA", rsaCertPEM, rsaKeyPEM},
  90. {"RSA-untyped", rsaCertPEM, keyPEM}, // golang.org/issue/4477
  91. }
  92. func TestX509KeyPair(t *testing.T) {
  93. t.Parallel()
  94. var pem []byte
  95. for _, test := range keyPairTests {
  96. pem = []byte(test.cert + test.key)
  97. if _, err := X509KeyPair(pem, pem); err != nil {
  98. t.Errorf("Failed to load %s cert followed by %s key: %s", test.algo, test.algo, err)
  99. }
  100. pem = []byte(test.key + test.cert)
  101. if _, err := X509KeyPair(pem, pem); err != nil {
  102. t.Errorf("Failed to load %s key followed by %s cert: %s", test.algo, test.algo, err)
  103. }
  104. }
  105. }
  106. func TestX509KeyPairErrors(t *testing.T) {
  107. _, err := X509KeyPair([]byte(rsaKeyPEM), []byte(rsaCertPEM))
  108. if err == nil {
  109. t.Fatalf("X509KeyPair didn't return an error when arguments were switched")
  110. }
  111. if subStr := "been switched"; !strings.Contains(err.Error(), subStr) {
  112. t.Fatalf("Expected %q in the error when switching arguments to X509KeyPair, but the error was %q", subStr, err)
  113. }
  114. _, err = X509KeyPair([]byte(rsaCertPEM), []byte(rsaCertPEM))
  115. if err == nil {
  116. t.Fatalf("X509KeyPair didn't return an error when both arguments were certificates")
  117. }
  118. if subStr := "certificate"; !strings.Contains(err.Error(), subStr) {
  119. t.Fatalf("Expected %q in the error when both arguments to X509KeyPair were certificates, but the error was %q", subStr, err)
  120. }
  121. const nonsensePEM = `
  122. -----BEGIN NONSENSE-----
  123. Zm9vZm9vZm9v
  124. -----END NONSENSE-----
  125. `
  126. _, err = X509KeyPair([]byte(nonsensePEM), []byte(nonsensePEM))
  127. if err == nil {
  128. t.Fatalf("X509KeyPair didn't return an error when both arguments were nonsense")
  129. }
  130. if subStr := "NONSENSE"; !strings.Contains(err.Error(), subStr) {
  131. t.Fatalf("Expected %q in the error when both arguments to X509KeyPair were nonsense, but the error was %q", subStr, err)
  132. }
  133. }
  134. func TestX509MixedKeyPair(t *testing.T) {
  135. if _, err := X509KeyPair([]byte(rsaCertPEM), []byte(ecdsaKeyPEM)); err == nil {
  136. t.Error("Load of RSA certificate succeeded with ECDSA private key")
  137. }
  138. if _, err := X509KeyPair([]byte(ecdsaCertPEM), []byte(rsaKeyPEM)); err == nil {
  139. t.Error("Load of ECDSA certificate succeeded with RSA private key")
  140. }
  141. }
  142. func newLocalListener(t testing.TB) net.Listener {
  143. ln, err := net.Listen("tcp", "127.0.0.1:0")
  144. if err != nil {
  145. ln, err = net.Listen("tcp6", "[::1]:0")
  146. }
  147. if err != nil {
  148. t.Fatal(err)
  149. }
  150. return ln
  151. }
  152. func TestDialTimeout(t *testing.T) {
  153. if testing.Short() {
  154. t.Skip("skipping in short mode")
  155. }
  156. listener := newLocalListener(t)
  157. addr := listener.Addr().String()
  158. defer listener.Close()
  159. complete := make(chan bool)
  160. defer close(complete)
  161. go func() {
  162. conn, err := listener.Accept()
  163. if err != nil {
  164. t.Error(err)
  165. return
  166. }
  167. <-complete
  168. conn.Close()
  169. }()
  170. dialer := &net.Dialer{
  171. Timeout: 10 * time.Millisecond,
  172. }
  173. var err error
  174. if _, err = DialWithDialer(dialer, "tcp", addr, nil); err == nil {
  175. t.Fatal("DialWithTimeout completed successfully")
  176. }
  177. if !isTimeoutError(err) {
  178. t.Errorf("resulting error not a timeout: %v\nType %T: %#v", err, err, err)
  179. }
  180. }
  181. func isTimeoutError(err error) bool {
  182. if ne, ok := err.(net.Error); ok {
  183. return ne.Timeout()
  184. }
  185. return false
  186. }
  187. // tests that Conn.Read returns (non-zero, io.EOF) instead of
  188. // (non-zero, nil) when a Close (alertCloseNotify) is sitting right
  189. // behind the application data in the buffer.
  190. func TestConnReadNonzeroAndEOF(t *testing.T) {
  191. // This test is racy: it assumes that after a write to a
  192. // localhost TCP connection, the peer TCP connection can
  193. // immediately read it. Because it's racy, we skip this test
  194. // in short mode, and then retry it several times with an
  195. // increasing sleep in between our final write (via srv.Close
  196. // below) and the following read.
  197. if testing.Short() {
  198. t.Skip("skipping in short mode")
  199. }
  200. var err error
  201. for delay := time.Millisecond; delay <= 64*time.Millisecond; delay *= 2 {
  202. if err = testConnReadNonzeroAndEOF(t, delay); err == nil {
  203. return
  204. }
  205. }
  206. t.Error(err)
  207. }
  208. func testConnReadNonzeroAndEOF(t *testing.T, delay time.Duration) error {
  209. ln := newLocalListener(t)
  210. defer ln.Close()
  211. srvCh := make(chan *Conn, 1)
  212. var serr error
  213. go func() {
  214. sconn, err := ln.Accept()
  215. if err != nil {
  216. serr = err
  217. srvCh <- nil
  218. return
  219. }
  220. serverConfig := testConfig.Clone()
  221. srv := Server(sconn, serverConfig)
  222. if err := srv.Handshake(); err != nil {
  223. serr = fmt.Errorf("handshake: %v", err)
  224. srvCh <- nil
  225. return
  226. }
  227. srvCh <- srv
  228. }()
  229. clientConfig := testConfig.Clone()
  230. conn, err := Dial("tcp", ln.Addr().String(), clientConfig)
  231. if err != nil {
  232. t.Fatal(err)
  233. }
  234. defer conn.Close()
  235. srv := <-srvCh
  236. if srv == nil {
  237. return serr
  238. }
  239. buf := make([]byte, 6)
  240. srv.Write([]byte("foobar"))
  241. n, err := conn.Read(buf)
  242. if n != 6 || err != nil || string(buf) != "foobar" {
  243. return fmt.Errorf("Read = %d, %v, data %q; want 6, nil, foobar", n, err, buf)
  244. }
  245. srv.Write([]byte("abcdef"))
  246. srv.Close()
  247. time.Sleep(delay)
  248. n, err = conn.Read(buf)
  249. if n != 6 || string(buf) != "abcdef" {
  250. return fmt.Errorf("Read = %d, buf= %q; want 6, abcdef", n, buf)
  251. }
  252. if err != io.EOF {
  253. return fmt.Errorf("Second Read error = %v; want io.EOF", err)
  254. }
  255. return nil
  256. }
  257. func TestTLSUniqueMatches(t *testing.T) {
  258. ln := newLocalListener(t)
  259. defer ln.Close()
  260. serverTLSUniques := make(chan []byte)
  261. go func() {
  262. for i := 0; i < 2; i++ {
  263. sconn, err := ln.Accept()
  264. if err != nil {
  265. t.Error(err)
  266. return
  267. }
  268. serverConfig := testConfig.Clone()
  269. srv := Server(sconn, serverConfig)
  270. if err := srv.Handshake(); err != nil {
  271. t.Error(err)
  272. return
  273. }
  274. serverTLSUniques <- srv.ConnectionState().TLSUnique
  275. }
  276. }()
  277. clientConfig := testConfig.Clone()
  278. clientConfig.ClientSessionCache = NewLRUClientSessionCache(1)
  279. conn, err := Dial("tcp", ln.Addr().String(), clientConfig)
  280. if err != nil {
  281. t.Fatal(err)
  282. }
  283. if !bytes.Equal(conn.ConnectionState().TLSUnique, <-serverTLSUniques) {
  284. t.Error("client and server channel bindings differ")
  285. }
  286. conn.Close()
  287. conn, err = Dial("tcp", ln.Addr().String(), clientConfig)
  288. if err != nil {
  289. t.Fatal(err)
  290. }
  291. defer conn.Close()
  292. if !conn.ConnectionState().DidResume {
  293. t.Error("second session did not use resumption")
  294. }
  295. if !bytes.Equal(conn.ConnectionState().TLSUnique, <-serverTLSUniques) {
  296. t.Error("client and server channel bindings differ when session resumption is used")
  297. }
  298. }
  299. func TestVerifyHostname(t *testing.T) {
  300. // [Psiphon]
  301. // Disable due to internal import
  302. //testenv.MustHaveExternalNetwork(t)
  303. c, err := Dial("tcp", "www.google.com:https", nil)
  304. if err != nil {
  305. t.Fatal(err)
  306. }
  307. if err := c.VerifyHostname("www.google.com"); err != nil {
  308. t.Fatalf("verify www.google.com: %v", err)
  309. }
  310. if err := c.VerifyHostname("www.yahoo.com"); err == nil {
  311. t.Fatalf("verify www.yahoo.com succeeded")
  312. }
  313. c, err = Dial("tcp", "www.google.com:https", &Config{InsecureSkipVerify: true})
  314. if err != nil {
  315. t.Fatal(err)
  316. }
  317. if err := c.VerifyHostname("www.google.com"); err == nil {
  318. t.Fatalf("verify www.google.com succeeded with InsecureSkipVerify=true")
  319. }
  320. if err := c.VerifyHostname("www.yahoo.com"); err == nil {
  321. t.Fatalf("verify www.google.com succeeded with InsecureSkipVerify=true")
  322. }
  323. }
  324. func TestVerifyHostnameResumed(t *testing.T) {
  325. // [Psiphon]
  326. // Disable due to internal import
  327. //testenv.MustHaveExternalNetwork(t)
  328. config := &Config{
  329. ClientSessionCache: NewLRUClientSessionCache(32),
  330. }
  331. for i := 0; i < 2; i++ {
  332. c, err := Dial("tcp", "www.google.com:https", config)
  333. if err != nil {
  334. t.Fatalf("Dial #%d: %v", i, err)
  335. }
  336. cs := c.ConnectionState()
  337. if i > 0 && !cs.DidResume {
  338. t.Fatalf("Subsequent connection unexpectedly didn't resume")
  339. }
  340. if cs.VerifiedChains == nil {
  341. t.Fatalf("Dial #%d: cs.VerifiedChains == nil", i)
  342. }
  343. if err := c.VerifyHostname("www.google.com"); err != nil {
  344. t.Fatalf("verify www.google.com #%d: %v", i, err)
  345. }
  346. c.Close()
  347. }
  348. }
  349. func TestConnCloseBreakingWrite(t *testing.T) {
  350. ln := newLocalListener(t)
  351. defer ln.Close()
  352. srvCh := make(chan *Conn, 1)
  353. var serr error
  354. var sconn net.Conn
  355. go func() {
  356. var err error
  357. sconn, err = ln.Accept()
  358. if err != nil {
  359. serr = err
  360. srvCh <- nil
  361. return
  362. }
  363. serverConfig := testConfig.Clone()
  364. srv := Server(sconn, serverConfig)
  365. if err := srv.Handshake(); err != nil {
  366. serr = fmt.Errorf("handshake: %v", err)
  367. srvCh <- nil
  368. return
  369. }
  370. srvCh <- srv
  371. }()
  372. cconn, err := net.Dial("tcp", ln.Addr().String())
  373. if err != nil {
  374. t.Fatal(err)
  375. }
  376. defer cconn.Close()
  377. conn := &changeImplConn{
  378. Conn: cconn,
  379. }
  380. clientConfig := testConfig.Clone()
  381. tconn := Client(conn, clientConfig)
  382. if err := tconn.Handshake(); err != nil {
  383. t.Fatal(err)
  384. }
  385. srv := <-srvCh
  386. if srv == nil {
  387. t.Fatal(serr)
  388. }
  389. defer sconn.Close()
  390. connClosed := make(chan struct{})
  391. conn.closeFunc = func() error {
  392. close(connClosed)
  393. return nil
  394. }
  395. inWrite := make(chan bool, 1)
  396. var errConnClosed = errors.New("conn closed for test")
  397. conn.writeFunc = func(p []byte) (n int, err error) {
  398. inWrite <- true
  399. <-connClosed
  400. return 0, errConnClosed
  401. }
  402. closeReturned := make(chan bool, 1)
  403. go func() {
  404. <-inWrite
  405. tconn.Close() // test that this doesn't block forever.
  406. closeReturned <- true
  407. }()
  408. _, err = tconn.Write([]byte("foo"))
  409. if err != errConnClosed {
  410. t.Errorf("Write error = %v; want errConnClosed", err)
  411. }
  412. <-closeReturned
  413. if err := tconn.Close(); err != errClosed {
  414. t.Errorf("Close error = %v; want errClosed", err)
  415. }
  416. }
  417. func TestConnCloseWrite(t *testing.T) {
  418. ln := newLocalListener(t)
  419. defer ln.Close()
  420. clientDoneChan := make(chan struct{})
  421. serverCloseWrite := func() error {
  422. sconn, err := ln.Accept()
  423. if err != nil {
  424. return fmt.Errorf("accept: %v", err)
  425. }
  426. defer sconn.Close()
  427. serverConfig := testConfig.Clone()
  428. srv := Server(sconn, serverConfig)
  429. if err := srv.Handshake(); err != nil {
  430. return fmt.Errorf("handshake: %v", err)
  431. }
  432. defer srv.Close()
  433. data, err := ioutil.ReadAll(srv)
  434. if err != nil {
  435. return err
  436. }
  437. if len(data) > 0 {
  438. return fmt.Errorf("Read data = %q; want nothing", data)
  439. }
  440. if err := srv.CloseWrite(); err != nil {
  441. return fmt.Errorf("server CloseWrite: %v", err)
  442. }
  443. // Wait for clientCloseWrite to finish, so we know we
  444. // tested the CloseWrite before we defer the
  445. // sconn.Close above, which would also cause the
  446. // client to unblock like CloseWrite.
  447. <-clientDoneChan
  448. return nil
  449. }
  450. clientCloseWrite := func() error {
  451. defer close(clientDoneChan)
  452. clientConfig := testConfig.Clone()
  453. conn, err := Dial("tcp", ln.Addr().String(), clientConfig)
  454. if err != nil {
  455. return err
  456. }
  457. if err := conn.Handshake(); err != nil {
  458. return err
  459. }
  460. defer conn.Close()
  461. if err := conn.CloseWrite(); err != nil {
  462. return fmt.Errorf("client CloseWrite: %v", err)
  463. }
  464. if _, err := conn.Write([]byte{0}); err != errShutdown {
  465. return fmt.Errorf("CloseWrite error = %v; want errShutdown", err)
  466. }
  467. data, err := ioutil.ReadAll(conn)
  468. if err != nil {
  469. return err
  470. }
  471. if len(data) > 0 {
  472. return fmt.Errorf("Read data = %q; want nothing", data)
  473. }
  474. return nil
  475. }
  476. errChan := make(chan error, 2)
  477. go func() { errChan <- serverCloseWrite() }()
  478. go func() { errChan <- clientCloseWrite() }()
  479. for i := 0; i < 2; i++ {
  480. select {
  481. case err := <-errChan:
  482. if err != nil {
  483. t.Fatal(err)
  484. }
  485. case <-time.After(10 * time.Second):
  486. t.Fatal("deadlock")
  487. }
  488. }
  489. // Also test CloseWrite being called before the handshake is
  490. // finished:
  491. {
  492. ln2 := newLocalListener(t)
  493. defer ln2.Close()
  494. netConn, err := net.Dial("tcp", ln2.Addr().String())
  495. if err != nil {
  496. t.Fatal(err)
  497. }
  498. defer netConn.Close()
  499. conn := Client(netConn, testConfig.Clone())
  500. if err := conn.CloseWrite(); err != errEarlyCloseWrite {
  501. t.Errorf("CloseWrite error = %v; want errEarlyCloseWrite", err)
  502. }
  503. }
  504. }
  505. func TestClone(t *testing.T) {
  506. var c1 Config
  507. v := reflect.ValueOf(&c1).Elem()
  508. rnd := rand.New(rand.NewSource(time.Now().Unix()))
  509. typ := v.Type()
  510. for i := 0; i < typ.NumField(); i++ {
  511. f := v.Field(i)
  512. if !f.CanSet() {
  513. // unexported field; not cloned.
  514. continue
  515. }
  516. // testing/quick can't handle functions or interfaces.
  517. fn := typ.Field(i).Name
  518. switch fn {
  519. case "Rand":
  520. f.Set(reflect.ValueOf(io.Reader(os.Stdin)))
  521. continue
  522. case "Time", "GetCertificate", "GetConfigForClient", "VerifyPeerCertificate", "GetClientCertificate":
  523. // DeepEqual can't compare functions.
  524. continue
  525. case "Certificates":
  526. f.Set(reflect.ValueOf([]Certificate{
  527. {Certificate: [][]byte{{'b'}}},
  528. }))
  529. continue
  530. case "NameToCertificate":
  531. f.Set(reflect.ValueOf(map[string]*Certificate{"a": nil}))
  532. continue
  533. case "RootCAs", "ClientCAs":
  534. f.Set(reflect.ValueOf(x509.NewCertPool()))
  535. continue
  536. case "ClientSessionCache":
  537. f.Set(reflect.ValueOf(NewLRUClientSessionCache(10)))
  538. continue
  539. case "KeyLogWriter":
  540. f.Set(reflect.ValueOf(io.Writer(os.Stdout)))
  541. continue
  542. }
  543. q, ok := quick.Value(f.Type(), rnd)
  544. if !ok {
  545. t.Fatalf("quick.Value failed on field %s", fn)
  546. }
  547. f.Set(q)
  548. }
  549. c2 := c1.Clone()
  550. // DeepEqual also compares unexported fields, thus c2 needs to have run
  551. // serverInit in order to be DeepEqual to c1. Cloning it and discarding
  552. // the result is sufficient.
  553. c2.Clone()
  554. if !reflect.DeepEqual(&c1, c2) {
  555. t.Errorf("clone failed to copy a field")
  556. }
  557. }
  558. // changeImplConn is a net.Conn which can change its Write and Close
  559. // methods.
  560. type changeImplConn struct {
  561. net.Conn
  562. writeFunc func([]byte) (int, error)
  563. closeFunc func() error
  564. }
  565. func (w *changeImplConn) Write(p []byte) (n int, err error) {
  566. if w.writeFunc != nil {
  567. return w.writeFunc(p)
  568. }
  569. return w.Conn.Write(p)
  570. }
  571. func (w *changeImplConn) Close() error {
  572. if w.closeFunc != nil {
  573. return w.closeFunc()
  574. }
  575. return w.Conn.Close()
  576. }
  577. func throughput(b *testing.B, totalBytes int64, dynamicRecordSizingDisabled bool) {
  578. ln := newLocalListener(b)
  579. defer ln.Close()
  580. N := b.N
  581. // Less than 64KB because Windows appears to use a TCP rwin < 64KB.
  582. // See Issue #15899.
  583. const bufsize = 32 << 10
  584. go func() {
  585. buf := make([]byte, bufsize)
  586. for i := 0; i < N; i++ {
  587. sconn, err := ln.Accept()
  588. if err != nil {
  589. // panic rather than synchronize to avoid benchmark overhead
  590. // (cannot call b.Fatal in goroutine)
  591. panic(fmt.Errorf("accept: %v", err))
  592. }
  593. serverConfig := testConfig.Clone()
  594. serverConfig.CipherSuites = nil // the defaults may prefer faster ciphers
  595. serverConfig.DynamicRecordSizingDisabled = dynamicRecordSizingDisabled
  596. srv := Server(sconn, serverConfig)
  597. if err := srv.Handshake(); err != nil {
  598. panic(fmt.Errorf("handshake: %v", err))
  599. }
  600. if _, err := io.CopyBuffer(srv, srv, buf); err != nil {
  601. panic(fmt.Errorf("copy buffer: %v", err))
  602. }
  603. }
  604. }()
  605. b.SetBytes(totalBytes)
  606. clientConfig := testConfig.Clone()
  607. clientConfig.CipherSuites = nil // the defaults may prefer faster ciphers
  608. clientConfig.DynamicRecordSizingDisabled = dynamicRecordSizingDisabled
  609. buf := make([]byte, bufsize)
  610. chunks := int(math.Ceil(float64(totalBytes) / float64(len(buf))))
  611. for i := 0; i < N; i++ {
  612. conn, err := Dial("tcp", ln.Addr().String(), clientConfig)
  613. if err != nil {
  614. b.Fatal(err)
  615. }
  616. for j := 0; j < chunks; j++ {
  617. _, err := conn.Write(buf)
  618. if err != nil {
  619. b.Fatal(err)
  620. }
  621. _, err = io.ReadFull(conn, buf)
  622. if err != nil {
  623. b.Fatal(err)
  624. }
  625. }
  626. conn.Close()
  627. }
  628. }
  629. func BenchmarkThroughput(b *testing.B) {
  630. for _, mode := range []string{"Max", "Dynamic"} {
  631. for size := 1; size <= 64; size <<= 1 {
  632. name := fmt.Sprintf("%sPacket/%dMB", mode, size)
  633. b.Run(name, func(b *testing.B) {
  634. throughput(b, int64(size<<20), mode == "Max")
  635. })
  636. }
  637. }
  638. }
  639. type slowConn struct {
  640. net.Conn
  641. bps int
  642. }
  643. func (c *slowConn) Write(p []byte) (int, error) {
  644. if c.bps == 0 {
  645. panic("too slow")
  646. }
  647. t0 := time.Now()
  648. wrote := 0
  649. for wrote < len(p) {
  650. time.Sleep(100 * time.Microsecond)
  651. allowed := int(time.Since(t0).Seconds()*float64(c.bps)) / 8
  652. if allowed > len(p) {
  653. allowed = len(p)
  654. }
  655. if wrote < allowed {
  656. n, err := c.Conn.Write(p[wrote:allowed])
  657. wrote += n
  658. if err != nil {
  659. return wrote, err
  660. }
  661. }
  662. }
  663. return len(p), nil
  664. }
  665. func latency(b *testing.B, bps int, dynamicRecordSizingDisabled bool) {
  666. ln := newLocalListener(b)
  667. defer ln.Close()
  668. N := b.N
  669. go func() {
  670. for i := 0; i < N; i++ {
  671. sconn, err := ln.Accept()
  672. if err != nil {
  673. // panic rather than synchronize to avoid benchmark overhead
  674. // (cannot call b.Fatal in goroutine)
  675. panic(fmt.Errorf("accept: %v", err))
  676. }
  677. serverConfig := testConfig.Clone()
  678. serverConfig.DynamicRecordSizingDisabled = dynamicRecordSizingDisabled
  679. srv := Server(&slowConn{sconn, bps}, serverConfig)
  680. if err := srv.Handshake(); err != nil {
  681. panic(fmt.Errorf("handshake: %v", err))
  682. }
  683. io.Copy(srv, srv)
  684. }
  685. }()
  686. clientConfig := testConfig.Clone()
  687. clientConfig.DynamicRecordSizingDisabled = dynamicRecordSizingDisabled
  688. buf := make([]byte, 16384)
  689. peek := make([]byte, 1)
  690. for i := 0; i < N; i++ {
  691. conn, err := Dial("tcp", ln.Addr().String(), clientConfig)
  692. if err != nil {
  693. b.Fatal(err)
  694. }
  695. // make sure we're connected and previous connection has stopped
  696. if _, err := conn.Write(buf[:1]); err != nil {
  697. b.Fatal(err)
  698. }
  699. if _, err := io.ReadFull(conn, peek); err != nil {
  700. b.Fatal(err)
  701. }
  702. if _, err := conn.Write(buf); err != nil {
  703. b.Fatal(err)
  704. }
  705. if _, err = io.ReadFull(conn, peek); err != nil {
  706. b.Fatal(err)
  707. }
  708. conn.Close()
  709. }
  710. }
  711. func BenchmarkLatency(b *testing.B) {
  712. for _, mode := range []string{"Max", "Dynamic"} {
  713. for _, kbps := range []int{200, 500, 1000, 2000, 5000} {
  714. name := fmt.Sprintf("%sPacket/%dkbps", mode, kbps)
  715. b.Run(name, func(b *testing.B) {
  716. latency(b, kbps*1000, mode == "Max")
  717. })
  718. }
  719. }
  720. }