Source file
src/crypto/tls/handshake_client_test.go
1
2
3
4
5 package tls
6
7 import (
8 "bytes"
9 "context"
10 "crypto/ecdsa"
11 "crypto/elliptic"
12 "crypto/rand"
13 "crypto/rsa"
14 "crypto/x509"
15 "crypto/x509/pkix"
16 "encoding/base64"
17 "encoding/hex"
18 "encoding/pem"
19 "errors"
20 "fmt"
21 "internal/byteorder"
22 "io"
23 "math/big"
24 "net"
25 "os"
26 "os/exec"
27 "path/filepath"
28 "reflect"
29 "runtime"
30 "strconv"
31 "strings"
32 "testing"
33 "time"
34 )
35
36
37
38
39
40
41 type opensslInputEvent int
42
43 const (
44
45
46 opensslRenegotiate opensslInputEvent = iota
47
48
49
50 opensslSendSentinel
51
52
53
54 opensslKeyUpdate
55 )
56
57 const opensslSentinel = "SENTINEL\n"
58
59 type opensslInput chan opensslInputEvent
60
61 func (i opensslInput) Read(buf []byte) (n int, err error) {
62 for event := range i {
63 switch event {
64 case opensslRenegotiate:
65 return copy(buf, []byte("R\n")), nil
66 case opensslKeyUpdate:
67 return copy(buf, []byte("K\n")), nil
68 case opensslSendSentinel:
69 return copy(buf, []byte(opensslSentinel)), nil
70 default:
71 panic("unknown event")
72 }
73 }
74
75 return 0, io.EOF
76 }
77
78
79
80
81 type opensslOutputSink struct {
82 handshakeComplete chan struct{}
83 readKeyUpdate chan struct{}
84 all []byte
85 line []byte
86 }
87
88 func newOpensslOutputSink() *opensslOutputSink {
89 return &opensslOutputSink{make(chan struct{}), make(chan struct{}), nil, nil}
90 }
91
92
93
94 const opensslEndOfHandshake = "SSL_accept:SSLv3/TLS write finished"
95
96
97
98 const opensslReadKeyUpdate = "SSL_accept:TLSv1.3 read client key update"
99
100 func (o *opensslOutputSink) Write(data []byte) (n int, err error) {
101 o.line = append(o.line, data...)
102 o.all = append(o.all, data...)
103
104 for {
105 line, next, ok := bytes.Cut(o.line, []byte("\n"))
106 if !ok {
107 break
108 }
109
110 if bytes.Equal([]byte(opensslEndOfHandshake), line) {
111 o.handshakeComplete <- struct{}{}
112 }
113 if bytes.Equal([]byte(opensslReadKeyUpdate), line) {
114 o.readKeyUpdate <- struct{}{}
115 }
116 o.line = next
117 }
118
119 return len(data), nil
120 }
121
122 func (o *opensslOutputSink) String() string {
123 return string(o.all)
124 }
125
126
127
128 type clientTest struct {
129
130
131 name string
132
133
134 args []string
135
136 config *Config
137
138
139 cert []byte
140
141
142 key any
143
144
145
146 extensions [][]byte
147
148
149
150 validate func(ConnectionState) error
151
152
153 numRenegotiations int
154
155
156 renegotiationExpectedToFail int
157
158
159
160 checkRenegotiationError func(renegotiationNum int, err error) error
161
162 sendKeyUpdate bool
163 }
164
165 var serverCommand = []string{"openssl", "s_server", "-no_ticket", "-num_tickets", "0"}
166
167
168
169
170
171 func (test *clientTest) connFromCommand() (conn *recordingConn, child *exec.Cmd, stdin opensslInput, stdout *opensslOutputSink, err error) {
172 cert := testRSACertificate
173 if len(test.cert) > 0 {
174 cert = test.cert
175 }
176 certPath := tempFile(string(cert))
177 defer os.Remove(certPath)
178
179 var key any = testRSAPrivateKey
180 if test.key != nil {
181 key = test.key
182 }
183 derBytes, err := x509.MarshalPKCS8PrivateKey(key)
184 if err != nil {
185 panic(err)
186 }
187
188 var pemOut bytes.Buffer
189 pem.Encode(&pemOut, &pem.Block{Type: "PRIVATE KEY", Bytes: derBytes})
190
191 keyPath := tempFile(pemOut.String())
192 defer os.Remove(keyPath)
193
194 var command []string
195 command = append(command, serverCommand...)
196 command = append(command, test.args...)
197 command = append(command, "-cert", certPath, "-certform", "DER", "-key", keyPath)
198
199
200
201
202
203 const serverPort = 24323
204 command = append(command, "-accept", strconv.Itoa(serverPort))
205
206 if len(test.extensions) > 0 {
207 var serverInfo bytes.Buffer
208 for _, ext := range test.extensions {
209 pem.Encode(&serverInfo, &pem.Block{
210 Type: fmt.Sprintf("SERVERINFO FOR EXTENSION %d", byteorder.BeUint16(ext)),
211 Bytes: ext,
212 })
213 }
214 serverInfoPath := tempFile(serverInfo.String())
215 defer os.Remove(serverInfoPath)
216 command = append(command, "-serverinfo", serverInfoPath)
217 }
218
219 if test.numRenegotiations > 0 || test.sendKeyUpdate {
220 found := false
221 for _, flag := range command[1:] {
222 if flag == "-state" {
223 found = true
224 break
225 }
226 }
227
228 if !found {
229 panic("-state flag missing to OpenSSL, you need this if testing renegotiation or KeyUpdate")
230 }
231 }
232
233 cmd := exec.Command(command[0], command[1:]...)
234 stdin = opensslInput(make(chan opensslInputEvent))
235 cmd.Stdin = stdin
236 out := newOpensslOutputSink()
237 cmd.Stdout = out
238 cmd.Stderr = out
239 if err := cmd.Start(); err != nil {
240 return nil, nil, nil, nil, err
241 }
242
243
244
245
246
247 var tcpConn net.Conn
248 for i := uint(0); i < 5; i++ {
249 tcpConn, err = net.DialTCP("tcp", nil, &net.TCPAddr{
250 IP: net.IPv4(127, 0, 0, 1),
251 Port: serverPort,
252 })
253 if err == nil {
254 break
255 }
256 time.Sleep((1 << i) * 5 * time.Millisecond)
257 }
258 if err != nil {
259 close(stdin)
260 cmd.Process.Kill()
261 err = fmt.Errorf("error connecting to the OpenSSL server: %v (%v)\n\n%s", err, cmd.Wait(), out)
262 return nil, nil, nil, nil, err
263 }
264
265 record := &recordingConn{
266 Conn: tcpConn,
267 }
268
269 return record, cmd, stdin, out, nil
270 }
271
272 func (test *clientTest) dataPath() string {
273 return filepath.Join("testdata", "Client-"+test.name)
274 }
275
276 func (test *clientTest) loadData() (flows [][]byte, err error) {
277 in, err := os.Open(test.dataPath())
278 if err != nil {
279 return nil, err
280 }
281 defer in.Close()
282 return parseTestData(in)
283 }
284
285 func (test *clientTest) run(t *testing.T, write bool) {
286 var clientConn net.Conn
287 var recordingConn *recordingConn
288 var childProcess *exec.Cmd
289 var stdin opensslInput
290 var stdout *opensslOutputSink
291
292 if write {
293 var err error
294 recordingConn, childProcess, stdin, stdout, err = test.connFromCommand()
295 if err != nil {
296 t.Fatalf("Failed to start subcommand: %s", err)
297 }
298 clientConn = recordingConn
299 defer func() {
300 if t.Failed() {
301 t.Logf("OpenSSL output:\n\n%s", stdout.all)
302 }
303 }()
304 } else {
305 flows, err := test.loadData()
306 if err != nil {
307 t.Fatalf("failed to load data from %s: %v", test.dataPath(), err)
308 }
309 clientConn = &replayingConn{t: t, flows: flows, reading: false}
310 }
311
312 config := test.config
313 if config == nil {
314 config = testConfig
315 }
316 client := Client(clientConn, config)
317 defer client.Close()
318
319 if _, err := client.Write([]byte("hello\n")); err != nil {
320 t.Errorf("Client.Write failed: %s", err)
321 return
322 }
323
324 for i := 1; i <= test.numRenegotiations; i++ {
325
326
327 if i == 1 && write {
328 <-stdout.handshakeComplete
329 }
330
331
332
333
334
335
336
337
338
339 if write {
340 stdin <- opensslRenegotiate
341 }
342
343 signalChan := make(chan struct{})
344
345 go func() {
346 defer close(signalChan)
347
348 buf := make([]byte, 256)
349 n, err := client.Read(buf)
350
351 if test.checkRenegotiationError != nil {
352 newErr := test.checkRenegotiationError(i, err)
353 if err != nil && newErr == nil {
354 return
355 }
356 err = newErr
357 }
358
359 if err != nil {
360 t.Errorf("Client.Read failed after renegotiation #%d: %s", i, err)
361 return
362 }
363
364 buf = buf[:n]
365 if !bytes.Equal([]byte(opensslSentinel), buf) {
366 t.Errorf("Client.Read returned %q, but wanted %q", string(buf), opensslSentinel)
367 }
368
369 if expected := i + 1; client.handshakes != expected {
370 t.Errorf("client should have recorded %d handshakes, but believes that %d have occurred", expected, client.handshakes)
371 }
372 }()
373
374 if write && test.renegotiationExpectedToFail != i {
375 <-stdout.handshakeComplete
376 stdin <- opensslSendSentinel
377 }
378 <-signalChan
379 }
380
381 if test.sendKeyUpdate {
382 if write {
383 <-stdout.handshakeComplete
384 stdin <- opensslKeyUpdate
385 }
386
387 doneRead := make(chan struct{})
388
389 go func() {
390 defer close(doneRead)
391
392 buf := make([]byte, 256)
393 n, err := client.Read(buf)
394
395 if err != nil {
396 t.Errorf("Client.Read failed after KeyUpdate: %s", err)
397 return
398 }
399
400 buf = buf[:n]
401 if !bytes.Equal([]byte(opensslSentinel), buf) {
402 t.Errorf("Client.Read returned %q, but wanted %q", string(buf), opensslSentinel)
403 }
404 }()
405
406 if write {
407
408
409
410 <-stdout.readKeyUpdate
411 stdin <- opensslSendSentinel
412 }
413 <-doneRead
414
415 if _, err := client.Write([]byte("hello again\n")); err != nil {
416 t.Errorf("Client.Write failed: %s", err)
417 return
418 }
419 }
420
421 if test.validate != nil {
422 if err := test.validate(client.ConnectionState()); err != nil {
423 t.Errorf("validate callback returned error: %s", err)
424 }
425 }
426
427
428
429 if write && test.renegotiationExpectedToFail == 0 {
430 if err := peekError(client); err != nil {
431 t.Errorf("final Read returned an error: %s", err)
432 }
433 }
434
435 if write {
436 client.Close()
437 path := test.dataPath()
438 out, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
439 if err != nil {
440 t.Fatalf("Failed to create output file: %s", err)
441 }
442 defer out.Close()
443 recordingConn.Close()
444 close(stdin)
445 childProcess.Process.Kill()
446 childProcess.Wait()
447 if len(recordingConn.flows) < 3 {
448 t.Fatalf("Client connection didn't work")
449 }
450 recordingConn.WriteTo(out)
451 t.Logf("Wrote %s\n", path)
452 }
453 }
454
455
456
457 func peekError(conn net.Conn) error {
458 conn.SetReadDeadline(time.Now().Add(100 * time.Millisecond))
459 if n, err := conn.Read(make([]byte, 1)); n != 0 {
460 return errors.New("unexpectedly read data")
461 } else if err != nil {
462 if netErr, ok := err.(net.Error); !ok || !netErr.Timeout() {
463 return err
464 }
465 }
466 return nil
467 }
468
469 func runClientTestForVersion(t *testing.T, template *clientTest, version, option string) {
470
471 test := *template
472 if template.config != nil {
473 test.config = template.config.Clone()
474 }
475 test.name = version + "-" + test.name
476 test.args = append([]string{option}, test.args...)
477
478 runTestAndUpdateIfNeeded(t, version, test.run, false)
479 }
480
481 func runClientTestTLS10(t *testing.T, template *clientTest) {
482 runClientTestForVersion(t, template, "TLSv10", "-tls1")
483 }
484
485 func runClientTestTLS11(t *testing.T, template *clientTest) {
486 runClientTestForVersion(t, template, "TLSv11", "-tls1_1")
487 }
488
489 func runClientTestTLS12(t *testing.T, template *clientTest) {
490 runClientTestForVersion(t, template, "TLSv12", "-tls1_2")
491 }
492
493 func runClientTestTLS13(t *testing.T, template *clientTest) {
494 runClientTestForVersion(t, template, "TLSv13", "-tls1_3")
495 }
496
497 func TestHandshakeClientRSARC4(t *testing.T) {
498 test := &clientTest{
499 name: "RSA-RC4",
500 args: []string{"-cipher", "RC4-SHA"},
501 }
502 runClientTestTLS10(t, test)
503 runClientTestTLS11(t, test)
504 runClientTestTLS12(t, test)
505 }
506
507 func TestHandshakeClientRSAAES128GCM(t *testing.T) {
508 test := &clientTest{
509 name: "AES128-GCM-SHA256",
510 args: []string{"-cipher", "AES128-GCM-SHA256"},
511 }
512 runClientTestTLS12(t, test)
513 }
514
515 func TestHandshakeClientRSAAES256GCM(t *testing.T) {
516 test := &clientTest{
517 name: "AES256-GCM-SHA384",
518 args: []string{"-cipher", "AES256-GCM-SHA384"},
519 }
520 runClientTestTLS12(t, test)
521 }
522
523 func TestHandshakeClientECDHERSAAES(t *testing.T) {
524 test := &clientTest{
525 name: "ECDHE-RSA-AES",
526 args: []string{"-cipher", "ECDHE-RSA-AES128-SHA"},
527 }
528 runClientTestTLS10(t, test)
529 runClientTestTLS11(t, test)
530 runClientTestTLS12(t, test)
531 }
532
533 func TestHandshakeClientECDHEECDSAAES(t *testing.T) {
534 test := &clientTest{
535 name: "ECDHE-ECDSA-AES",
536 args: []string{"-cipher", "ECDHE-ECDSA-AES128-SHA"},
537 cert: testECDSACertificate,
538 key: testECDSAPrivateKey,
539 }
540 runClientTestTLS10(t, test)
541 runClientTestTLS11(t, test)
542 runClientTestTLS12(t, test)
543 }
544
545 func TestHandshakeClientECDHEECDSAAESGCM(t *testing.T) {
546 test := &clientTest{
547 name: "ECDHE-ECDSA-AES-GCM",
548 args: []string{"-cipher", "ECDHE-ECDSA-AES128-GCM-SHA256"},
549 cert: testECDSACertificate,
550 key: testECDSAPrivateKey,
551 }
552 runClientTestTLS12(t, test)
553 }
554
555 func TestHandshakeClientAES256GCMSHA384(t *testing.T) {
556 test := &clientTest{
557 name: "ECDHE-ECDSA-AES256-GCM-SHA384",
558 args: []string{"-cipher", "ECDHE-ECDSA-AES256-GCM-SHA384"},
559 cert: testECDSACertificate,
560 key: testECDSAPrivateKey,
561 }
562 runClientTestTLS12(t, test)
563 }
564
565 func TestHandshakeClientAES128CBCSHA256(t *testing.T) {
566 test := &clientTest{
567 name: "AES128-SHA256",
568 args: []string{"-cipher", "AES128-SHA256"},
569 }
570 runClientTestTLS12(t, test)
571 }
572
573 func TestHandshakeClientECDHERSAAES128CBCSHA256(t *testing.T) {
574 test := &clientTest{
575 name: "ECDHE-RSA-AES128-SHA256",
576 args: []string{"-cipher", "ECDHE-RSA-AES128-SHA256"},
577 }
578 runClientTestTLS12(t, test)
579 }
580
581 func TestHandshakeClientECDHEECDSAAES128CBCSHA256(t *testing.T) {
582 test := &clientTest{
583 name: "ECDHE-ECDSA-AES128-SHA256",
584 args: []string{"-cipher", "ECDHE-ECDSA-AES128-SHA256"},
585 cert: testECDSACertificate,
586 key: testECDSAPrivateKey,
587 }
588 runClientTestTLS12(t, test)
589 }
590
591 func TestHandshakeClientX25519(t *testing.T) {
592 config := testConfig.Clone()
593 config.CurvePreferences = []CurveID{X25519}
594
595 test := &clientTest{
596 name: "X25519-ECDHE",
597 args: []string{"-cipher", "ECDHE-RSA-AES128-GCM-SHA256", "-curves", "X25519"},
598 config: config,
599 }
600
601 runClientTestTLS12(t, test)
602 runClientTestTLS13(t, test)
603 }
604
605 func TestHandshakeClientP256(t *testing.T) {
606 config := testConfig.Clone()
607 config.CurvePreferences = []CurveID{CurveP256}
608
609 test := &clientTest{
610 name: "P256-ECDHE",
611 args: []string{"-cipher", "ECDHE-RSA-AES128-GCM-SHA256", "-curves", "P-256"},
612 config: config,
613 }
614
615 runClientTestTLS12(t, test)
616 runClientTestTLS13(t, test)
617 }
618
619 func TestHandshakeClientHelloRetryRequest(t *testing.T) {
620 config := testConfig.Clone()
621 config.CurvePreferences = []CurveID{X25519, CurveP256}
622
623 test := &clientTest{
624 name: "HelloRetryRequest",
625 args: []string{"-cipher", "ECDHE-RSA-AES128-GCM-SHA256", "-curves", "P-256"},
626 config: config,
627 validate: func(cs ConnectionState) error {
628 if !cs.testingOnlyDidHRR {
629 return errors.New("expected HelloRetryRequest")
630 }
631 return nil
632 },
633 }
634
635 runClientTestTLS13(t, test)
636 }
637
638 func TestHandshakeClientECDHERSAChaCha20(t *testing.T) {
639 config := testConfig.Clone()
640 config.CipherSuites = []uint16{TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305}
641
642 test := &clientTest{
643 name: "ECDHE-RSA-CHACHA20-POLY1305",
644 args: []string{"-cipher", "ECDHE-RSA-CHACHA20-POLY1305"},
645 config: config,
646 }
647
648 runClientTestTLS12(t, test)
649 }
650
651 func TestHandshakeClientECDHEECDSAChaCha20(t *testing.T) {
652 config := testConfig.Clone()
653 config.CipherSuites = []uint16{TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305}
654
655 test := &clientTest{
656 name: "ECDHE-ECDSA-CHACHA20-POLY1305",
657 args: []string{"-cipher", "ECDHE-ECDSA-CHACHA20-POLY1305"},
658 config: config,
659 cert: testECDSACertificate,
660 key: testECDSAPrivateKey,
661 }
662
663 runClientTestTLS12(t, test)
664 }
665
666 func TestHandshakeClientAES128SHA256(t *testing.T) {
667 test := &clientTest{
668 name: "AES128-SHA256",
669 args: []string{"-ciphersuites", "TLS_AES_128_GCM_SHA256"},
670 }
671 runClientTestTLS13(t, test)
672 }
673 func TestHandshakeClientAES256SHA384(t *testing.T) {
674 test := &clientTest{
675 name: "AES256-SHA384",
676 args: []string{"-ciphersuites", "TLS_AES_256_GCM_SHA384"},
677 }
678 runClientTestTLS13(t, test)
679 }
680 func TestHandshakeClientCHACHA20SHA256(t *testing.T) {
681 test := &clientTest{
682 name: "CHACHA20-SHA256",
683 args: []string{"-ciphersuites", "TLS_CHACHA20_POLY1305_SHA256"},
684 }
685 runClientTestTLS13(t, test)
686 }
687
688 func TestHandshakeClientECDSATLS13(t *testing.T) {
689 test := &clientTest{
690 name: "ECDSA",
691 cert: testECDSACertificate,
692 key: testECDSAPrivateKey,
693 }
694 runClientTestTLS13(t, test)
695 }
696
697 func TestHandshakeClientEd25519(t *testing.T) {
698 test := &clientTest{
699 name: "Ed25519",
700 cert: testEd25519Certificate,
701 key: testEd25519PrivateKey,
702 }
703 runClientTestTLS12(t, test)
704 runClientTestTLS13(t, test)
705
706 config := testConfig.Clone()
707 cert, _ := X509KeyPair([]byte(clientEd25519CertificatePEM), []byte(clientEd25519KeyPEM))
708 config.Certificates = []Certificate{cert}
709
710 test = &clientTest{
711 name: "ClientCert-Ed25519",
712 args: []string{"-Verify", "1"},
713 config: config,
714 }
715
716 runClientTestTLS12(t, test)
717 runClientTestTLS13(t, test)
718 }
719
720 func TestHandshakeClientCertRSA(t *testing.T) {
721 config := testConfig.Clone()
722 cert, _ := X509KeyPair([]byte(clientCertificatePEM), []byte(clientKeyPEM))
723 config.Certificates = []Certificate{cert}
724
725 test := &clientTest{
726 name: "ClientCert-RSA-RSA",
727 args: []string{"-cipher", "AES128", "-Verify", "1"},
728 config: config,
729 }
730
731 runClientTestTLS10(t, test)
732 runClientTestTLS12(t, test)
733
734 test = &clientTest{
735 name: "ClientCert-RSA-ECDSA",
736 args: []string{"-cipher", "ECDHE-ECDSA-AES128-SHA", "-Verify", "1"},
737 config: config,
738 cert: testECDSACertificate,
739 key: testECDSAPrivateKey,
740 }
741
742 runClientTestTLS10(t, test)
743 runClientTestTLS12(t, test)
744 runClientTestTLS13(t, test)
745
746 test = &clientTest{
747 name: "ClientCert-RSA-AES256-GCM-SHA384",
748 args: []string{"-cipher", "ECDHE-RSA-AES256-GCM-SHA384", "-Verify", "1"},
749 config: config,
750 cert: testRSACertificate,
751 key: testRSAPrivateKey,
752 }
753
754 runClientTestTLS12(t, test)
755 }
756
757 func TestHandshakeClientCertECDSA(t *testing.T) {
758 config := testConfig.Clone()
759 cert, _ := X509KeyPair([]byte(clientECDSACertificatePEM), []byte(clientECDSAKeyPEM))
760 config.Certificates = []Certificate{cert}
761
762 test := &clientTest{
763 name: "ClientCert-ECDSA-RSA",
764 args: []string{"-cipher", "AES128", "-Verify", "1"},
765 config: config,
766 }
767
768 runClientTestTLS10(t, test)
769 runClientTestTLS12(t, test)
770 runClientTestTLS13(t, test)
771
772 test = &clientTest{
773 name: "ClientCert-ECDSA-ECDSA",
774 args: []string{"-cipher", "ECDHE-ECDSA-AES128-SHA", "-Verify", "1"},
775 config: config,
776 cert: testECDSACertificate,
777 key: testECDSAPrivateKey,
778 }
779
780 runClientTestTLS10(t, test)
781 runClientTestTLS12(t, test)
782 }
783
784
785
786
787
788 func TestHandshakeClientCertRSAPSS(t *testing.T) {
789 cert, err := x509.ParseCertificate(testRSAPSSCertificate)
790 if err != nil {
791 panic(err)
792 }
793 rootCAs := x509.NewCertPool()
794 rootCAs.AddCert(cert)
795
796 config := testConfig.Clone()
797
798 config.GetClientCertificate = func(*CertificateRequestInfo) (*Certificate, error) {
799 return &Certificate{
800 Certificate: [][]byte{testRSAPSSCertificate},
801 PrivateKey: testRSAPrivateKey,
802 }, nil
803 }
804 config.RootCAs = rootCAs
805
806 test := &clientTest{
807 name: "ClientCert-RSA-RSAPSS",
808 args: []string{"-cipher", "AES128", "-Verify", "1", "-client_sigalgs",
809 "rsa_pss_rsae_sha256", "-sigalgs", "rsa_pss_rsae_sha256"},
810 config: config,
811 cert: testRSAPSSCertificate,
812 key: testRSAPrivateKey,
813 }
814 runClientTestTLS12(t, test)
815 runClientTestTLS13(t, test)
816 }
817
818 func TestHandshakeClientCertRSAPKCS1v15(t *testing.T) {
819 config := testConfig.Clone()
820 cert, _ := X509KeyPair([]byte(clientCertificatePEM), []byte(clientKeyPEM))
821 config.Certificates = []Certificate{cert}
822
823 test := &clientTest{
824 name: "ClientCert-RSA-RSAPKCS1v15",
825 args: []string{"-cipher", "AES128", "-Verify", "1", "-client_sigalgs",
826 "rsa_pkcs1_sha256", "-sigalgs", "rsa_pkcs1_sha256"},
827 config: config,
828 }
829
830 runClientTestTLS12(t, test)
831 }
832
833 func TestClientKeyUpdate(t *testing.T) {
834 test := &clientTest{
835 name: "KeyUpdate",
836 args: []string{"-state"},
837 sendKeyUpdate: true,
838 }
839 runClientTestTLS13(t, test)
840 }
841
842 func TestResumption(t *testing.T) {
843 t.Run("TLSv12", func(t *testing.T) { testResumption(t, VersionTLS12) })
844 t.Run("TLSv13", func(t *testing.T) { testResumption(t, VersionTLS13) })
845 }
846
847 func testResumption(t *testing.T, version uint16) {
848 if testing.Short() {
849 t.Skip("skipping in -short mode")
850 }
851 serverConfig := &Config{
852 MaxVersion: version,
853 CipherSuites: []uint16{TLS_RSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_RC4_128_SHA},
854 Certificates: testConfig.Certificates,
855 }
856
857 issuer, err := x509.ParseCertificate(testRSACertificateIssuer)
858 if err != nil {
859 panic(err)
860 }
861
862 rootCAs := x509.NewCertPool()
863 rootCAs.AddCert(issuer)
864
865 clientConfig := &Config{
866 MaxVersion: version,
867 CipherSuites: []uint16{TLS_RSA_WITH_RC4_128_SHA},
868 ClientSessionCache: NewLRUClientSessionCache(32),
869 RootCAs: rootCAs,
870 ServerName: "example.golang",
871 }
872
873 testResumeState := func(test string, didResume bool) {
874 t.Helper()
875 _, hs, err := testHandshake(t, clientConfig, serverConfig)
876 if err != nil {
877 t.Fatalf("%s: handshake failed: %s", test, err)
878 }
879 if hs.DidResume != didResume {
880 t.Fatalf("%s resumed: %v, expected: %v", test, hs.DidResume, didResume)
881 }
882 if didResume && (hs.PeerCertificates == nil || hs.VerifiedChains == nil) {
883 t.Fatalf("expected non-nil certificates after resumption. Got peerCertificates: %#v, verifiedCertificates: %#v", hs.PeerCertificates, hs.VerifiedChains)
884 }
885 if got, want := hs.ServerName, clientConfig.ServerName; got != want {
886 t.Errorf("%s: server name %s, want %s", test, got, want)
887 }
888 }
889
890 getTicket := func() []byte {
891 return clientConfig.ClientSessionCache.(*lruSessionCache).q.Front().Value.(*lruSessionCacheEntry).state.session.ticket
892 }
893 deleteTicket := func() {
894 ticketKey := clientConfig.ClientSessionCache.(*lruSessionCache).q.Front().Value.(*lruSessionCacheEntry).sessionKey
895 clientConfig.ClientSessionCache.Put(ticketKey, nil)
896 }
897 corruptTicket := func() {
898 clientConfig.ClientSessionCache.(*lruSessionCache).q.Front().Value.(*lruSessionCacheEntry).state.session.secret[0] ^= 0xff
899 }
900 randomKey := func() [32]byte {
901 var k [32]byte
902 if _, err := io.ReadFull(serverConfig.rand(), k[:]); err != nil {
903 t.Fatalf("Failed to read new SessionTicketKey: %s", err)
904 }
905 return k
906 }
907
908 testResumeState("Handshake", false)
909 ticket := getTicket()
910 testResumeState("Resume", true)
911 if bytes.Equal(ticket, getTicket()) {
912 t.Fatal("ticket didn't change after resumption")
913 }
914
915
916 ticket = getTicket()
917 serverConfig.Time = func() time.Time { return time.Now().Add(24*time.Hour + time.Minute) }
918 testResumeState("ResumeWithOldTicket", true)
919 if bytes.Equal(ticket, getTicket()) {
920 t.Fatal("old first ticket matches the fresh one")
921 }
922
923
924 ticket = getTicket()
925 serverConfig.Time = func() time.Time { return time.Now().Add(24*8*time.Hour + time.Minute) }
926 testResumeState("ResumeWithExpiredTicket", false)
927 if bytes.Equal(ticket, getTicket()) {
928 t.Fatal("expired first ticket matches the fresh one")
929 }
930
931 serverConfig.Time = func() time.Time { return time.Now() }
932 key1 := randomKey()
933 serverConfig.SetSessionTicketKeys([][32]byte{key1})
934
935 testResumeState("InvalidSessionTicketKey", false)
936 testResumeState("ResumeAfterInvalidSessionTicketKey", true)
937
938 key2 := randomKey()
939 serverConfig.SetSessionTicketKeys([][32]byte{key2, key1})
940 ticket = getTicket()
941 testResumeState("KeyChange", true)
942 if bytes.Equal(ticket, getTicket()) {
943 t.Fatal("new ticket wasn't included while resuming")
944 }
945 testResumeState("KeyChangeFinish", true)
946
947
948 serverConfig.Time = func() time.Time { return time.Now().Add(24*time.Hour + time.Minute) }
949 testResumeState("OldSessionTicket", true)
950 ticket = getTicket()
951
952 serverConfig.Time = func() time.Time { return time.Now().Add(24*8*time.Hour + time.Minute) }
953 testResumeState("ExpiredSessionTicket", false)
954 if bytes.Equal(ticket, getTicket()) {
955 t.Fatal("new ticket wasn't provided after old ticket expired")
956 }
957
958
959 d := 0 * time.Hour
960 serverConfig.Time = func() time.Time { return time.Now().Add(d) }
961 deleteTicket()
962 testResumeState("GetFreshSessionTicket", false)
963 for i := 0; i < 13; i++ {
964 d += 12 * time.Hour
965 testResumeState("OldSessionTicket", true)
966 }
967
968
969
970
971 d += 12 * time.Hour
972 if version == VersionTLS13 {
973 testResumeState("ExpiredSessionTicket", true)
974 } else {
975 testResumeState("ExpiredSessionTicket", false)
976 }
977 if bytes.Equal(ticket, getTicket()) {
978 t.Fatal("new ticket wasn't provided after old ticket expired")
979 }
980
981
982
983 serverConfig = &Config{
984 MaxVersion: version,
985 CipherSuites: []uint16{TLS_RSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_RC4_128_SHA},
986 Certificates: testConfig.Certificates,
987 }
988 serverConfig.SetSessionTicketKeys([][32]byte{key2})
989
990 testResumeState("FreshConfig", true)
991
992
993
994 if version != VersionTLS13 {
995 clientConfig.CipherSuites = []uint16{TLS_ECDHE_RSA_WITH_RC4_128_SHA}
996 testResumeState("DifferentCipherSuite", false)
997 testResumeState("DifferentCipherSuiteRecovers", true)
998 }
999
1000 deleteTicket()
1001 testResumeState("WithoutSessionTicket", false)
1002
1003
1004
1005 if version == VersionTLS13 {
1006 deleteTicket()
1007 serverConfig = &Config{
1008
1009 CurvePreferences: []CurveID{CurveP521, CurveP384, CurveP256},
1010 MaxVersion: version,
1011 Certificates: testConfig.Certificates,
1012 }
1013 testResumeState("InitialHandshake", false)
1014 testResumeState("WithHelloRetryRequest", true)
1015
1016
1017 serverConfig = &Config{
1018 MaxVersion: version,
1019 CipherSuites: []uint16{TLS_RSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_RC4_128_SHA},
1020 Certificates: testConfig.Certificates,
1021 }
1022 }
1023
1024
1025 deleteTicket()
1026 serverConfig.ClientCAs = rootCAs
1027 serverConfig.ClientAuth = RequireAndVerifyClientCert
1028 clientConfig.Certificates = serverConfig.Certificates
1029 testResumeState("InitialHandshake", false)
1030 testResumeState("WithClientCertificates", true)
1031 serverConfig.ClientAuth = NoClientCert
1032
1033
1034
1035 testResumeState("FetchTicketToCorrupt", false)
1036 corruptTicket()
1037 _, _, err = testHandshake(t, clientConfig, serverConfig)
1038 if err == nil {
1039 t.Fatalf("handshake did not fail with a corrupted client secret")
1040 }
1041 testResumeState("AfterHandshakeFailure", false)
1042
1043 clientConfig.ClientSessionCache = nil
1044 testResumeState("WithoutSessionCache", false)
1045
1046 clientConfig.ClientSessionCache = &serializingClientCache{t: t}
1047 testResumeState("BeforeSerializingCache", false)
1048 testResumeState("WithSerializingCache", true)
1049 }
1050
1051 type serializingClientCache struct {
1052 t *testing.T
1053
1054 ticket, state []byte
1055 }
1056
1057 func (c *serializingClientCache) Get(sessionKey string) (session *ClientSessionState, ok bool) {
1058 if c.ticket == nil {
1059 return nil, false
1060 }
1061 state, err := ParseSessionState(c.state)
1062 if err != nil {
1063 c.t.Error(err)
1064 return nil, false
1065 }
1066 cs, err := NewResumptionState(c.ticket, state)
1067 if err != nil {
1068 c.t.Error(err)
1069 return nil, false
1070 }
1071 return cs, true
1072 }
1073
1074 func (c *serializingClientCache) Put(sessionKey string, cs *ClientSessionState) {
1075 if cs == nil {
1076 c.ticket, c.state = nil, nil
1077 return
1078 }
1079 ticket, state, err := cs.ResumptionState()
1080 if err != nil {
1081 c.t.Error(err)
1082 return
1083 }
1084 stateBytes, err := state.Bytes()
1085 if err != nil {
1086 c.t.Error(err)
1087 return
1088 }
1089 c.ticket, c.state = ticket, stateBytes
1090 }
1091
1092 func TestLRUClientSessionCache(t *testing.T) {
1093
1094 cache := NewLRUClientSessionCache(4)
1095 cs := make([]ClientSessionState, 6)
1096 keys := []string{"0", "1", "2", "3", "4", "5", "6"}
1097
1098
1099 for i := 0; i < 4; i++ {
1100 cache.Put(keys[i], &cs[i])
1101 }
1102 for i := 0; i < 4; i++ {
1103 if s, ok := cache.Get(keys[i]); !ok || s != &cs[i] {
1104 t.Fatalf("session cache failed lookup for added key: %s", keys[i])
1105 }
1106 }
1107
1108
1109 for i := 4; i < 6; i++ {
1110 cache.Put(keys[i], &cs[i])
1111 }
1112 for i := 0; i < 2; i++ {
1113 if s, ok := cache.Get(keys[i]); ok || s != nil {
1114 t.Fatalf("session cache should have evicted key: %s", keys[i])
1115 }
1116 }
1117
1118
1119 cache.Get(keys[2])
1120 cache.Put(keys[0], &cs[0])
1121 if s, ok := cache.Get(keys[3]); ok || s != nil {
1122 t.Fatalf("session cache should have evicted key 3")
1123 }
1124
1125
1126 cache.Put(keys[0], &cs[3])
1127 if s, ok := cache.Get(keys[0]); !ok || s != &cs[3] {
1128 t.Fatalf("session cache failed update for key 0")
1129 }
1130
1131
1132 cache.Put(keys[0], nil)
1133 if _, ok := cache.Get(keys[0]); ok {
1134 t.Fatalf("session cache failed to delete key 0")
1135 }
1136
1137
1138 cache.Put(keys[2], nil)
1139 if _, ok := cache.Get(keys[2]); ok {
1140 t.Fatalf("session cache failed to delete key 4")
1141 }
1142 for i := 4; i < 6; i++ {
1143 if s, ok := cache.Get(keys[i]); !ok || s != &cs[i] {
1144 t.Fatalf("session cache should not have deleted key: %s", keys[i])
1145 }
1146 }
1147 }
1148
1149 func TestKeyLogTLS12(t *testing.T) {
1150 var serverBuf, clientBuf bytes.Buffer
1151
1152 clientConfig := testConfig.Clone()
1153 clientConfig.KeyLogWriter = &clientBuf
1154 clientConfig.MaxVersion = VersionTLS12
1155
1156 serverConfig := testConfig.Clone()
1157 serverConfig.KeyLogWriter = &serverBuf
1158 serverConfig.MaxVersion = VersionTLS12
1159
1160 c, s := localPipe(t)
1161 done := make(chan bool)
1162
1163 go func() {
1164 defer close(done)
1165
1166 if err := Server(s, serverConfig).Handshake(); err != nil {
1167 t.Errorf("server: %s", err)
1168 return
1169 }
1170 s.Close()
1171 }()
1172
1173 if err := Client(c, clientConfig).Handshake(); err != nil {
1174 t.Fatalf("client: %s", err)
1175 }
1176
1177 c.Close()
1178 <-done
1179
1180 checkKeylogLine := func(side, loggedLine string) {
1181 if len(loggedLine) == 0 {
1182 t.Fatalf("%s: no keylog line was produced", side)
1183 }
1184 const expectedLen = 13 +
1185 1 +
1186 32*2 +
1187 1 +
1188 48*2 +
1189 1
1190 if len(loggedLine) != expectedLen {
1191 t.Fatalf("%s: keylog line has incorrect length (want %d, got %d): %q", side, expectedLen, len(loggedLine), loggedLine)
1192 }
1193 if !strings.HasPrefix(loggedLine, "CLIENT_RANDOM "+strings.Repeat("0", 64)+" ") {
1194 t.Fatalf("%s: keylog line has incorrect structure or nonce: %q", side, loggedLine)
1195 }
1196 }
1197
1198 checkKeylogLine("client", clientBuf.String())
1199 checkKeylogLine("server", serverBuf.String())
1200 }
1201
1202 func TestKeyLogTLS13(t *testing.T) {
1203 var serverBuf, clientBuf bytes.Buffer
1204
1205 clientConfig := testConfig.Clone()
1206 clientConfig.KeyLogWriter = &clientBuf
1207
1208 serverConfig := testConfig.Clone()
1209 serverConfig.KeyLogWriter = &serverBuf
1210
1211 c, s := localPipe(t)
1212 done := make(chan bool)
1213
1214 go func() {
1215 defer close(done)
1216
1217 if err := Server(s, serverConfig).Handshake(); err != nil {
1218 t.Errorf("server: %s", err)
1219 return
1220 }
1221 s.Close()
1222 }()
1223
1224 if err := Client(c, clientConfig).Handshake(); err != nil {
1225 t.Fatalf("client: %s", err)
1226 }
1227
1228 c.Close()
1229 <-done
1230
1231 checkKeylogLines := func(side, loggedLines string) {
1232 loggedLines = strings.TrimSpace(loggedLines)
1233 lines := strings.Split(loggedLines, "\n")
1234 if len(lines) != 4 {
1235 t.Errorf("Expected the %s to log 4 lines, got %d", side, len(lines))
1236 }
1237 }
1238
1239 checkKeylogLines("client", clientBuf.String())
1240 checkKeylogLines("server", serverBuf.String())
1241 }
1242
1243 func TestHandshakeClientALPNMatch(t *testing.T) {
1244 config := testConfig.Clone()
1245 config.NextProtos = []string{"proto2", "proto1"}
1246
1247 test := &clientTest{
1248 name: "ALPN",
1249
1250
1251 args: []string{"-alpn", "proto1,proto2"},
1252 config: config,
1253 validate: func(state ConnectionState) error {
1254
1255 if state.NegotiatedProtocol != "proto1" {
1256 return fmt.Errorf("Got protocol %q, wanted proto1", state.NegotiatedProtocol)
1257 }
1258 return nil
1259 },
1260 }
1261 runClientTestTLS12(t, test)
1262 runClientTestTLS13(t, test)
1263 }
1264
1265 func TestServerSelectingUnconfiguredApplicationProtocol(t *testing.T) {
1266
1267
1268
1269 c, s := localPipe(t)
1270 errChan := make(chan error, 1)
1271
1272 go func() {
1273 client := Client(c, &Config{
1274 ServerName: "foo",
1275 CipherSuites: []uint16{TLS_RSA_WITH_AES_128_GCM_SHA256},
1276 NextProtos: []string{"http", "something-else"},
1277 })
1278 errChan <- client.Handshake()
1279 }()
1280
1281 var header [5]byte
1282 if _, err := io.ReadFull(s, header[:]); err != nil {
1283 t.Fatal(err)
1284 }
1285 recordLen := int(header[3])<<8 | int(header[4])
1286
1287 record := make([]byte, recordLen)
1288 if _, err := io.ReadFull(s, record); err != nil {
1289 t.Fatal(err)
1290 }
1291
1292 serverHello := &serverHelloMsg{
1293 vers: VersionTLS12,
1294 random: make([]byte, 32),
1295 cipherSuite: TLS_RSA_WITH_AES_128_GCM_SHA256,
1296 alpnProtocol: "how-about-this",
1297 }
1298 serverHelloBytes := mustMarshal(t, serverHello)
1299
1300 s.Write([]byte{
1301 byte(recordTypeHandshake),
1302 byte(VersionTLS12 >> 8),
1303 byte(VersionTLS12 & 0xff),
1304 byte(len(serverHelloBytes) >> 8),
1305 byte(len(serverHelloBytes)),
1306 })
1307 s.Write(serverHelloBytes)
1308 s.Close()
1309
1310 if err := <-errChan; !strings.Contains(err.Error(), "server selected unadvertised ALPN protocol") {
1311 t.Fatalf("Expected error about unconfigured cipher suite but got %q", err)
1312 }
1313 }
1314
1315
1316 const sctsBase64 = "ABIBaQFnAHUApLkJkLQYWBSHuxOizGdwCjw1mAT5G9+443fNDsgN3BAAAAFHl5nuFgAABAMARjBEAiAcS4JdlW5nW9sElUv2zvQyPoZ6ejKrGGB03gjaBZFMLwIgc1Qbbn+hsH0RvObzhS+XZhr3iuQQJY8S9G85D9KeGPAAdgBo9pj4H2SCvjqM7rkoHUz8cVFdZ5PURNEKZ6y7T0/7xAAAAUeX4bVwAAAEAwBHMEUCIDIhFDgG2HIuADBkGuLobU5a4dlCHoJLliWJ1SYT05z6AiEAjxIoZFFPRNWMGGIjskOTMwXzQ1Wh2e7NxXE1kd1J0QsAdgDuS723dc5guuFCaR+r4Z5mow9+X7By2IMAxHuJeqj9ywAAAUhcZIqHAAAEAwBHMEUCICmJ1rBT09LpkbzxtUC+Hi7nXLR0J+2PmwLp+sJMuqK+AiEAr0NkUnEVKVhAkccIFpYDqHOlZaBsuEhWWrYpg2RtKp0="
1317
1318 func TestHandshakClientSCTs(t *testing.T) {
1319 config := testConfig.Clone()
1320
1321 scts, err := base64.StdEncoding.DecodeString(sctsBase64)
1322 if err != nil {
1323 t.Fatal(err)
1324 }
1325
1326
1327
1328 test := &clientTest{
1329 name: "SCT",
1330 config: config,
1331 extensions: [][]byte{scts},
1332 validate: func(state ConnectionState) error {
1333 expectedSCTs := [][]byte{
1334 scts[8:125],
1335 scts[127:245],
1336 scts[247:],
1337 }
1338 if n := len(state.SignedCertificateTimestamps); n != len(expectedSCTs) {
1339 return fmt.Errorf("Got %d scts, wanted %d", n, len(expectedSCTs))
1340 }
1341 for i, expected := range expectedSCTs {
1342 if sct := state.SignedCertificateTimestamps[i]; !bytes.Equal(sct, expected) {
1343 return fmt.Errorf("SCT #%d contained %x, expected %x", i, sct, expected)
1344 }
1345 }
1346 return nil
1347 },
1348 }
1349 runClientTestTLS12(t, test)
1350
1351
1352
1353 }
1354
1355 func TestRenegotiationRejected(t *testing.T) {
1356 config := testConfig.Clone()
1357 test := &clientTest{
1358 name: "RenegotiationRejected",
1359 args: []string{"-state"},
1360 config: config,
1361 numRenegotiations: 1,
1362 renegotiationExpectedToFail: 1,
1363 checkRenegotiationError: func(renegotiationNum int, err error) error {
1364 if err == nil {
1365 return errors.New("expected error from renegotiation but got nil")
1366 }
1367 if !strings.Contains(err.Error(), "no renegotiation") {
1368 return fmt.Errorf("expected renegotiation to be rejected but got %q", err)
1369 }
1370 return nil
1371 },
1372 }
1373 runClientTestTLS12(t, test)
1374 }
1375
1376 func TestRenegotiateOnce(t *testing.T) {
1377 config := testConfig.Clone()
1378 config.Renegotiation = RenegotiateOnceAsClient
1379
1380 test := &clientTest{
1381 name: "RenegotiateOnce",
1382 args: []string{"-state"},
1383 config: config,
1384 numRenegotiations: 1,
1385 }
1386
1387 runClientTestTLS12(t, test)
1388 }
1389
1390 func TestRenegotiateTwice(t *testing.T) {
1391 config := testConfig.Clone()
1392 config.Renegotiation = RenegotiateFreelyAsClient
1393
1394 test := &clientTest{
1395 name: "RenegotiateTwice",
1396 args: []string{"-state"},
1397 config: config,
1398 numRenegotiations: 2,
1399 }
1400
1401 runClientTestTLS12(t, test)
1402 }
1403
1404 func TestRenegotiateTwiceRejected(t *testing.T) {
1405 config := testConfig.Clone()
1406 config.Renegotiation = RenegotiateOnceAsClient
1407
1408 test := &clientTest{
1409 name: "RenegotiateTwiceRejected",
1410 args: []string{"-state"},
1411 config: config,
1412 numRenegotiations: 2,
1413 renegotiationExpectedToFail: 2,
1414 checkRenegotiationError: func(renegotiationNum int, err error) error {
1415 if renegotiationNum == 1 {
1416 return err
1417 }
1418
1419 if err == nil {
1420 return errors.New("expected error from renegotiation but got nil")
1421 }
1422 if !strings.Contains(err.Error(), "no renegotiation") {
1423 return fmt.Errorf("expected renegotiation to be rejected but got %q", err)
1424 }
1425 return nil
1426 },
1427 }
1428
1429 runClientTestTLS12(t, test)
1430 }
1431
1432 func TestHandshakeClientExportKeyingMaterial(t *testing.T) {
1433 test := &clientTest{
1434 name: "ExportKeyingMaterial",
1435 config: testConfig.Clone(),
1436 validate: func(state ConnectionState) error {
1437 if km, err := state.ExportKeyingMaterial("test", nil, 42); err != nil {
1438 return fmt.Errorf("ExportKeyingMaterial failed: %v", err)
1439 } else if len(km) != 42 {
1440 return fmt.Errorf("Got %d bytes from ExportKeyingMaterial, wanted %d", len(km), 42)
1441 }
1442 return nil
1443 },
1444 }
1445 runClientTestTLS10(t, test)
1446 runClientTestTLS12(t, test)
1447 runClientTestTLS13(t, test)
1448 }
1449
1450 var hostnameInSNITests = []struct {
1451 in, out string
1452 }{
1453
1454 {"", ""},
1455 {"localhost", "localhost"},
1456 {"foo, bar, baz and qux", "foo, bar, baz and qux"},
1457
1458
1459 {"golang.org", "golang.org"},
1460 {"golang.org.", "golang.org"},
1461
1462
1463 {"1.2.3.4", ""},
1464
1465
1466 {"::1", ""},
1467 {"::1%lo0", ""},
1468 {"[::1]", ""},
1469 {"[::1%lo0]", ""},
1470 }
1471
1472 func TestHostnameInSNI(t *testing.T) {
1473 for _, tt := range hostnameInSNITests {
1474 c, s := localPipe(t)
1475
1476 go func(host string) {
1477 Client(c, &Config{ServerName: host, InsecureSkipVerify: true}).Handshake()
1478 }(tt.in)
1479
1480 var header [5]byte
1481 if _, err := io.ReadFull(s, header[:]); err != nil {
1482 t.Fatal(err)
1483 }
1484 recordLen := int(header[3])<<8 | int(header[4])
1485
1486 record := make([]byte, recordLen)
1487 if _, err := io.ReadFull(s, record[:]); err != nil {
1488 t.Fatal(err)
1489 }
1490
1491 c.Close()
1492 s.Close()
1493
1494 var m clientHelloMsg
1495 if !m.unmarshal(record) {
1496 t.Errorf("unmarshaling ClientHello for %q failed", tt.in)
1497 continue
1498 }
1499 if tt.in != tt.out && m.serverName == tt.in {
1500 t.Errorf("prohibited %q found in ClientHello: %x", tt.in, record)
1501 }
1502 if m.serverName != tt.out {
1503 t.Errorf("expected %q not found in ClientHello: %x", tt.out, record)
1504 }
1505 }
1506 }
1507
1508 func TestServerSelectingUnconfiguredCipherSuite(t *testing.T) {
1509
1510
1511
1512 c, s := localPipe(t)
1513 errChan := make(chan error, 1)
1514
1515 go func() {
1516 client := Client(c, &Config{
1517 ServerName: "foo",
1518 CipherSuites: []uint16{TLS_RSA_WITH_AES_128_GCM_SHA256},
1519 })
1520 errChan <- client.Handshake()
1521 }()
1522
1523 var header [5]byte
1524 if _, err := io.ReadFull(s, header[:]); err != nil {
1525 t.Fatal(err)
1526 }
1527 recordLen := int(header[3])<<8 | int(header[4])
1528
1529 record := make([]byte, recordLen)
1530 if _, err := io.ReadFull(s, record); err != nil {
1531 t.Fatal(err)
1532 }
1533
1534
1535
1536 serverHello := &serverHelloMsg{
1537 vers: VersionTLS12,
1538 random: make([]byte, 32),
1539 cipherSuite: TLS_RSA_WITH_AES_256_GCM_SHA384,
1540 }
1541 serverHelloBytes := mustMarshal(t, serverHello)
1542
1543 s.Write([]byte{
1544 byte(recordTypeHandshake),
1545 byte(VersionTLS12 >> 8),
1546 byte(VersionTLS12 & 0xff),
1547 byte(len(serverHelloBytes) >> 8),
1548 byte(len(serverHelloBytes)),
1549 })
1550 s.Write(serverHelloBytes)
1551 s.Close()
1552
1553 if err := <-errChan; !strings.Contains(err.Error(), "unconfigured cipher") {
1554 t.Fatalf("Expected error about unconfigured cipher suite but got %q", err)
1555 }
1556 }
1557
1558 func TestVerifyConnection(t *testing.T) {
1559 t.Run("TLSv12", func(t *testing.T) { testVerifyConnection(t, VersionTLS12) })
1560 t.Run("TLSv13", func(t *testing.T) { testVerifyConnection(t, VersionTLS13) })
1561 }
1562
1563 func testVerifyConnection(t *testing.T, version uint16) {
1564 checkFields := func(c ConnectionState, called *int, errorType string) error {
1565 if c.Version != version {
1566 return fmt.Errorf("%s: got Version %v, want %v", errorType, c.Version, version)
1567 }
1568 if c.HandshakeComplete {
1569 return fmt.Errorf("%s: got HandshakeComplete, want false", errorType)
1570 }
1571 if c.ServerName != "example.golang" {
1572 return fmt.Errorf("%s: got ServerName %s, want %s", errorType, c.ServerName, "example.golang")
1573 }
1574 if c.NegotiatedProtocol != "protocol1" {
1575 return fmt.Errorf("%s: got NegotiatedProtocol %s, want %s", errorType, c.NegotiatedProtocol, "protocol1")
1576 }
1577 if c.CipherSuite == 0 {
1578 return fmt.Errorf("%s: got CipherSuite 0, want non-zero", errorType)
1579 }
1580 wantDidResume := false
1581 if *called == 2 {
1582 wantDidResume = true
1583 }
1584 if c.DidResume != wantDidResume {
1585 return fmt.Errorf("%s: got DidResume %t, want %t", errorType, c.DidResume, wantDidResume)
1586 }
1587 return nil
1588 }
1589
1590 tests := []struct {
1591 name string
1592 configureServer func(*Config, *int)
1593 configureClient func(*Config, *int)
1594 }{
1595 {
1596 name: "RequireAndVerifyClientCert",
1597 configureServer: func(config *Config, called *int) {
1598 config.ClientAuth = RequireAndVerifyClientCert
1599 config.VerifyConnection = func(c ConnectionState) error {
1600 *called++
1601 if l := len(c.PeerCertificates); l != 1 {
1602 return fmt.Errorf("server: got len(PeerCertificates) = %d, wanted 1", l)
1603 }
1604 if len(c.VerifiedChains) == 0 {
1605 return fmt.Errorf("server: got len(VerifiedChains) = 0, wanted non-zero")
1606 }
1607 return checkFields(c, called, "server")
1608 }
1609 },
1610 configureClient: func(config *Config, called *int) {
1611 config.VerifyConnection = func(c ConnectionState) error {
1612 *called++
1613 if l := len(c.PeerCertificates); l != 1 {
1614 return fmt.Errorf("client: got len(PeerCertificates) = %d, wanted 1", l)
1615 }
1616 if len(c.VerifiedChains) == 0 {
1617 return fmt.Errorf("client: got len(VerifiedChains) = 0, wanted non-zero")
1618 }
1619 if c.DidResume {
1620 return nil
1621
1622
1623 }
1624 if len(c.OCSPResponse) == 0 {
1625 return fmt.Errorf("client: got len(OCSPResponse) = 0, wanted non-zero")
1626 }
1627 if len(c.SignedCertificateTimestamps) == 0 {
1628 return fmt.Errorf("client: got len(SignedCertificateTimestamps) = 0, wanted non-zero")
1629 }
1630 return checkFields(c, called, "client")
1631 }
1632 },
1633 },
1634 {
1635 name: "InsecureSkipVerify",
1636 configureServer: func(config *Config, called *int) {
1637 config.ClientAuth = RequireAnyClientCert
1638 config.InsecureSkipVerify = true
1639 config.VerifyConnection = func(c ConnectionState) error {
1640 *called++
1641 if l := len(c.PeerCertificates); l != 1 {
1642 return fmt.Errorf("server: got len(PeerCertificates) = %d, wanted 1", l)
1643 }
1644 if c.VerifiedChains != nil {
1645 return fmt.Errorf("server: got Verified Chains %v, want nil", c.VerifiedChains)
1646 }
1647 return checkFields(c, called, "server")
1648 }
1649 },
1650 configureClient: func(config *Config, called *int) {
1651 config.InsecureSkipVerify = true
1652 config.VerifyConnection = func(c ConnectionState) error {
1653 *called++
1654 if l := len(c.PeerCertificates); l != 1 {
1655 return fmt.Errorf("client: got len(PeerCertificates) = %d, wanted 1", l)
1656 }
1657 if c.VerifiedChains != nil {
1658 return fmt.Errorf("server: got Verified Chains %v, want nil", c.VerifiedChains)
1659 }
1660 if c.DidResume {
1661 return nil
1662
1663
1664 }
1665 if len(c.OCSPResponse) == 0 {
1666 return fmt.Errorf("client: got len(OCSPResponse) = 0, wanted non-zero")
1667 }
1668 if len(c.SignedCertificateTimestamps) == 0 {
1669 return fmt.Errorf("client: got len(SignedCertificateTimestamps) = 0, wanted non-zero")
1670 }
1671 return checkFields(c, called, "client")
1672 }
1673 },
1674 },
1675 {
1676 name: "NoClientCert",
1677 configureServer: func(config *Config, called *int) {
1678 config.ClientAuth = NoClientCert
1679 config.VerifyConnection = func(c ConnectionState) error {
1680 *called++
1681 return checkFields(c, called, "server")
1682 }
1683 },
1684 configureClient: func(config *Config, called *int) {
1685 config.VerifyConnection = func(c ConnectionState) error {
1686 *called++
1687 return checkFields(c, called, "client")
1688 }
1689 },
1690 },
1691 {
1692 name: "RequestClientCert",
1693 configureServer: func(config *Config, called *int) {
1694 config.ClientAuth = RequestClientCert
1695 config.VerifyConnection = func(c ConnectionState) error {
1696 *called++
1697 return checkFields(c, called, "server")
1698 }
1699 },
1700 configureClient: func(config *Config, called *int) {
1701 config.Certificates = nil
1702 config.VerifyConnection = func(c ConnectionState) error {
1703 *called++
1704 if l := len(c.PeerCertificates); l != 1 {
1705 return fmt.Errorf("client: got len(PeerCertificates) = %d, wanted 1", l)
1706 }
1707 if len(c.VerifiedChains) == 0 {
1708 return fmt.Errorf("client: got len(VerifiedChains) = 0, wanted non-zero")
1709 }
1710 if c.DidResume {
1711 return nil
1712
1713
1714 }
1715 if len(c.OCSPResponse) == 0 {
1716 return fmt.Errorf("client: got len(OCSPResponse) = 0, wanted non-zero")
1717 }
1718 if len(c.SignedCertificateTimestamps) == 0 {
1719 return fmt.Errorf("client: got len(SignedCertificateTimestamps) = 0, wanted non-zero")
1720 }
1721 return checkFields(c, called, "client")
1722 }
1723 },
1724 },
1725 }
1726 for _, test := range tests {
1727 issuer, err := x509.ParseCertificate(testRSACertificateIssuer)
1728 if err != nil {
1729 panic(err)
1730 }
1731 rootCAs := x509.NewCertPool()
1732 rootCAs.AddCert(issuer)
1733
1734 var serverCalled, clientCalled int
1735
1736 serverConfig := &Config{
1737 MaxVersion: version,
1738 Certificates: []Certificate{testConfig.Certificates[0]},
1739 ClientCAs: rootCAs,
1740 NextProtos: []string{"protocol1"},
1741 }
1742 serverConfig.Certificates[0].SignedCertificateTimestamps = [][]byte{[]byte("dummy sct 1"), []byte("dummy sct 2")}
1743 serverConfig.Certificates[0].OCSPStaple = []byte("dummy ocsp")
1744 test.configureServer(serverConfig, &serverCalled)
1745
1746 clientConfig := &Config{
1747 MaxVersion: version,
1748 ClientSessionCache: NewLRUClientSessionCache(32),
1749 RootCAs: rootCAs,
1750 ServerName: "example.golang",
1751 Certificates: []Certificate{testConfig.Certificates[0]},
1752 NextProtos: []string{"protocol1"},
1753 }
1754 test.configureClient(clientConfig, &clientCalled)
1755
1756 testHandshakeState := func(name string, didResume bool) {
1757 _, hs, err := testHandshake(t, clientConfig, serverConfig)
1758 if err != nil {
1759 t.Fatalf("%s: handshake failed: %s", name, err)
1760 }
1761 if hs.DidResume != didResume {
1762 t.Errorf("%s: resumed: %v, expected: %v", name, hs.DidResume, didResume)
1763 }
1764 wantCalled := 1
1765 if didResume {
1766 wantCalled = 2
1767 }
1768 if clientCalled != wantCalled {
1769 t.Errorf("%s: expected client VerifyConnection called %d times, did %d times", name, wantCalled, clientCalled)
1770 }
1771 if serverCalled != wantCalled {
1772 t.Errorf("%s: expected server VerifyConnection called %d times, did %d times", name, wantCalled, serverCalled)
1773 }
1774 }
1775 testHandshakeState(fmt.Sprintf("%s-FullHandshake", test.name), false)
1776 testHandshakeState(fmt.Sprintf("%s-Resumption", test.name), true)
1777 }
1778 }
1779
1780 func TestVerifyPeerCertificate(t *testing.T) {
1781 t.Run("TLSv12", func(t *testing.T) { testVerifyPeerCertificate(t, VersionTLS12) })
1782 t.Run("TLSv13", func(t *testing.T) { testVerifyPeerCertificate(t, VersionTLS13) })
1783 }
1784
1785 func testVerifyPeerCertificate(t *testing.T, version uint16) {
1786 issuer, err := x509.ParseCertificate(testRSACertificateIssuer)
1787 if err != nil {
1788 panic(err)
1789 }
1790
1791 rootCAs := x509.NewCertPool()
1792 rootCAs.AddCert(issuer)
1793
1794 now := func() time.Time { return time.Unix(1476984729, 0) }
1795
1796 sentinelErr := errors.New("TestVerifyPeerCertificate")
1797
1798 verifyPeerCertificateCallback := func(called *bool, rawCerts [][]byte, validatedChains [][]*x509.Certificate) error {
1799 if l := len(rawCerts); l != 1 {
1800 return fmt.Errorf("got len(rawCerts) = %d, wanted 1", l)
1801 }
1802 if len(validatedChains) == 0 {
1803 return errors.New("got len(validatedChains) = 0, wanted non-zero")
1804 }
1805 *called = true
1806 return nil
1807 }
1808 verifyConnectionCallback := func(called *bool, isClient bool, c ConnectionState) error {
1809 if l := len(c.PeerCertificates); l != 1 {
1810 return fmt.Errorf("got len(PeerCertificates) = %d, wanted 1", l)
1811 }
1812 if len(c.VerifiedChains) == 0 {
1813 return fmt.Errorf("got len(VerifiedChains) = 0, wanted non-zero")
1814 }
1815 if isClient && len(c.OCSPResponse) == 0 {
1816 return fmt.Errorf("got len(OCSPResponse) = 0, wanted non-zero")
1817 }
1818 *called = true
1819 return nil
1820 }
1821
1822 tests := []struct {
1823 configureServer func(*Config, *bool)
1824 configureClient func(*Config, *bool)
1825 validate func(t *testing.T, testNo int, clientCalled, serverCalled bool, clientErr, serverErr error)
1826 }{
1827 {
1828 configureServer: func(config *Config, called *bool) {
1829 config.InsecureSkipVerify = false
1830 config.VerifyPeerCertificate = func(rawCerts [][]byte, validatedChains [][]*x509.Certificate) error {
1831 return verifyPeerCertificateCallback(called, rawCerts, validatedChains)
1832 }
1833 },
1834 configureClient: func(config *Config, called *bool) {
1835 config.InsecureSkipVerify = false
1836 config.VerifyPeerCertificate = func(rawCerts [][]byte, validatedChains [][]*x509.Certificate) error {
1837 return verifyPeerCertificateCallback(called, rawCerts, validatedChains)
1838 }
1839 },
1840 validate: func(t *testing.T, testNo int, clientCalled, serverCalled bool, clientErr, serverErr error) {
1841 if clientErr != nil {
1842 t.Errorf("test[%d]: client handshake failed: %v", testNo, clientErr)
1843 }
1844 if serverErr != nil {
1845 t.Errorf("test[%d]: server handshake failed: %v", testNo, serverErr)
1846 }
1847 if !clientCalled {
1848 t.Errorf("test[%d]: client did not call callback", testNo)
1849 }
1850 if !serverCalled {
1851 t.Errorf("test[%d]: server did not call callback", testNo)
1852 }
1853 },
1854 },
1855 {
1856 configureServer: func(config *Config, called *bool) {
1857 config.InsecureSkipVerify = false
1858 config.VerifyPeerCertificate = func(rawCerts [][]byte, validatedChains [][]*x509.Certificate) error {
1859 return sentinelErr
1860 }
1861 },
1862 configureClient: func(config *Config, called *bool) {
1863 config.VerifyPeerCertificate = nil
1864 },
1865 validate: func(t *testing.T, testNo int, clientCalled, serverCalled bool, clientErr, serverErr error) {
1866 if serverErr != sentinelErr {
1867 t.Errorf("#%d: got server error %v, wanted sentinelErr", testNo, serverErr)
1868 }
1869 },
1870 },
1871 {
1872 configureServer: func(config *Config, called *bool) {
1873 config.InsecureSkipVerify = false
1874 },
1875 configureClient: func(config *Config, called *bool) {
1876 config.VerifyPeerCertificate = func(rawCerts [][]byte, validatedChains [][]*x509.Certificate) error {
1877 return sentinelErr
1878 }
1879 },
1880 validate: func(t *testing.T, testNo int, clientCalled, serverCalled bool, clientErr, serverErr error) {
1881 if clientErr != sentinelErr {
1882 t.Errorf("#%d: got client error %v, wanted sentinelErr", testNo, clientErr)
1883 }
1884 },
1885 },
1886 {
1887 configureServer: func(config *Config, called *bool) {
1888 config.InsecureSkipVerify = false
1889 },
1890 configureClient: func(config *Config, called *bool) {
1891 config.InsecureSkipVerify = true
1892 config.VerifyPeerCertificate = func(rawCerts [][]byte, validatedChains [][]*x509.Certificate) error {
1893 if l := len(rawCerts); l != 1 {
1894 return fmt.Errorf("got len(rawCerts) = %d, wanted 1", l)
1895 }
1896
1897
1898
1899 if l := len(validatedChains); l != 0 {
1900 return fmt.Errorf("got len(validatedChains) = %d, wanted zero", l)
1901 }
1902 *called = true
1903 return nil
1904 }
1905 },
1906 validate: func(t *testing.T, testNo int, clientCalled, serverCalled bool, clientErr, serverErr error) {
1907 if clientErr != nil {
1908 t.Errorf("test[%d]: client handshake failed: %v", testNo, clientErr)
1909 }
1910 if serverErr != nil {
1911 t.Errorf("test[%d]: server handshake failed: %v", testNo, serverErr)
1912 }
1913 if !clientCalled {
1914 t.Errorf("test[%d]: client did not call callback", testNo)
1915 }
1916 },
1917 },
1918 {
1919 configureServer: func(config *Config, called *bool) {
1920 config.InsecureSkipVerify = false
1921 config.VerifyConnection = func(c ConnectionState) error {
1922 return verifyConnectionCallback(called, false, c)
1923 }
1924 },
1925 configureClient: func(config *Config, called *bool) {
1926 config.InsecureSkipVerify = false
1927 config.VerifyConnection = func(c ConnectionState) error {
1928 return verifyConnectionCallback(called, true, c)
1929 }
1930 },
1931 validate: func(t *testing.T, testNo int, clientCalled, serverCalled bool, clientErr, serverErr error) {
1932 if clientErr != nil {
1933 t.Errorf("test[%d]: client handshake failed: %v", testNo, clientErr)
1934 }
1935 if serverErr != nil {
1936 t.Errorf("test[%d]: server handshake failed: %v", testNo, serverErr)
1937 }
1938 if !clientCalled {
1939 t.Errorf("test[%d]: client did not call callback", testNo)
1940 }
1941 if !serverCalled {
1942 t.Errorf("test[%d]: server did not call callback", testNo)
1943 }
1944 },
1945 },
1946 {
1947 configureServer: func(config *Config, called *bool) {
1948 config.InsecureSkipVerify = false
1949 config.VerifyConnection = func(c ConnectionState) error {
1950 return sentinelErr
1951 }
1952 },
1953 configureClient: func(config *Config, called *bool) {
1954 config.InsecureSkipVerify = false
1955 config.VerifyConnection = nil
1956 },
1957 validate: func(t *testing.T, testNo int, clientCalled, serverCalled bool, clientErr, serverErr error) {
1958 if serverErr != sentinelErr {
1959 t.Errorf("#%d: got server error %v, wanted sentinelErr", testNo, serverErr)
1960 }
1961 },
1962 },
1963 {
1964 configureServer: func(config *Config, called *bool) {
1965 config.InsecureSkipVerify = false
1966 config.VerifyConnection = nil
1967 },
1968 configureClient: func(config *Config, called *bool) {
1969 config.InsecureSkipVerify = false
1970 config.VerifyConnection = func(c ConnectionState) error {
1971 return sentinelErr
1972 }
1973 },
1974 validate: func(t *testing.T, testNo int, clientCalled, serverCalled bool, clientErr, serverErr error) {
1975 if clientErr != sentinelErr {
1976 t.Errorf("#%d: got client error %v, wanted sentinelErr", testNo, clientErr)
1977 }
1978 },
1979 },
1980 {
1981 configureServer: func(config *Config, called *bool) {
1982 config.InsecureSkipVerify = false
1983 config.VerifyPeerCertificate = func(rawCerts [][]byte, validatedChains [][]*x509.Certificate) error {
1984 return verifyPeerCertificateCallback(called, rawCerts, validatedChains)
1985 }
1986 config.VerifyConnection = func(c ConnectionState) error {
1987 return sentinelErr
1988 }
1989 },
1990 configureClient: func(config *Config, called *bool) {
1991 config.InsecureSkipVerify = false
1992 config.VerifyPeerCertificate = nil
1993 config.VerifyConnection = nil
1994 },
1995 validate: func(t *testing.T, testNo int, clientCalled, serverCalled bool, clientErr, serverErr error) {
1996 if serverErr != sentinelErr {
1997 t.Errorf("#%d: got server error %v, wanted sentinelErr", testNo, serverErr)
1998 }
1999 if !serverCalled {
2000 t.Errorf("test[%d]: server did not call callback", testNo)
2001 }
2002 },
2003 },
2004 {
2005 configureServer: func(config *Config, called *bool) {
2006 config.InsecureSkipVerify = false
2007 config.VerifyPeerCertificate = nil
2008 config.VerifyConnection = nil
2009 },
2010 configureClient: func(config *Config, called *bool) {
2011 config.InsecureSkipVerify = false
2012 config.VerifyPeerCertificate = func(rawCerts [][]byte, validatedChains [][]*x509.Certificate) error {
2013 return verifyPeerCertificateCallback(called, rawCerts, validatedChains)
2014 }
2015 config.VerifyConnection = func(c ConnectionState) error {
2016 return sentinelErr
2017 }
2018 },
2019 validate: func(t *testing.T, testNo int, clientCalled, serverCalled bool, clientErr, serverErr error) {
2020 if clientErr != sentinelErr {
2021 t.Errorf("#%d: got client error %v, wanted sentinelErr", testNo, clientErr)
2022 }
2023 if !clientCalled {
2024 t.Errorf("test[%d]: client did not call callback", testNo)
2025 }
2026 },
2027 },
2028 }
2029
2030 for i, test := range tests {
2031 c, s := localPipe(t)
2032 done := make(chan error)
2033
2034 var clientCalled, serverCalled bool
2035
2036 go func() {
2037 config := testConfig.Clone()
2038 config.ServerName = "example.golang"
2039 config.ClientAuth = RequireAndVerifyClientCert
2040 config.ClientCAs = rootCAs
2041 config.Time = now
2042 config.MaxVersion = version
2043 config.Certificates = make([]Certificate, 1)
2044 config.Certificates[0].Certificate = [][]byte{testRSACertificate}
2045 config.Certificates[0].PrivateKey = testRSAPrivateKey
2046 config.Certificates[0].SignedCertificateTimestamps = [][]byte{[]byte("dummy sct 1"), []byte("dummy sct 2")}
2047 config.Certificates[0].OCSPStaple = []byte("dummy ocsp")
2048 test.configureServer(config, &serverCalled)
2049
2050 err = Server(s, config).Handshake()
2051 s.Close()
2052 done <- err
2053 }()
2054
2055 config := testConfig.Clone()
2056 config.ServerName = "example.golang"
2057 config.RootCAs = rootCAs
2058 config.Time = now
2059 config.MaxVersion = version
2060 test.configureClient(config, &clientCalled)
2061 clientErr := Client(c, config).Handshake()
2062 c.Close()
2063 serverErr := <-done
2064
2065 test.validate(t, i, clientCalled, serverCalled, clientErr, serverErr)
2066 }
2067 }
2068
2069
2070
2071 type brokenConn struct {
2072 net.Conn
2073
2074
2075
2076 breakAfter int
2077
2078
2079 numWrites int
2080 }
2081
2082
2083 var brokenConnErr = errors.New("too many writes to brokenConn")
2084
2085 func (b *brokenConn) Write(data []byte) (int, error) {
2086 if b.numWrites >= b.breakAfter {
2087 return 0, brokenConnErr
2088 }
2089
2090 b.numWrites++
2091 return b.Conn.Write(data)
2092 }
2093
2094 func TestFailedWrite(t *testing.T) {
2095
2096 for _, breakAfter := range []int{0, 1} {
2097 c, s := localPipe(t)
2098 done := make(chan bool)
2099
2100 go func() {
2101 Server(s, testConfig).Handshake()
2102 s.Close()
2103 done <- true
2104 }()
2105
2106 brokenC := &brokenConn{Conn: c, breakAfter: breakAfter}
2107 err := Client(brokenC, testConfig).Handshake()
2108 if err != brokenConnErr {
2109 t.Errorf("#%d: expected error from brokenConn but got %q", breakAfter, err)
2110 }
2111 brokenC.Close()
2112
2113 <-done
2114 }
2115 }
2116
2117
2118 type writeCountingConn struct {
2119 net.Conn
2120
2121
2122 numWrites int
2123 }
2124
2125 func (wcc *writeCountingConn) Write(data []byte) (int, error) {
2126 wcc.numWrites++
2127 return wcc.Conn.Write(data)
2128 }
2129
2130 func TestBuffering(t *testing.T) {
2131 t.Run("TLSv12", func(t *testing.T) { testBuffering(t, VersionTLS12) })
2132 t.Run("TLSv13", func(t *testing.T) { testBuffering(t, VersionTLS13) })
2133 }
2134
2135 func testBuffering(t *testing.T, version uint16) {
2136 c, s := localPipe(t)
2137 done := make(chan bool)
2138
2139 clientWCC := &writeCountingConn{Conn: c}
2140 serverWCC := &writeCountingConn{Conn: s}
2141
2142 go func() {
2143 config := testConfig.Clone()
2144 config.MaxVersion = version
2145 Server(serverWCC, config).Handshake()
2146 serverWCC.Close()
2147 done <- true
2148 }()
2149
2150 err := Client(clientWCC, testConfig).Handshake()
2151 if err != nil {
2152 t.Fatal(err)
2153 }
2154 clientWCC.Close()
2155 <-done
2156
2157 var expectedClient, expectedServer int
2158 if version == VersionTLS13 {
2159 expectedClient = 2
2160 expectedServer = 1
2161 } else {
2162 expectedClient = 2
2163 expectedServer = 2
2164 }
2165
2166 if n := clientWCC.numWrites; n != expectedClient {
2167 t.Errorf("expected client handshake to complete with %d writes, but saw %d", expectedClient, n)
2168 }
2169
2170 if n := serverWCC.numWrites; n != expectedServer {
2171 t.Errorf("expected server handshake to complete with %d writes, but saw %d", expectedServer, n)
2172 }
2173 }
2174
2175 func TestAlertFlushing(t *testing.T) {
2176 c, s := localPipe(t)
2177 done := make(chan bool)
2178
2179 clientWCC := &writeCountingConn{Conn: c}
2180 serverWCC := &writeCountingConn{Conn: s}
2181
2182 serverConfig := testConfig.Clone()
2183
2184
2185 brokenKey := rsa.PrivateKey{PublicKey: testRSAPrivateKey.PublicKey}
2186 brokenKey.D = big.NewInt(42)
2187 serverConfig.Certificates = []Certificate{{
2188 Certificate: [][]byte{testRSACertificate},
2189 PrivateKey: &brokenKey,
2190 }}
2191
2192 go func() {
2193 Server(serverWCC, serverConfig).Handshake()
2194 serverWCC.Close()
2195 done <- true
2196 }()
2197
2198 err := Client(clientWCC, testConfig).Handshake()
2199 if err == nil {
2200 t.Fatal("client unexpectedly returned no error")
2201 }
2202
2203 const expectedError = "remote error: tls: internal error"
2204 if e := err.Error(); !strings.Contains(e, expectedError) {
2205 t.Fatalf("expected to find %q in error but error was %q", expectedError, e)
2206 }
2207 clientWCC.Close()
2208 <-done
2209
2210 if n := serverWCC.numWrites; n != 1 {
2211 t.Errorf("expected server handshake to complete with one write, but saw %d", n)
2212 }
2213 }
2214
2215 func TestHandshakeRace(t *testing.T) {
2216 if testing.Short() {
2217 t.Skip("skipping in -short mode")
2218 }
2219 t.Parallel()
2220
2221
2222
2223 for i := 0; i < 32; i++ {
2224 c, s := localPipe(t)
2225
2226 go func() {
2227 server := Server(s, testConfig)
2228 if err := server.Handshake(); err != nil {
2229 panic(err)
2230 }
2231
2232 var request [1]byte
2233 if n, err := server.Read(request[:]); err != nil || n != 1 {
2234 panic(err)
2235 }
2236
2237 server.Write(request[:])
2238 server.Close()
2239 }()
2240
2241 startWrite := make(chan struct{})
2242 startRead := make(chan struct{})
2243 readDone := make(chan struct{}, 1)
2244
2245 client := Client(c, testConfig)
2246 go func() {
2247 <-startWrite
2248 var request [1]byte
2249 client.Write(request[:])
2250 }()
2251
2252 go func() {
2253 <-startRead
2254 var reply [1]byte
2255 if _, err := io.ReadFull(client, reply[:]); err != nil {
2256 panic(err)
2257 }
2258 c.Close()
2259 readDone <- struct{}{}
2260 }()
2261
2262 if i&1 == 1 {
2263 startWrite <- struct{}{}
2264 startRead <- struct{}{}
2265 } else {
2266 startRead <- struct{}{}
2267 startWrite <- struct{}{}
2268 }
2269 <-readDone
2270 }
2271 }
2272
2273 var getClientCertificateTests = []struct {
2274 setup func(*Config, *Config)
2275 expectedClientError string
2276 verify func(*testing.T, int, *ConnectionState)
2277 }{
2278 {
2279 func(clientConfig, serverConfig *Config) {
2280
2281
2282
2283 serverConfig.ClientCAs = nil
2284 clientConfig.GetClientCertificate = func(cri *CertificateRequestInfo) (*Certificate, error) {
2285 if len(cri.SignatureSchemes) == 0 {
2286 panic("empty SignatureSchemes")
2287 }
2288 if len(cri.AcceptableCAs) != 0 {
2289 panic("AcceptableCAs should have been empty")
2290 }
2291 return new(Certificate), nil
2292 }
2293 },
2294 "",
2295 func(t *testing.T, testNum int, cs *ConnectionState) {
2296 if l := len(cs.PeerCertificates); l != 0 {
2297 t.Errorf("#%d: expected no certificates but got %d", testNum, l)
2298 }
2299 },
2300 },
2301 {
2302 func(clientConfig, serverConfig *Config) {
2303
2304
2305 clientConfig.MaxVersion = VersionTLS11
2306 clientConfig.GetClientCertificate = func(cri *CertificateRequestInfo) (*Certificate, error) {
2307 if len(cri.SignatureSchemes) == 0 {
2308 panic("empty SignatureSchemes")
2309 }
2310 return new(Certificate), nil
2311 }
2312 },
2313 "",
2314 func(t *testing.T, testNum int, cs *ConnectionState) {
2315 if l := len(cs.PeerCertificates); l != 0 {
2316 t.Errorf("#%d: expected no certificates but got %d", testNum, l)
2317 }
2318 },
2319 },
2320 {
2321 func(clientConfig, serverConfig *Config) {
2322
2323
2324 clientConfig.GetClientCertificate = func(cri *CertificateRequestInfo) (*Certificate, error) {
2325 return nil, errors.New("GetClientCertificate")
2326 }
2327 },
2328 "GetClientCertificate",
2329 func(t *testing.T, testNum int, cs *ConnectionState) {
2330 },
2331 },
2332 {
2333 func(clientConfig, serverConfig *Config) {
2334 clientConfig.GetClientCertificate = func(cri *CertificateRequestInfo) (*Certificate, error) {
2335 if len(cri.AcceptableCAs) == 0 {
2336 panic("empty AcceptableCAs")
2337 }
2338 cert := &Certificate{
2339 Certificate: [][]byte{testRSACertificate},
2340 PrivateKey: testRSAPrivateKey,
2341 }
2342 return cert, nil
2343 }
2344 },
2345 "",
2346 func(t *testing.T, testNum int, cs *ConnectionState) {
2347 if len(cs.VerifiedChains) == 0 {
2348 t.Errorf("#%d: expected some verified chains, but found none", testNum)
2349 }
2350 },
2351 },
2352 }
2353
2354 func TestGetClientCertificate(t *testing.T) {
2355 t.Run("TLSv12", func(t *testing.T) { testGetClientCertificate(t, VersionTLS12) })
2356 t.Run("TLSv13", func(t *testing.T) { testGetClientCertificate(t, VersionTLS13) })
2357 }
2358
2359 func testGetClientCertificate(t *testing.T, version uint16) {
2360 issuer, err := x509.ParseCertificate(testRSACertificateIssuer)
2361 if err != nil {
2362 panic(err)
2363 }
2364
2365 for i, test := range getClientCertificateTests {
2366 serverConfig := testConfig.Clone()
2367 serverConfig.ClientAuth = VerifyClientCertIfGiven
2368 serverConfig.RootCAs = x509.NewCertPool()
2369 serverConfig.RootCAs.AddCert(issuer)
2370 serverConfig.ClientCAs = serverConfig.RootCAs
2371 serverConfig.Time = func() time.Time { return time.Unix(1476984729, 0) }
2372 serverConfig.MaxVersion = version
2373
2374 clientConfig := testConfig.Clone()
2375 clientConfig.MaxVersion = version
2376
2377 test.setup(clientConfig, serverConfig)
2378
2379 type serverResult struct {
2380 cs ConnectionState
2381 err error
2382 }
2383
2384 c, s := localPipe(t)
2385 done := make(chan serverResult)
2386
2387 go func() {
2388 defer s.Close()
2389 server := Server(s, serverConfig)
2390 err := server.Handshake()
2391
2392 var cs ConnectionState
2393 if err == nil {
2394 cs = server.ConnectionState()
2395 }
2396 done <- serverResult{cs, err}
2397 }()
2398
2399 clientErr := Client(c, clientConfig).Handshake()
2400 c.Close()
2401
2402 result := <-done
2403
2404 if clientErr != nil {
2405 if len(test.expectedClientError) == 0 {
2406 t.Errorf("#%d: client error: %v", i, clientErr)
2407 } else if got := clientErr.Error(); got != test.expectedClientError {
2408 t.Errorf("#%d: expected client error %q, but got %q", i, test.expectedClientError, got)
2409 } else {
2410 test.verify(t, i, &result.cs)
2411 }
2412 } else if len(test.expectedClientError) > 0 {
2413 t.Errorf("#%d: expected client error %q, but got no error", i, test.expectedClientError)
2414 } else if err := result.err; err != nil {
2415 t.Errorf("#%d: server error: %v", i, err)
2416 } else {
2417 test.verify(t, i, &result.cs)
2418 }
2419 }
2420 }
2421
2422 func TestRSAPSSKeyError(t *testing.T) {
2423
2424
2425
2426
2427 b, _ := pem.Decode([]byte(`
2428 -----BEGIN CERTIFICATE-----
2429 MIIDZTCCAhygAwIBAgIUCF2x0FyTgZG0CC9QTDjGWkB5vgEwPgYJKoZIhvcNAQEK
2430 MDGgDTALBglghkgBZQMEAgGhGjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAIBogQC
2431 AgDeMBIxEDAOBgNVBAMMB1JTQS1QU1MwHhcNMTgwNjI3MjI0NDM2WhcNMTgwNzI3
2432 MjI0NDM2WjASMRAwDgYDVQQDDAdSU0EtUFNTMIIBIDALBgkqhkiG9w0BAQoDggEP
2433 ADCCAQoCggEBANxDm0f76JdI06YzsjB3AmmjIYkwUEGxePlafmIASFjDZl/elD0Z
2434 /a7xLX468b0qGxLS5al7XCcEprSdsDR6DF5L520+pCbpfLyPOjuOvGmk9KzVX4x5
2435 b05YXYuXdsQ0Kjxcx2i3jjCday6scIhMJVgBZxTEyMj1thPQM14SHzKCd/m6HmCL
2436 QmswpH2yMAAcBRWzRpp/vdH5DeOJEB3aelq7094no731mrLUCHRiZ1htq8BDB3ou
2437 czwqgwspbqZ4dnMXl2MvfySQ5wJUxQwILbiuAKO2lVVPUbFXHE9pgtznNoPvKwQT
2438 JNcX8ee8WIZc2SEGzofjk3NpjR+2ADB2u3sCAwEAAaNTMFEwHQYDVR0OBBYEFNEz
2439 AdyJ2f+fU+vSCS6QzohnOnprMB8GA1UdIwQYMBaAFNEzAdyJ2f+fU+vSCS6Qzohn
2440 OnprMA8GA1UdEwEB/wQFMAMBAf8wPgYJKoZIhvcNAQEKMDGgDTALBglghkgBZQME
2441 AgGhGjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAIBogQCAgDeA4IBAQCjEdrR5aab
2442 sZmCwrMeKidXgfkmWvfuLDE+TCbaqDZp7BMWcMQXT9O0UoUT5kqgKj2ARm2pEW0Z
2443 H3Z1vj3bbds72qcDIJXp+l0fekyLGeCrX/CbgnMZXEP7+/+P416p34ChR1Wz4dU1
2444 KD3gdsUuTKKeMUog3plxlxQDhRQmiL25ygH1LmjLd6dtIt0GVRGr8lj3euVeprqZ
2445 bZ3Uq5eLfsn8oPgfC57gpO6yiN+UURRTlK3bgYvLh4VWB3XXk9UaQZ7Mq1tpXjoD
2446 HYFybkWzibkZp4WRo+Fa28rirH+/wHt0vfeN7UCceURZEx4JaxIIfe4ku7uDRhJi
2447 RwBA9Xk1KBNF
2448 -----END CERTIFICATE-----`))
2449 if b == nil {
2450 t.Fatal("Failed to decode certificate")
2451 }
2452 cert, err := x509.ParseCertificate(b.Bytes)
2453 if err != nil {
2454 return
2455 }
2456 if _, ok := cert.PublicKey.(*rsa.PublicKey); ok {
2457 t.Error("A RSASSA-PSS certificate was parsed like a PKCS#1 v1.5 one, and it will be mistakenly used with rsa_pss_rsae_* signature algorithms")
2458 }
2459 }
2460
2461 func TestCloseClientConnectionOnIdleServer(t *testing.T) {
2462 clientConn, serverConn := localPipe(t)
2463 client := Client(clientConn, testConfig.Clone())
2464 go func() {
2465 var b [1]byte
2466 serverConn.Read(b[:])
2467 client.Close()
2468 }()
2469 client.SetWriteDeadline(time.Now().Add(time.Minute))
2470 err := client.Handshake()
2471 if err != nil {
2472 if err, ok := err.(net.Error); ok && err.Timeout() {
2473 t.Errorf("Expected a closed network connection error but got '%s'", err.Error())
2474 }
2475 } else {
2476 t.Errorf("Error expected, but no error returned")
2477 }
2478 }
2479
2480 func testDowngradeCanary(t *testing.T, clientVersion, serverVersion uint16) error {
2481 defer func() { testingOnlyForceDowngradeCanary = false }()
2482 testingOnlyForceDowngradeCanary = true
2483
2484 clientConfig := testConfig.Clone()
2485 clientConfig.MaxVersion = clientVersion
2486 serverConfig := testConfig.Clone()
2487 serverConfig.MaxVersion = serverVersion
2488 _, _, err := testHandshake(t, clientConfig, serverConfig)
2489 return err
2490 }
2491
2492 func TestDowngradeCanary(t *testing.T) {
2493 if err := testDowngradeCanary(t, VersionTLS13, VersionTLS12); err == nil {
2494 t.Errorf("downgrade from TLS 1.3 to TLS 1.2 was not detected")
2495 }
2496 if testing.Short() {
2497 t.Skip("skipping the rest of the checks in short mode")
2498 }
2499 if err := testDowngradeCanary(t, VersionTLS13, VersionTLS11); err == nil {
2500 t.Errorf("downgrade from TLS 1.3 to TLS 1.1 was not detected")
2501 }
2502 if err := testDowngradeCanary(t, VersionTLS13, VersionTLS10); err == nil {
2503 t.Errorf("downgrade from TLS 1.3 to TLS 1.0 was not detected")
2504 }
2505 if err := testDowngradeCanary(t, VersionTLS12, VersionTLS11); err == nil {
2506 t.Errorf("downgrade from TLS 1.2 to TLS 1.1 was not detected")
2507 }
2508 if err := testDowngradeCanary(t, VersionTLS12, VersionTLS10); err == nil {
2509 t.Errorf("downgrade from TLS 1.2 to TLS 1.0 was not detected")
2510 }
2511 if err := testDowngradeCanary(t, VersionTLS13, VersionTLS13); err != nil {
2512 t.Errorf("server unexpectedly sent downgrade canary for TLS 1.3")
2513 }
2514 if err := testDowngradeCanary(t, VersionTLS12, VersionTLS12); err != nil {
2515 t.Errorf("client didn't ignore expected TLS 1.2 canary")
2516 }
2517 if err := testDowngradeCanary(t, VersionTLS11, VersionTLS11); err != nil {
2518 t.Errorf("client unexpectedly reacted to a canary in TLS 1.1")
2519 }
2520 if err := testDowngradeCanary(t, VersionTLS10, VersionTLS10); err != nil {
2521 t.Errorf("client unexpectedly reacted to a canary in TLS 1.0")
2522 }
2523 }
2524
2525 func TestResumptionKeepsOCSPAndSCT(t *testing.T) {
2526 t.Run("TLSv12", func(t *testing.T) { testResumptionKeepsOCSPAndSCT(t, VersionTLS12) })
2527 t.Run("TLSv13", func(t *testing.T) { testResumptionKeepsOCSPAndSCT(t, VersionTLS13) })
2528 }
2529
2530 func testResumptionKeepsOCSPAndSCT(t *testing.T, ver uint16) {
2531 issuer, err := x509.ParseCertificate(testRSACertificateIssuer)
2532 if err != nil {
2533 t.Fatalf("failed to parse test issuer")
2534 }
2535 roots := x509.NewCertPool()
2536 roots.AddCert(issuer)
2537 clientConfig := &Config{
2538 MaxVersion: ver,
2539 ClientSessionCache: NewLRUClientSessionCache(32),
2540 ServerName: "example.golang",
2541 RootCAs: roots,
2542 }
2543 serverConfig := testConfig.Clone()
2544 serverConfig.MaxVersion = ver
2545 serverConfig.Certificates[0].OCSPStaple = []byte{1, 2, 3}
2546 serverConfig.Certificates[0].SignedCertificateTimestamps = [][]byte{{4, 5, 6}}
2547
2548 _, ccs, err := testHandshake(t, clientConfig, serverConfig)
2549 if err != nil {
2550 t.Fatalf("handshake failed: %s", err)
2551 }
2552
2553
2554 if !bytes.Equal(ccs.OCSPResponse, serverConfig.Certificates[0].OCSPStaple) {
2555 t.Errorf("client ConnectionState contained unexpected OCSPResponse: wanted %v, got %v",
2556 serverConfig.Certificates[0].OCSPStaple, ccs.OCSPResponse)
2557 }
2558 if !reflect.DeepEqual(ccs.SignedCertificateTimestamps, serverConfig.Certificates[0].SignedCertificateTimestamps) {
2559 t.Errorf("client ConnectionState contained unexpected SignedCertificateTimestamps: wanted %v, got %v",
2560 serverConfig.Certificates[0].SignedCertificateTimestamps, ccs.SignedCertificateTimestamps)
2561 }
2562
2563
2564 oldSCTs := serverConfig.Certificates[0].SignedCertificateTimestamps
2565 serverConfig.Certificates[0].SignedCertificateTimestamps = nil
2566 _, ccs, err = testHandshake(t, clientConfig, serverConfig)
2567 if err != nil {
2568 t.Fatalf("handshake failed: %s", err)
2569 }
2570 if !ccs.DidResume {
2571 t.Fatalf("expected session to be resumed")
2572 }
2573
2574
2575 if !bytes.Equal(ccs.OCSPResponse, serverConfig.Certificates[0].OCSPStaple) {
2576 t.Errorf("client ConnectionState contained unexpected OCSPResponse after resumption: wanted %v, got %v",
2577 serverConfig.Certificates[0].OCSPStaple, ccs.OCSPResponse)
2578 }
2579 if !reflect.DeepEqual(ccs.SignedCertificateTimestamps, oldSCTs) {
2580 t.Errorf("client ConnectionState contained unexpected SignedCertificateTimestamps after resumption: wanted %v, got %v",
2581 oldSCTs, ccs.SignedCertificateTimestamps)
2582 }
2583
2584
2585
2586 if ver == VersionTLS13 {
2587 return
2588 }
2589
2590
2591 serverConfig.Certificates[0].SignedCertificateTimestamps = [][]byte{{7, 8, 9}}
2592 _, ccs, err = testHandshake(t, clientConfig, serverConfig)
2593 if err != nil {
2594 t.Fatalf("handshake failed: %s", err)
2595 }
2596 if !ccs.DidResume {
2597 t.Fatalf("expected session to be resumed")
2598 }
2599 if !reflect.DeepEqual(ccs.SignedCertificateTimestamps, serverConfig.Certificates[0].SignedCertificateTimestamps) {
2600 t.Errorf("client ConnectionState contained unexpected SignedCertificateTimestamps after resumption: wanted %v, got %v",
2601 serverConfig.Certificates[0].SignedCertificateTimestamps, ccs.SignedCertificateTimestamps)
2602 }
2603 }
2604
2605
2606
2607
2608 func TestClientHandshakeContextCancellation(t *testing.T) {
2609 c, s := localPipe(t)
2610 ctx, cancel := context.WithCancel(context.Background())
2611 unblockServer := make(chan struct{})
2612 defer close(unblockServer)
2613 go func() {
2614 cancel()
2615 <-unblockServer
2616 _ = s.Close()
2617 }()
2618 cli := Client(c, testConfig)
2619
2620
2621 err := cli.HandshakeContext(ctx)
2622 if err == nil {
2623 t.Fatal("Client handshake did not error when the context was canceled")
2624 }
2625 if err != context.Canceled {
2626 t.Errorf("Unexpected client handshake error: %v", err)
2627 }
2628 if runtime.GOARCH == "wasm" {
2629 t.Skip("conn.Close does not error as expected when called multiple times on WASM")
2630 }
2631 err = cli.Close()
2632 if err == nil {
2633 t.Error("Client connection was not closed when the context was canceled")
2634 }
2635 }
2636
2637
2638
2639 func TestTLS13OnlyClientHelloCipherSuite(t *testing.T) {
2640 tls13Tests := []struct {
2641 name string
2642 ciphers []uint16
2643 }{
2644 {
2645 name: "nil",
2646 ciphers: nil,
2647 },
2648 {
2649 name: "empty",
2650 ciphers: []uint16{},
2651 },
2652 {
2653 name: "some TLS 1.2 cipher",
2654 ciphers: []uint16{TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
2655 },
2656 {
2657 name: "some TLS 1.3 cipher",
2658 ciphers: []uint16{TLS_AES_128_GCM_SHA256},
2659 },
2660 {
2661 name: "some TLS 1.2 and 1.3 ciphers",
2662 ciphers: []uint16{TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_AES_256_GCM_SHA384},
2663 },
2664 }
2665 for _, tt := range tls13Tests {
2666 tt := tt
2667 t.Run(tt.name, func(t *testing.T) {
2668 t.Parallel()
2669 testTLS13OnlyClientHelloCipherSuite(t, tt.ciphers)
2670 })
2671 }
2672 }
2673
2674 func testTLS13OnlyClientHelloCipherSuite(t *testing.T, ciphers []uint16) {
2675 serverConfig := &Config{
2676 Certificates: testConfig.Certificates,
2677 GetConfigForClient: func(chi *ClientHelloInfo) (*Config, error) {
2678 if len(chi.CipherSuites) != len(defaultCipherSuitesTLS13NoAES) {
2679 t.Errorf("only TLS 1.3 suites should be advertised, got=%x", chi.CipherSuites)
2680 } else {
2681 for i := range defaultCipherSuitesTLS13NoAES {
2682 if want, got := defaultCipherSuitesTLS13NoAES[i], chi.CipherSuites[i]; want != got {
2683 t.Errorf("cipher at index %d does not match, want=%x, got=%x", i, want, got)
2684 }
2685 }
2686 }
2687 return nil, nil
2688 },
2689 }
2690 clientConfig := &Config{
2691 MinVersion: VersionTLS13,
2692 CipherSuites: ciphers,
2693 InsecureSkipVerify: true,
2694 }
2695 if _, _, err := testHandshake(t, clientConfig, serverConfig); err != nil {
2696 t.Fatalf("handshake failed: %s", err)
2697 }
2698 }
2699
2700
2701 type discardConn struct {
2702 net.Conn
2703 }
2704
2705 func (dc *discardConn) Write(data []byte) (int, error) {
2706 return len(data), nil
2707 }
2708
2709
2710 const largeRSAKeyCertPEM = `-----BEGIN CERTIFICATE-----
2711 MIIInjCCBIWgAwIBAgIBAjANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDEwd0ZXN0
2712 aW5nMB4XDTIzMDYwNzIxMjMzNloXDTIzMDYwNzIzMjMzNlowEjEQMA4GA1UEAxMH
2713 dGVzdGluZzCCBCIwDQYJKoZIhvcNAQEBBQADggQPADCCBAoCggQBAWdHsf6Rh2Ca
2714 n2SQwn4t4OQrOjbLLdGE1pM6TBKKrHUFy62uEL8atNjlcfXIsa4aEu3xNGiqxqur
2715 ZectlkZbm0FkaaQ1Wr9oikDY3KfjuaXdPdO/XC/h8AKNxlDOylyXwUSK/CuYb+1j
2716 gy8yF5QFvVfwW/xwTlHmhUeSkVSQPosfQ6yXNNsmMzkd+ZPWLrfq4R+wiNtwYGu0
2717 WSBcI/M9o8/vrNLnIppoiBJJ13j9CR1ToEAzOFh9wwRWLY10oZhoh1ONN1KQURx4
2718 qedzvvP2DSjZbUccdvl2rBGvZpzfOiFdm1FCnxB0c72Cqx+GTHXBFf8bsa7KHky9
2719 sNO1GUanbq17WoDNgwbY6H51bfShqv0CErxatwWox3we4EcAmFHPVTCYL1oWVMGo
2720 a3Eth91NZj+b/nGhF9lhHKGzXSv9brmLLkfvM1jA6XhNhA7BQ5Vz67lj2j3XfXdh
2721 t/BU5pBXbL4Ut4mIhT1YnKXAjX2/LF5RHQTE8Vwkx5JAEKZyUEGOReD/B+7GOrLp
2722 HduMT9vZAc5aR2k9I8qq1zBAzsL69lyQNAPaDYd1BIAjUety9gAYaSQffCgAgpRO
2723 Gt+DYvxS+7AT/yEd5h74MU2AH7KrAkbXOtlwupiGwhMVTstncDJWXMJqbBhyHPF8
2724 3UmZH0hbL4PYmzSj9LDWQQXI2tv6vrCpfts3Cqhqxz9vRpgY7t1Wu6l/r+KxYYz3
2725 1pcGpPvRmPh0DJm7cPTiXqPnZcPt+ulSaSdlxmd19OnvG5awp0fXhxryZVwuiT8G
2726 VDkhyARrxYrdjlINsZJZbQjO0t8ketXAELJOnbFXXzeCOosyOHkLwsqOO96AVJA8
2727 45ZVL5m95ClGy0RSrjVIkXsxTAMVG6SPAqKwk6vmTdRGuSPS4rhgckPVDHmccmuq
2728 dfnT2YkX+wB2/M3oCgU+s30fAHGkbGZ0pCdNbFYFZLiH0iiMbTDl/0L/z7IdK0nH
2729 GLHVE7apPraKC6xl6rPWsD2iSfrmtIPQa0+rqbIVvKP5JdfJ8J4alI+OxFw/znQe
2730 V0/Rez0j22Fe119LZFFSXhRv+ZSvcq20xDwh00mzcumPWpYuCVPozA18yIhC9tNn
2731 ALHndz0tDseIdy9vC71jQWy9iwri3ueN0DekMMF8JGzI1Z6BAFzgyAx3DkHtwHg7
2732 B7qD0jPG5hJ5+yt323fYgJsuEAYoZ8/jzZ01pkX8bt+UsVN0DGnSGsI2ktnIIk3J
2733 l+8krjmUy6EaW79nITwoOqaeHOIp8m3UkjEcoKOYrzHRKqRy+A09rY+m/cAQaafW
2734 4xp0Zv7qZPLwnu0jsqB4jD8Ll9yPB02ndsoV6U5PeHzTkVhPml19jKUAwFfs7TJg
2735 kXy+/xFhYVUCAwEAATANBgkqhkiG9w0BAQsFAAOCBAIAAQnZY77pMNeypfpba2WK
2736 aDasT7dk2JqP0eukJCVPTN24Zca+xJNPdzuBATm/8SdZK9lddIbjSnWRsKvTnO2r
2737 /rYdlPf3jM5uuJtb8+Uwwe1s+gszelGS9G/lzzq+ehWicRIq2PFcs8o3iQMfENiv
2738 qILJ+xjcrvms5ZPDNahWkfRx3KCg8Q+/at2n5p7XYjMPYiLKHnDC+RE2b1qT20IZ
2739 FhuK/fTWLmKbfYFNNga6GC4qcaZJ7x0pbm4SDTYp0tkhzcHzwKhidfNB5J2vNz6l
2740 Ur6wiYwamFTLqcOwWo7rdvI+sSn05WQBv0QZlzFX+OAu0l7WQ7yU+noOxBhjvHds
2741 14+r9qcQZg2q9kG+evopYZqYXRUNNlZKo9MRBXhfrISulFAc5lRFQIXMXnglvAu+
2742 Ipz2gomEAOcOPNNVldhKAU94GAMJd/KfN0ZP7gX3YvPzuYU6XDhag5RTohXLm18w
2743 5AF+ES3DOQ6ixu3DTf0D+6qrDuK+prdX8ivcdTQVNOQ+MIZeGSc6NWWOTaMGJ3lg
2744 aZIxJUGdo6E7GBGiC1YTjgFKFbHzek1LRTh/LX3vbSudxwaG0HQxwsU9T4DWiMqa
2745 Fkf2KteLEUA6HrR+0XlAZrhwoqAmrJ+8lCFX3V0gE9lpENfVHlFXDGyx10DpTB28
2746 DdjnY3F7EPWNzwf9P3oNT69CKW3Bk6VVr3ROOJtDxVu1ioWo3TaXltQ0VOnap2Pu
2747 sa5wfrpfwBDuAS9JCDg4ttNp2nW3F7tgXC6xPqw5pvGwUppEw9XNrqV8TZrxduuv
2748 rQ3NyZ7KSzIpmFlD3UwV/fGfz3UQmHS6Ng1evrUID9DjfYNfRqSGIGjDfxGtYD+j
2749 Z1gLJZuhjJpNtwBkKRtlNtrCWCJK2hidK/foxwD7kwAPo2I9FjpltxCRywZUs07X
2750 KwXTfBR9v6ij1LV6K58hFS+8ezZyZ05CeVBFkMQdclTOSfuPxlMkQOtjp8QWDj+F
2751 j/MYziT5KBkHvcbrjdRtUJIAi4N7zCsPZtjik918AK1WBNRVqPbrgq/XSEXMfuvs
2752 6JbfK0B76vdBDRtJFC1JsvnIrGbUztxXzyQwFLaR/AjVJqpVlysLWzPKWVX6/+SJ
2753 u1NQOl2E8P6ycyBsuGnO89p0S4F8cMRcI2X1XQsZ7/q0NBrOMaEp5T3SrWo9GiQ3
2754 o2SBdbs3Y6MBPBtTu977Z/0RO63J3M5i2tjUiDfrFy7+VRLKr7qQ7JibohyB8QaR
2755 9tedgjn2f+of7PnP/PEl1cCphUZeHM7QKUMPT8dbqwmKtlYY43EHXcvNOT5IBk3X
2756 9lwJoZk/B2i+ZMRNSP34ztAwtxmasPt6RAWGQpWCn9qmttAHAnMfDqe7F7jVR6rS
2757 u58=
2758 -----END CERTIFICATE-----`
2759
2760 func TestHandshakeRSATooBig(t *testing.T) {
2761 testCert, _ := pem.Decode([]byte(largeRSAKeyCertPEM))
2762
2763 c := &Conn{conn: &discardConn{}, config: testConfig.Clone()}
2764
2765 expectedErr := "tls: server sent certificate containing RSA key larger than 8192 bits"
2766 err := c.verifyServerCertificate([][]byte{testCert.Bytes})
2767 if err == nil || err.Error() != expectedErr {
2768 t.Errorf("Conn.verifyServerCertificate unexpected error: want %q, got %q", expectedErr, err)
2769 }
2770
2771 expectedErr = "tls: client sent certificate containing RSA key larger than 8192 bits"
2772 err = c.processCertsFromClient(Certificate{Certificate: [][]byte{testCert.Bytes}})
2773 if err == nil || err.Error() != expectedErr {
2774 t.Errorf("Conn.processCertsFromClient unexpected error: want %q, got %q", expectedErr, err)
2775 }
2776 }
2777
2778 func TestTLS13ECHRejectionCallbacks(t *testing.T) {
2779 k, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
2780 if err != nil {
2781 t.Fatal(err)
2782 }
2783 tmpl := &x509.Certificate{
2784 SerialNumber: big.NewInt(1),
2785 Subject: pkix.Name{CommonName: "test"},
2786 DNSNames: []string{"example.golang"},
2787 NotBefore: testConfig.Time().Add(-time.Hour),
2788 NotAfter: testConfig.Time().Add(time.Hour),
2789 }
2790 certDER, err := x509.CreateCertificate(rand.Reader, tmpl, tmpl, k.Public(), k)
2791 if err != nil {
2792 t.Fatal(err)
2793 }
2794 cert, err := x509.ParseCertificate(certDER)
2795 if err != nil {
2796 t.Fatal(err)
2797 }
2798
2799 clientConfig, serverConfig := testConfig.Clone(), testConfig.Clone()
2800 serverConfig.Certificates = []Certificate{
2801 {
2802 Certificate: [][]byte{certDER},
2803 PrivateKey: k,
2804 },
2805 }
2806 serverConfig.MinVersion = VersionTLS13
2807 clientConfig.RootCAs = x509.NewCertPool()
2808 clientConfig.RootCAs.AddCert(cert)
2809 clientConfig.MinVersion = VersionTLS13
2810 clientConfig.EncryptedClientHelloConfigList, _ = hex.DecodeString("0041fe0d003d0100200020204bed0a11fc0dde595a9b78d966b0011128eb83f65d3c91c1cc5ac786cd246f000400010001ff0e6578616d706c652e676f6c616e670000")
2811 clientConfig.ServerName = "example.golang"
2812
2813 for _, tc := range []struct {
2814 name string
2815 expectedErr string
2816
2817 verifyConnection func(ConnectionState) error
2818 verifyPeerCertificate func([][]byte, [][]*x509.Certificate) error
2819 encryptedClientHelloRejectionVerify func(ConnectionState) error
2820 }{
2821 {
2822 name: "no callbacks",
2823 expectedErr: "tls: server rejected ECH",
2824 },
2825 {
2826 name: "EncryptedClientHelloRejectionVerify, no err",
2827 encryptedClientHelloRejectionVerify: func(ConnectionState) error {
2828 return nil
2829 },
2830 expectedErr: "tls: server rejected ECH",
2831 },
2832 {
2833 name: "EncryptedClientHelloRejectionVerify, err",
2834 encryptedClientHelloRejectionVerify: func(ConnectionState) error {
2835 return errors.New("callback err")
2836 },
2837
2838
2839 expectedErr: "callback err",
2840 },
2841 {
2842 name: "VerifyConnection, err",
2843 verifyConnection: func(ConnectionState) error {
2844 return errors.New("callback err")
2845 },
2846 expectedErr: "tls: server rejected ECH",
2847 },
2848 {
2849 name: "VerifyPeerCertificate, err",
2850 verifyPeerCertificate: func([][]byte, [][]*x509.Certificate) error {
2851 return errors.New("callback err")
2852 },
2853 expectedErr: "tls: server rejected ECH",
2854 },
2855 } {
2856 t.Run(tc.name, func(t *testing.T) {
2857 c, s := localPipe(t)
2858 done := make(chan error)
2859
2860 go func() {
2861 serverErr := Server(s, serverConfig).Handshake()
2862 s.Close()
2863 done <- serverErr
2864 }()
2865
2866 cConfig := clientConfig.Clone()
2867 cConfig.VerifyConnection = tc.verifyConnection
2868 cConfig.VerifyPeerCertificate = tc.verifyPeerCertificate
2869 cConfig.EncryptedClientHelloRejectionVerify = tc.encryptedClientHelloRejectionVerify
2870
2871 clientErr := Client(c, cConfig).Handshake()
2872 c.Close()
2873
2874 if tc.expectedErr == "" && clientErr != nil {
2875 t.Fatalf("unexpected err: %s", clientErr)
2876 } else if clientErr != nil && tc.expectedErr != clientErr.Error() {
2877 t.Fatalf("unexpected err: got %q, want %q", clientErr, tc.expectedErr)
2878 }
2879 })
2880 }
2881 }
2882
2883 func TestECHTLS12Server(t *testing.T) {
2884 clientConfig, serverConfig := testConfig.Clone(), testConfig.Clone()
2885
2886 serverConfig.MaxVersion = VersionTLS12
2887 clientConfig.MinVersion = 0
2888
2889 clientConfig.EncryptedClientHelloConfigList, _ = hex.DecodeString("0041fe0d003d0100200020204bed0a11fc0dde595a9b78d966b0011128eb83f65d3c91c1cc5ac786cd246f000400010001ff0e6578616d706c652e676f6c616e670000")
2890
2891 expectedErr := "server: tls: client offered only unsupported versions: [304]\nclient: remote error: tls: protocol version not supported"
2892 _, _, err := testHandshake(t, clientConfig, serverConfig)
2893 if err == nil || err.Error() != expectedErr {
2894 t.Fatalf("unexpected handshake error: got %q, want %q", err, expectedErr)
2895 }
2896 }
2897
View as plain text