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