Source file
src/crypto/x509/hybrid_pool_test.go
1
2
3
4
5 package x509_test
6
7 import (
8 "crypto/ecdsa"
9 "crypto/elliptic"
10 "crypto/rand"
11 "crypto/tls"
12 "crypto/x509"
13 "crypto/x509/pkix"
14 "internal/testenv"
15 "math/big"
16 "runtime"
17 "testing"
18 "time"
19 )
20
21 func TestHybridPool(t *testing.T) {
22 if !(runtime.GOOS == "windows" || runtime.GOOS == "darwin" || runtime.GOOS == "ios") {
23 t.Skipf("platform verifier not available on %s", runtime.GOOS)
24 }
25 if !testenv.HasExternalNetwork() {
26 t.Skip()
27 }
28
29
30
31 c, err := tls.Dial("tcp", "google.com:443", &tls.Config{InsecureSkipVerify: true})
32 if err != nil {
33 t.Fatalf("tls connection failed: %s", err)
34 }
35 googChain := c.ConnectionState().PeerCertificates
36
37 rootTmpl := &x509.Certificate{
38 SerialNumber: big.NewInt(1),
39 Subject: pkix.Name{CommonName: "Go test root"},
40 IsCA: true,
41 BasicConstraintsValid: true,
42 NotBefore: time.Now().Add(-time.Hour),
43 NotAfter: time.Now().Add(time.Hour * 10),
44 }
45 k, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
46 if err != nil {
47 t.Fatalf("failed to generate test key: %s", err)
48 }
49 rootDER, err := x509.CreateCertificate(rand.Reader, rootTmpl, rootTmpl, k.Public(), k)
50 if err != nil {
51 t.Fatalf("failed to create test cert: %s", err)
52 }
53 root, err := x509.ParseCertificate(rootDER)
54 if err != nil {
55 t.Fatalf("failed to parse test cert: %s", err)
56 }
57
58 pool, err := x509.SystemCertPool()
59 if err != nil {
60 t.Fatalf("SystemCertPool failed: %s", err)
61 }
62 opts := x509.VerifyOptions{Roots: pool}
63
64 _, err = googChain[0].Verify(opts)
65 if err != nil {
66 t.Fatalf("verification failed for google.com chain (empty pool): %s", err)
67 }
68
69 pool.AddCert(root)
70
71 _, err = googChain[0].Verify(opts)
72 if err != nil {
73 t.Fatalf("verification failed for google.com chain (hybrid pool): %s", err)
74 }
75
76 certTmpl := &x509.Certificate{
77 SerialNumber: big.NewInt(1),
78 NotBefore: time.Now().Add(-time.Hour),
79 NotAfter: time.Now().Add(time.Hour * 10),
80 DNSNames: []string{"example.com"},
81 }
82 certDER, err := x509.CreateCertificate(rand.Reader, certTmpl, rootTmpl, k.Public(), k)
83 if err != nil {
84 t.Fatalf("failed to create test cert: %s", err)
85 }
86 cert, err := x509.ParseCertificate(certDER)
87 if err != nil {
88 t.Fatalf("failed to parse test cert: %s", err)
89 }
90
91 _, err = cert.Verify(opts)
92 if err != nil {
93 t.Fatalf("verification failed for custom chain (hybrid pool): %s", err)
94 }
95 }
96
View as plain text