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=="}