...

Source file src/golang.org/x/mod/sumdb/tlog/ct_test.go

Documentation: golang.org/x/mod/sumdb/tlog

     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"
    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 := io.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  }
    97  

View as plain text