Skip to content

Commit 166e457

Browse files
committed
De-duplicate get_hash_algorithm method
Add helper to return pyca/cryptography hash object for a given hash name and use in SSlibkey and CryptoSigner, replacing two local helpers. NOTE: The helper is added to a separate _crypto_util module for conditional import only of pyca/cryptography is installed. Signed-off-by: Lukas Puehringer <[email protected]>
1 parent 3c6a34d commit 166e457

File tree

3 files changed

+31
-36
lines changed

3 files changed

+31
-36
lines changed

securesystemslib/signer/_crypto_signer.py

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,7 @@
3838
)
3939
from cryptography.hazmat.primitives.asymmetric.types import PrivateKeyTypes
4040
from cryptography.hazmat.primitives.hashes import (
41-
SHA224,
4241
SHA256,
43-
SHA384,
44-
SHA512,
4542
HashAlgorithm,
4643
)
4744
from cryptography.hazmat.primitives.serialization import (
@@ -50,6 +47,9 @@
5047
PrivateFormat,
5148
load_pem_private_key,
5249
)
50+
51+
from securesystemslib.signer._crypto_utils import get_hash_algorithm
52+
5353
except ImportError:
5454
CRYPTO_IMPORT_ERROR = "'pyca/cryptography' library required"
5555

@@ -77,21 +77,6 @@ class _NoSignArgs:
7777
_ECDSA_KEYTYPES = ["ecdsa", "ecdsa-sha2-nistp256"]
7878

7979

80-
def _get_hash_algorithm(name: str) -> "HashAlgorithm":
81-
"""Helper to return hash algorithm for name."""
82-
algorithm: HashAlgorithm
83-
if name == "sha224":
84-
algorithm = SHA224()
85-
if name == "sha256":
86-
algorithm = SHA256()
87-
if name == "sha384":
88-
algorithm = SHA384()
89-
if name == "sha512":
90-
algorithm = SHA512()
91-
92-
return algorithm
93-
94-
9580
def _get_rsa_padding(name: str, hash_algorithm: "HashAlgorithm") -> "AsymmetricPadding":
9681
"""Helper to return rsa signature padding for name."""
9782
padding: AsymmetricPadding
@@ -156,7 +141,7 @@ def __init__(
156141
raise ValueError(f"invalid rsa key: {type(private_key)}")
157142

158143
padding_name, hash_name = public_key.scheme.split("-")[1:]
159-
hash_algo = _get_hash_algorithm(hash_name)
144+
hash_algo = get_hash_algorithm(hash_name)
160145
padding = _get_rsa_padding(padding_name, hash_algo)
161146
self._sign_args = _RSASignArgs(padding, hash_algo)
162147
self._private_key = private_key
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
"""Signer utils for internal use that require pyca/cryptography."""
2+
3+
from cryptography.hazmat.primitives.hashes import (
4+
SHA224,
5+
SHA256,
6+
SHA384,
7+
SHA512,
8+
HashAlgorithm,
9+
)
10+
11+
12+
def get_hash_algorithm(name: str) -> HashAlgorithm:
13+
"""Helper to return hash algorithm object for name."""
14+
if name == "sha224":
15+
return SHA224()
16+
elif name == "sha256":
17+
return SHA256()
18+
elif name == "sha384":
19+
return SHA384()
20+
elif name == "sha512":
21+
return SHA512()
22+
23+
raise ValueError(f"Unsupported hash algorithm: {name}")

securesystemslib/signer/_key.py

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
)
4444
from cryptography.hazmat.primitives.asymmetric.types import PublicKeyTypes
4545
from cryptography.hazmat.primitives.hashes import (
46-
SHA224,
4746
SHA256,
4847
SHA384,
4948
SHA512,
@@ -54,6 +53,9 @@
5453
PublicFormat,
5554
load_pem_public_key,
5655
)
56+
57+
from securesystemslib.signer._crypto_utils import get_hash_algorithm
58+
5759
except ImportError:
5860
CRYPTO_IMPORT_ERROR = "'pyca/cryptography' library required"
5961

@@ -308,21 +310,6 @@ def from_crypto(
308310

309311
return SSlibKey(keyid, keytype, scheme, keyval)
310312

311-
@staticmethod
312-
def _get_hash_algorithm(name: str) -> HashAlgorithm:
313-
"""Helper to return hash algorithm for name."""
314-
algorithm: HashAlgorithm
315-
if name == "sha224":
316-
algorithm = SHA224()
317-
if name == "sha256":
318-
algorithm = SHA256()
319-
if name == "sha384":
320-
algorithm = SHA384()
321-
if name == "sha512":
322-
algorithm = SHA512()
323-
324-
return algorithm
325-
326313
@staticmethod
327314
def _get_rsa_padding(name: str, hash_algorithm: HashAlgorithm) -> AsymmetricPadding:
328315
"""Helper to return rsa signature padding for name."""
@@ -372,7 +359,7 @@ def _validate_curve(
372359
key = cast(RSAPublicKey, self._crypto_key())
373360
_validate_type(key, RSAPublicKey)
374361
padding_name, hash_name = self.scheme.split("-")[1:]
375-
hash_algorithm = self._get_hash_algorithm(hash_name)
362+
hash_algorithm = get_hash_algorithm(hash_name)
376363
padding = self._get_rsa_padding(padding_name, hash_algorithm)
377364
key.verify(signature, data, padding, hash_algorithm)
378365

0 commit comments

Comments
 (0)