Skip to content

Commit 3c3c8cb

Browse files
author
Jussi Kukkonen
committed
Metadata API: Clean up verify_signature() exceptions
Aim to only raise UnsignedMetadataError from verify_signature(). Some of the situations could be things like UnsupportedAlgorithmError -- where the underlying reason may be a missing dependency -- but it seems impossible for a client to know whether it's that or whether it is broken or malicious server side. Signed-off-by: Jussi Kukkonen <[email protected]>
1 parent 3f8fa8c commit 3c3c8cb

File tree

2 files changed

+31
-11
lines changed

2 files changed

+31
-11
lines changed

tests/test_api.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,20 @@ def test_sign_verify(self):
205205
with self.assertRaises(tuf.exceptions.UnsignedMetadataError):
206206
targets_key.verify_signature(metadata_obj)
207207

208+
# Test failure on broken public key data (securesystemslib CryptoError)
209+
public = timestamp_key.keyval["public"]
210+
timestamp_key.keyval["public"] = "ffff"
211+
with self.assertRaises(tuf.exceptions.UnsignedMetadataError):
212+
timestamp_key.verify_signature(metadata_obj)
213+
timestamp_key.keyval["public"] = public
214+
215+
# Test failure on wrong signature (securesystemslib FormatError)
216+
sig = next(sig for sig in metadata_obj.signatures if sig.keyid == timestamp_keyid)
217+
correct_sig = sig.signature
218+
sig.signature = "foo"
219+
with self.assertRaises(tuf.exceptions.UnsignedMetadataError):
220+
timestamp_key.verify_signature(metadata_obj)
221+
sig.signature = correct_sig
208222

209223
def test_metadata_base(self):
210224
# Use of Snapshot is arbitrary, we're just testing the base class features

tuf/api/metadata.py

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from datetime import datetime, timedelta
2020
from typing import Any, Dict, List, Mapping, Optional
2121

22+
from securesystemslib import exceptions as sslib_exceptions
2223
from securesystemslib import keys as sslib_keys
2324
from securesystemslib.signer import Signature, Signer
2425
from securesystemslib.storage import FilesystemBackend, StorageBackendInterface
@@ -435,8 +436,6 @@ def verify_signature(
435436
Raises:
436437
UnsignedMetadataError: The signature could not be verified for a
437438
variety of possible reasons: see error message.
438-
TODO: Various other errors currently bleed through from lower
439-
level components: Issue #1351
440439
"""
441440
try:
442441
sigs = metadata.signatures
@@ -453,16 +452,23 @@ def verify_signature(
453452

454453
signed_serializer = CanonicalJSONSerializer()
455454

456-
if not sslib_keys.verify_signature(
457-
self.to_securesystemslib_key(),
458-
signature.to_dict(),
459-
signed_serializer.serialize(metadata.signed),
460-
):
455+
try:
456+
if not sslib_keys.verify_signature(
457+
self.to_securesystemslib_key(),
458+
signature.to_dict(),
459+
signed_serializer.serialize(metadata.signed),
460+
):
461+
raise exceptions.UnsignedMetadataError(
462+
f"Failed to verify {self.id} signature", metadata.signed,
463+
)
464+
except (
465+
sslib_exceptions.CryptoError,
466+
sslib_exceptions.FormatError,
467+
sslib_exceptions.UnsupportedAlgorithmError,
468+
) as e:
461469
raise exceptions.UnsignedMetadataError(
462-
f"Failed to verify {self.id} signature for metadata",
463-
metadata.signed,
464-
)
465-
470+
f"Failed to verify {self.id} signature", metadata.signed,
471+
) from e
466472

467473
class Role:
468474
"""A container class containing the set of keyids and threshold associated

0 commit comments

Comments
 (0)