Skip to content

Commit b38d91f

Browse files
Verify threshold is valid (#712)
* Verify threshold is valid Signed-off-by: Fredrik Skogman <[email protected]> * Updated tests Signed-off-by: Fredrik Skogman <[email protected]> * Updated tests Signed-off-by: Fredrik Skogman <[email protected]> --------- Signed-off-by: Fredrik Skogman <[email protected]>
1 parent 876cf2a commit b38d91f

File tree

2 files changed

+48
-9
lines changed

2 files changed

+48
-9
lines changed

metadata/metadata.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,13 @@ func (meta *Metadata[T]) VerifyDelegate(delegatedRole string, delegatedMetadata
292292
if len(roleKeyIDs) == 0 {
293293
return &ErrValue{Msg: fmt.Sprintf("no delegation found for %s", delegatedRole)}
294294
}
295+
296+
if roleThreshold < 1 {
297+
return &ErrValue{Msg: fmt.Sprintf("insufficient threshold (%d) configured for %s",
298+
roleThreshold,
299+
delegatedRole)}
300+
}
301+
295302
// loop through each role keyID
296303
for _, keyID := range roleKeyIDs {
297304
key, ok := keys[keyID]

metadata/metadata_test.go

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -592,26 +592,24 @@ func TestVerifyDelegate(t *testing.T) {
592592
},
593593
Roles: []DelegatedRole{
594594
{
595-
Name: "test",
596-
KeyIDs: []string{delegateeKey.ID()},
595+
Name: "test",
596+
KeyIDs: []string{delegateeKey.ID()},
597+
Threshold: 1,
597598
},
598599
},
599600
}
601+
600602
targets.Signed.Delegations = delegations
601-
err = targets.VerifyDelegate("test", root)
602-
assert.NoError(t, err)
603+
err = targets.VerifyDelegate("root", targets)
604+
assert.Errorf(t, err, "Verifying test failed, not enough signatures, got %d, want %d", 0, 1)
603605
err = targets.VerifyDelegate("test", targets)
604-
assert.NoError(t, err)
606+
assert.Errorf(t, err, "Verifying test failed, not enough signatures, got %d, want %d", 0, 1)
605607

606608
err = targets.VerifyDelegate("non-existing", root)
607609
assert.EqualError(t, err, "value error: no delegation found for non-existing")
608610
err = targets.VerifyDelegate("non-existing", targets)
609611
assert.EqualError(t, err, "value error: no delegation found for non-existing")
610612

611-
targets.Signed.Delegations.Roles[0].Threshold = 1
612-
err = targets.VerifyDelegate("test", targets)
613-
assert.Errorf(t, err, "Verifying test failed, not enough signatures, got %d, want %d", 0, 1)
614-
615613
delegations.Keys["incorrectkey"] = delegations.Keys[delegateeKey.ID()]
616614
delete(delegations.Keys, delegateeKey.ID())
617615
err = targets.VerifyDelegate("test", root)
@@ -626,6 +624,40 @@ func TestVerifyDelegate(t *testing.T) {
626624
assert.EqualError(t, err, "type error: call is valid only on delegator metadata (should be either root or targets)")
627625
}
628626

627+
func TestVerifyDelegateThreshold(t *testing.T) {
628+
root := Root(fixedExpire)
629+
err := root.VerifyDelegate("test", root)
630+
assert.EqualError(t, err, "value error: no delegation found for test")
631+
632+
targets := Targets(fixedExpire)
633+
err = targets.VerifyDelegate("test", targets)
634+
assert.EqualError(t, err, "value error: no delegations found")
635+
636+
key, _, err := ed25519.GenerateKey(nil)
637+
assert.NoError(t, err)
638+
639+
delegateeKey, _ := KeyFromPublicKey(key)
640+
delegations := &Delegations{
641+
Keys: map[string]*Key{
642+
delegateeKey.ID(): delegateeKey,
643+
},
644+
Roles: []DelegatedRole{
645+
{
646+
Name: "test",
647+
KeyIDs: []string{delegateeKey.ID()},
648+
Threshold: 0,
649+
},
650+
},
651+
}
652+
targets.Signed.Delegations = delegations
653+
err = targets.VerifyDelegate("test", root)
654+
assert.ErrorIs(t, err, &ErrValue{})
655+
assert.EqualError(t, err, "value error: insufficient threshold (0) configured for test")
656+
err = targets.VerifyDelegate("test", targets)
657+
assert.ErrorIs(t, err, &ErrValue{})
658+
assert.EqualError(t, err, "value error: insufficient threshold (0) configured for test")
659+
}
660+
629661
func TestVerifyLengthHashesTargetFiles(t *testing.T) {
630662
targetFiles := TargetFile()
631663
targetFiles.Hashes = map[string]HexBytes{}

0 commit comments

Comments
 (0)