Skip to content

Commit 743c440

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 4952b98 commit 743c440

File tree

2 files changed

+37
-9
lines changed

2 files changed

+37
-9
lines changed

tests/test_api.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,25 @@ def test_sign_verify(self):
205205
with self.assertRaises(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(exceptions.UnsignedMetadataError):
212+
timestamp_key.verify_signature(metadata_obj)
213+
timestamp_key.keyval["public"] = public
214+
215+
# Test failure with invalid signature (securesystemslib FormatError)
216+
sig = metadata_obj.signatures[timestamp_keyid]
217+
correct_sig = sig.signature
218+
sig.signature = "foo"
219+
with self.assertRaises(exceptions.UnsignedMetadataError):
220+
timestamp_key.verify_signature(metadata_obj)
221+
222+
# Test failure with valid but incorrect signature
223+
sig.signature = "52af76354db3403242e1437b1fbf1c7edc4e66b81dfd63b3026ff681d57e88e11a697cca78061a376a9dd8d7fde5777b14d4e6d8e75f976101cbc61321642f06"
224+
with self.assertRaises(exceptions.UnsignedMetadataError):
225+
timestamp_key.verify_signature(metadata_obj)
226+
sig.signature = correct_sig
208227

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

tuf/api/metadata.py

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
Union,
3434
)
3535

36+
from securesystemslib import exceptions as sslib_exceptions
3637
from securesystemslib import hash as sslib_hash
3738
from securesystemslib import keys as sslib_keys
3839
from securesystemslib.signer import Signature, Signer
@@ -483,8 +484,6 @@ def verify_signature(
483484
Raises:
484485
UnsignedMetadataError: The signature could not be verified for a
485486
variety of possible reasons: see error message.
486-
TODO: Various other errors currently bleed through from lower
487-
level components: Issue #1351
488487
"""
489488
try:
490489
signature = metadata.signatures[self.keyid]
@@ -500,15 +499,25 @@ def verify_signature(
500499

501500
signed_serializer = CanonicalJSONSerializer()
502501

503-
if not sslib_keys.verify_signature(
504-
self.to_securesystemslib_key(),
505-
signature.to_dict(),
506-
signed_serializer.serialize(metadata.signed),
507-
):
502+
try:
503+
if not sslib_keys.verify_signature(
504+
self.to_securesystemslib_key(),
505+
signature.to_dict(),
506+
signed_serializer.serialize(metadata.signed),
507+
):
508+
raise exceptions.UnsignedMetadataError(
509+
f"Failed to verify {self.keyid} signature",
510+
metadata.signed,
511+
)
512+
except (
513+
sslib_exceptions.CryptoError,
514+
sslib_exceptions.FormatError,
515+
sslib_exceptions.UnsupportedAlgorithmError,
516+
) as e:
508517
raise exceptions.UnsignedMetadataError(
509-
f"Failed to verify {self.keyid} signature for metadata",
518+
f"Failed to verify {self.keyid} signature",
510519
metadata.signed,
511-
)
520+
) from e
512521

513522

514523
class Role:

0 commit comments

Comments
 (0)