Source file
src/crypto/tls/handshake_test.go
1
2
3
4
5 package tls
6
7 import (
8 "bufio"
9 "bytes"
10 "context"
11 "crypto/ed25519"
12 "crypto/x509"
13 "encoding/hex"
14 "errors"
15 "flag"
16 "fmt"
17 "io"
18 "net"
19 "os"
20 "os/exec"
21 "runtime"
22 "strconv"
23 "strings"
24 "sync"
25 "testing"
26 "time"
27 )
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 var (
46 update = flag.Bool("update", false, "update golden files on failure")
47 keyFile = flag.String("keylog", "", "destination file for KeyLogWriter")
48 bogoMode = flag.Bool("bogo-mode", false, "Enabled bogo shim mode, ignore everything else")
49 bogoFilter = flag.String("bogo-filter", "", "BoGo test filter")
50 bogoLocalDir = flag.String("bogo-local-dir", "", "Local BoGo to use, instead of fetching from source")
51 )
52
53 func runTestAndUpdateIfNeeded(t *testing.T, name string, run func(t *testing.T, update bool), wait bool) {
54
55 skipFIPS(t)
56
57 success := t.Run(name, func(t *testing.T) {
58 if !*update && !wait {
59 t.Parallel()
60 }
61 run(t, false)
62 })
63
64 if !success && *update {
65 t.Run(name+"#update", func(t *testing.T) {
66 run(t, true)
67 })
68 }
69 }
70
71
72
73 func checkOpenSSLVersion() error {
74 if !*update {
75 return nil
76 }
77
78 openssl := exec.Command("openssl", "version")
79 output, err := openssl.CombinedOutput()
80 if err != nil {
81 return err
82 }
83
84 version := string(output)
85 if strings.HasPrefix(version, "OpenSSL 1.1.1") {
86 return nil
87 }
88
89 println("***********************************************")
90 println("")
91 println("You need to build OpenSSL 1.1.1 from source in order")
92 println("to update the test data.")
93 println("")
94 println("Configure it with:")
95 println("./Configure enable-weak-ssl-ciphers no-shared")
96 println("and then add the apps/ directory at the front of your PATH.")
97 println("***********************************************")
98
99 return errors.New("version of OpenSSL does not appear to be suitable for updating test data")
100 }
101
102
103
104
105 type recordingConn struct {
106 net.Conn
107 sync.Mutex
108 flows [][]byte
109 reading bool
110 }
111
112 func (r *recordingConn) Read(b []byte) (n int, err error) {
113 if n, err = r.Conn.Read(b); n == 0 {
114 return
115 }
116 b = b[:n]
117
118 r.Lock()
119 defer r.Unlock()
120
121 if l := len(r.flows); l == 0 || !r.reading {
122 buf := make([]byte, len(b))
123 copy(buf, b)
124 r.flows = append(r.flows, buf)
125 } else {
126 r.flows[l-1] = append(r.flows[l-1], b[:n]...)
127 }
128 r.reading = true
129 return
130 }
131
132 func (r *recordingConn) Write(b []byte) (n int, err error) {
133 if n, err = r.Conn.Write(b); n == 0 {
134 return
135 }
136 b = b[:n]
137
138 r.Lock()
139 defer r.Unlock()
140
141 if l := len(r.flows); l == 0 || r.reading {
142 buf := make([]byte, len(b))
143 copy(buf, b)
144 r.flows = append(r.flows, buf)
145 } else {
146 r.flows[l-1] = append(r.flows[l-1], b[:n]...)
147 }
148 r.reading = false
149 return
150 }
151
152
153 func (r *recordingConn) WriteTo(w io.Writer) (int64, error) {
154
155 clientToServer := true
156 var written int64
157 for i, flow := range r.flows {
158 source, dest := "client", "server"
159 if !clientToServer {
160 source, dest = dest, source
161 }
162 n, err := fmt.Fprintf(w, ">>> Flow %d (%s to %s)\n", i+1, source, dest)
163 written += int64(n)
164 if err != nil {
165 return written, err
166 }
167 dumper := hex.Dumper(w)
168 n, err = dumper.Write(flow)
169 written += int64(n)
170 if err != nil {
171 return written, err
172 }
173 err = dumper.Close()
174 if err != nil {
175 return written, err
176 }
177 clientToServer = !clientToServer
178 }
179 return written, nil
180 }
181
182 func parseTestData(r io.Reader) (flows [][]byte, err error) {
183 var currentFlow []byte
184
185 scanner := bufio.NewScanner(r)
186 for scanner.Scan() {
187 line := scanner.Text()
188
189
190 if strings.HasPrefix(line, ">>> ") {
191 if len(currentFlow) > 0 || len(flows) > 0 {
192 flows = append(flows, currentFlow)
193 currentFlow = nil
194 }
195 continue
196 }
197
198
199
200
201 _, after, ok := strings.Cut(line, " ")
202 if !ok {
203 return nil, errors.New("invalid test data")
204 }
205 line = after
206
207 before, _, ok := strings.Cut(line, "|")
208 if !ok {
209 return nil, errors.New("invalid test data")
210 }
211 line = before
212
213 hexBytes := strings.Fields(line)
214 for _, hexByte := range hexBytes {
215 val, err := strconv.ParseUint(hexByte, 16, 8)
216 if err != nil {
217 return nil, errors.New("invalid hex byte in test data: " + err.Error())
218 }
219 currentFlow = append(currentFlow, byte(val))
220 }
221 }
222
223 if len(currentFlow) > 0 {
224 flows = append(flows, currentFlow)
225 }
226
227 return flows, nil
228 }
229
230
231 type replayingConn struct {
232 t testing.TB
233 sync.Mutex
234 flows [][]byte
235 reading bool
236 }
237
238 var _ net.Conn = (*replayingConn)(nil)
239
240 func (r *replayingConn) Read(b []byte) (n int, err error) {
241 r.Lock()
242 defer r.Unlock()
243
244 if !r.reading {
245 r.t.Errorf("expected write, got read")
246 return 0, fmt.Errorf("recording expected write, got read")
247 }
248
249 n = copy(b, r.flows[0])
250 r.flows[0] = r.flows[0][n:]
251 if len(r.flows[0]) == 0 {
252 r.flows = r.flows[1:]
253 if len(r.flows) == 0 {
254 return n, io.EOF
255 } else {
256 r.reading = false
257 }
258 }
259 return n, nil
260 }
261
262 func (r *replayingConn) Write(b []byte) (n int, err error) {
263 r.Lock()
264 defer r.Unlock()
265
266 if r.reading {
267 r.t.Errorf("expected read, got write")
268 return 0, fmt.Errorf("recording expected read, got write")
269 }
270
271 if !bytes.HasPrefix(r.flows[0], b) {
272 r.t.Errorf("write mismatch: expected %x, got %x", r.flows[0], b)
273 return 0, fmt.Errorf("write mismatch")
274 }
275 r.flows[0] = r.flows[0][len(b):]
276 if len(r.flows[0]) == 0 {
277 r.flows = r.flows[1:]
278 r.reading = true
279 }
280 return len(b), nil
281 }
282
283 func (r *replayingConn) Close() error {
284 r.Lock()
285 defer r.Unlock()
286
287 if len(r.flows) > 0 {
288 r.t.Errorf("closed with unfinished flows")
289 return fmt.Errorf("unexpected close")
290 }
291 return nil
292 }
293
294 func (r *replayingConn) LocalAddr() net.Addr { return nil }
295 func (r *replayingConn) RemoteAddr() net.Addr { return nil }
296 func (r *replayingConn) SetDeadline(t time.Time) error { return nil }
297 func (r *replayingConn) SetReadDeadline(t time.Time) error { return nil }
298 func (r *replayingConn) SetWriteDeadline(t time.Time) error { return nil }
299
300
301 func tempFile(contents string) string {
302 file, err := os.CreateTemp("", "go-tls-test")
303 if err != nil {
304 panic("failed to create temp file: " + err.Error())
305 }
306 path := file.Name()
307 file.WriteString(contents)
308 file.Close()
309 return path
310 }
311
312
313
314 var localListener struct {
315 mu sync.Mutex
316 addr net.Addr
317 ch chan net.Conn
318 }
319
320 const localFlakes = 0
321
322 func localServer(l net.Listener) {
323 for n := 0; ; n++ {
324 c, err := l.Accept()
325 if err != nil {
326 return
327 }
328 if localFlakes == 1 && n%2 == 0 {
329 c.Close()
330 continue
331 }
332 localListener.ch <- c
333 }
334 }
335
336 var isConnRefused = func(err error) bool { return false }
337
338 func localPipe(t testing.TB) (net.Conn, net.Conn) {
339 localListener.mu.Lock()
340 defer localListener.mu.Unlock()
341
342 addr := localListener.addr
343
344 var err error
345 Dialing:
346
347 for i := 0; i < 5; i++ {
348 tooSlow := time.NewTimer(1 * time.Second)
349 defer tooSlow.Stop()
350 var c1 net.Conn
351 c1, err = net.Dial(addr.Network(), addr.String())
352 if err != nil {
353 if runtime.GOOS == "dragonfly" && (isConnRefused(err) || os.IsTimeout(err)) {
354
355
356 <-tooSlow.C
357 continue
358 }
359 t.Fatalf("localPipe: %v", err)
360 }
361 if localFlakes == 2 && i == 0 {
362 c1.Close()
363 continue
364 }
365 for {
366 select {
367 case <-tooSlow.C:
368 t.Logf("localPipe: timeout waiting for %v", c1.LocalAddr())
369 c1.Close()
370 continue Dialing
371
372 case c2 := <-localListener.ch:
373 if c2.RemoteAddr().String() == c1.LocalAddr().String() {
374 t.Cleanup(func() { c1.Close() })
375 t.Cleanup(func() { c2.Close() })
376 return c1, c2
377 }
378 t.Logf("localPipe: unexpected connection: %v != %v", c2.RemoteAddr(), c1.LocalAddr())
379 c2.Close()
380 }
381 }
382 }
383
384 t.Fatalf("localPipe: failed to connect: %v", err)
385 panic("unreachable")
386 }
387
388
389 type zeroSource struct{}
390
391 func (zeroSource) Read(b []byte) (n int, err error) {
392 clear(b)
393 return len(b), nil
394 }
395
396 func allCipherSuites() []uint16 {
397 ids := make([]uint16, len(cipherSuites))
398 for i, suite := range cipherSuites {
399 ids[i] = suite.id
400 }
401
402 return ids
403 }
404
405 var testConfig *Config
406
407 func TestMain(m *testing.M) {
408 flag.Usage = func() {
409 fmt.Fprintf(flag.CommandLine.Output(), "Usage of %s:\n", os.Args)
410 flag.PrintDefaults()
411 if *bogoMode {
412 os.Exit(89)
413 }
414 }
415
416 flag.Parse()
417
418 if *bogoMode {
419 bogoShim()
420 os.Exit(0)
421 }
422
423 os.Exit(runMain(m))
424 }
425
426 func runMain(m *testing.M) int {
427
428
429 hasAESGCMHardwareSupport = false
430
431
432 l, err := net.Listen("tcp", "127.0.0.1:0")
433 if err != nil {
434 l, err = net.Listen("tcp6", "[::1]:0")
435 }
436 if err != nil {
437 fmt.Fprintf(os.Stderr, "Failed to open local listener: %v", err)
438 os.Exit(1)
439 }
440 localListener.ch = make(chan net.Conn)
441 localListener.addr = l.Addr()
442 defer l.Close()
443 go localServer(l)
444
445 if err := checkOpenSSLVersion(); err != nil {
446 fmt.Fprintf(os.Stderr, "Error: %v", err)
447 os.Exit(1)
448 }
449
450 testConfig = &Config{
451 Time: func() time.Time { return time.Unix(0, 0) },
452 Rand: zeroSource{},
453 Certificates: make([]Certificate, 2),
454 InsecureSkipVerify: true,
455 CipherSuites: allCipherSuites(),
456 CurvePreferences: []CurveID{X25519, CurveP256, CurveP384, CurveP521},
457 MinVersion: VersionTLS10,
458 MaxVersion: VersionTLS13,
459 }
460 testConfig.Certificates[0].Certificate = [][]byte{testRSACertificate}
461 testConfig.Certificates[0].PrivateKey = testRSAPrivateKey
462 testConfig.Certificates[1].Certificate = [][]byte{testSNICertificate}
463 testConfig.Certificates[1].PrivateKey = testRSAPrivateKey
464 testConfig.BuildNameToCertificate()
465 if *keyFile != "" {
466 f, err := os.OpenFile(*keyFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
467 if err != nil {
468 panic("failed to open -keylog file: " + err.Error())
469 }
470 testConfig.KeyLogWriter = f
471 defer f.Close()
472 }
473
474 return m.Run()
475 }
476
477 func testHandshake(t *testing.T, clientConfig, serverConfig *Config) (serverState, clientState ConnectionState, err error) {
478 const sentinel = "SENTINEL\n"
479 c, s := localPipe(t)
480 errChan := make(chan error, 1)
481 go func() {
482 cli := Client(c, clientConfig)
483 err := cli.Handshake()
484 if err != nil {
485 errChan <- fmt.Errorf("client: %v", err)
486 c.Close()
487 return
488 }
489 defer func() { errChan <- nil }()
490 clientState = cli.ConnectionState()
491 buf, err := io.ReadAll(cli)
492 if err != nil {
493 t.Errorf("failed to call cli.Read: %v", err)
494 }
495 if got := string(buf); got != sentinel {
496 t.Errorf("read %q from TLS connection, but expected %q", got, sentinel)
497 }
498
499
500
501 cli.Close()
502 }()
503 server := Server(s, serverConfig)
504 err = server.Handshake()
505 if err == nil {
506 serverState = server.ConnectionState()
507 if _, err := io.WriteString(server, sentinel); err != nil {
508 t.Errorf("failed to call server.Write: %v", err)
509 }
510 if err := server.Close(); err != nil {
511 t.Errorf("failed to call server.Close: %v", err)
512 }
513 } else {
514 err = fmt.Errorf("server: %v", err)
515 s.Close()
516 }
517 err = errors.Join(err, <-errChan)
518 return
519 }
520
521 func fromHex(s string) []byte {
522 b, _ := hex.DecodeString(s)
523 return b
524 }
525
526
527
528
529 var testTime = func() time.Time { return time.Unix(1476984729, 0) }
530
531 var testRSACertificate = fromHex("3082024b308201b4a003020102020900e8f09d3fe25beaa6300d06092a864886f70d01010b0500301f310b3009060355040a1302476f3110300e06035504031307476f20526f6f74301e170d3136303130313030303030305a170d3235303130313030303030305a301a310b3009060355040a1302476f310b300906035504031302476f30819f300d06092a864886f70d010101050003818d0030818902818100db467d932e12270648bc062821ab7ec4b6a25dfe1e5245887a3647a5080d92425bc281c0be97799840fb4f6d14fd2b138bc2a52e67d8d4099ed62238b74a0b74732bc234f1d193e596d9747bf3589f6c613cc0b041d4d92b2b2423775b1c3bbd755dce2054cfa163871d1e24c4f31d1a508baab61443ed97a77562f414c852d70203010001a38193308190300e0603551d0f0101ff0404030205a0301d0603551d250416301406082b0601050507030106082b06010505070302300c0603551d130101ff0402300030190603551d0e041204109f91161f43433e49a6de6db680d79f60301b0603551d230414301280104813494d137e1631bba301d5acab6e7b30190603551d1104123010820e6578616d706c652e676f6c616e67300d06092a864886f70d01010b0500038181009d30cc402b5b50a061cbbae55358e1ed8328a9581aa938a495a1ac315a1a84663d43d32dd90bf297dfd320643892243a00bccf9c7db74020015faad3166109a276fd13c3cce10c5ceeb18782f16c04ed73bbb343778d0c1cf10fa1d8408361c94c722b9daedb4606064df4c1b33ec0d1bd42d4dbfe3d1360845c21d33be9fae7")
532
533 var testRSACertificateIssuer = fromHex("3082021930820182a003020102020900ca5e4e811a965964300d06092a864886f70d01010b0500301f310b3009060355040a1302476f3110300e06035504031307476f20526f6f74301e170d3136303130313030303030305a170d3235303130313030303030305a301f310b3009060355040a1302476f3110300e06035504031307476f20526f6f7430819f300d06092a864886f70d010101050003818d0030818902818100d667b378bb22f34143b6cd2008236abefaf2852adf3ab05e01329e2c14834f5105df3f3073f99dab5442d45ee5f8f57b0111c8cb682fbb719a86944eebfffef3406206d898b8c1b1887797c9c5006547bb8f00e694b7a063f10839f269f2c34fff7a1f4b21fbcd6bfdfb13ac792d1d11f277b5c5b48600992203059f2a8f8cc50203010001a35d305b300e0603551d0f0101ff040403020204301d0603551d250416301406082b0601050507030106082b06010505070302300f0603551d130101ff040530030101ff30190603551d0e041204104813494d137e1631bba301d5acab6e7b300d06092a864886f70d01010b050003818100c1154b4bab5266221f293766ae4138899bd4c5e36b13cee670ceeaa4cbdf4f6679017e2fe649765af545749fe4249418a56bd38a04b81e261f5ce86b8d5c65413156a50d12449554748c59a30c515bc36a59d38bddf51173e899820b282e40aa78c806526fd184fb6b4cf186ec728edffa585440d2b3225325f7ab580e87dd76")
534
535 var testRSA2048Certificate = fromHex("30820316308201fea003020102020900e8f09d3fe25beaa6300d06092a864886f70d01010b0500301f310b3009060355040a1302476f3110300e06035504031307476f20526f6f74301e170d3136303130313030303030305a170d3338303130313030303030305a301a310b3009060355040a1302476f310b300906035504031302476f30820122300d06092a864886f70d01010105000382010f003082010a0282010100e0ac47db9ba1b7f98a996c62dc1d248d4ee570544136fe4e911e22fccc0fe2b20982f3c4cdd8f4065c5068c873ca0a768b80dc915edc66541a5f26cdea44e56e411221e2f9927bf4e009fee76dbe0e118dcc13392efd6f42d8eb2fd5bc8f63ac77800c84d3be90c20c321273254b9137ef61f825dad1ec2c5e75aa4be6d3104899bd5ac400da7ab942b4227a3870ae5bb97870aa09a1082fb8e78b944cd7fd1b0c6fb1cce03b5430b12ef9ce2d95e01821766e998df0cc99202a57cf030577bd2dc0ec85a49f203511bb6f0e9f43398ead0958f8d7534c61e81daf4501faaa68d9cbc725b58401900fa48a3e2333b15c88cf0c5cc8f33fb9464f9d5f5768b8f10203010001a35a3058300e0603551d0f0101ff0404030205a0301d0603551d250416301406082b0601050507030106082b06010505070302300c0603551d130101ff0402300030190603551d1104123010820e6578616d706c652e676f6c616e67300d06092a864886f70d01010b050003820101009e83f835e2da08204ee6f8bdca793cf83c7aec175349c1642dfbe9f4d0dcfb1aedb4d0122e16c2ad92e63dd31cce10ca5dd04be48cded0fdc8fea49e891d9d93e778a67d54b619ac167ce7bb0f6000ca00c5677d09df3eb10080134ba32bfe4132d33954dc479cb266288d53d3f43af9c78c0ca59d396498bdc56d4966dc6b7e49081f7f2ae1d704bb9f9effed93c57d3b738da02edff3999e3f1a5dce2b093951947d233d9c6b6a12b4b1611826aa02544980089eebbcf22a1a96bd35a3ddf638578989334a93d5081fab442b4383ba6213b7cdd74110582244a2abd937828b311d8dd69178756db7874293b9810c5c2e833f91d49d283a62caaf359141997f")
536
537 var testRSA2048CertificateIssuer = fromHex("308203223082020aa003020102020900ca5e4e811a965964300d06092a864886f70d01010b0500301f310b3009060355040a1302476f3110300e06035504031307476f20526f6f74301e170d3136303130313030303030305a170d3235303130313030303030305a301f310b3009060355040a1302476f3110300e06035504031307476f20526f6f7430820122300d06092a864886f70d01010105000382010f003082010a0282010100b308c1720c7054abe66e1be6f8a11246808215a810e8936e47601f7ec1afeb02ad69a5000959d4e08ebc4455ef90b39616f380b8ff2e76f29942d7e009cf010824fe56f69140ac39b761595255ec2aa35155ca2eea884f57b25f8a52f41f56f65b0197cb6c637f9adfa97d8ac27565449f64e67f8b918646ffd630601b0badd8d38aea421fe413ee94f10ea5874c2fd6d8c1b9febaa5ca0ce759993a232c9c48e52230bbf58777b0c30e07e9e0914133730d844b9887b950d5a17c779ac69de2d9c65d26f1ea46c7dd7ac636af6d77df7c9218f78c7b5f08b025867f343ac66cd43a657ac44bfd7e9d07e95a22ff9a0babf72dcffc66eba0a1d90731f67e3bbd0203010001a361305f300e0603551d0f0101ff040403020204301d0603551d250416301406082b0601050507030106082b06010505070302300f0603551d130101ff040530030101ff301d0603551d0e0416041460145a6ce2e8a15b1b68db9a4752ce8684d6ba2d300d06092a864886f70d01010b050003820101001d342fe0b50a25d57a8b13bc14d0abb1eea7431ee752aa423e1306654183e44e9d48bbf592cd32ce77310fdc4e8bbcd724fc43d2723f454bfe605ff90d38d8c6fe60b36c6f4d2d7e4e79bceeb2484f0565274b0d0c4a8562370677624a4c133e332a9e63d4b47544c14e4908ee8685dd0760ae6f4ab089ede2b0cdc595ecefbee7d8be80d57b2d4e4510b6ceda54d1a5980540214191d81cc89a983da43d4043f8efe97a2e231c5153bded520acce87ec8c64a3408f0eb4c742c4a877e8b5b7b7f72497734a41a95994a7a103262ea6d598d03fd5cb0579ed4702424da8893334c58215bc655d49656aedcd02d18676f45d6b9469ae04b89abe9b358391cce99")
538
539 var testRSA2048PrivateKey, _ = x509.ParsePKCS1PrivateKey(fromHex("308204a40201000282010100e0ac47db9ba1b7f98a996c62dc1d248d4ee570544136fe4e911e22fccc0fe2b20982f3c4cdd8f4065c5068c873ca0a768b80dc915edc66541a5f26cdea44e56e411221e2f9927bf4e009fee76dbe0e118dcc13392efd6f42d8eb2fd5bc8f63ac77800c84d3be90c20c321273254b9137ef61f825dad1ec2c5e75aa4be6d3104899bd5ac400da7ab942b4227a3870ae5bb97870aa09a1082fb8e78b944cd7fd1b0c6fb1cce03b5430b12ef9ce2d95e01821766e998df0cc99202a57cf030577bd2dc0ec85a49f203511bb6f0e9f43398ead0958f8d7534c61e81daf4501faaa68d9cbc725b58401900fa48a3e2333b15c88cf0c5cc8f33fb9464f9d5f5768b8f10203010001028201007aac96efca229b199e1bf79a63256677e1c455792bc2a348b2e409a68ea57dda486740430d4290bb885c3f5a741eb567d4f41f7b2098a726f4df4f88cf899edc7c9b31f584dffedece15a7212642c7dbbdd8d806392a183e1fc30af36169c9bab9e528f0bdcd27ad4c8b6a97849da6452c6809de61848db80c3ba3289e785042cdfd46fbfee5f78adcba2927fcd8cbe9dcaa97190457eaa45d77adbe0db820aff0c8511d837ab5b307bad5f85afd2cc70d9659ec58045d97ced1eb7950670ac559449c0305fddefda1bac88d36629a177f65abad182c6470830b39e7f6dbdef4df813ccaef01d5a42d37213b2b9647e2ff56a63e6b6a4b6e8a1567bbfd77042102818100eb66f205e8507c78f7167dbef3ddf02fde6a67bd15152609e9296576e28c79678177145ae98e0a2fee58fdb3d626fb6beae3e0ae0b76bc47d16fcdeb16f0caca8a0902779979382609705ae84514de480c2fb2ddda3049347cc1bde9f1a359747079ef3dce020a3c186c90e63bc20b5489a40d768b1c1c35c679edc5662e18c702818100f454ffff95b126b55cb13b68a3841600fc0bc69ff4064f7ceb122495fa972fdb05ca2fa1c6e2e84432f81c96875ab12226e8ce92ba808c4f6325f27ce058791f05db96e623687d3cfc198e748a07521a8c7ee9e7e8faf95b0985be82b867a49f7d5d50fac3881d2c39dedfdbca3ebe847b859c9864cf7a543e4688f5a60118870281806cee737ac65950704daeebbb8c701c709a54d4f28baa00b33f6137a1bf0e5033d4963d2620c3e8f4eb2fe51eee2f95d3079c31e1784e96ac093fdaa33a376d3032961ebd27990fa192669abab715041385082196461c6813d0d37ac5a25afbcf452937cb7ae438c63c6b28d651bae6b1550c446aa1cefd42e9388d0df6cdc80b02818100cac172c33504923bb494fad8e5c0a9c5dd63244bfe63f238969632b82700a95cd71c2694d887d9f92656d0da75ae640a1441e392cda3f94bb3da7cb4f6335527d2639c809467946e34423cfe26c0d6786398ba20922d1b1a59f79bd5bc937d8040b75c890c13fb298548977a3c05ff71cf535c54f66b5a77684a7e4363a3cb2702818100a4d782f35d5a07f9c1f8f9c378564b220387d1e481cc856b631de7637d8bb77c851db070122050ac230dc6e45edf4523471c717c1cb86a36b2fd3358fae349d51be54d71d7dbeaa6af668323e2b51933f0b8488aa12723e0f32207068b4aa64ed54bcef4acbbbe35b92802faba7ed45ae52bef8313d9ef4393ccc5cf868ddbf8"))
540
541
542
543
544 var testRSAPSSCertificate = fromHex("308202583082018da003020102021100f29926eb87ea8a0db9fcc247347c11b0304106092a864886f70d01010a3034a00f300d06096086480165030402010500a11c301a06092a864886f70d010108300d06096086480165030402010500a20302012030123110300e060355040a130741636d6520436f301e170d3137313132333136313631305a170d3138313132333136313631305a30123110300e060355040a130741636d6520436f30819f300d06092a864886f70d010101050003818d0030818902818100db467d932e12270648bc062821ab7ec4b6a25dfe1e5245887a3647a5080d92425bc281c0be97799840fb4f6d14fd2b138bc2a52e67d8d4099ed62238b74a0b74732bc234f1d193e596d9747bf3589f6c613cc0b041d4d92b2b2423775b1c3bbd755dce2054cfa163871d1e24c4f31d1a508baab61443ed97a77562f414c852d70203010001a3463044300e0603551d0f0101ff0404030205a030130603551d25040c300a06082b06010505070301300c0603551d130101ff04023000300f0603551d110408300687047f000001304106092a864886f70d01010a3034a00f300d06096086480165030402010500a11c301a06092a864886f70d010108300d06096086480165030402010500a20302012003818100cdac4ef2ce5f8d79881042707f7cbf1b5a8a00ef19154b40151771006cd41626e5496d56da0c1a139fd84695593cb67f87765e18aa03ea067522dd78d2a589b8c92364e12838ce346c6e067b51f1a7e6f4b37ffab13f1411896679d18e880e0ba09e302ac067efca460288e9538122692297ad8093d4f7dd701424d7700a46a1")
545
546 var testECDSACertificate = fromHex("3082020030820162020900b8bf2d47a0d2ebf4300906072a8648ce3d04013045310b3009060355040613024155311330110603550408130a536f6d652d53746174653121301f060355040a1318496e7465726e6574205769646769747320507479204c7464301e170d3132313132323135303633325a170d3232313132303135303633325a3045310b3009060355040613024155311330110603550408130a536f6d652d53746174653121301f060355040a1318496e7465726e6574205769646769747320507479204c746430819b301006072a8648ce3d020106052b81040023038186000400c4a1edbe98f90b4873367ec316561122f23d53c33b4d213dcd6b75e6f6b0dc9adf26c1bcb287f072327cb3642f1c90bcea6823107efee325c0483a69e0286dd33700ef0462dd0da09c706283d881d36431aa9e9731bd96b068c09b23de76643f1a5c7fe9120e5858b65f70dd9bd8ead5d7f5d5ccb9b69f30665b669a20e227e5bffe3b300906072a8648ce3d040103818c0030818802420188a24febe245c5487d1bacf5ed989dae4770c05e1bb62fbdf1b64db76140d311a2ceee0b7e927eff769dc33b7ea53fcefa10e259ec472d7cacda4e970e15a06fd00242014dfcbe67139c2d050ebd3fa38c25c13313830d9406bbd4377af6ec7ac9862eddd711697f857c56defb31782be4c7780daecbbe9e4e3624317b6a0f399512078f2a")
547
548 var testEd25519Certificate = fromHex("3082012e3081e1a00302010202100f431c425793941de987e4f1ad15005d300506032b657030123110300e060355040a130741636d6520436f301e170d3139303531363231333830315a170d3230303531353231333830315a30123110300e060355040a130741636d6520436f302a300506032b65700321003fe2152ee6e3ef3f4e854a7577a3649eede0bf842ccc92268ffa6f3483aaec8fa34d304b300e0603551d0f0101ff0404030205a030130603551d25040c300a06082b06010505070301300c0603551d130101ff0402300030160603551d11040f300d820b6578616d706c652e636f6d300506032b65700341006344ed9cc4be5324539fd2108d9fe82108909539e50dc155ff2c16b71dfcab7d4dd4e09313d0a942e0b66bfe5d6748d79f50bc6ccd4b03837cf20858cdaccf0c")
549
550 var testSNICertificate = fromHex("0441883421114c81480804c430820237308201a0a003020102020900e8f09d3fe25beaa6300d06092a864886f70d01010b0500301f310b3009060355040a1302476f3110300e06035504031307476f20526f6f74301e170d3136303130313030303030305a170d3235303130313030303030305a3023310b3009060355040a1302476f311430120603550403130b736e69746573742e636f6d30819f300d06092a864886f70d010101050003818d0030818902818100db467d932e12270648bc062821ab7ec4b6a25dfe1e5245887a3647a5080d92425bc281c0be97799840fb4f6d14fd2b138bc2a52e67d8d4099ed62238b74a0b74732bc234f1d193e596d9747bf3589f6c613cc0b041d4d92b2b2423775b1c3bbd755dce2054cfa163871d1e24c4f31d1a508baab61443ed97a77562f414c852d70203010001a3773075300e0603551d0f0101ff0404030205a0301d0603551d250416301406082b0601050507030106082b06010505070302300c0603551d130101ff0402300030190603551d0e041204109f91161f43433e49a6de6db680d79f60301b0603551d230414301280104813494d137e1631bba301d5acab6e7b300d06092a864886f70d01010b0500038181007beeecff0230dbb2e7a334af65430b7116e09f327c3bbf918107fc9c66cb497493207ae9b4dbb045cb63d605ec1b5dd485bb69124d68fa298dc776699b47632fd6d73cab57042acb26f083c4087459bc5a3bb3ca4d878d7fe31016b7bc9a627438666566e3389bfaeebe6becc9a0093ceed18d0f9ac79d56f3a73f18188988ed")
551
552 var testP256Certificate = fromHex("308201693082010ea00302010202105012dc24e1124ade4f3e153326ff27bf300a06082a8648ce3d04030230123110300e060355040a130741636d6520436f301e170d3137303533313232343934375a170d3138303533313232343934375a30123110300e060355040a130741636d6520436f3059301306072a8648ce3d020106082a8648ce3d03010703420004c02c61c9b16283bbcc14956d886d79b358aa614596975f78cece787146abf74c2d5dc578c0992b4f3c631373479ebf3892efe53d21c4f4f1cc9a11c3536b7f75a3463044300e0603551d0f0101ff0404030205a030130603551d25040c300a06082b06010505070301300c0603551d130101ff04023000300f0603551d1104083006820474657374300a06082a8648ce3d0403020349003046022100963712d6226c7b2bef41512d47e1434131aaca3ba585d666c924df71ac0448b3022100f4d05c725064741aef125f243cdbccaa2a5d485927831f221c43023bd5ae471a")
553
554 var testRSAPrivateKey, _ = x509.ParsePKCS1PrivateKey(fromHex("3082025b02010002818100db467d932e12270648bc062821ab7ec4b6a25dfe1e5245887a3647a5080d92425bc281c0be97799840fb4f6d14fd2b138bc2a52e67d8d4099ed62238b74a0b74732bc234f1d193e596d9747bf3589f6c613cc0b041d4d92b2b2423775b1c3bbd755dce2054cfa163871d1e24c4f31d1a508baab61443ed97a77562f414c852d702030100010281800b07fbcf48b50f1388db34b016298b8217f2092a7c9a04f77db6775a3d1279b62ee9951f7e371e9de33f015aea80660760b3951dc589a9f925ed7de13e8f520e1ccbc7498ce78e7fab6d59582c2386cc07ed688212a576ff37833bd5943483b5554d15a0b9b4010ed9bf09f207e7e9805f649240ed6c1256ed75ab7cd56d9671024100fded810da442775f5923debae4ac758390a032a16598d62f059bb2e781a9c2f41bfa015c209f966513fe3bf5a58717cbdb385100de914f88d649b7d15309fa49024100dd10978c623463a1802c52f012cfa72ff5d901f25a2292446552c2568b1840e49a312e127217c2186615aae4fb6602a4f6ebf3f3d160f3b3ad04c592f65ae41f02400c69062ca781841a09de41ed7a6d9f54adc5d693a2c6847949d9e1358555c9ac6a8d9e71653ac77beb2d3abaf7bb1183aa14278956575dbebf525d0482fd72d90240560fe1900ba36dae3022115fd952f2399fb28e2975a1c3e3d0b679660bdcb356cc189d611cfdd6d87cd5aea45aa30a2082e8b51e94c2f3dd5d5c6036a8a615ed0240143993d80ece56f877cb80048335701eb0e608cc0c1ca8c2227b52edf8f1ac99c562f2541b5ce81f0515af1c5b4770dba53383964b4b725ff46fdec3d08907df"))
555
556 var testECDSAPrivateKey, _ = x509.ParseECPrivateKey(fromHex("3081dc0201010442019883e909ad0ac9ea3d33f9eae661f1785206970f8ca9a91672f1eedca7a8ef12bd6561bb246dda5df4b4d5e7e3a92649bc5d83a0bf92972e00e62067d0c7bd99d7a00706052b81040023a18189038186000400c4a1edbe98f90b4873367ec316561122f23d53c33b4d213dcd6b75e6f6b0dc9adf26c1bcb287f072327cb3642f1c90bcea6823107efee325c0483a69e0286dd33700ef0462dd0da09c706283d881d36431aa9e9731bd96b068c09b23de76643f1a5c7fe9120e5858b65f70dd9bd8ead5d7f5d5ccb9b69f30665b669a20e227e5bffe3b"))
557
558 var testP256PrivateKey, _ = x509.ParseECPrivateKey(fromHex("30770201010420012f3b52bc54c36ba3577ad45034e2e8efe1e6999851284cb848725cfe029991a00a06082a8648ce3d030107a14403420004c02c61c9b16283bbcc14956d886d79b358aa614596975f78cece787146abf74c2d5dc578c0992b4f3c631373479ebf3892efe53d21c4f4f1cc9a11c3536b7f75"))
559
560 var testEd25519PrivateKey = ed25519.PrivateKey(fromHex("3a884965e76b3f55e5faf9615458a92354894234de3ec9f684d46d55cebf3dc63fe2152ee6e3ef3f4e854a7577a3649eede0bf842ccc92268ffa6f3483aaec8f"))
561
562 const clientCertificatePEM = `
563 -----BEGIN CERTIFICATE-----
564 MIIB7zCCAVigAwIBAgIQXBnBiWWDVW/cC8m5k5/pvDANBgkqhkiG9w0BAQsFADAS
565 MRAwDgYDVQQKEwdBY21lIENvMB4XDTE2MDgxNzIxNTIzMVoXDTE3MDgxNzIxNTIz
566 MVowEjEQMA4GA1UEChMHQWNtZSBDbzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
567 gYEAum+qhr3Pv5/y71yUYHhv6BPy0ZZvzdkybiI3zkH5yl0prOEn2mGi7oHLEMff
568 NFiVhuk9GeZcJ3NgyI14AvQdpJgJoxlwaTwlYmYqqyIjxXuFOE8uCXMyp70+m63K
569 hAfmDzr/d8WdQYUAirab7rCkPy1MTOZCPrtRyN1IVPQMjkcCAwEAAaNGMEQwDgYD
570 VR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAw
571 DwYDVR0RBAgwBocEfwAAATANBgkqhkiG9w0BAQsFAAOBgQBGq0Si+yhU+Fpn+GKU
572 8ZqyGJ7ysd4dfm92lam6512oFmyc9wnTN+RLKzZ8Aa1B0jLYw9KT+RBrjpW5LBeK
573 o0RIvFkTgxYEiKSBXCUNmAysEbEoVr4dzWFihAm/1oDGRY2CLLTYg5vbySK3KhIR
574 e/oCO8HJ/+rJnahJ05XX1Q7lNQ==
575 -----END CERTIFICATE-----`
576
577 var clientKeyPEM = testingKey(`
578 -----BEGIN RSA TESTING KEY-----
579 MIICXQIBAAKBgQC6b6qGvc+/n/LvXJRgeG/oE/LRlm/N2TJuIjfOQfnKXSms4Sfa
580 YaLugcsQx980WJWG6T0Z5lwnc2DIjXgC9B2kmAmjGXBpPCViZiqrIiPFe4U4Ty4J
581 czKnvT6brcqEB+YPOv93xZ1BhQCKtpvusKQ/LUxM5kI+u1HI3UhU9AyORwIDAQAB
582 AoGAEJZ03q4uuMb7b26WSQsOMeDsftdatT747LGgs3pNRkMJvTb/O7/qJjxoG+Mc
583 qeSj0TAZXp+PXXc3ikCECAc+R8rVMfWdmp903XgO/qYtmZGCorxAHEmR80SrfMXv
584 PJnznLQWc8U9nphQErR+tTESg7xWEzmFcPKwnZd1xg8ERYkCQQDTGtrFczlB2b/Z
585 9TjNMqUlMnTLIk/a/rPE2fLLmAYhK5sHnJdvDURaH2mF4nso0EGtENnTsh6LATnY
586 dkrxXGm9AkEA4hXHG2q3MnhgK1Z5hjv+Fnqd+8bcbII9WW4flFs15EKoMgS1w/PJ
587 zbsySaSy5IVS8XeShmT9+3lrleed4sy+UwJBAJOOAbxhfXP5r4+5R6ql66jES75w
588 jUCVJzJA5ORJrn8g64u2eGK28z/LFQbv9wXgCwfc72R468BdawFSLa/m2EECQGbZ
589 rWiFla26IVXV0xcD98VWJsTBZMlgPnSOqoMdM1kSEd4fUmlAYI/dFzV1XYSkOmVr
590 FhdZnklmpVDeu27P4c0CQQCuCOup0FlJSBpWY1TTfun/KMBkBatMz0VMA3d7FKIU
591 csPezl677Yjo8u1r/KzeI6zLg87Z8E6r6ZWNc9wBSZK6
592 -----END RSA TESTING KEY-----`)
593
594 const clientECDSACertificatePEM = `
595 -----BEGIN CERTIFICATE-----
596 MIIB/DCCAV4CCQCaMIRsJjXZFzAJBgcqhkjOPQQBMEUxCzAJBgNVBAYTAkFVMRMw
597 EQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0
598 eSBMdGQwHhcNMTIxMTE0MTMyNTUzWhcNMjIxMTEyMTMyNTUzWjBBMQswCQYDVQQG
599 EwJBVTEMMAoGA1UECBMDTlNXMRAwDgYDVQQHEwdQeXJtb250MRIwEAYDVQQDEwlK
600 b2VsIFNpbmcwgZswEAYHKoZIzj0CAQYFK4EEACMDgYYABACVjJF1FMBexFe01MNv
601 ja5oHt1vzobhfm6ySD6B5U7ixohLZNz1MLvT/2XMW/TdtWo+PtAd3kfDdq0Z9kUs
602 jLzYHQFMH3CQRnZIi4+DzEpcj0B22uCJ7B0rxE4wdihBsmKo+1vx+U56jb0JuK7q
603 ixgnTy5w/hOWusPTQBbNZU6sER7m8TAJBgcqhkjOPQQBA4GMADCBiAJCAOAUxGBg
604 C3JosDJdYUoCdFzCgbkWqD8pyDbHgf9stlvZcPE4O1BIKJTLCRpS8V3ujfK58PDa
605 2RU6+b0DeoeiIzXsAkIBo9SKeDUcSpoj0gq+KxAxnZxfvuiRs9oa9V2jI/Umi0Vw
606 jWVim34BmT0Y9hCaOGGbLlfk+syxis7iI6CH8OFnUes=
607 -----END CERTIFICATE-----`
608
609 var clientECDSAKeyPEM = testingKey(`
610 -----BEGIN EC PARAMETERS-----
611 BgUrgQQAIw==
612 -----END EC PARAMETERS-----
613 -----BEGIN EC TESTING KEY-----
614 MIHcAgEBBEIBkJN9X4IqZIguiEVKMqeBUP5xtRsEv4HJEtOpOGLELwO53SD78Ew8
615 k+wLWoqizS3NpQyMtrU8JFdWfj+C57UNkOugBwYFK4EEACOhgYkDgYYABACVjJF1
616 FMBexFe01MNvja5oHt1vzobhfm6ySD6B5U7ixohLZNz1MLvT/2XMW/TdtWo+PtAd
617 3kfDdq0Z9kUsjLzYHQFMH3CQRnZIi4+DzEpcj0B22uCJ7B0rxE4wdihBsmKo+1vx
618 +U56jb0JuK7qixgnTy5w/hOWusPTQBbNZU6sER7m8Q==
619 -----END EC TESTING KEY-----`)
620
621 const clientEd25519CertificatePEM = `
622 -----BEGIN CERTIFICATE-----
623 MIIBLjCB4aADAgECAhAX0YGTviqMISAQJRXoNCNPMAUGAytlcDASMRAwDgYDVQQK
624 EwdBY21lIENvMB4XDTE5MDUxNjIxNTQyNloXDTIwMDUxNTIxNTQyNlowEjEQMA4G
625 A1UEChMHQWNtZSBDbzAqMAUGAytlcAMhAAvgtWC14nkwPb7jHuBQsQTIbcd4bGkv
626 xRStmmNveRKRo00wSzAOBgNVHQ8BAf8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUH
627 AwIwDAYDVR0TAQH/BAIwADAWBgNVHREEDzANggtleGFtcGxlLmNvbTAFBgMrZXAD
628 QQD8GRcqlKUx+inILn9boF2KTjRAOdazENwZ/qAicbP1j6FYDc308YUkv+Y9FN/f
629 7Q7hF9gRomDQijcjKsJGqjoI
630 -----END CERTIFICATE-----`
631
632 var clientEd25519KeyPEM = testingKey(`
633 -----BEGIN TESTING KEY-----
634 MC4CAQAwBQYDK2VwBCIEINifzf07d9qx3d44e0FSbV4mC/xQxT644RRbpgNpin7I
635 -----END TESTING KEY-----`)
636
637 func TestServerHelloTrailingMessage(t *testing.T) {
638
639
640
641
642
643
644 c, s := localPipe(t)
645 go func() {
646 ctx := context.Background()
647 srv := Server(s, testConfig)
648 clientHello, _, err := srv.readClientHello(ctx)
649 if err != nil {
650 testFatal(t, err)
651 }
652
653 hs := serverHandshakeStateTLS13{
654 c: srv,
655 ctx: ctx,
656 clientHello: clientHello,
657 }
658 if err := hs.processClientHello(); err != nil {
659 testFatal(t, err)
660 }
661 if err := transcriptMsg(hs.clientHello, hs.transcript); err != nil {
662 testFatal(t, err)
663 }
664
665 record, err := concatHandshakeMessages(hs.hello, &encryptedExtensionsMsg{alpnProtocol: "h2"})
666 if err != nil {
667 testFatal(t, err)
668 }
669
670 if _, err := s.Write(record); err != nil {
671 testFatal(t, err)
672 }
673 srv.Close()
674 }()
675
676 cli := Client(c, testConfig)
677 expectedErr := "tls: handshake buffer not empty before setting read traffic secret"
678 if err := cli.Handshake(); err == nil {
679 t.Fatal("expected error from incomplete handshake, got nil")
680 } else if err.Error() != expectedErr {
681 t.Fatalf("expected error %q, got %q", expectedErr, err.Error())
682 }
683 }
684
685 func TestClientHelloTrailingMessage(t *testing.T) {
686
687
688 c, s := localPipe(t)
689 go func() {
690 cli := Client(c, testConfig)
691
692 hello, _, _, err := cli.makeClientHello()
693 if err != nil {
694 testFatal(t, err)
695 }
696
697 record, err := concatHandshakeMessages(hello, &certificateMsgTLS13{})
698 if err != nil {
699 testFatal(t, err)
700 }
701
702 if _, err := c.Write(record); err != nil {
703 testFatal(t, err)
704 }
705 cli.Close()
706 }()
707
708 srv := Server(s, testConfig)
709 expectedErr := "tls: handshake buffer not empty before setting read traffic secret"
710 if err := srv.Handshake(); err == nil {
711 t.Fatal("expected error from incomplete handshake, got nil")
712 } else if err.Error() != expectedErr {
713 t.Fatalf("expected error %q, got %q", expectedErr, err.Error())
714 }
715 }
716
717 func TestDoubleClientHelloHRR(t *testing.T) {
718
719
720
721
722 c, s := localPipe(t)
723
724 go func() {
725 cli := Client(c, testConfig)
726
727 hello, _, _, err := cli.makeClientHello()
728 if err != nil {
729 testFatal(t, err)
730 }
731 hello.keyShares = nil
732
733 record, err := concatHandshakeMessages(hello, hello)
734 if err != nil {
735 testFatal(t, err)
736 }
737
738 if _, err := c.Write(record); err != nil {
739 testFatal(t, err)
740 }
741 cli.Close()
742 }()
743
744 srv := Server(s, testConfig)
745 expectedErr := "tls: handshake buffer not empty before HelloRetryRequest"
746 if err := srv.Handshake(); err == nil {
747 t.Fatal("expected error from incomplete handshake, got nil")
748 } else if err.Error() != expectedErr {
749 t.Fatalf("expected error %q, got %q", expectedErr, err.Error())
750 }
751 }
752
753
754
755 func concatHandshakeMessages(msgs ...handshakeMessage) ([]byte, error) {
756 var marshalled []byte
757 for _, msg := range msgs {
758 data, err := msg.marshal()
759 if err != nil {
760 return nil, err
761 }
762 marshalled = append(marshalled, data...)
763 }
764 m := len(marshalled)
765 outBuf := make([]byte, recordHeaderLen)
766 outBuf[0] = byte(recordTypeHandshake)
767 vers := VersionTLS12
768 outBuf[1] = byte(vers >> 8)
769 outBuf[2] = byte(vers)
770 outBuf[3] = byte(m >> 8)
771 outBuf[4] = byte(m)
772 outBuf = append(outBuf, marshalled...)
773 return outBuf, nil
774 }
775
View as plain text