Skip to content

Commit 090063f

Browse files
committed
add verify flag
1 parent c0ed15e commit 090063f

File tree

1 file changed

+36
-11
lines changed

1 file changed

+36
-11
lines changed

cmd/client/main.go

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package main
22

33
import (
4+
"bytes"
45
"context"
56
"crypto/x509"
67
"encoding/base64"
@@ -31,8 +32,9 @@ import (
3132
var (
3233
monitoringURL = flag.String("monitoring_url", "", "Log monitoring URL.")
3334
leafIndex = flag.String("leaf_index", "", "The index of the leaf to fetch.")
34-
origin = flag.String("origin", "", "Origin of the log, for checkpoints and the monitoring prefix.")
35-
logPubKey = flag.String("log_public_key", "", "Public key for the log, base64 encoded.")
35+
origin = flag.String("origin", "", "Origin of the log, for checkpoints and the monitoring prefix. MUST be provided if verify=true.")
36+
logPubKey = flag.String("log_public_key", "", "Public key for the log, base64 encoded. MUST be provided if verify=true.")
37+
verify = flag.Bool("verify", true, "Whether or not to verify the leaf entry.")
3638
)
3739

3840
var (
@@ -62,6 +64,15 @@ func main() {
6264
klog.Exitf("Invalid --monitoring_url %q: %v", *monitoringURL, err)
6365
}
6466

67+
if *verify {
68+
if *logPubKey == "" {
69+
klog.Exitf("log_public_key MUST be provided when verify=true")
70+
}
71+
if *origin == "" {
72+
klog.Exitf("origin MUST be provided when verify=true")
73+
}
74+
}
75+
6576
// Create client
6677
hc := &http.Client{
6778
Timeout: 30 * time.Second,
@@ -96,8 +107,10 @@ func main() {
96107
klog.Exitf("Failed to unmarshal entry: %v", err)
97108
}
98109

99-
if errs := verify(ctx, &entry, cp, li, fetcher); len(errs) != 0 {
100-
klog.Exitf("Failed to verify leaf entry: %s", errors.Join(errs...))
110+
if *verify {
111+
if errs := verifyLeafEntry(ctx, &entry, cp, li, fetcher); len(errs) != 0 {
112+
klog.Exitf("Failed to verify leaf entry: %s", errors.Join(errs...))
113+
}
101114
}
102115

103116
pemBlock := &pem.Block{
@@ -152,18 +165,30 @@ func readCheckpoint(ctx context.Context, fetcher *client.HTTPFetcher) (*log.Chec
152165
if err != nil {
153166
return nil, fmt.Errorf("Failed to fetch checkpoint: %v", err)
154167
}
155-
logSigV, err := logSigVerifier(*origin, *logPubKey)
156-
if err != nil {
157-
return nil, fmt.Errorf("Failed to create verifier: %v", err)
168+
if *verify {
169+
logSigV, err := logSigVerifier(*origin, *logPubKey)
170+
if err != nil {
171+
return nil, fmt.Errorf("Failed to create verifier: %v", err)
172+
}
173+
cp, _, _, err := log.ParseCheckpoint(cpRaw, *origin, logSigV)
174+
if err != nil {
175+
return nil, fmt.Errorf("Failed to parse checkpoint: %v", err)
176+
}
177+
return cp, nil
178+
}
179+
// A https://c2sp.org/static-ct-api logsize is on the second line
180+
l := bytes.SplitN(cpRaw, []byte("\n"), 3)
181+
if len(l) < 2 {
182+
return nil, errors.New("invalid checkpoint - no size")
158183
}
159-
cp, _, _, err := log.ParseCheckpoint(cpRaw, *origin, logSigV)
184+
size, err := strconv.ParseUint(string(l[1]), 10, 64)
160185
if err != nil {
161-
return nil, fmt.Errorf("Failed to parse checkpoint: %v", err)
186+
return nil, fmt.Errorf("invalid checkpoint - can't extract size: %v", err)
162187
}
163-
return cp, nil
188+
return &log.Checkpoint{Size: size}, nil
164189
}
165190

166-
func verify(ctx context.Context, entry *staticct.Entry, cp *log.Checkpoint, li uint64, fetcher *client.HTTPFetcher) []error {
191+
func verifyLeafEntry(ctx context.Context, entry *staticct.Entry, cp *log.Checkpoint, li uint64, fetcher *client.HTTPFetcher) []error {
167192
// Check that the entry has been built properly
168193
var errs []error
169194
e := ctonly.Entry{

0 commit comments

Comments
 (0)