Skip to content

Commit 314eed4

Browse files
[Delegations prereq 6] Use a verify.DB for delegation in client (#196)
* [Delegations prereq] Use a verify.DB for delegation in client Splitting up #175 * stash * Add tests to make sure the top level targets 'delegation' edge has associated keys. Make NewDelegationsIterator return an error if the passed DB is missing the top level targets role * Pass delegation directly to loadDelegatedTargets
1 parent b98aea5 commit 314eed4

File tree

6 files changed

+156
-82
lines changed

6 files changed

+156
-82
lines changed

client/delegations.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,19 @@ func (c *Client) getTargetFileMeta(target string) (data.TargetFileMeta, error) {
2020
// - filter delegations with paths or path_hash_prefixes matching searched target
2121
// - 5.6.7.1 cycles protection
2222
// - 5.6.7.2 terminations
23-
delegations := targets.NewDelegationsIterator(target)
23+
delegations, err := targets.NewDelegationsIterator(target, c.db)
24+
if err != nil {
25+
return data.TargetFileMeta{}, err
26+
}
27+
2428
for i := 0; i < c.MaxDelegations; i++ {
2529
d, ok := delegations.Next()
2630
if !ok {
2731
return data.TargetFileMeta{}, ErrUnknownTarget{target, snapshot.Version}
2832
}
2933

3034
// covers 5.6.{1,2,3,4,5,6}
31-
targets, err := c.loadDelegatedTargets(snapshot, d.Delegatee.Name, d.Verifier)
35+
targets, err := c.loadDelegatedTargets(snapshot, d)
3236
if err != nil {
3337
return data.TargetFileMeta{}, err
3438
}
@@ -39,11 +43,11 @@ func (c *Client) getTargetFileMeta(target string) (data.TargetFileMeta, error) {
3943
}
4044

4145
if targets.Delegations != nil {
42-
delegationsVerifier, err := verify.NewDelegationsVerifier(targets.Delegations)
46+
delegationsDB, err := verify.NewDBFromDelegations(targets.Delegations)
4347
if err != nil {
4448
return data.TargetFileMeta{}, err
4549
}
46-
err = delegations.Add(targets.Delegations.Roles, d.Delegatee.Name, delegationsVerifier)
50+
err = delegations.Add(targets.Delegations.Roles, d.Delegatee.Name, delegationsDB)
4751
if err != nil {
4852
return data.TargetFileMeta{}, err
4953
}
@@ -75,7 +79,9 @@ func (c *Client) loadLocalSnapshot() (*data.Snapshot, error) {
7579
}
7680

7781
// loadDelegatedTargets downloads, decodes, verifies and stores targets
78-
func (c *Client) loadDelegatedTargets(snapshot *data.Snapshot, role string, verifier verify.DelegationsVerifier) (*data.Targets, error) {
82+
func (c *Client) loadDelegatedTargets(snapshot *data.Snapshot, delegation targets.Delegation) (*data.Targets, error) {
83+
role := delegation.Delegatee.Name
84+
7985
var err error
8086
fileName := role + ".json"
8187
fileMeta, ok := snapshot.Meta[fileName]
@@ -98,11 +104,7 @@ func (c *Client) loadDelegatedTargets(snapshot *data.Snapshot, role string, veri
98104
// 5.6.3 verify signature with parent public keys
99105
// 5.6.5 verify that the targets is not expired
100106
// role "targets" is a top role verified by root keys loaded in the client db
101-
if role == "targets" {
102-
err = c.db.Unmarshal(raw, targets, role, fileMeta.Version)
103-
} else {
104-
err = verifier.Unmarshal(raw, targets, role, fileMeta.Version)
105-
}
107+
err = delegation.DB.Unmarshal(raw, targets, role, fileMeta.Version)
106108
if err != nil {
107109
return nil, ErrDecodeFailed{fileName, err}
108110
}

client/delegations_test.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package client
22

33
import (
4+
"crypto/sha256"
45
"encoding/json"
56
"fmt"
67
"io"
@@ -26,7 +27,13 @@ func TestGetTargetMeta(t *testing.T) {
2627

2728
f, err := c.getTargetFileMeta("f.txt")
2829
assert.Nil(t, err)
29-
assert.Equal(t, int64(15), f.Length)
30+
hash := sha256.Sum256([]byte("Contents: f.txt"))
31+
assert.Equal(t, data.HexBytes(hash[:]), f.Hashes["sha256"])
32+
33+
f, err = c.getTargetFileMeta("targets.txt")
34+
assert.Nil(t, err)
35+
hash = sha256.Sum256([]byte("Contents: targets.txt"))
36+
assert.Equal(t, data.HexBytes(hash[:]), f.Hashes["sha256"])
3037
}
3138

3239
func TestMaxDelegations(t *testing.T) {

pkg/targets/delegation.go

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
package targets
22

33
import (
4+
"errors"
5+
46
"github.com/theupdateframework/go-tuf/data"
7+
"github.com/theupdateframework/go-tuf/internal/sets"
58
"github.com/theupdateframework/go-tuf/verify"
69
)
710

811
type Delegation struct {
912
Delegator string
10-
Verifier verify.DelegationsVerifier
1113
Delegatee data.DelegatedRole
14+
DB *verify.DB
1215
}
1316

1417
type delegationsIterator struct {
@@ -17,19 +20,31 @@ type delegationsIterator struct {
1720
visitedRoles map[string]struct{}
1821
}
1922

23+
var ErrTopLevelTargetsRoleMissing = errors.New("tuf: top level targets role missing from top level keys DB")
24+
2025
// NewDelegationsIterator initialises an iterator with a first step
21-
// on top level targets
22-
func NewDelegationsIterator(target string) *delegationsIterator {
26+
// on top level targets.
27+
func NewDelegationsIterator(target string, topLevelKeysDB *verify.DB) (*delegationsIterator, error) {
28+
targetsRole := topLevelKeysDB.GetRole("targets")
29+
if targetsRole == nil {
30+
return nil, ErrTopLevelTargetsRoleMissing
31+
}
32+
2333
i := &delegationsIterator{
2434
target: target,
2535
stack: []Delegation{
2636
{
27-
Delegatee: data.DelegatedRole{Name: "targets"},
37+
Delegatee: data.DelegatedRole{
38+
Name: "targets",
39+
KeyIDs: sets.StringSetToSlice(targetsRole.KeyIDs),
40+
Threshold: targetsRole.Threshold,
41+
},
42+
DB: topLevelKeysDB,
2843
},
2944
},
3045
visitedRoles: make(map[string]struct{}),
3146
}
32-
return i
47+
return i, nil
3348
}
3449

3550
func (d *delegationsIterator) Next() (value Delegation, ok bool) {
@@ -57,7 +72,7 @@ func (d *delegationsIterator) Next() (value Delegation, ok bool) {
5772
return delegation, true
5873
}
5974

60-
func (d *delegationsIterator) Add(roles []data.DelegatedRole, delegator string, verifier verify.DelegationsVerifier) error {
75+
func (d *delegationsIterator) Add(roles []data.DelegatedRole, delegator string, db *verify.DB) error {
6176
for i := len(roles) - 1; i >= 0; i-- {
6277
// Push the roles onto the stack in reverse so we get an preorder traversal
6378
// of the delegations graph.
@@ -70,7 +85,7 @@ func (d *delegationsIterator) Add(roles []data.DelegatedRole, delegator string,
7085
delegation := Delegation{
7186
Delegator: delegator,
7287
Delegatee: r,
73-
Verifier: verifier,
88+
DB: db,
7489
}
7590
d.stack = append(d.stack, delegation)
7691
}

0 commit comments

Comments
 (0)