github.com/guyezi/gofrontend@v0.0.0-20200228202240-7a62a49e62c0/libgo/go/crypto/tls/handshake_test.go (about) 1 // Copyright 2013 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package tls 6 7 import ( 8 "bufio" 9 "crypto/ed25519" 10 "crypto/x509" 11 "encoding/hex" 12 "errors" 13 "flag" 14 "fmt" 15 "io" 16 "io/ioutil" 17 "net" 18 "os" 19 "os/exec" 20 "runtime" 21 "strconv" 22 "strings" 23 "sync" 24 "testing" 25 "time" 26 ) 27 28 // TLS reference tests run a connection against a reference implementation 29 // (OpenSSL) of TLS and record the bytes of the resulting connection. The Go 30 // code, during a test, is configured with deterministic randomness and so the 31 // reference test can be reproduced exactly in the future. 32 // 33 // In order to save everyone who wishes to run the tests from needing the 34 // reference implementation installed, the reference connections are saved in 35 // files in the testdata directory. Thus running the tests involves nothing 36 // external, but creating and updating them requires the reference 37 // implementation. 38 // 39 // Tests can be updated by running them with the -update flag. This will cause 40 // the test files for failing tests to be regenerated. Since the reference 41 // implementation will always generate fresh random numbers, large parts of the 42 // reference connection will always change. 43 44 var ( 45 update = flag.Bool("update", false, "update golden files on failure") 46 fast = flag.Bool("fast", false, "impose a quick, possibly flaky timeout on recorded tests") 47 keyFile = flag.String("keylog", "", "destination file for KeyLogWriter") 48 ) 49 50 func runTestAndUpdateIfNeeded(t *testing.T, name string, run func(t *testing.T, update bool), wait bool) { 51 success := t.Run(name, func(t *testing.T) { 52 if !*update && !wait { 53 t.Parallel() 54 } 55 run(t, false) 56 }) 57 58 if !success && *update { 59 t.Run(name+"#update", func(t *testing.T) { 60 run(t, true) 61 }) 62 } 63 } 64 65 // checkOpenSSLVersion ensures that the version of OpenSSL looks reasonable 66 // before updating the test data. 67 func checkOpenSSLVersion() error { 68 if !*update { 69 return nil 70 } 71 72 openssl := exec.Command("openssl", "version") 73 output, err := openssl.CombinedOutput() 74 if err != nil { 75 return err 76 } 77 78 version := string(output) 79 if strings.HasPrefix(version, "OpenSSL 1.1.1") { 80 return nil 81 } 82 83 println("***********************************************") 84 println("") 85 println("You need to build OpenSSL 1.1.1 from source in order") 86 println("to update the test data.") 87 println("") 88 println("Configure it with:") 89 println("./Configure enable-weak-ssl-ciphers") 90 println("and then add the apps/ directory at the front of your PATH.") 91 println("***********************************************") 92 93 return errors.New("version of OpenSSL does not appear to be suitable for updating test data") 94 } 95 96 // recordingConn is a net.Conn that records the traffic that passes through it. 97 // WriteTo can be used to produce output that can be later be loaded with 98 // ParseTestData. 99 type recordingConn struct { 100 net.Conn 101 sync.Mutex 102 flows [][]byte 103 reading bool 104 } 105 106 func (r *recordingConn) Read(b []byte) (n int, err error) { 107 if n, err = r.Conn.Read(b); n == 0 { 108 return 109 } 110 b = b[:n] 111 112 r.Lock() 113 defer r.Unlock() 114 115 if l := len(r.flows); l == 0 || !r.reading { 116 buf := make([]byte, len(b)) 117 copy(buf, b) 118 r.flows = append(r.flows, buf) 119 } else { 120 r.flows[l-1] = append(r.flows[l-1], b[:n]...) 121 } 122 r.reading = true 123 return 124 } 125 126 func (r *recordingConn) Write(b []byte) (n int, err error) { 127 if n, err = r.Conn.Write(b); n == 0 { 128 return 129 } 130 b = b[:n] 131 132 r.Lock() 133 defer r.Unlock() 134 135 if l := len(r.flows); l == 0 || r.reading { 136 buf := make([]byte, len(b)) 137 copy(buf, b) 138 r.flows = append(r.flows, buf) 139 } else { 140 r.flows[l-1] = append(r.flows[l-1], b[:n]...) 141 } 142 r.reading = false 143 return 144 } 145 146 // WriteTo writes Go source code to w that contains the recorded traffic. 147 func (r *recordingConn) WriteTo(w io.Writer) (int64, error) { 148 // TLS always starts with a client to server flow. 149 clientToServer := true 150 var written int64 151 for i, flow := range r.flows { 152 source, dest := "client", "server" 153 if !clientToServer { 154 source, dest = dest, source 155 } 156 n, err := fmt.Fprintf(w, ">>> Flow %d (%s to %s)\n", i+1, source, dest) 157 written += int64(n) 158 if err != nil { 159 return written, err 160 } 161 dumper := hex.Dumper(w) 162 n, err = dumper.Write(flow) 163 written += int64(n) 164 if err != nil { 165 return written, err 166 } 167 err = dumper.Close() 168 if err != nil { 169 return written, err 170 } 171 clientToServer = !clientToServer 172 } 173 return written, nil 174 } 175 176 func parseTestData(r io.Reader) (flows [][]byte, err error) { 177 var currentFlow []byte 178 179 scanner := bufio.NewScanner(r) 180 for scanner.Scan() { 181 line := scanner.Text() 182 // If the line starts with ">>> " then it marks the beginning 183 // of a new flow. 184 if strings.HasPrefix(line, ">>> ") { 185 if len(currentFlow) > 0 || len(flows) > 0 { 186 flows = append(flows, currentFlow) 187 currentFlow = nil 188 } 189 continue 190 } 191 192 // Otherwise the line is a line of hex dump that looks like: 193 // 00000170 fc f5 06 bf (...) |.....X{&?......!| 194 // (Some bytes have been omitted from the middle section.) 195 196 if i := strings.IndexByte(line, ' '); i >= 0 { 197 line = line[i:] 198 } else { 199 return nil, errors.New("invalid test data") 200 } 201 202 if i := strings.IndexByte(line, '|'); i >= 0 { 203 line = line[:i] 204 } else { 205 return nil, errors.New("invalid test data") 206 } 207 208 hexBytes := strings.Fields(line) 209 for _, hexByte := range hexBytes { 210 val, err := strconv.ParseUint(hexByte, 16, 8) 211 if err != nil { 212 return nil, errors.New("invalid hex byte in test data: " + err.Error()) 213 } 214 currentFlow = append(currentFlow, byte(val)) 215 } 216 } 217 218 if len(currentFlow) > 0 { 219 flows = append(flows, currentFlow) 220 } 221 222 return flows, nil 223 } 224 225 // tempFile creates a temp file containing contents and returns its path. 226 func tempFile(contents string) string { 227 file, err := ioutil.TempFile("", "go-tls-test") 228 if err != nil { 229 panic("failed to create temp file: " + err.Error()) 230 } 231 path := file.Name() 232 file.WriteString(contents) 233 file.Close() 234 return path 235 } 236 237 // localListener is set up by TestMain and used by localPipe to create Conn 238 // pairs like net.Pipe, but connected by an actual buffered TCP connection. 239 var localListener struct { 240 mu sync.Mutex 241 addr net.Addr 242 ch chan net.Conn 243 } 244 245 const localFlakes = 0 // change to 1 or 2 to exercise localServer/localPipe handling of mismatches 246 247 func localServer(l net.Listener) { 248 for n := 0; ; n++ { 249 c, err := l.Accept() 250 if err != nil { 251 return 252 } 253 if localFlakes == 1 && n%2 == 0 { 254 c.Close() 255 continue 256 } 257 localListener.ch <- c 258 } 259 } 260 261 var isConnRefused = func(err error) bool { return false } 262 263 func localPipe(t testing.TB) (net.Conn, net.Conn) { 264 localListener.mu.Lock() 265 defer localListener.mu.Unlock() 266 267 addr := localListener.addr 268 269 var err error 270 Dialing: 271 // We expect a rare mismatch, but probably not 5 in a row. 272 for i := 0; i < 5; i++ { 273 tooSlow := time.NewTimer(1 * time.Second) 274 defer tooSlow.Stop() 275 var c1 net.Conn 276 c1, err = net.Dial(addr.Network(), addr.String()) 277 if err != nil { 278 if runtime.GOOS == "dragonfly" && (isConnRefused(err) || os.IsTimeout(err)) { 279 // golang.org/issue/29583: Dragonfly sometimes returns a spurious 280 // ECONNREFUSED or ETIMEDOUT. 281 <-tooSlow.C 282 continue 283 } 284 t.Fatalf("localPipe: %v", err) 285 } 286 if localFlakes == 2 && i == 0 { 287 c1.Close() 288 continue 289 } 290 for { 291 select { 292 case <-tooSlow.C: 293 t.Logf("localPipe: timeout waiting for %v", c1.LocalAddr()) 294 c1.Close() 295 continue Dialing 296 297 case c2 := <-localListener.ch: 298 if c2.RemoteAddr().String() == c1.LocalAddr().String() { 299 return c1, c2 300 } 301 t.Logf("localPipe: unexpected connection: %v != %v", c2.RemoteAddr(), c1.LocalAddr()) 302 c2.Close() 303 } 304 } 305 } 306 307 t.Fatalf("localPipe: failed to connect: %v", err) 308 panic("unreachable") 309 } 310 311 // zeroSource is an io.Reader that returns an unlimited number of zero bytes. 312 type zeroSource struct{} 313 314 func (zeroSource) Read(b []byte) (n int, err error) { 315 for i := range b { 316 b[i] = 0 317 } 318 319 return len(b), nil 320 } 321 322 func allCipherSuites() []uint16 { 323 ids := make([]uint16, len(cipherSuites)) 324 for i, suite := range cipherSuites { 325 ids[i] = suite.id 326 } 327 328 return ids 329 } 330 331 var testConfig *Config 332 333 func TestMain(m *testing.M) { 334 flag.Parse() 335 os.Exit(runMain(m)) 336 } 337 338 func runMain(m *testing.M) int { 339 // TLS 1.3 cipher suites preferences are not configurable and change based 340 // on the architecture. Force them to the version with AES acceleration for 341 // test consistency. 342 once.Do(initDefaultCipherSuites) 343 varDefaultCipherSuitesTLS13 = []uint16{ 344 TLS_AES_128_GCM_SHA256, 345 TLS_CHACHA20_POLY1305_SHA256, 346 TLS_AES_256_GCM_SHA384, 347 } 348 349 // Set up localPipe. 350 l, err := net.Listen("tcp", "127.0.0.1:0") 351 if err != nil { 352 l, err = net.Listen("tcp6", "[::1]:0") 353 } 354 if err != nil { 355 fmt.Fprintf(os.Stderr, "Failed to open local listener: %v", err) 356 os.Exit(1) 357 } 358 localListener.ch = make(chan net.Conn) 359 localListener.addr = l.Addr() 360 defer l.Close() 361 go localServer(l) 362 363 if err := checkOpenSSLVersion(); err != nil { 364 fmt.Fprintf(os.Stderr, "Error: %v", err) 365 os.Exit(1) 366 } 367 368 testConfig = &Config{ 369 Time: func() time.Time { return time.Unix(0, 0) }, 370 Rand: zeroSource{}, 371 Certificates: make([]Certificate, 2), 372 InsecureSkipVerify: true, 373 CipherSuites: allCipherSuites(), 374 } 375 testConfig.Certificates[0].Certificate = [][]byte{testRSACertificate} 376 testConfig.Certificates[0].PrivateKey = testRSAPrivateKey 377 testConfig.Certificates[1].Certificate = [][]byte{testSNICertificate} 378 testConfig.Certificates[1].PrivateKey = testRSAPrivateKey 379 testConfig.BuildNameToCertificate() 380 if *keyFile != "" { 381 f, err := os.OpenFile(*keyFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) 382 if err != nil { 383 panic("failed to open -keylog file: " + err.Error()) 384 } 385 testConfig.KeyLogWriter = f 386 defer f.Close() 387 } 388 389 return m.Run() 390 } 391 392 func testHandshake(t *testing.T, clientConfig, serverConfig *Config) (serverState, clientState ConnectionState, err error) { 393 const sentinel = "SENTINEL\n" 394 c, s := localPipe(t) 395 errChan := make(chan error) 396 go func() { 397 cli := Client(c, clientConfig) 398 err := cli.Handshake() 399 if err != nil { 400 errChan <- fmt.Errorf("client: %v", err) 401 c.Close() 402 return 403 } 404 defer cli.Close() 405 clientState = cli.ConnectionState() 406 buf, err := ioutil.ReadAll(cli) 407 if err != nil { 408 t.Errorf("failed to call cli.Read: %v", err) 409 } 410 if got := string(buf); got != sentinel { 411 t.Errorf("read %q from TLS connection, but expected %q", got, sentinel) 412 } 413 errChan <- nil 414 }() 415 server := Server(s, serverConfig) 416 err = server.Handshake() 417 if err == nil { 418 serverState = server.ConnectionState() 419 if _, err := io.WriteString(server, sentinel); err != nil { 420 t.Errorf("failed to call server.Write: %v", err) 421 } 422 if err := server.Close(); err != nil { 423 t.Errorf("failed to call server.Close: %v", err) 424 } 425 err = <-errChan 426 } else { 427 s.Close() 428 <-errChan 429 } 430 return 431 } 432 433 func fromHex(s string) []byte { 434 b, _ := hex.DecodeString(s) 435 return b 436 } 437 438 var testRSACertificate = fromHex("3082024b308201b4a003020102020900e8f09d3fe25beaa6300d06092a864886f70d01010b0500301f310b3009060355040a1302476f3110300e06035504031307476f20526f6f74301e170d3136303130313030303030305a170d3235303130313030303030305a301a310b3009060355040a1302476f310b300906035504031302476f30819f300d06092a864886f70d010101050003818d0030818902818100db467d932e12270648bc062821ab7ec4b6a25dfe1e5245887a3647a5080d92425bc281c0be97799840fb4f6d14fd2b138bc2a52e67d8d4099ed62238b74a0b74732bc234f1d193e596d9747bf3589f6c613cc0b041d4d92b2b2423775b1c3bbd755dce2054cfa163871d1e24c4f31d1a508baab61443ed97a77562f414c852d70203010001a38193308190300e0603551d0f0101ff0404030205a0301d0603551d250416301406082b0601050507030106082b06010505070302300c0603551d130101ff0402300030190603551d0e041204109f91161f43433e49a6de6db680d79f60301b0603551d230414301280104813494d137e1631bba301d5acab6e7b30190603551d1104123010820e6578616d706c652e676f6c616e67300d06092a864886f70d01010b0500038181009d30cc402b5b50a061cbbae55358e1ed8328a9581aa938a495a1ac315a1a84663d43d32dd90bf297dfd320643892243a00bccf9c7db74020015faad3166109a276fd13c3cce10c5ceeb18782f16c04ed73bbb343778d0c1cf10fa1d8408361c94c722b9daedb4606064df4c1b33ec0d1bd42d4dbfe3d1360845c21d33be9fae7") 439 440 var testRSACertificateIssuer = fromHex("3082021930820182a003020102020900ca5e4e811a965964300d06092a864886f70d01010b0500301f310b3009060355040a1302476f3110300e06035504031307476f20526f6f74301e170d3136303130313030303030305a170d3235303130313030303030305a301f310b3009060355040a1302476f3110300e06035504031307476f20526f6f7430819f300d06092a864886f70d010101050003818d0030818902818100d667b378bb22f34143b6cd2008236abefaf2852adf3ab05e01329e2c14834f5105df3f3073f99dab5442d45ee5f8f57b0111c8cb682fbb719a86944eebfffef3406206d898b8c1b1887797c9c5006547bb8f00e694b7a063f10839f269f2c34fff7a1f4b21fbcd6bfdfb13ac792d1d11f277b5c5b48600992203059f2a8f8cc50203010001a35d305b300e0603551d0f0101ff040403020204301d0603551d250416301406082b0601050507030106082b06010505070302300f0603551d130101ff040530030101ff30190603551d0e041204104813494d137e1631bba301d5acab6e7b300d06092a864886f70d01010b050003818100c1154b4bab5266221f293766ae4138899bd4c5e36b13cee670ceeaa4cbdf4f6679017e2fe649765af545749fe4249418a56bd38a04b81e261f5ce86b8d5c65413156a50d12449554748c59a30c515bc36a59d38bddf51173e899820b282e40aa78c806526fd184fb6b4cf186ec728edffa585440d2b3225325f7ab580e87dd76") 441 442 // testRSAPSSCertificate has signatureAlgorithm rsassaPss, but subjectPublicKeyInfo 443 // algorithm rsaEncryption, for use with the rsa_pss_rsae_* SignatureSchemes. 444 // See also TestRSAPSSKeyError. testRSAPSSCertificate is self-signed. 445 var testRSAPSSCertificate = fromHex("308202583082018da003020102021100f29926eb87ea8a0db9fcc247347c11b0304106092a864886f70d01010a3034a00f300d06096086480165030402010500a11c301a06092a864886f70d010108300d06096086480165030402010500a20302012030123110300e060355040a130741636d6520436f301e170d3137313132333136313631305a170d3138313132333136313631305a30123110300e060355040a130741636d6520436f30819f300d06092a864886f70d010101050003818d0030818902818100db467d932e12270648bc062821ab7ec4b6a25dfe1e5245887a3647a5080d92425bc281c0be97799840fb4f6d14fd2b138bc2a52e67d8d4099ed62238b74a0b74732bc234f1d193e596d9747bf3589f6c613cc0b041d4d92b2b2423775b1c3bbd755dce2054cfa163871d1e24c4f31d1a508baab61443ed97a77562f414c852d70203010001a3463044300e0603551d0f0101ff0404030205a030130603551d25040c300a06082b06010505070301300c0603551d130101ff04023000300f0603551d110408300687047f000001304106092a864886f70d01010a3034a00f300d06096086480165030402010500a11c301a06092a864886f70d010108300d06096086480165030402010500a20302012003818100cdac4ef2ce5f8d79881042707f7cbf1b5a8a00ef19154b40151771006cd41626e5496d56da0c1a139fd84695593cb67f87765e18aa03ea067522dd78d2a589b8c92364e12838ce346c6e067b51f1a7e6f4b37ffab13f1411896679d18e880e0ba09e302ac067efca460288e9538122692297ad8093d4f7dd701424d7700a46a1") 446 447 var testECDSACertificate = fromHex("3082020030820162020900b8bf2d47a0d2ebf4300906072a8648ce3d04013045310b3009060355040613024155311330110603550408130a536f6d652d53746174653121301f060355040a1318496e7465726e6574205769646769747320507479204c7464301e170d3132313132323135303633325a170d3232313132303135303633325a3045310b3009060355040613024155311330110603550408130a536f6d652d53746174653121301f060355040a1318496e7465726e6574205769646769747320507479204c746430819b301006072a8648ce3d020106052b81040023038186000400c4a1edbe98f90b4873367ec316561122f23d53c33b4d213dcd6b75e6f6b0dc9adf26c1bcb287f072327cb3642f1c90bcea6823107efee325c0483a69e0286dd33700ef0462dd0da09c706283d881d36431aa9e9731bd96b068c09b23de76643f1a5c7fe9120e5858b65f70dd9bd8ead5d7f5d5ccb9b69f30665b669a20e227e5bffe3b300906072a8648ce3d040103818c0030818802420188a24febe245c5487d1bacf5ed989dae4770c05e1bb62fbdf1b64db76140d311a2ceee0b7e927eff769dc33b7ea53fcefa10e259ec472d7cacda4e970e15a06fd00242014dfcbe67139c2d050ebd3fa38c25c13313830d9406bbd4377af6ec7ac9862eddd711697f857c56defb31782be4c7780daecbbe9e4e3624317b6a0f399512078f2a") 448 449 var testEd25519Certificate = fromHex("3082012e3081e1a00302010202100f431c425793941de987e4f1ad15005d300506032b657030123110300e060355040a130741636d6520436f301e170d3139303531363231333830315a170d3230303531353231333830315a30123110300e060355040a130741636d6520436f302a300506032b65700321003fe2152ee6e3ef3f4e854a7577a3649eede0bf842ccc92268ffa6f3483aaec8fa34d304b300e0603551d0f0101ff0404030205a030130603551d25040c300a06082b06010505070301300c0603551d130101ff0402300030160603551d11040f300d820b6578616d706c652e636f6d300506032b65700341006344ed9cc4be5324539fd2108d9fe82108909539e50dc155ff2c16b71dfcab7d4dd4e09313d0a942e0b66bfe5d6748d79f50bc6ccd4b03837cf20858cdaccf0c") 450 451 var testSNICertificate = fromHex("0441883421114c81480804c430820237308201a0a003020102020900e8f09d3fe25beaa6300d06092a864886f70d01010b0500301f310b3009060355040a1302476f3110300e06035504031307476f20526f6f74301e170d3136303130313030303030305a170d3235303130313030303030305a3023310b3009060355040a1302476f311430120603550403130b736e69746573742e636f6d30819f300d06092a864886f70d010101050003818d0030818902818100db467d932e12270648bc062821ab7ec4b6a25dfe1e5245887a3647a5080d92425bc281c0be97799840fb4f6d14fd2b138bc2a52e67d8d4099ed62238b74a0b74732bc234f1d193e596d9747bf3589f6c613cc0b041d4d92b2b2423775b1c3bbd755dce2054cfa163871d1e24c4f31d1a508baab61443ed97a77562f414c852d70203010001a3773075300e0603551d0f0101ff0404030205a0301d0603551d250416301406082b0601050507030106082b06010505070302300c0603551d130101ff0402300030190603551d0e041204109f91161f43433e49a6de6db680d79f60301b0603551d230414301280104813494d137e1631bba301d5acab6e7b300d06092a864886f70d01010b0500038181007beeecff0230dbb2e7a334af65430b7116e09f327c3bbf918107fc9c66cb497493207ae9b4dbb045cb63d605ec1b5dd485bb69124d68fa298dc776699b47632fd6d73cab57042acb26f083c4087459bc5a3bb3ca4d878d7fe31016b7bc9a627438666566e3389bfaeebe6becc9a0093ceed18d0f9ac79d56f3a73f18188988ed") 452 453 var testP256Certificate = fromHex("308201693082010ea00302010202105012dc24e1124ade4f3e153326ff27bf300a06082a8648ce3d04030230123110300e060355040a130741636d6520436f301e170d3137303533313232343934375a170d3138303533313232343934375a30123110300e060355040a130741636d6520436f3059301306072a8648ce3d020106082a8648ce3d03010703420004c02c61c9b16283bbcc14956d886d79b358aa614596975f78cece787146abf74c2d5dc578c0992b4f3c631373479ebf3892efe53d21c4f4f1cc9a11c3536b7f75a3463044300e0603551d0f0101ff0404030205a030130603551d25040c300a06082b06010505070301300c0603551d130101ff04023000300f0603551d1104083006820474657374300a06082a8648ce3d0403020349003046022100963712d6226c7b2bef41512d47e1434131aaca3ba585d666c924df71ac0448b3022100f4d05c725064741aef125f243cdbccaa2a5d485927831f221c43023bd5ae471a") 454 455 var testRSAPrivateKey, _ = x509.ParsePKCS1PrivateKey(fromHex("3082025b02010002818100db467d932e12270648bc062821ab7ec4b6a25dfe1e5245887a3647a5080d92425bc281c0be97799840fb4f6d14fd2b138bc2a52e67d8d4099ed62238b74a0b74732bc234f1d193e596d9747bf3589f6c613cc0b041d4d92b2b2423775b1c3bbd755dce2054cfa163871d1e24c4f31d1a508baab61443ed97a77562f414c852d702030100010281800b07fbcf48b50f1388db34b016298b8217f2092a7c9a04f77db6775a3d1279b62ee9951f7e371e9de33f015aea80660760b3951dc589a9f925ed7de13e8f520e1ccbc7498ce78e7fab6d59582c2386cc07ed688212a576ff37833bd5943483b5554d15a0b9b4010ed9bf09f207e7e9805f649240ed6c1256ed75ab7cd56d9671024100fded810da442775f5923debae4ac758390a032a16598d62f059bb2e781a9c2f41bfa015c209f966513fe3bf5a58717cbdb385100de914f88d649b7d15309fa49024100dd10978c623463a1802c52f012cfa72ff5d901f25a2292446552c2568b1840e49a312e127217c2186615aae4fb6602a4f6ebf3f3d160f3b3ad04c592f65ae41f02400c69062ca781841a09de41ed7a6d9f54adc5d693a2c6847949d9e1358555c9ac6a8d9e71653ac77beb2d3abaf7bb1183aa14278956575dbebf525d0482fd72d90240560fe1900ba36dae3022115fd952f2399fb28e2975a1c3e3d0b679660bdcb356cc189d611cfdd6d87cd5aea45aa30a2082e8b51e94c2f3dd5d5c6036a8a615ed0240143993d80ece56f877cb80048335701eb0e608cc0c1ca8c2227b52edf8f1ac99c562f2541b5ce81f0515af1c5b4770dba53383964b4b725ff46fdec3d08907df")) 456 457 var testECDSAPrivateKey, _ = x509.ParseECPrivateKey(fromHex("3081dc0201010442019883e909ad0ac9ea3d33f9eae661f1785206970f8ca9a91672f1eedca7a8ef12bd6561bb246dda5df4b4d5e7e3a92649bc5d83a0bf92972e00e62067d0c7bd99d7a00706052b81040023a18189038186000400c4a1edbe98f90b4873367ec316561122f23d53c33b4d213dcd6b75e6f6b0dc9adf26c1bcb287f072327cb3642f1c90bcea6823107efee325c0483a69e0286dd33700ef0462dd0da09c706283d881d36431aa9e9731bd96b068c09b23de76643f1a5c7fe9120e5858b65f70dd9bd8ead5d7f5d5ccb9b69f30665b669a20e227e5bffe3b")) 458 459 var testP256PrivateKey, _ = x509.ParseECPrivateKey(fromHex("30770201010420012f3b52bc54c36ba3577ad45034e2e8efe1e6999851284cb848725cfe029991a00a06082a8648ce3d030107a14403420004c02c61c9b16283bbcc14956d886d79b358aa614596975f78cece787146abf74c2d5dc578c0992b4f3c631373479ebf3892efe53d21c4f4f1cc9a11c3536b7f75")) 460 461 var testEd25519PrivateKey = ed25519.PrivateKey(fromHex("3a884965e76b3f55e5faf9615458a92354894234de3ec9f684d46d55cebf3dc63fe2152ee6e3ef3f4e854a7577a3649eede0bf842ccc92268ffa6f3483aaec8f")) 462 463 const clientCertificatePEM = ` 464 -----BEGIN CERTIFICATE----- 465 MIIB7zCCAVigAwIBAgIQXBnBiWWDVW/cC8m5k5/pvDANBgkqhkiG9w0BAQsFADAS 466 MRAwDgYDVQQKEwdBY21lIENvMB4XDTE2MDgxNzIxNTIzMVoXDTE3MDgxNzIxNTIz 467 MVowEjEQMA4GA1UEChMHQWNtZSBDbzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC 468 gYEAum+qhr3Pv5/y71yUYHhv6BPy0ZZvzdkybiI3zkH5yl0prOEn2mGi7oHLEMff 469 NFiVhuk9GeZcJ3NgyI14AvQdpJgJoxlwaTwlYmYqqyIjxXuFOE8uCXMyp70+m63K 470 hAfmDzr/d8WdQYUAirab7rCkPy1MTOZCPrtRyN1IVPQMjkcCAwEAAaNGMEQwDgYD 471 VR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAw 472 DwYDVR0RBAgwBocEfwAAATANBgkqhkiG9w0BAQsFAAOBgQBGq0Si+yhU+Fpn+GKU 473 8ZqyGJ7ysd4dfm92lam6512oFmyc9wnTN+RLKzZ8Aa1B0jLYw9KT+RBrjpW5LBeK 474 o0RIvFkTgxYEiKSBXCUNmAysEbEoVr4dzWFihAm/1oDGRY2CLLTYg5vbySK3KhIR 475 e/oCO8HJ/+rJnahJ05XX1Q7lNQ== 476 -----END CERTIFICATE-----` 477 478 var clientKeyPEM = testingKey(` 479 -----BEGIN RSA TESTING KEY----- 480 MIICXQIBAAKBgQC6b6qGvc+/n/LvXJRgeG/oE/LRlm/N2TJuIjfOQfnKXSms4Sfa 481 YaLugcsQx980WJWG6T0Z5lwnc2DIjXgC9B2kmAmjGXBpPCViZiqrIiPFe4U4Ty4J 482 czKnvT6brcqEB+YPOv93xZ1BhQCKtpvusKQ/LUxM5kI+u1HI3UhU9AyORwIDAQAB 483 AoGAEJZ03q4uuMb7b26WSQsOMeDsftdatT747LGgs3pNRkMJvTb/O7/qJjxoG+Mc 484 qeSj0TAZXp+PXXc3ikCECAc+R8rVMfWdmp903XgO/qYtmZGCorxAHEmR80SrfMXv 485 PJnznLQWc8U9nphQErR+tTESg7xWEzmFcPKwnZd1xg8ERYkCQQDTGtrFczlB2b/Z 486 9TjNMqUlMnTLIk/a/rPE2fLLmAYhK5sHnJdvDURaH2mF4nso0EGtENnTsh6LATnY 487 dkrxXGm9AkEA4hXHG2q3MnhgK1Z5hjv+Fnqd+8bcbII9WW4flFs15EKoMgS1w/PJ 488 zbsySaSy5IVS8XeShmT9+3lrleed4sy+UwJBAJOOAbxhfXP5r4+5R6ql66jES75w 489 jUCVJzJA5ORJrn8g64u2eGK28z/LFQbv9wXgCwfc72R468BdawFSLa/m2EECQGbZ 490 rWiFla26IVXV0xcD98VWJsTBZMlgPnSOqoMdM1kSEd4fUmlAYI/dFzV1XYSkOmVr 491 FhdZnklmpVDeu27P4c0CQQCuCOup0FlJSBpWY1TTfun/KMBkBatMz0VMA3d7FKIU 492 csPezl677Yjo8u1r/KzeI6zLg87Z8E6r6ZWNc9wBSZK6 493 -----END RSA TESTING KEY-----`) 494 495 const clientECDSACertificatePEM = ` 496 -----BEGIN CERTIFICATE----- 497 MIIB/DCCAV4CCQCaMIRsJjXZFzAJBgcqhkjOPQQBMEUxCzAJBgNVBAYTAkFVMRMw 498 EQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0 499 eSBMdGQwHhcNMTIxMTE0MTMyNTUzWhcNMjIxMTEyMTMyNTUzWjBBMQswCQYDVQQG 500 EwJBVTEMMAoGA1UECBMDTlNXMRAwDgYDVQQHEwdQeXJtb250MRIwEAYDVQQDEwlK 501 b2VsIFNpbmcwgZswEAYHKoZIzj0CAQYFK4EEACMDgYYABACVjJF1FMBexFe01MNv 502 ja5oHt1vzobhfm6ySD6B5U7ixohLZNz1MLvT/2XMW/TdtWo+PtAd3kfDdq0Z9kUs 503 jLzYHQFMH3CQRnZIi4+DzEpcj0B22uCJ7B0rxE4wdihBsmKo+1vx+U56jb0JuK7q 504 ixgnTy5w/hOWusPTQBbNZU6sER7m8TAJBgcqhkjOPQQBA4GMADCBiAJCAOAUxGBg 505 C3JosDJdYUoCdFzCgbkWqD8pyDbHgf9stlvZcPE4O1BIKJTLCRpS8V3ujfK58PDa 506 2RU6+b0DeoeiIzXsAkIBo9SKeDUcSpoj0gq+KxAxnZxfvuiRs9oa9V2jI/Umi0Vw 507 jWVim34BmT0Y9hCaOGGbLlfk+syxis7iI6CH8OFnUes= 508 -----END CERTIFICATE-----` 509 510 var clientECDSAKeyPEM = testingKey(` 511 -----BEGIN EC PARAMETERS----- 512 BgUrgQQAIw== 513 -----END EC PARAMETERS----- 514 -----BEGIN EC TESTING KEY----- 515 MIHcAgEBBEIBkJN9X4IqZIguiEVKMqeBUP5xtRsEv4HJEtOpOGLELwO53SD78Ew8 516 k+wLWoqizS3NpQyMtrU8JFdWfj+C57UNkOugBwYFK4EEACOhgYkDgYYABACVjJF1 517 FMBexFe01MNvja5oHt1vzobhfm6ySD6B5U7ixohLZNz1MLvT/2XMW/TdtWo+PtAd 518 3kfDdq0Z9kUsjLzYHQFMH3CQRnZIi4+DzEpcj0B22uCJ7B0rxE4wdihBsmKo+1vx 519 +U56jb0JuK7qixgnTy5w/hOWusPTQBbNZU6sER7m8Q== 520 -----END EC TESTING KEY-----`) 521 522 const clientEd25519CertificatePEM = ` 523 -----BEGIN CERTIFICATE----- 524 MIIBLjCB4aADAgECAhAX0YGTviqMISAQJRXoNCNPMAUGAytlcDASMRAwDgYDVQQK 525 EwdBY21lIENvMB4XDTE5MDUxNjIxNTQyNloXDTIwMDUxNTIxNTQyNlowEjEQMA4G 526 A1UEChMHQWNtZSBDbzAqMAUGAytlcAMhAAvgtWC14nkwPb7jHuBQsQTIbcd4bGkv 527 xRStmmNveRKRo00wSzAOBgNVHQ8BAf8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUH 528 AwIwDAYDVR0TAQH/BAIwADAWBgNVHREEDzANggtleGFtcGxlLmNvbTAFBgMrZXAD 529 QQD8GRcqlKUx+inILn9boF2KTjRAOdazENwZ/qAicbP1j6FYDc308YUkv+Y9FN/f 530 7Q7hF9gRomDQijcjKsJGqjoI 531 -----END CERTIFICATE-----` 532 533 var clientEd25519KeyPEM = testingKey(` 534 -----BEGIN TESTING KEY----- 535 MC4CAQAwBQYDK2VwBCIEINifzf07d9qx3d44e0FSbV4mC/xQxT644RRbpgNpin7I 536 -----END TESTING KEY-----`)