Skip to content

Commit 09154f0

Browse files
authored
Merge pull request #852 from NicholasTanz/supportNistp521_SSlibKey_verify_sig
AzureSigner: import_ may return *unsupported* ecdsa-sha2-nistp521 scheme
2 parents fc24e60 + 9a06a52 commit 09154f0

File tree

5 files changed

+56
-0
lines changed

5 files changed

+56
-0
lines changed

securesystemslib/signer/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,10 @@
4949
{
5050
("ecdsa", "ecdsa-sha2-nistp256"): SSlibKey,
5151
("ecdsa", "ecdsa-sha2-nistp384"): SSlibKey,
52+
("ecdsa", "ecdsa-sha2-nistp521"): SSlibKey,
5253
("ecdsa-sha2-nistp256", "ecdsa-sha2-nistp256"): SSlibKey,
5354
("ecdsa-sha2-nistp384", "ecdsa-sha2-nistp384"): SSlibKey,
55+
("ecdsa-sha2-nistp521", "ecdsa-sha2-nistp521"): SSlibKey,
5456
("ed25519", "ed25519"): SSlibKey,
5557
("rsa", "rsassa-pss-sha224"): SSlibKey,
5658
("rsa", "rsassa-pss-sha256"): SSlibKey,

securesystemslib/signer/_key.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
ECDSA,
2424
SECP256R1,
2525
SECP384R1,
26+
SECP521R1,
2627
EllipticCurvePublicKey,
2728
)
2829
from cryptography.hazmat.primitives.asymmetric.ed25519 import (
@@ -255,6 +256,9 @@ def _pem() -> str:
255256
if isinstance(public_key.curve, SECP384R1):
256257
return "ecdsa", "ecdsa-sha2-nistp384", _pem()
257258

259+
if isinstance(public_key.curve, SECP521R1):
260+
return "ecdsa", "ecdsa-sha2-nistp521", _pem()
261+
258262
raise ValueError(f"unsupported curve '{public_key.curve.name}'")
259263

260264
if isinstance(public_key, Ed25519PublicKey):
@@ -387,6 +391,15 @@ def _validate_curve(key, curve):
387391
_validate_curve(key, SECP384R1)
388392
key.verify(signature, data, ECDSA(SHA384()))
389393

394+
elif (
395+
self.keytype in ["ecdsa", "ecdsa-sha2-nistp521"]
396+
and self.scheme == "ecdsa-sha2-nistp521"
397+
):
398+
key = cast(EllipticCurvePublicKey, self._crypto_key())
399+
_validate_type(key, EllipticCurvePublicKey)
400+
_validate_curve(key, SECP521R1)
401+
key.verify(signature, data, ECDSA(SHA512()))
402+
390403
elif self.keytype == "ed25519" and self.scheme == "ed25519":
391404
public_bytes = bytes.fromhex(self.keyval["public"])
392405
key = Ed25519PublicKey.from_public_bytes(public_bytes)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIHuAgEAMBAGByqGSM49AgEGBSuBBAAjBIHWMIHTAgEBBEIAz06adlpkPjjoOEpo
3+
XOVBFqHPK7o9JpB/Vle4o9sOS/9xWi+DS/8cgOXjXT5l3s7QOXSVGax0lZV1+xyG
4+
wWLUKR6hgYkDgYYABAFfEUbLD0n0LjfChrqG5ncjCsRmGS54cM1nVSqcdwWE1gWE
5+
zvCK0rGC/o5SnCXA+w9JSOpwHGSSlrLitPhRPAg/3gB2xAurcND4G7CsQQuMAAzG
6+
9AZ+gyUsnl8czingqGUrCmTYeIFCnivVuO4DowWruznIXQKdv1Mf5lnBXn9yMJ7D
7+
Fg==
8+
-----END PRIVATE KEY-----
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
-----BEGIN PUBLIC KEY-----
2+
MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBXxFGyw9J9C43woa6huZ3IwrEZhku
3+
eHDNZ1UqnHcFhNYFhM7witKxgv6OUpwlwPsPSUjqcBxkkpay4rT4UTwIP94AdsQL
4+
q3DQ+BuwrEELjAAMxvQGfoMlLJ5fHM4p4KhlKwpk2HiBQp4r1bjuA6MFq7s5yF0C
5+
nb9TH+ZZwV5/cjCewxY=
6+
-----END PUBLIC KEY-----

tests/test_signer.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ def test_key_verify_signature(self):
8888
"0155661bdf705f621a74f55eef36c9ae041e456141eced7a45d4a1f75ded9ac0"
8989
)
9090
ecdsa_nistp384_pub = "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEksAG80nLUksODTEUBTPJJPYN0bfxhkrr\n2hlyokfRG4kDYsRRN86vWwxDTW7qhWNZPFhJMJxHmvHsCbLz/IF7hdo8Xv/vRO4M\nVHbwq0fiWznUvkZowHC5fH2EEvNF1R5t\n-----END PUBLIC KEY-----\n"
91+
ecdsa_nistp521_keyid = (
92+
"3dddef3c311b151c5fe12f5fcfa3d9795e2b5fe1a6746c2691befacb13a6af4a"
93+
)
94+
ecdsa_nistp521_pub = "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBXxFGyw9J9C43woa6huZ3IwrEZhku\neHDNZ1UqnHcFhNYFhM7witKxgv6OUpwlwPsPSUjqcBxkkpay4rT4UTwIP94AdsQL\nq3DQ+BuwrEELjAAMxvQGfoMlLJ5fHM4p4KhlKwpk2HiBQp4r1bjuA6MFq7s5yF0C\nnb9TH+ZZwV5/cjCewxY=\n-----END PUBLIC KEY-----"
9195

9296
key_sig_data = [
9397
(
@@ -175,6 +179,13 @@ def test_key_verify_signature(self):
175179
ecdsa_nistp384_pub,
176180
"30650230747ffab40d894dcacfa2da613a312b2423aa744c7b2365345467819c2af210983c5a7ce6810db995f2e6c90f90f9ad1c023100fdde5013796916af1989b757b64f2fad8496fa7b2b19e9568260868d4a670e6feb123b3337179a4d06b5fbe42b6937fb",
177181
),
182+
(
183+
ecdsa_nistp521_keyid,
184+
"ecdsa",
185+
"ecdsa-sha2-nistp521",
186+
ecdsa_nistp521_pub,
187+
"3081880242019c9621491de75e9b89c4956f6571840528923db953a0fdcf88f9c0221e8c181459af1d9f4e420ad7b971c5c429e457f1f67cfc968c655ea569c3185bfeb2bd943f024201bd2d51bee9ae0bbeb79c99c7bc1758dd256ce7caad9020fb2e2873efc80613826a45b96be25eab11dc521942b92af5820ddde08797d9d6ae236aa54036b41e1152",
188+
),
178189
(
179190
ecdsa_keyid,
180191
"ecdsa-sha2-nistp256",
@@ -189,6 +200,13 @@ def test_key_verify_signature(self):
189200
ecdsa_nistp384_pub,
190201
"30650230747ffab40d894dcacfa2da613a312b2423aa744c7b2365345467819c2af210983c5a7ce6810db995f2e6c90f90f9ad1c023100fdde5013796916af1989b757b64f2fad8496fa7b2b19e9568260868d4a670e6feb123b3337179a4d06b5fbe42b6937fb",
191202
),
203+
(
204+
ecdsa_nistp521_keyid,
205+
"ecdsa-sha2-nistp521",
206+
"ecdsa-sha2-nistp521",
207+
ecdsa_nistp521_pub,
208+
"3081880242019c9621491de75e9b89c4956f6571840528923db953a0fdcf88f9c0221e8c181459af1d9f4e420ad7b971c5c429e457f1f67cfc968c655ea569c3185bfeb2bd943f024201bd2d51bee9ae0bbeb79c99c7bc1758dd256ce7caad9020fb2e2873efc80613826a45b96be25eab11dc521942b92af5820ddde08797d9d6ae236aa54036b41e1152",
209+
),
192210
]
193211
for keyid, keytype, scheme, pub, sig in key_sig_data:
194212
key = Key.from_dict(
@@ -303,6 +321,12 @@ def test_from_crypto(self):
303321
"0155661bdf705f621a74f55eef36c9ae041e456141eced7a45d4a1f75ded9ac0",
304322
"ecdsa_secp384r1_public.pem",
305323
),
324+
(
325+
"ecdsa",
326+
"ecdsa-sha2-nistp521",
327+
"3dddef3c311b151c5fe12f5fcfa3d9795e2b5fe1a6746c2691befacb13a6af4a",
328+
"ecdsa_secp521r1_public.pem",
329+
),
306330
(
307331
"ed25519",
308332
"ed25519",
@@ -340,19 +364,22 @@ def test_verify_invalid_keytype_scheme(self):
340364
ed25519 = "50a5768a7a577483c28e57a6742b4d2170b9be628a961355ef127c45f2aefdc5"
341365
ecdsa_nistp256 = "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEsYJfSlYU3UlYbGOZfE/yOHkayWWq\nLPR/NeCa83szZmnJGc9wwCRPvJS87K+eDGIhhhKueTyrLqXQqmyHioQbOQ==\n-----END PUBLIC KEY-----\n"
342366
ecdsa_nistp384 = "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEksAG80nLUksODTEUBTPJJPYN0bfxhkrr\n2hlyokfRG4kDYsRRN86vWwxDTW7qhWNZPFhJMJxHmvHsCbLz/IF7hdo8Xv/vRO4M\nVHbwq0fiWznUvkZowHC5fH2EEvNF1R5t\n-----END PUBLIC KEY-----\n"
367+
ecdsa_nistp521 = "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBXxFGyw9J9C43woa6huZ3IwrEZhku\neHDNZ1UqnHcFhNYFhM7witKxgv6OUpwlwPsPSUjqcBxkkpay4rT4UTwIP94AdsQL\nq3DQ+BuwrEELjAAMxvQGfoMlLJ5fHM4p4KhlKwpk2HiBQp4r1bjuA6MFq7s5yF0C\nnb9TH+ZZwV5/cjCewxY=\n-----END PUBLIC KEY-----"
343368

344369
test_data = [
345370
# bad keytype / scheme
346371
("ed25519", "rsassa-pss-sha256", rsa),
347372
("ecdsa-sha2-nistp384", "ecdsa-sha2-nistp256", ecdsa_nistp256),
348373
("ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", ecdsa_nistp384),
374+
("ecdsa-sha2-nistp256", "ecdsa-sha2-nistp521", ecdsa_nistp521),
349375
("rsa", "ed25519", ed25519),
350376
# bad key type (pem formatted keys only)
351377
("rsa", "rsassa-pss-sha256", ecdsa_nistp256),
352378
("ecdsa", "ecdsa-sha2-nistp256", rsa),
353379
# bad curve (ecdsa keys only)
354380
("ecdsa", "ecdsa-sha2-nistp256", ecdsa_nistp384),
355381
("ecdsa", "ecdsa-sha2-nistp384", ecdsa_nistp256),
382+
("ecdsa", "ecdsa-sha2-nistp521", ecdsa_nistp256),
356383
]
357384

358385
for keytype, scheme, val in test_data:

0 commit comments

Comments
 (0)