sumdb/tlog: use recorded responses in TestCertificateTransparency

The test fetched proofs from the Google Argon 2020 log over the network.
The log is being turned down, and in the meantime requests from the
builders are intermittently rejected with an "automated queries" page.

The log is frozen, so record its get-sth, get-entries, get-proof-by-hash,
and get-sth-consistency responses in testdata and check the proofs
against those. The test no longer needs the network, so it also runs in
-short mode.

Fixes golang/go#60852

Change-Id: I6ef48082c008aac26f485400244bbbd36a6a6964
Reviewed-on: https://go-review.googlesource.com/c/mod/+/848125
LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
Reviewed-by: Damien Neil <dneil@google.com>
Auto-Submit: Filippo Valsorda <filippo@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
diff --git a/sumdb/tlog/ct_test.go b/sumdb/tlog/ct_test.go
index 0f6183a..9bb1d56 100644
--- a/sumdb/tlog/ct_test.go
+++ b/sumdb/tlog/ct_test.go
@@ -6,10 +6,6 @@
 
 import (
 	"encoding/json"
-	"fmt"
-	"io"
-	"net/http"
-	"net/url"
 	"os"
 	"testing"
 )
@@ -18,20 +14,22 @@
 	// Test that we can verify actual Certificate Transparency proofs.
 	// (The other tests check that we can verify our own proofs;
 	// this is a test that the two are compatible.)
-
-	if testing.Short() {
-		t.Skip("skipping in -short mode")
-	}
+	//
+	// The testdata files are responses from the Google Argon 2020 log
+	// (https://ct.googleapis.com/logs/argon2020/ct/v1/) to the
+	// get-sth, get-entries?start=10000&end=10000, get-proof-by-hash,
+	// and get-sth-consistency?first=3654490 endpoints, with the unused
+	// extra_data field removed from the get-entries response.
 
 	var root ctTree
-	httpGET(t, "http://ct.googleapis.com/logs/argon2020/ct/v1/get-sth", &root)
+	readJSON(t, "testdata/argon2020/sth.json", &root)
 
 	var leaf ctEntries
-	httpGET(t, "http://ct.googleapis.com/logs/argon2020/ct/v1/get-entries?start=10000&end=10000", &leaf)
+	readJSON(t, "testdata/argon2020/entries.json", &leaf)
 	hash := RecordHash(leaf.Entries[0].Data)
 
 	var rp ctRecordProof
-	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)
+	readJSON(t, "testdata/argon2020/proof.json", &rp)
 
 	err := CheckRecord(rp.Proof, root.Size, root.Hash, 10000, hash)
 	if err != nil {
@@ -39,7 +37,7 @@
 	}
 
 	var tp ctTreeProof
-	httpGET(t, "http://ct.googleapis.com/logs/argon2020/ct/v1/get-sth-consistency?first=3654490&second="+fmt.Sprint(root.Size), &tp)
+	readJSON(t, "testdata/argon2020/consistency.json", &tp)
 
 	oh, _ := ParseHash("AuIZ5V6sDUj1vn3Y1K85oOaQ7y+FJJKtyRTl1edIKBQ=")
 	err = CheckTree(tp.Proof, root.Size, root.Hash, 3654490, oh)
@@ -70,27 +68,12 @@
 	Proof TreeProof `json:"consistency"`
 }
 
-func httpGET(t *testing.T, url string, targ any) {
-	if testing.Verbose() {
-		println()
-		println(url)
-	}
-	resp, err := http.Get(url)
+func readJSON(t *testing.T, name string, targ any) {
+	data, err := os.ReadFile(name)
 	if err != nil {
 		t.Fatal(err)
 	}
-	defer resp.Body.Close()
-	data, err := io.ReadAll(resp.Body)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if testing.Verbose() {
-		os.Stdout.Write(data)
-	}
-	err = json.Unmarshal(data, targ)
-	if err != nil {
-		println(url)
-		os.Stdout.Write(data)
-		t.Fatal(err)
+	if err := json.Unmarshal(data, targ); err != nil {
+		t.Fatalf("%s: %v", name, err)
 	}
 }
diff --git a/sumdb/tlog/testdata/argon2020/consistency.json b/sumdb/tlog/testdata/argon2020/consistency.json
new file mode 100644
index 0000000..7f32409
--- /dev/null
+++ b/sumdb/tlog/testdata/argon2020/consistency.json
@@ -0,0 +1 @@
+{"consistency":["80Sfbj6UQEdVSZCSIgh9NMPj3vCBzcc1A48B2crJSWg=","FZcrgAHUk6nNPviJZq8kEK6jCG1d18pJOFE45ZDc1TQ=","Q67reWXmPBo1UfmwBap4Xi9PMPfFdUSSw3WGlRZdG7k=","eJ7CyhR4PxzBxDIsWgrVYW1eFUb9ndgf46tFmiqVrxA=","QrDwp062Grm5WY8KdrhFsBuuNjGzRox2Jb8PmVL5OYw=","XM4YMjMEdLH/XJam/ZWyaP14k3cmsOtnPsOWQ54lW1s=","SGiBh+jOTGccXU48ZzgQ88lRcBmtB4wz4oSDndv2QTg=","WAS6txqNLYKGL1GdBdpqmV42TTfn6cJsuDsqLXuTCNI=","QFmRS0rirUA7ZN3lxFjDncV+E1OCrn3NUB4RCp+5fzc=","Hdbp7It2XBNZmNDBpCN/KPd7vfVqxgzwOosqVIaEA9E=","mxvHL0ZiblBdD7j7pIa1jlfB0gSqfJ6oX0UGo7L0VsU=","q5hjyvoW6TL/PThgcitpDcSTrnKX2p1+aqscqH2euRA=","jTOWDqt3IHj2NVFeezyBz2ofpru+ztEywqKUAfFclKI=","GIRn0w3HqJdvU9j1WVD//eR6lk2AaTVjyzjsJNP8U88=","x52GJvxG81fnQBrgOTbll1A5tz95/LXK0Ag1NhB0r1I=","6/0OqrcTgc3o5dD5PymmoC96lB9yLPFuTHVvLy8fSGk=","Gf+iKLfcXO5l4JEFmsZvSdG5q1uEeWPfYLrds6pmjz0=","DGuaco+McyM3AfRSF6qX7RwSetwe2ieYJmxw5e9rVx0=","2tQJ9V32hnYp+fdpP6TcjmgJmLeNVOMKM0Ml1kk4cNU=","3PapK+IkyJr8I9yAErAmzuZezzLMzsg+PfeRCgNW8NQ=","s6xiYeejb+wtqHA+URJZ2I/SCPyIW8coP6aB00FJbMY=","z9lSpmdTcr5M5ZzKlc4EPh3SrSypKFdk6JUF/UccaZU=","GXIElfmnRuWfbA4z7ubV/UwlpSRUbUeec7oL5HDDnh0=","pR0SH/NYP6s9+8azWwaeUXA4Ze/3WCIgMfh5YW6wvcE=","f3GuAKYVrF8RBg3s15jvA/YvV9oAliWtzP/imwPhQVA=","WHn8zDxlVgkV+lSlmzaOdfSBrTHoRr5nT3d76q0KKWE=","f2uV2ZxVgULzLPKuZcowRY3ZY7fRlX59iDBjV1R8kNQ=","NzQVjJsvQwbi7WStMr9oFkh9VbHfK7LB6o7WwAqwNTs=","C0LttBeYHZHgL+032JIcJC3CTBIyza/hsbmJUgJfmDI=","nixU5CWTFVDlF4BGdcU6kA7WSYurEpe9jRWc+F/7sOc="]}
diff --git a/sumdb/tlog/testdata/argon2020/entries.json b/sumdb/tlog/testdata/argon2020/entries.json
new file mode 100644
index 0000000..0ff5e25
--- /dev/null
+++ b/sumdb/tlog/testdata/argon2020/entries.json
@@ -0,0 +1 @@
+{"entries":[{"leaf_input":"AAAAAAFelPhqUwAAAAViMIIFXjCCBEagAwIBAgIRAOodHzZdqWIFzYyl/SovhCMwDQYJKoZIhvcNAQELBQAwgZAxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMTYwNAYDVQQDEy1DT01PRE8gUlNBIERvbWFpbiBWYWxpZGF0aW9uIFNlY3VyZSBTZXJ2ZXIgQ0EwHhcNMTcwMjE1MDAwMDAwWhcNMjAwNDE2MjM1OTU5WjBfMSEwHwYDVQQLExhEb21haW4gQ29udHJvbCBWYWxpZGF0ZWQxHTAbBgNVBAsTFFBvc2l0aXZlU1NMIFdpbGRjYXJkMRswGQYDVQQDDBIqLmxhbmRsb3Jkcy5jb20uYXUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPBKKHj4zdrGlCjgTHzb5gx9JCs97DwvBz60f14gDufF2haWbOxyJ0a3opAMsZnOr8HkARVCwxdqG/PTfACcb0QM7FOlzvxGqxataTYiChwvkkif8F9GlJw69HuHgzhusPf1Ytfk3ps1PRC14MkyrS4kwPrk/Le4XdkqRpRw62wG4V6IkbzsNMEOl1H8EgUbfyapdOcVxHjIzvBVy56fBRKG05Fr5wNq3Acak5kYZdNsLhhmlrqAfAjiombW3hb3V5blJdRC0BDdYHv2+zKey6LqJ1FDoXo6IzbzPpC+aifZy47YX+/N1U64Qn5xlDg7mOP8JXfkNJHbU1TJZHif5AgMBAAGjggHhMIIB3TAfBgNVHSMEGDAWgBSQr2o6lFoL2JDqElZz30O0Oija5zAdBgNVHQ4EFgQUNQSLjkoz01I+iuuoC5lgEp0anhcwDgYDVR0PAQH/BAQDAgWgMAwGA1UdEwEB/wQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCME8GA1UdIARIMEYwOgYLKwYBBAGyMQECAgcwKzApBggrBgEFBQcCARYdaHR0cHM6Ly9zZWN1cmUuY29tb2RvLmNvbS9DUFMwCAYGZ4EMAQIBMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NPTU9ET1JTQURvbWFpblZhbGlkYXRpb25TZWN1cmVTZXJ2ZXJDQS5jcmwwgYUGCCsGAQUFBwEBBHkwdzBPBggrBgEFBQcwAoZDaHR0cDovL2NydC5jb21vZG9jYS5jb20vQ09NT0RPUlNBRG9tYWluVmFsaWRhdGlvblNlY3VyZVNlcnZlckNBLmNydDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29tMC8GA1UdEQQoMCaCEioubGFuZGxvcmRzLmNvbS5hdYIQbGFuZGxvcmRzLmNvbS5hdTANBgkqhkiG9w0BAQsFAAOCAQEACyHqxUzrexToY7tOv4+kyGPP2D27P1tQpyzeAl1bPObiMhNK2b9vvBLDWAaqm8c0YL1h+DBdLoWzf3xFsIkTCVCjWJTNSNlcYtgRk6or1s7jWsfXzWqsnPjPPmTIOCw7EfH7Yme3oxPs3UUsmShAgPwNohAtL9GqlqMiKM6v1WU3NHt01jEoNP23LRa6KeNK6AH6WHJykzL223IlhgXjHTeuQj6lR+TNrQXJuhwTXYe+20rrpPQxc1Pn7AqnvfWgmicRQ7gdIcr4V6+ecTvLfNOaJ0ZYe5G5giuAAdTm7F57pk04f4gyZNYKrj88mvbkoriN8b6jcWExtrYO6bm2TwAA"}]}
diff --git a/sumdb/tlog/testdata/argon2020/proof.json b/sumdb/tlog/testdata/argon2020/proof.json
new file mode 100644
index 0000000..a629cc1
--- /dev/null
+++ b/sumdb/tlog/testdata/argon2020/proof.json
@@ -0,0 +1 @@
+{"leaf_index":10000,"audit_path":["T46AmJsuOM/gFiGlUp+IJJebp+1Z5qratFNW7U0JyOQ=","9Jj1Feodn42uRYEfffkV4HF/EIPFQ5Zo9IwkxbQ2uhk=","D53/1oCNebF4J59HHgioovKZxrmrKcVuCVhy3Izg8Ck=","wSFDgGSrsXRPA+1c8WHoAFCsWeUv8NDyP/Q/SgsyVyY=","516/RcwsgdwdzHn18v1dJHqBkgFUbNhmCIWOGjsMJaE=","naTFY2ajLFgrgs5XUl+zJYZnnlJksLGsA1VYwpLfqbY=","mKBRJo6qao+0Kdh/rhGkZUbHUAxMhrtrclrTpIbNjIg=","Co4ueOFE7lpifLio94irxxsv1wFMMaK3tPu2ZQkHlro=","yRgy800K6JMYCC05sWfqF2kvCg2riT/pVM+nEa6V5+0=","n2O38XJZC8/Wpbwi9HhgVizlUyeUHVZvYyQB1607MRc=","go3tAjuNfNSCj87y2Rg1xOroDknGN1eaf3cgvzObf7Q=","8D0Mj3/J7ySSnFb0afIHYXv6rlOhECnsebY6XKi1IR8=","6rcez46ZU8M5vPiWVMAUfJfAOV0pPP/mch/lYzZhj/M=","2rtIeXrPvSdUyHc5maIgSAVB2BzaKaupWxSAiVayDE4=","nniW/IMFQPN5xw8UsHFn7CRStYbm1gLu7NNa6kkRqJQ=","mRPPi7sQS22MduIEyvcNzCNFqIt6kLwYPkNKrVtIcu8=","JvTivzESNS9wHI8aph5a7uieVmtS/p9PciMZ5D6GyOo=","UTyQd+Ym0wY4zG+qK806bBORwi1CSVvFQ/KknnqoZj8=","hXODrqN+ff+U6zPqRQ+ZQKs6im1fPcxIerDSfNwflhE=","II6GE+WY/DrpZzfHztLwkR46o37zVkNLCyPYlf68zA0=","d609kWWcNBllbA8Jb/ad4XAVVGnScLRmtP8FYyr+Dck=","rikBsP0G0gioXRpBFED2CzQdSLrGPvRd0bEcbEZw1rI=","GXIElfmnRuWfbA4z7ubV/UwlpSRUbUeec7oL5HDDnh0=","pR0SH/NYP6s9+8azWwaeUXA4Ze/3WCIgMfh5YW6wvcE=","f3GuAKYVrF8RBg3s15jvA/YvV9oAliWtzP/imwPhQVA=","WHn8zDxlVgkV+lSlmzaOdfSBrTHoRr5nT3d76q0KKWE=","f2uV2ZxVgULzLPKuZcowRY3ZY7fRlX59iDBjV1R8kNQ=","NzQVjJsvQwbi7WStMr9oFkh9VbHfK7LB6o7WwAqwNTs=","C0LttBeYHZHgL+032JIcJC3CTBIyza/hsbmJUgJfmDI=","nixU5CWTFVDlF4BGdcU6kA7WSYurEpe9jRWc+F/7sOc="]}
diff --git a/sumdb/tlog/testdata/argon2020/sth.json b/sumdb/tlog/testdata/argon2020/sth.json
new file mode 100644
index 0000000..350fc9e
--- /dev/null
+++ b/sumdb/tlog/testdata/argon2020/sth.json
@@ -0,0 +1 @@
+{"tree_size":961984013,"timestamp":1791559800928,"sha256_root_hash":"dwlueapdd7LaOEnX2W2Wp9v2XE+KzejHRQGHwEx0oaM=","tree_head_signature":"BAMASDBGAiEAzoSNpM5YEEzp2JIW8NcF08TCFlI6XKo0Ce7GKzfqpxkCIQDo0McCxAiO5HgOIK/t/yLZ2EIu8+0ev6hdRgdGEfh9lQ=="}