Skip to content
This repository was archived by the owner on Oct 11, 2024. It is now read-only.

Commit f839b54

Browse files
authored
Use MapID as reported in SignedMapRoot (#721)
* Use MapID as reported in SignedMapRoot MapID is part of SignedMapRoot and part of leaf and empty hash computation. We can remove a bit of state from the client without a reduction in security by relying on the value as reported by the server. * fix verifier
1 parent d454063 commit f839b54

File tree

7 files changed

+21
-25
lines changed

7 files changed

+21
-25
lines changed

cmd/keytransparency-client/cmd/root.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,6 @@ func init() {
8383
RootCmd.PersistentFlags().String("log-url", "", "URL of Certificate Transparency server")
8484
RootCmd.PersistentFlags().String("log-key", "", "Path to public key PEM for Trillian Log server")
8585

86-
RootCmd.PersistentFlags().Int64("map-id", 0, "Map ID of the backend map server")
87-
8886
RootCmd.PersistentFlags().String("kt-url", "", "URL of Key Transparency server")
8987
RootCmd.PersistentFlags().String("kt-key", "testdata/server.crt", "Path to public key for Key Transparency")
9088
RootCmd.PersistentFlags().String("kt-sig", "testdata/p256-pubkey.pem", "Path to public key for signed map heads")
@@ -186,7 +184,7 @@ func readSignatureVerifier(ktPEM string) (signatures.Verifier, error) {
186184
return ver, nil
187185
}
188186

189-
func getClient(cc *grpc.ClientConn, mapID int64, vrfPubFile, ktSig string, log client.LogVerifier) (*grpcc.Client, error) {
187+
func getClient(cc *grpc.ClientConn, vrfPubFile, ktSig string, log client.LogVerifier) (*grpcc.Client, error) {
190188
// Create Key Transparency client.
191189
vrfKey, err := readVrfKey(vrfPubFile)
192190
if err != nil {
@@ -197,7 +195,7 @@ func getClient(cc *grpc.ClientConn, mapID int64, vrfPubFile, ktSig string, log c
197195
return nil, fmt.Errorf("error reading key transparency PEM: %v", err)
198196
}
199197
cli := pb.NewKeyTransparencyServiceClient(cc)
200-
return grpcc.New(mapID, cli, vrfKey, verifier, log), nil
198+
return grpcc.New(cli, vrfKey, verifier, log), nil
201199
}
202200

203201
func dial(ktURL, caFile, clientSecretFile string, serviceKeyFile string) (*grpc.ClientConn, error) {
@@ -257,7 +255,6 @@ func GetClient(clientSecretFile string) (*grpcc.Client, error) {
257255
ktURL := viper.GetString("kt-url")
258256
ktPEM := viper.GetString("kt-key")
259257
ktSig := viper.GetString("kt-sig")
260-
mapID := viper.GetInt64("map-id")
261258
logPEM := viper.GetString("log-key")
262259
serviceKeyFile := viper.GetString("service-key")
263260
cc, err := dial(ktURL, ktPEM, clientSecretFile, serviceKeyFile)
@@ -277,7 +274,7 @@ func GetClient(clientSecretFile string) (*grpcc.Client, error) {
277274
}
278275
log := client.NewLogVerifier(hasher, logPubKey)
279276

280-
c, err := getClient(cc, mapID, vrfFile, ktSig, log)
277+
c, err := getClient(cc, vrfFile, ktSig, log)
281278
if err != nil {
282279
return nil, fmt.Errorf("Error creating client: %v", err)
283280
}

cmd/keytransparency-client/grpcc/grpc_client.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,15 @@ type Client struct {
9191
}
9292

9393
// New creates a new client.
94-
func New(mapID int64,
94+
func New(
9595
client spb.KeyTransparencyServiceClient,
9696
vrf vrf.PublicKey,
9797
verifier crypto.PublicKey,
9898
log client.LogVerifier) *Client {
9999
return &Client{
100100
cli: client,
101101
vrf: vrf,
102-
kt: kt.New(vrf, tv.New(mapID, sparse.CONIKSHasher), verifier, log),
102+
kt: kt.New(vrf, tv.New(sparse.CONIKSHasher), verifier, log),
103103
log: log,
104104
mutator: entry.New(),
105105
RetryCount: 1,

core/client/kt/verify.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,16 @@ import (
2525
"github.com/google/keytransparency/core/crypto/commitments"
2626
"github.com/google/keytransparency/core/crypto/vrf"
2727
"github.com/google/keytransparency/core/tree/sparse"
28-
tv "github.com/google/keytransparency/core/tree/sparse/verifier"
2928

3029
"github.com/golang/protobuf/proto"
30+
"github.com/google/trillian"
3131
"github.com/google/trillian/client"
32-
tcrypto "github.com/google/trillian/crypto"
3332
"golang.org/x/net/context"
3433

34+
tv "github.com/google/keytransparency/core/tree/sparse/verifier"
35+
tcrypto "github.com/google/trillian/crypto"
36+
3537
tpb "github.com/google/keytransparency/core/proto/keytransparency_v1_types"
36-
"github.com/google/trillian"
3738
)
3839

3940
var (
@@ -106,7 +107,8 @@ func (v *Verifier) VerifyGetEntryResponse(ctx context.Context, userID, appID str
106107
return ErrNilProof
107108
}
108109

109-
if err := v.tree.VerifyProof(leafProof.Inclusion, index[:], leafProof.Leaf.LeafValue, sparse.FromBytes(in.GetSmr().RootHash)); err != nil {
110+
mapID := in.GetSmr().GetMapId()
111+
if err := v.tree.VerifyProof(mapID, leafProof.Inclusion, index[:], leafProof.Leaf.LeafValue, sparse.FromBytes(in.GetSmr().RootHash)); err != nil {
110112
Vlog.Printf("✗ Sparse tree proof verification failed.")
111113
return fmt.Errorf("tree.VerifyProof(): %v", err)
112114
}

core/tree/sparse/verifier/verifier.go

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,27 +38,25 @@ var (
3838

3939
// Verifier represents a sparse tree proof verifier object.
4040
type Verifier struct {
41-
mapID int64
4241
hasher sparse.TreeHasher
4342
}
4443

4544
// New returns a new tree proofs verifier object.
46-
func New(mapID int64, hasher sparse.TreeHasher) *Verifier {
45+
func New(hasher sparse.TreeHasher) *Verifier {
4746
return &Verifier{
48-
mapID: mapID,
4947
hasher: hasher,
5048
}
5149
}
5250

5351
// VerifyProof verifies a tree proof of a given leaf at a given index based on
5452
// the provided root and neighbor list
55-
func (v *Verifier) VerifyProof(neighbors [][]byte, index, leaf []byte, root sparse.Hash) error {
53+
func (v *Verifier) VerifyProof(treeID int64, neighbors [][]byte, index, leaf []byte, root sparse.Hash) error {
5654
if len(neighbors) > sparse.IndexLen {
5755
return ErrNeighborsLen
5856
}
5957

6058
// Calculate the tree root based on neighbors and leaf.
61-
calculatedRoot, err := v.calculateRoot(neighbors, tree.BitString(index), leaf)
59+
calculatedRoot, err := v.calculateRoot(treeID, neighbors, tree.BitString(index), leaf)
6260
if err != nil {
6361
return err
6462
}
@@ -73,7 +71,7 @@ func (v *Verifier) VerifyProof(neighbors [][]byte, index, leaf []byte, root spar
7371

7472
// calculateRoot calculates the root of the tree branch defined by leaf and
7573
// neighbors.
76-
func (v *Verifier) calculateRoot(neighbors [][]byte, bindex string, leaf []byte) (sparse.Hash, error) {
74+
func (v *Verifier) calculateRoot(treeID int64, neighbors [][]byte, bindex string, leaf []byte) (sparse.Hash, error) {
7775
var leafHash sparse.Hash
7876

7977
// If the leaf is empty, it is a proof of absence.
@@ -84,10 +82,10 @@ func (v *Verifier) calculateRoot(neighbors [][]byte, bindex string, leaf []byte)
8482
// Calculate the value of the empty leaf
8583
missingBranchBIndex := bindex[:len(neighbors)]
8684
index, depth := tree.InvertBitString(missingBranchBIndex)
87-
leafHash = v.hasher.HashEmpty(v.mapID, index, depth)
85+
leafHash = v.hasher.HashEmpty(treeID, index, depth)
8886
} else {
8987
index, depth := tree.InvertBitString(bindex)
90-
leafHash = v.hasher.HashLeaf(v.mapID, index, depth, leaf)
88+
leafHash = v.hasher.HashLeaf(treeID, index, depth, leaf)
9189
}
9290

9391
// calculatedRoot holds the calculated root so far, starting from leaf.
@@ -100,7 +98,7 @@ func (v *Verifier) calculateRoot(neighbors [][]byte, bindex string, leaf []byte)
10098
// If the neighbor is empty, set it to HashEmpty output.
10199
if len(neighbor) == 0 {
102100
nIndex, nDepth := tree.InvertBitString(neighborBIndex)
103-
neighborHash = v.hasher.HashEmpty(v.mapID, nIndex, nDepth)
101+
neighborHash = v.hasher.HashEmpty(treeID, nIndex, nDepth)
104102
} else {
105103
neighborHash = sparse.FromBytes(neighbor)
106104
}

core/tree/sparse/verifier/verifier_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ func generateNbrData(t *testing.T, leaves []Leaf) ([][][]byte, error) {
8282
*/
8383

8484
func TestVerifyProof(t *testing.T) {
85-
verifier := New(mapID, sparse.CONIKSHasher)
85+
verifier := New(sparse.CONIKSHasher)
8686
for _, tc := range []struct {
8787
root []byte
8888
leaves []Leaf
@@ -165,7 +165,7 @@ func TestVerifyProof(t *testing.T) {
165165
nbrs[256-len(leaf.nbrs)+k] = nbr
166166
}
167167

168-
if err := verifier.VerifyProof(nbrs, leaf.index, leaf.value, sparse.FromBytes(tc.root)); err != nil {
168+
if err := verifier.VerifyProof(mapID, nbrs, leaf.index, leaf.value, sparse.FromBytes(tc.root)); err != nil {
169169
t.Errorf("VerifyProof(_, %v, _, _)=%v", leaf.index, err)
170170
}
171171
}

integration/testutil.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ func NewEnv(t *testing.T) *Env {
214214
t.Fatalf("Dial(%v) = %v", addr, err)
215215
}
216216
cli := pb.NewKeyTransparencyServiceClient(cc)
217-
client := grpcc.New(mapID, cli, vrfPub, verifier, fake.NewFakeTrillianLogVerifier())
217+
client := grpcc.New(cli, vrfPub, verifier, fake.NewFakeTrillianLogVerifier())
218218
client.RetryCount = 0
219219

220220
return &Env{s, server, cc, client, signer, sqldb, factory, vrfPriv, cli, hs}

scripts/prepare_client.sh

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ vrf: \"${VRF}\"
7676
kt-key: \"${KTKEY}\"
7777
kt-sig: \"${SIGKEY}\"
7878
domain: \"${DOMAIN}\"
79-
mapid: ${MAP_ID}
8079
kt-url: \"${KTURL}\"
8180
client-secret: \"${CLIENTSECRET}\"
8281
service-key: \"${SERVICEKEY}\""

0 commit comments

Comments
 (0)