Skip to content

Commit 54c2f74

Browse files
committed
VIndex for Static CT logs
This outputs each DNSName from each cert into the VIndex. In the interests of launching and iterating, this doesn't yet output all levels up to the TLD. Confirmed this works on the Google test log coachandhorses2026h1. This was picked because it's a smaller log (only 161 million entries). Changed general client to support static CT Input Logs verifier keys. It doesn't support static CT enough to dereference the input log pointers though. We'll need a custom client for that.
1 parent e874678 commit 54c2f74

6 files changed

Lines changed: 563 additions & 42 deletions

File tree

go.mod

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@ module github.com/transparency-dev/incubator
33
go 1.25.0
44

55
require (
6+
filippo.io/sunlight v0.8.0
7+
filippo.io/torchwood v0.9.0
68
github.com/cockroachdb/pebble v1.1.5
79
github.com/go-git/go-git/v5 v5.19.1
810
github.com/google/go-cmp v0.7.0
911
github.com/gorilla/mux v1.8.1
1012
github.com/transparency-dev/formats v0.1.0
1113
github.com/transparency-dev/merkle v0.0.2
1214
github.com/transparency-dev/tessera v1.0.3-0.20260318145621-a1e0ccb4adf4
15+
golang.org/x/crypto v0.50.0
1316
golang.org/x/mod v0.36.0
1417
golang.org/x/sync v0.20.0
1518
k8s.io/klog/v2 v2.140.0
@@ -39,22 +42,22 @@ require (
3942
github.com/go-logr/stdr v1.2.2 // indirect
4043
github.com/gogo/protobuf v1.3.2 // indirect
4144
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
42-
github.com/golang/protobuf v1.5.4 // indirect
4345
github.com/golang/snappy v0.0.4 // indirect
46+
github.com/google/certificate-transparency-go v1.3.2 // indirect
4447
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
4548
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
4649
github.com/kevinburke/ssh_config v1.2.0 // indirect
4750
github.com/klauspost/compress v1.18.0 // indirect
4851
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
4952
github.com/kr/pretty v0.3.1 // indirect
5053
github.com/kr/text v0.2.0 // indirect
51-
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
54+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
5255
github.com/pjbgf/sha1cd v0.6.0 // indirect
5356
github.com/pkg/errors v0.9.1 // indirect
54-
github.com/prometheus/client_golang v1.15.0 // indirect
55-
github.com/prometheus/client_model v0.3.0 // indirect
56-
github.com/prometheus/common v0.42.0 // indirect
57-
github.com/prometheus/procfs v0.9.0 // indirect
57+
github.com/prometheus/client_golang v1.22.0 // indirect
58+
github.com/prometheus/client_model v0.6.1 // indirect
59+
github.com/prometheus/common v0.62.0 // indirect
60+
github.com/prometheus/procfs v0.15.1 // indirect
5861
github.com/rogpeppe/go-internal v1.14.1 // indirect
5962
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect
6063
github.com/skeema/knownhosts v1.3.1 // indirect
@@ -63,7 +66,6 @@ require (
6366
go.opentelemetry.io/otel v1.42.0 // indirect
6467
go.opentelemetry.io/otel/metric v1.42.0 // indirect
6568
go.opentelemetry.io/otel/trace v1.42.0 // indirect
66-
golang.org/x/crypto v0.50.0 // indirect
6769
golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f // indirect
6870
golang.org/x/net v0.53.0 // indirect
6971
golang.org/x/sys v0.43.0 // indirect

go.sum

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk=
22
dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
3+
filippo.io/sunlight v0.8.0 h1:7ytoUj2KmU5k4ogDSLwEtCoEjjrTZsh+g++UIfTGpM4=
4+
filippo.io/sunlight v0.8.0/go.mod h1:gJ1qFtjHWqj9j4f5M2fnaER6ZFPUkTrRz4/pTamneDg=
5+
filippo.io/torchwood v0.9.0 h1:2W156cI7K3MyxEyNTuS1C9lYEW7y1u7PoHLmvgNsiZc=
6+
filippo.io/torchwood v0.9.0/go.mod h1:zOJguxdmaODUQScAvC80bV6N0SOA9U+bFZG1DwJU6N8=
37
github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ=
48
github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
59
github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
@@ -37,8 +41,9 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3
3741
github.com/cyphar/filepath-securejoin v0.6.1 h1:5CeZ1jPXEiYt3+Z6zqprSAgSWiggmpVyciv8syjIpVE=
3842
github.com/cyphar/filepath-securejoin v0.6.1/go.mod h1:A8hd4EnAeyujCJRrICiOWqjS1AX0a9kM5XL+NwKoYSc=
3943
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
40-
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
4144
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
45+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
46+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4247
github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o=
4348
github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE=
4449
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
@@ -66,12 +71,10 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
6671
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
6772
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ=
6873
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw=
69-
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
70-
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
71-
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
72-
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
7374
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
7475
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
76+
github.com/google/certificate-transparency-go v1.3.2 h1:9ahSNZF2o7SYMaKaXhAumVEzXB2QaayzII9C8rv7v+A=
77+
github.com/google/certificate-transparency-go v1.3.2/go.mod h1:H5FpMUaGa5Ab2+KCYsxg6sELw3Flkl7pGZzWdBoYLXs=
7578
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
7679
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
7780
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
@@ -95,8 +98,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
9598
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
9699
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
97100
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
98-
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
99-
github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
101+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
102+
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
100103
github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
101104
github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
102105
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
@@ -106,16 +109,17 @@ github.com/pjbgf/sha1cd v0.6.0/go.mod h1:lhpGlyHLpQZoxMv8HcgXvZEhcGs0PG/vsZnEJ7H
106109
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
107110
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
108111
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
109-
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
110112
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
111-
github.com/prometheus/client_golang v1.15.0 h1:5fCgGYogn0hFdhyhLbw7hEsWxufKtY9klyvdNfFlFhM=
112-
github.com/prometheus/client_golang v1.15.0/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk=
113-
github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
114-
github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
115-
github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM=
116-
github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc=
117-
github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
118-
github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY=
113+
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
114+
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
115+
github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=
116+
github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
117+
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
118+
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
119+
github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io=
120+
github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I=
121+
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
122+
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
119123
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
120124
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
121125
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
@@ -166,7 +170,6 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY
166170
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
167171
golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA=
168172
golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs=
169-
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
170173
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
171174
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
172175
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=

vindex/cmd/client/client.go

Lines changed: 44 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,29 @@ package main
1919

2020
import (
2121
"context"
22+
"crypto/x509"
23+
"encoding/base64"
2224
"errors"
2325
"flag"
2426
"fmt"
2527
"net/http"
2628
"slices"
2729

30+
fnote "github.com/transparency-dev/formats/note"
2831
"github.com/transparency-dev/incubator/vindex/client"
2932
"golang.org/x/mod/sumdb/note"
3033
"k8s.io/klog/v2"
3134
)
3235

3336
var (
34-
vindexBaseURL = flag.String("vindex_base_url", "", "The base URL of the vindex server.")
35-
inLogBaseURL = flag.String("in_log_base_url", "", "The base URL of the input log.")
36-
lookup = flag.String("lookup", "", "The key to look up in the vindex.")
37-
outLogPubKey = flag.String("out_log_pub_key", "", "The public key to use to verify the output log checkpoint.")
38-
inLogPubKey = flag.String("in_log_pub_key", "", "The public key to use to verify the input log checkpoint.")
39-
inLogOrigin = flag.String("in_log_origin", "", "Optional: allows the Input Log Origin string to be configured to something other than the public key name.")
40-
minIdx = flag.Uint64("min_idx", 0, "The minimum index to look up in the input log.")
37+
vindexBaseURL = flag.String("vindex_base_url", "", "The base URL of the vindex server.")
38+
inLogBaseURL = flag.String("in_log_base_url", "", "The base URL of the input log.")
39+
lookup = flag.String("lookup", "", "The key to look up in the vindex.")
40+
outLogPubKey = flag.String("out_log_pub_key", "", "The public key to use to verify the output log checkpoint. Required.")
41+
inLogPubKey = flag.String("in_log_pub_key", "", "The public key to use to verify the input log checkpoint. Required.")
42+
inLogPubKeyDER = flag.String("in_log_pub_key_der", "", "For CT logs. The public key to use to verify the input log checkpoint. Required, along with in_log_origin.")
43+
inLogOrigin = flag.String("in_log_origin", "", "Required if in_log_pub_key_der is used. Otherwise, allows the Input Log Origin string to be configured to something other than the public key name.")
44+
minIdx = flag.Uint64("min_idx", 0, "The minimum index to look up in the input log.")
4145
)
4246

4347
func main() {
@@ -104,10 +108,7 @@ func newVIndexClientFromFlags() *client.VIndexClient {
104108
if *outLogPubKey == "" {
105109
klog.Exitf("out_log_pub_key must be provided")
106110
}
107-
inV, err := note.NewVerifier(*inLogPubKey)
108-
if err != nil {
109-
klog.Exitf("failed to construct input log verifier: %v", err)
110-
}
111+
inV := inputLogVerifierFromFlags()
111112
outV, err := note.NewVerifier(*outLogPubKey)
112113
if err != nil {
113114
klog.Exitf("failed to construct output log verifier: %v", err)
@@ -123,13 +124,7 @@ func newInputLogClientFromFlags() *client.InputLogClient {
123124
if *inLogBaseURL == "" {
124125
klog.Exit("in_log_base_url flag must be provided")
125126
}
126-
if *inLogPubKey == "" {
127-
klog.Exitf("in_log_pub_key must be provided")
128-
}
129-
v, err := note.NewVerifier(*inLogPubKey)
130-
if err != nil {
131-
klog.Exitf("failed to construct input log verifier: %v", err)
132-
}
127+
v := inputLogVerifierFromFlags()
133128
origin := *inLogOrigin
134129
if len(origin) == 0 {
135130
origin = v.Name()
@@ -140,3 +135,34 @@ func newInputLogClientFromFlags() *client.InputLogClient {
140135
}
141136
return c
142137
}
138+
139+
func inputLogVerifierFromFlags() note.Verifier {
140+
if *inLogPubKey == "" && *inLogPubKeyDER == "" {
141+
klog.Exitf("Must provide exactly one --in_log_pub_key* flag")
142+
}
143+
if *inLogPubKey != "" {
144+
v, err := note.NewVerifier(*inLogPubKey)
145+
if err != nil {
146+
klog.Exitf("failed to construct input log verifier: %v", err)
147+
}
148+
return v
149+
}
150+
derBytes, err := base64.StdEncoding.DecodeString(*inLogPubKeyDER)
151+
if err != nil {
152+
klog.Exitf("Error decoding public key: %s", err)
153+
}
154+
pub, err := x509.ParsePKIXPublicKey(derBytes)
155+
if err != nil {
156+
klog.Exitf("Error parsing public key: %v", err)
157+
}
158+
159+
verifierKey, err := fnote.RFC6962VerifierString(*inLogOrigin, pub)
160+
if err != nil {
161+
klog.Exitf("Error creating RFC6962 verifier string: %v", err)
162+
}
163+
v, err := fnote.NewVerifier(verifierKey)
164+
if err != nil {
165+
klog.Exitf("Error creating verifier: %v", err)
166+
}
167+
return v
168+
}

vindex/cmd/ct/README.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
## Verifiable Index: CT
2+
3+
This is a demo of pulling the contents of a tile-based CT log into a [Verifiable Index](../../README.md).
4+
5+
[tlog-tiles]: https://c2sp.org/tlog-tiles
6+
[Tessera]: https://github.com/transparency-dev/tessera
7+
8+
The CT Input Log is processed, with each entry being indexed on all common names defined in the cert.
9+
This allows the owner of a domain to look up all certs for their domain, in a way that is fully verified.
10+
11+
> [!NOTE]
12+
> This demo doesn't map all certificates!
13+
> In order to generate a manageable number of key/values, this only indexes
14+
> final certs, and only domain names ending with `.co.uk`.
15+
> https://github.com/transparency-dev/incubator/issues/64
16+
17+
## Running
18+
19+
The static CT Input Log is expected to be available for reading at a URL provided by the `--monitoring_url` flag.
20+
This is the base directory that should contain the checkpoint file.
21+
The Verifiable Index and Output Log are constructed locally, persisted to local disk (in the `--storage_dir` directory), and hosted via a web server.
22+
23+
```shell
24+
OUTPUT_LOG_PRIVATE_KEY=PRIVATE+KEY+example.com/outputlog+07392c46+ATPJ4crkyUbPeaRffN/4NUof3KV0pQznVIPGOQm3SDEJ \
25+
go run ./vindex/cmd/ct \
26+
--storage_dir ~/vindex-ct/ \
27+
--origin="coachandhorses2026h1.staging.certificate.transparency.goog" \
28+
--public_key="MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECHOhXfvYgTcu+Fnl7M7niFj3FgqWlQpXUSWUDw2KAaJXvhGxdJTtmyciN5rWTiDtpeNENVmsUTHFS4XQgeRE0g==" \
29+
--monitoring_url="https://storage.googleapis.com/coachandhorses2026h1.staging.certificate.transparency.goog"
30+
```
31+
32+
Running the above will run a web server hosting the following URLs:
33+
- `/vindex/lookup` - the provisional [vindex lookup API](./api/api.go)
34+
- `/outputlog/` - the [tlog-tiles][] base URL for the output log
35+
36+
To inspect the log, you can use the woodpecker tool (using the corresponding public key to the private key used above):
37+
38+
```shell
39+
# To inspect the Output Log
40+
go run github.com/mhutchinson/woodpecker@main --custom_log_type=tiles --custom_log_url=http://localhost:8088/outputlog/ --custom_log_vkey=example.com/outputlog+07392c46+AWyS8y8ZsRmQnTr6Fr2knaa8+t6CPYFh5Ho3wJEr14B8
41+
```
42+
43+
Use left/right cursor to browse, and `q` to quit.
44+
45+
A domain indexed by the verifiable map can be looked up using the following command:
46+
47+
```shell
48+
go run ./vindex/cmd/client \
49+
--vindex_base_url http://localhost:8088/vindex/ \
50+
--out_log_pub_key=example.com/outputlog+07392c46+AWyS8y8ZsRmQnTr6Fr2knaa8+t6CPYFh5Ho3wJEr14B8 \
51+
--in_log_pub_key_der=MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECHOhXfvYgTcu+Fnl7M7niFj3FgqWlQpXUSWUDw2KAaJXvhGxdJTtmyciN5rWTiDtpeNENVmsUTHFS4XQgeRE0g== \
52+
--in_log_origin=coachandhorses2026h1.staging.certificate.transparency.goog \
53+
--lookup=google.com
54+
```

0 commit comments

Comments
 (0)