Skip to content

Commit 271d5b7

Browse files
author
Jussi Kukkonen
committed
Metadata API: verify_delegate: refactor
* Rename arguments so connection between the role name and the metadata is stronger. * Also add a comment on the list comprehension + next() trick. * Add return value annotation * Raise early if delegations is None to make the flow more obvious (and modify test case so we have coverage for the new case) Signed-off-by: Jussi Kukkonen <jkukkonen@vmware.com>
1 parent 48b58d9 commit 271d5b7

File tree

3 files changed

+27
-25
lines changed

3 files changed

+27
-25
lines changed

tests/repository_data/repository/metadata/role2.json

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,11 @@
22
"signatures": [
33
{
44
"keyid": "c8022fa1e9b9cb239a6b362bbdffa9649e61ad2cb699d2e4bc4fdf7930a0e64a",
5-
"sig": "6c32f8cc2c642803a7b3b022ede0cf727e82964c1aa934571ef366bd5050ed02cfe3fdfe5477c08d0cbcc2dd17bb786d37ab1ce2b27e01ad79faf087594e0300"
5+
"sig": "75b196a224fd200e46e738b1216b3316c5384f61083872f8d14b8b0a378b2344e64b1a6f1a89a711206a66a0b199d65ac0e30fe15ddbc4de89fa8ff645f99403"
66
}
77
],
88
"signed": {
99
"_type": "targets",
10-
"delegations": {
11-
"keys": {},
12-
"roles": []
13-
},
1410
"expires": "2030-01-01T00:00:00Z",
1511
"spec_version": "1.0.0",
1612
"targets": {},

tests/test_api.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,9 @@ def test_metadata_verify_delegate(self):
365365
root.verify_delegate('role1', role1)
366366
with self.assertRaises(ValueError):
367367
targets.verify_delegate('targets', targets)
368+
# verify fails when delegator has no delegations
369+
with self.assertRaises(ValueError):
370+
role2.verify_delegate('role1', role1)
368371

369372
# verify fails when delegate content is modified
370373
expires = snapshot.signed.expires

tuf/api/metadata.py

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -271,16 +271,16 @@ def sign(
271271

272272
def verify_delegate(
273273
self,
274-
role_name: str,
275-
delegate: "Metadata",
274+
delegated_role: str,
275+
delegated_metadata: "Metadata",
276276
signed_serializer: Optional[SignedSerializer] = None,
277-
):
278-
"""Verifies that 'delegate' is signed with the required threshold of
279-
keys for the delegated role 'role_name'.
277+
) -> None:
278+
"""Verifies that 'delegated_metadata' is signed with the required
279+
threshold of keys for the delegated role 'delegated_role'.
280280
281281
Args:
282-
role_name: Name of the delegated role to verify
283-
delegate: The Metadata object for the delegated role
282+
delegated_role: Name of the delegated role to verify
283+
delegated_metadata: The Metadata object for the delegated role
284284
signed_serializer: Optional; serializer used for delegate
285285
serialization. Default is CanonicalJSONSerializer.
286286
@@ -289,38 +289,41 @@ def verify_delegate(
289289
threshold of keys for 'role_name'
290290
"""
291291

292-
# Find the keys and role in our metadata
292+
# Find the keys and role in delegator metadata
293293
role = None
294294
if isinstance(self.signed, Root):
295295
keys = self.signed.keys
296-
role = self.signed.roles.get(role_name)
296+
role = self.signed.roles.get(delegated_role)
297297
elif isinstance(self.signed, Targets):
298-
if self.signed.delegations:
299-
keys = self.signed.delegations.keys
300-
# Assume role names are unique in delegations.roles: #1426
301-
roles = self.signed.delegations.roles
302-
role = next((r for r in roles if r.name == role_name), None)
298+
if self.signed.delegations is None:
299+
raise ValueError(f"No delegation found for {delegated_role}")
300+
301+
keys = self.signed.delegations.keys
302+
roles = self.signed.delegations.roles
303+
# Assume role names are unique in delegations.roles: #1426
304+
# Find first role in roles with matching name (or None if no match)
305+
role = next((r for r in roles if r.name == delegated_role), None)
303306
else:
304307
raise TypeError("Call is valid only on delegator metadata")
305308

306309
if role is None:
307-
raise ValueError(f"No delegation found for {role_name}")
310+
raise ValueError(f"No delegation found for {delegated_role}")
308311

309-
# verify that delegate is signed by required threshold of unique keys
312+
# verify that delegated_metadata is signed by threshold of unique keys
310313
signing_keys = set()
311314
for keyid in role.keyids:
312315
key = keys[keyid]
313316
try:
314-
key.verify_signature(delegate, signed_serializer)
317+
key.verify_signature(delegated_metadata, signed_serializer)
315318
signing_keys.add(key.keyid)
316319
except exceptions.UnsignedMetadataError:
317-
logger.info("Key %s failed to verify %s", keyid, role_name)
320+
logger.info("Key %s failed to verify %s", keyid, delegated_role)
318321

319322
if len(signing_keys) < role.threshold:
320323
raise exceptions.UnsignedMetadataError(
321-
f"{role_name} was signed by {len(signing_keys)}/"
324+
f"{delegated_role} was signed by {len(signing_keys)}/"
322325
f"{role.threshold} keys",
323-
delegate.signed,
326+
delegated_metadata.signed,
324327
)
325328

326329

0 commit comments

Comments
 (0)