Skip to content

Commit 73f84e2

Browse files
committed
key: re-structure SlibKey.verify_signature
Re-structure try/except block according to @jku's review comment, for better readability. Signed-off-by: Lukas Puehringer <[email protected]>
1 parent 3247ed7 commit 73f84e2

File tree

1 file changed

+80
-57
lines changed

1 file changed

+80
-57
lines changed

securesystemslib/signer/_key.py

Lines changed: 80 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,15 @@
33
from abc import ABCMeta, abstractmethod
44
from typing import Any, Dict, Optional, Tuple, Type, cast
55

6-
from securesystemslib import exceptions
76
from securesystemslib._vendor.ed25519.ed25519 import (
87
SignatureMismatch,
98
checkvalid,
109
)
10+
from securesystemslib.exceptions import (
11+
UnsupportedLibraryError,
12+
UnverifiedSignatureError,
13+
VerificationError,
14+
)
1115
from securesystemslib.signer._signature import Signature
1216

1317
CRYPTO_IMPORT_ERROR = None
@@ -250,65 +254,84 @@ def _get_rsa_padding(
250254
return padding
251255

252256
def verify_signature(self, signature: Signature, data: bytes) -> None:
253-
try:
254-
if signature.keyid != self.keyid:
255-
raise ValueError(
256-
f"keyid mismatch: 'key id: {self.keyid}"
257-
f" != signature keyid: {signature.keyid}'"
257+
if signature.keyid != self.keyid:
258+
raise VerificationError from ValueError(
259+
f"keyid mismatch: 'key id: {self.keyid}"
260+
f" != signature keyid: {signature.keyid}'"
261+
)
262+
263+
sig = bytes.fromhex(signature.signature)
264+
265+
if CRYPTO_IMPORT_ERROR:
266+
try:
267+
if self.scheme != "ed25519":
268+
raise UnsupportedLibraryError(CRYPTO_IMPORT_ERROR)
269+
270+
public_bytes = bytes.fromhex(self.keyval["public"])
271+
checkvalid(sig, data, public_bytes)
272+
273+
except SignatureMismatch as e:
274+
raise UnverifiedSignatureError(
275+
f"Failed to verify signature by {self.keyid}"
276+
) from e
277+
278+
except Exception as e:
279+
logger.info(
280+
"Key %s failed to verify sig: %s", self.keyid, str(e)
258281
)
259-
sig = bytes.fromhex(signature.signature)
282+
raise VerificationError(
283+
f"Unknown failure to verify signature by {self.keyid}"
284+
) from e
260285

261-
if CRYPTO_IMPORT_ERROR:
262-
if self.scheme == "ed25519":
286+
else:
287+
try:
288+
key: PublicKeyTypes
289+
if self.scheme in [
290+
"rsassa-pss-sha224",
291+
"rsassa-pss-sha256",
292+
"rsassa-pss-sha384",
293+
"rsassa-pss-sha512",
294+
"rsa-pkcs1v15-sha224",
295+
"rsa-pkcs1v15-sha256",
296+
"rsa-pkcs1v15-sha384",
297+
"rsa-pkcs1v15-sha512",
298+
]:
299+
key = cast(RSAPublicKey, self._from_pem())
300+
padding_name, hash_name = self.scheme.split("-")[1:]
301+
hash_algorithm = self._get_hash_algorithm(hash_name)
302+
padding = self._get_rsa_padding(
303+
padding_name, hash_algorithm
304+
)
305+
key.verify(sig, data, padding, hash_algorithm)
306+
307+
elif self.scheme in [
308+
"ecdsa-sha2-nistp256",
309+
"ecdsa-sha2-nistp384",
310+
]:
311+
key = cast(EllipticCurvePublicKey, self._from_pem())
312+
hash_name = f"sha{self.scheme[-3:]}"
313+
hash_algorithm = self._get_hash_algorithm(hash_name)
314+
signature_algorithm = ECDSA(hash_algorithm)
315+
key.verify(sig, data, signature_algorithm)
316+
317+
elif self.scheme in ["ed25519"]:
263318
public_bytes = bytes.fromhex(self.keyval["public"])
264-
checkvalid(sig, data, public_bytes)
265-
return
266-
267-
raise exceptions.UnsupportedLibraryError(CRYPTO_IMPORT_ERROR)
268-
269-
key: PublicKeyTypes
270-
if self.scheme in [
271-
"rsassa-pss-sha224",
272-
"rsassa-pss-sha256",
273-
"rsassa-pss-sha384",
274-
"rsassa-pss-sha512",
275-
"rsa-pkcs1v15-sha224",
276-
"rsa-pkcs1v15-sha256",
277-
"rsa-pkcs1v15-sha384",
278-
"rsa-pkcs1v15-sha512",
279-
]:
280-
key = cast(RSAPublicKey, self._from_pem())
281-
padding_name, hash_name = self.scheme.split("-")[1:]
282-
hash_algorithm = self._get_hash_algorithm(hash_name)
283-
padding = self._get_rsa_padding(padding_name, hash_algorithm)
284-
key.verify(sig, data, padding, hash_algorithm)
285-
286-
elif self.scheme in ["ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384"]:
287-
key = cast(EllipticCurvePublicKey, self._from_pem())
288-
hash_name = f"sha{self.scheme[-3:]}"
289-
hash_algorithm = self._get_hash_algorithm(hash_name)
290-
signature_algorithm = ECDSA(hash_algorithm)
291-
key.verify(sig, data, signature_algorithm)
292-
293-
elif self.scheme in ["ed25519"]:
294-
public_bytes = bytes.fromhex(self.keyval["public"])
295-
key = Ed25519PublicKey.from_public_bytes(public_bytes)
296-
key.verify(sig, data)
297-
298-
else:
299-
raise ValueError(f"unknown scheme '{self.scheme}'")
300-
301-
# Workaround for 'except (SignatureMismatch, InvalidSignature)' to
302-
# conditionally evaluate the optional 'InvalidSignature':
303-
except Exception as e:
304-
if isinstance(e, SignatureMismatch) or (
305-
not CRYPTO_IMPORT_ERROR and isinstance(e, InvalidSignature)
306-
):
307-
raise exceptions.UnverifiedSignatureError(
319+
key = Ed25519PublicKey.from_public_bytes(public_bytes)
320+
key.verify(sig, data)
321+
322+
else:
323+
raise ValueError(f"unknown scheme '{self.scheme}'")
324+
325+
# the actual switch for cryptography calls goes here
326+
except InvalidSignature as e:
327+
raise UnverifiedSignatureError(
308328
f"Failed to verify signature by {self.keyid}"
309329
) from e
310330

311-
logger.info("Key %s failed to verify sig: %s", self.keyid, str(e))
312-
raise exceptions.VerificationError(
313-
f"Unknown failure to verify signature by {self.keyid}"
314-
) from e
331+
except Exception as e:
332+
logger.info(
333+
"Key %s failed to verify sig: %s", self.keyid, str(e)
334+
)
335+
raise VerificationError(
336+
f"Unknown failure to verify signature by {self.keyid}"
337+
) from e

0 commit comments

Comments
 (0)