Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / mod@v0.3.0 / sumdb / tlog / ct_test.go
1 // Copyright 2019 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 tlog
6
7 import (
8         "encoding/json"
9         "fmt"
10         "io/ioutil"
11         "net/http"
12         "net/url"
13         "os"
14         "testing"
15 )
16
17 func TestCertificateTransparency(t *testing.T) {
18         // Test that we can verify actual Certificate Transparency proofs.
19         // (The other tests check that we can verify our own proofs;
20         // this is a test that the two are compatible.)
21
22         if testing.Short() {
23                 t.Skip("skipping in -short mode")
24         }
25
26         var root ctTree
27         httpGET(t, "http://ct.googleapis.com/logs/argon2020/ct/v1/get-sth", &root)
28
29         var leaf ctEntries
30         httpGET(t, "http://ct.googleapis.com/logs/argon2020/ct/v1/get-entries?start=10000&end=10000", &leaf)
31         hash := RecordHash(leaf.Entries[0].Data)
32
33         var rp ctRecordProof
34         httpGET(t, "http://ct.googleapis.com/logs/argon2020/ct/v1/get-proof-by-hash?tree_size="+fmt.Sprint(root.Size)+"&hash="+url.QueryEscape(hash.String()), &rp)
35
36         err := CheckRecord(rp.Proof, root.Size, root.Hash, 10000, hash)
37         if err != nil {
38                 t.Fatal(err)
39         }
40
41         var tp ctTreeProof
42         httpGET(t, "http://ct.googleapis.com/logs/argon2020/ct/v1/get-sth-consistency?first=3654490&second="+fmt.Sprint(root.Size), &tp)
43
44         oh, _ := ParseHash("AuIZ5V6sDUj1vn3Y1K85oOaQ7y+FJJKtyRTl1edIKBQ=")
45         err = CheckTree(tp.Proof, root.Size, root.Hash, 3654490, oh)
46         if err != nil {
47                 t.Fatal(err)
48         }
49 }
50
51 type ctTree struct {
52         Size int64 `json:"tree_size"`
53         Hash Hash  `json:"sha256_root_hash"`
54 }
55
56 type ctEntries struct {
57         Entries []*ctEntry
58 }
59
60 type ctEntry struct {
61         Data []byte `json:"leaf_input"`
62 }
63
64 type ctRecordProof struct {
65         Index int64       `json:"leaf_index"`
66         Proof RecordProof `json:"audit_path"`
67 }
68
69 type ctTreeProof struct {
70         Proof TreeProof `json:"consistency"`
71 }
72
73 func httpGET(t *testing.T, url string, targ interface{}) {
74         if testing.Verbose() {
75                 println()
76                 println(url)
77         }
78         resp, err := http.Get(url)
79         if err != nil {
80                 t.Fatal(err)
81         }
82         defer resp.Body.Close()
83         data, err := ioutil.ReadAll(resp.Body)
84         if err != nil {
85                 t.Fatal(err)
86         }
87         if testing.Verbose() {
88                 os.Stdout.Write(data)
89         }
90         err = json.Unmarshal(data, targ)
91         if err != nil {
92                 println(url)
93                 os.Stdout.Write(data)
94                 t.Fatal(err)
95         }
96 }