Skip to content

Commit b1b14eb

Browse files
authored
Merge pull request #558 from lukpueh/base-de_serialization-helpers
signer: _from/_to_dict helpers for Key base fields
2 parents c28c6f0 + b8746df commit b1b14eb

File tree

3 files changed

+32
-28
lines changed

3 files changed

+32
-28
lines changed

securesystemslib/signer/_gpg_signer.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,19 +32,11 @@ class GPGKey(Key):
3232

3333
@classmethod
3434
def from_dict(cls, keyid: str, key_dict: Dict[str, Any]) -> "GPGKey":
35-
keytype = key_dict.pop("keytype")
36-
scheme = key_dict.pop("scheme")
37-
keyval = key_dict.pop("keyval")
38-
35+
keytype, scheme, keyval = cls._from_dict(key_dict)
3936
return cls(keyid, keytype, scheme, keyval, key_dict)
4037

4138
def to_dict(self) -> Dict:
42-
return {
43-
"keytype": self.keytype,
44-
"scheme": self.scheme,
45-
"keyval": self.keyval,
46-
**self.unrecognized_fields,
47-
}
39+
return self._to_dict()
4840

4941
def verify_signature(self, signature: Signature, data: bytes) -> None:
5042
try:

securesystemslib/signer/_key.py

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,32 @@ def to_dict(self) -> Dict[str, Any]:
101101
"""
102102
raise NotImplementedError
103103

104+
def _to_dict(self) -> Dict[str, Any]:
105+
"""Serialization helper to add base Key fields to a dict.
106+
107+
Key implementations may call this in their to_dict, which they must
108+
still provide, in order to avoid unnoticed serialization accidents.
109+
"""
110+
return {
111+
"keytype": self.keytype,
112+
"scheme": self.scheme,
113+
"keyval": self.keyval,
114+
**self.unrecognized_fields,
115+
}
116+
117+
@staticmethod
118+
def _from_dict(key_dict: Dict[str, Any]) -> Tuple[str, str, Dict[str, Any]]:
119+
"""Deserialization helper to pop base Key fields off the dict.
120+
121+
Key implementations may call this in their from_dict, in order to parse
122+
out common fields. But they have to create the Key instance themselves.
123+
"""
124+
keytype = key_dict.pop("keytype")
125+
scheme = key_dict.pop("scheme")
126+
keyval = key_dict.pop("keyval")
127+
128+
return keytype, scheme, keyval
129+
104130
@abstractmethod
105131
def verify_signature(self, signature: Signature, data: bytes) -> None:
106132
"""Raises if verification of signature over data fails.
@@ -143,9 +169,7 @@ def from_securesystemslib_key(cls, key_dict: Dict[str, Any]) -> "SSlibKey":
143169

144170
@classmethod
145171
def from_dict(cls, keyid: str, key_dict: Dict[str, Any]) -> "SSlibKey":
146-
keytype = key_dict.pop("keytype")
147-
scheme = key_dict.pop("scheme")
148-
keyval = key_dict.pop("keyval")
172+
keytype, scheme, keyval = cls._from_dict(key_dict)
149173

150174
if "public" not in keyval or not isinstance(keyval["public"], str):
151175
raise ValueError(f"public key string required for scheme {scheme}")
@@ -154,12 +178,7 @@ def from_dict(cls, keyid: str, key_dict: Dict[str, Any]) -> "SSlibKey":
154178
return cls(keyid, keytype, scheme, keyval, key_dict)
155179

156180
def to_dict(self) -> Dict[str, Any]:
157-
return {
158-
"keytype": self.keytype,
159-
"scheme": self.scheme,
160-
"keyval": self.keyval,
161-
**self.unrecognized_fields,
162-
}
181+
return self._to_dict()
163182

164183
def verify_signature(self, signature: Signature, data: bytes) -> None:
165184
try:

securesystemslib/signer/_sigstore_signer.py

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,7 @@ class SigstoreKey(Key):
3535

3636
@classmethod
3737
def from_dict(cls, keyid: str, key_dict: Dict[str, Any]) -> "SigstoreKey":
38-
keytype = key_dict.pop("keytype")
39-
scheme = key_dict.pop("scheme")
40-
keyval = key_dict.pop("keyval")
38+
keytype, scheme, keyval = cls._from_dict(key_dict)
4139

4240
for content in ["identity", "issuer"]:
4341
if content not in keyval or not isinstance(keyval[content], str):
@@ -48,12 +46,7 @@ def from_dict(cls, keyid: str, key_dict: Dict[str, Any]) -> "SigstoreKey":
4846
return cls(keyid, keytype, scheme, keyval, key_dict)
4947

5048
def to_dict(self) -> Dict:
51-
return {
52-
"keytype": self.keytype,
53-
"scheme": self.scheme,
54-
"keyval": self.keyval,
55-
**self.unrecognized_fields,
56-
}
49+
return self._to_dict()
5750

5851
def verify_signature(self, signature: Signature, data: bytes) -> None:
5952
# pylint: disable=import-outside-toplevel,import-error

0 commit comments

Comments
 (0)