Skip to content

Commit 275e4ca

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 6a20108 commit 275e4ca

File tree

2 files changed

+38
-9
lines changed

2 files changed

+38
-9
lines changed

tests/test_api.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,26 @@ 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 with invalid signature (securesystemslib FormatError)
216+
sig = metadata_obj.signatures[timestamp_keyid]
217+
correct_sig = sig.signature
218+
print (correct_sig)
219+
sig.signature = "foo"
220+
with self.assertRaises(tuf.exceptions.UnsignedMetadataError):
221+
timestamp_key.verify_signature(metadata_obj)
222+
223+
# Test failure with valid but incorrect signature
224+
sig.signature = "52af76354db3403242e1437b1fbf1c7edc4e66b81dfd63b3026ff681d57e88e11a697cca78061a376a9dd8d7fde5777b14d4e6d8e75f976101cbc61321642f06"
225+
with self.assertRaises(tuf.exceptions.UnsignedMetadataError):
226+
timestamp_key.verify_signature(metadata_obj)
227+
sig.signature = correct_sig
208228

209229
def test_metadata_base(self):
210230
# 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
@@ -21,6 +21,7 @@
2121
from datetime import datetime, timedelta
2222
from typing import Any, ClassVar, Dict, List, Mapping, Optional, Tuple, Type
2323

24+
from securesystemslib import exceptions as sslib_exceptions
2425
from securesystemslib import keys as sslib_keys
2526
from securesystemslib.signer import Signature, Signer
2627
from securesystemslib.storage import FilesystemBackend, StorageBackendInterface
@@ -454,8 +455,6 @@ def verify_signature(
454455
Raises:
455456
UnsignedMetadataError: The signature could not be verified for a
456457
variety of possible reasons: see error message.
457-
TODO: Various other errors currently bleed through from lower
458-
level components: Issue #1351
459458
"""
460459
try:
461460
signature = metadata.signatures[self.keyid]
@@ -471,15 +470,25 @@ def verify_signature(
471470

472471
signed_serializer = CanonicalJSONSerializer()
473472

474-
if not sslib_keys.verify_signature(
475-
self.to_securesystemslib_key(),
476-
signature.to_dict(),
477-
signed_serializer.serialize(metadata.signed),
478-
):
473+
try:
474+
if not sslib_keys.verify_signature(
475+
self.to_securesystemslib_key(),
476+
signature.to_dict(),
477+
signed_serializer.serialize(metadata.signed),
478+
):
479+
raise exceptions.UnsignedMetadataError(
480+
f"Failed to verify {self.keyid} signature",
481+
metadata.signed,
482+
)
483+
except (
484+
sslib_exceptions.CryptoError,
485+
sslib_exceptions.FormatError,
486+
sslib_exceptions.UnsupportedAlgorithmError,
487+
) as e:
479488
raise exceptions.UnsignedMetadataError(
480-
f"Failed to verify {self.keyid} signature for metadata",
489+
f"Failed to verify {self.keyid} signature",
481490
metadata.signed,
482-
)
491+
) from e
483492

484493

485494
class Role:

0 commit comments

Comments
 (0)