Skip to content

Commit 09e092e

Browse files
authored
Merge pull request #557 from lukpueh/mv-_get_keyid
Move _get_keyid helper to Signer base class and use in implementations
2 parents 289102e + 7400ed7 commit 09e092e

File tree

6 files changed

+41
-25
lines changed

6 files changed

+41
-25
lines changed

securesystemslib/signer/_gcp_signer.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
import securesystemslib.hash as sslib_hash
88
from securesystemslib import exceptions
9-
from securesystemslib.keys import _get_keyid
109
from securesystemslib.signer._key import Key
1110
from securesystemslib.signer._signer import (
1211
SecretsHandler,
@@ -104,7 +103,7 @@ def import_(cls, gcp_keyid: str) -> Tuple[str, Key]:
104103
) from e
105104

106105
keyval = {"public": kms_pubkey.pem}
107-
keyid = _get_keyid(keytype, scheme, keyval)
106+
keyid = cls._get_keyid(keytype, scheme, keyval)
108107
public_key = SSlibKey(keyid, keytype, scheme, keyval)
109108

110109
return f"{cls.SCHEME}:{gcp_keyid}", public_key

securesystemslib/signer/_hsm_signer.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
from securesystemslib import KEY_TYPE_ECDSA
1313
from securesystemslib.exceptions import UnsupportedLibraryError
1414
from securesystemslib.hash import digest
15-
from securesystemslib.keys import _get_keyid
1615
from securesystemslib.signer._key import Key, SSlibKey
1716
from securesystemslib.signer._signature import Signature
1817
from securesystemslib.signer._signer import SecretsHandler, Signer
@@ -322,7 +321,7 @@ def import_(
322321

323322
keyval = {"public": public_pem}
324323
scheme = _SCHEME_FOR_CURVE[curve]
325-
keyid = _get_keyid(KEY_TYPE_ECDSA, scheme, keyval)
324+
keyid = cls._get_keyid(KEY_TYPE_ECDSA, scheme, keyval)
326325
key = SSlibKey(keyid, KEY_TYPE_ECDSA, scheme, keyval)
327326

328327
return uri, key

securesystemslib/signer/_signer.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
import logging
44
import os
55
from abc import ABCMeta, abstractmethod
6-
from typing import Callable, Dict, Optional, Type
6+
from typing import Any, Callable, Dict, Optional, Type
77
from urllib import parse
88

99
import securesystemslib.keys as sslib_keys
10+
from securesystemslib.formats import encode_canonical
11+
from securesystemslib.hash import digest
1012
from securesystemslib.signer._key import Key, SSlibKey
1113
from securesystemslib.signer._signature import Signature
1214

@@ -117,6 +119,20 @@ def from_priv_key_uri(
117119
priv_key_uri, public_key, secrets_handler
118120
)
119121

122+
@staticmethod
123+
def _get_keyid(keytype: str, scheme, keyval: Dict[str, Any]) -> str:
124+
"""Get keyid as sha256 hexdigest of the cjson representation of key fields."""
125+
data = encode_canonical(
126+
{
127+
"keytype": keytype,
128+
"scheme": scheme,
129+
"keyval": keyval,
130+
}
131+
).encode("utf-8")
132+
hasher = digest("sha256")
133+
hasher.update(data)
134+
return hasher.hexdigest()
135+
120136

121137
class SSlibSigner(Signer):
122138
"""A securesystemslib signer implementation.

securesystemslib/signer/_sigstore_signer.py

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
UnverifiedSignatureError,
1313
VerificationError,
1414
)
15-
from securesystemslib.formats import encode_canonical
16-
from securesystemslib.hash import digest
1715
from securesystemslib.signer._signer import (
1816
Key,
1917
SecretsHandler,
@@ -178,23 +176,6 @@ def from_priv_key_uri(
178176
def _get_uri(cls, ambient: bool) -> str:
179177
return f"{cls.SCHEME}:{'' if ambient else '?ambient=false'}"
180178

181-
@classmethod
182-
def _get_keyid(cls, keytype: str, scheme, keyval: Dict[str, Any]) -> str:
183-
"""Compute keyid as hexdigest over canonical json representation of key.
184-
185-
NOTE: Not compatible with ``securesystemslib.keys._get_keyid()``
186-
"""
187-
data = encode_canonical(
188-
{
189-
"keytype": keytype,
190-
"scheme": scheme,
191-
"keyval": keyval,
192-
}
193-
).encode("utf-8")
194-
hasher = digest()
195-
hasher.update(data)
196-
return hasher.hexdigest()
197-
198179
@classmethod
199180
def import_(
200181
cls, identity: str, issuer: str, ambient: bool = True

tests/check_kms_signers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class TestKMSKeys(unittest.TestCase):
2323
"""Test that KMS keys can be used to sign."""
2424

2525
pubkey = Key.from_dict(
26-
"218611b80052667026c221f8774249b0f6b8b310d30a5c45a3b878aa3a02f39e",
26+
"ab45d8d98992a4128efaea284c7ef0459557db199aeadf237ae41b915b9b5a1c",
2727
{
2828
"keytype": "ecdsa",
2929
"scheme": "ecdsa-sha2-nistp256",

tests/test_signer.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,27 @@ def test_gpg_key__eq__(self):
507507
self.assertNotEqual(key1, other_key)
508508

509509

510+
class TestUtils(unittest.TestCase):
511+
"""Test Signer utility methods."""
512+
513+
def test_get_keyid(self):
514+
# pylint: disable=protected-access
515+
self.assertEqual(
516+
Signer._get_keyid("rsa", "rsassa-pss-sha256", {"public": "abcd"}),
517+
"7b56b88ae790729d4e359d3fc5e889f1e0669a2e71a12d00e87473870c73fbcf",
518+
)
519+
520+
# Unsupported keys can have default keyids too
521+
self.assertEqual(
522+
Signer._get_keyid("foo", "bar", {"baz": "qux"}),
523+
"e3471be0598305190ba82f6f8043f4df52f3fbe471fdc187223bd9ade92abebb",
524+
)
525+
526+
# Invalid keys cannot
527+
with self.assertRaises(FormatError):
528+
Signer._get_keyid("foo", "bar", {"baz": 1.1})
529+
530+
510531
# Run the unit tests.
511532
if __name__ == "__main__":
512533
unittest.main()

0 commit comments

Comments
 (0)