Skip to content

Commit e6f743b

Browse files
author
Jussi Kukkonen
authored
Merge pull request #1435 from jku/handle-exceptions-in-verify
Handle exceptions in verify
2 parents cfc7638 + 70aff4c commit e6f743b

File tree

2 files changed

+49
-9
lines changed

2 files changed

+49
-9
lines changed

tests/test_api.py

+31
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,11 @@ def test_sign_verify(self):
181181
with self.assertRaises(exceptions.UnsignedMetadataError):
182182
snapshot_key.verify_signature(metadata_obj)
183183

184+
# Test verifying with explicitly set serializer
185+
targets_key.verify_signature(metadata_obj, CanonicalJSONSerializer())
186+
with self.assertRaises(exceptions.UnsignedMetadataError):
187+
targets_key.verify_signature(metadata_obj, JSONSerializer())
188+
184189
sslib_signer = SSlibSigner(self.keystore['snapshot'])
185190
# Append a new signature with the unrelated key and assert that ...
186191
metadata_obj.sign(sslib_signer, append=True)
@@ -200,6 +205,32 @@ def test_sign_verify(self):
200205
with self.assertRaises(exceptions.UnsignedMetadataError):
201206
targets_key.verify_signature(metadata_obj)
202207

208+
# Test failure on unknown scheme (securesystemslib UnsupportedAlgorithmError)
209+
scheme = timestamp_key.scheme
210+
timestamp_key.scheme = "foo"
211+
with self.assertRaises(exceptions.UnsignedMetadataError):
212+
timestamp_key.verify_signature(metadata_obj)
213+
timestamp_key.scheme = scheme
214+
215+
# Test failure on broken public key data (securesystemslib CryptoError)
216+
public = timestamp_key.keyval["public"]
217+
timestamp_key.keyval["public"] = "ffff"
218+
with self.assertRaises(exceptions.UnsignedMetadataError):
219+
timestamp_key.verify_signature(metadata_obj)
220+
timestamp_key.keyval["public"] = public
221+
222+
# Test failure with invalid signature (securesystemslib FormatError)
223+
sig = metadata_obj.signatures[timestamp_keyid]
224+
correct_sig = sig.signature
225+
sig.signature = "foo"
226+
with self.assertRaises(exceptions.UnsignedMetadataError):
227+
timestamp_key.verify_signature(metadata_obj)
228+
229+
# Test failure with valid but incorrect signature
230+
sig.signature = "ff"*64
231+
with self.assertRaises(exceptions.UnsignedMetadataError):
232+
timestamp_key.verify_signature(metadata_obj)
233+
sig.signature = correct_sig
203234

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

tuf/api/metadata.py

+18-9
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)