|
3 | 3 | from abc import ABCMeta, abstractmethod
|
4 | 4 | from typing import Any, Dict, Optional, Tuple, Type, cast
|
5 | 5 |
|
6 |
| -from securesystemslib import exceptions |
7 | 6 | from securesystemslib._vendor.ed25519.ed25519 import (
|
8 | 7 | SignatureMismatch,
|
9 | 8 | checkvalid,
|
10 | 9 | )
|
| 10 | +from securesystemslib.exceptions import ( |
| 11 | + UnsupportedLibraryError, |
| 12 | + UnverifiedSignatureError, |
| 13 | + VerificationError, |
| 14 | +) |
11 | 15 | from securesystemslib.signer._signature import Signature
|
12 | 16 |
|
13 | 17 | CRYPTO_IMPORT_ERROR = None
|
@@ -250,65 +254,84 @@ def _get_rsa_padding(
|
250 | 254 | return padding
|
251 | 255 |
|
252 | 256 | 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) |
258 | 281 | )
|
259 |
| - sig = bytes.fromhex(signature.signature) |
| 282 | + raise VerificationError( |
| 283 | + f"Unknown failure to verify signature by {self.keyid}" |
| 284 | + ) from e |
260 | 285 |
|
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"]: |
263 | 318 | 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( |
308 | 328 | f"Failed to verify signature by {self.keyid}"
|
309 | 329 | ) from e
|
310 | 330 |
|
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