Skip to content

Commit 813c38c

Browse files
committed
Add ML-DSA support to GCPSigner
Signed-off-by: Jussi Kukkonen <jkukkonen@google.com>
1 parent c7d7de7 commit 813c38c

2 files changed

Lines changed: 28 additions & 5 deletions

File tree

securesystemslib/signer/_gcp_signer.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,18 @@
5959
"rsa",
6060
"rsa-pkcs1v15-sha512",
6161
),
62+
CryptoKeyVersion.CryptoKeyVersionAlgorithm.PQ_SIGN_ML_DSA_44: (
63+
"ml-dsa",
64+
"ml-dsa-44/1",
65+
),
66+
CryptoKeyVersion.CryptoKeyVersionAlgorithm.PQ_SIGN_ML_DSA_65: (
67+
"ml-dsa",
68+
"ml-dsa-65/1",
69+
),
70+
CryptoKeyVersion.CryptoKeyVersionAlgorithm.PQ_SIGN_ML_DSA_87: (
71+
"ml-dsa",
72+
"ml-dsa-87/1",
73+
),
6274
}
6375
except ImportError:
6476
GCP_IMPORT_ERROR = (
@@ -176,10 +188,16 @@ def sign(self, payload: bytes) -> Signature:
176188
# NOTE: request and response can contain CRC32C of the digest/sig:
177189
# Verifying could be useful but would require another dependency...
178190

179-
hasher = hashlib.new(self.hash_algorithm)
180-
hasher.update(payload)
181-
digest = {self.hash_algorithm: hasher.digest()}
182-
request = {"name": self.gcp_keyid, "digest": digest}
191+
if self.public_key.keytype == "ml-dsa":
192+
hasher = hashlib.new("sha512")
193+
hasher.update(payload)
194+
pre_signing_string = b"tuf" + bytes([1]) + hasher.digest()
195+
request = {"name": self.gcp_keyid, "data": pre_signing_string}
196+
else:
197+
hasher = hashlib.new(self.hash_algorithm)
198+
hasher.update(payload)
199+
digest = {self.hash_algorithm: hasher.digest()}
200+
request = {"name": self.gcp_keyid, "digest": digest}
183201

184202
logger.debug("signing request %s", request)
185203
response = self.client.asymmetric_sign(request)

securesystemslib/signer/_key.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,12 @@ def get_hash_algorithm_name(self) -> str:
252252
]:
253253
return f"sha{self.scheme[-3:]}"
254254

255-
elif self.scheme == "ecdsa-sha2-nistp521":
255+
elif self.scheme in [
256+
"ecdsa-sha2-nistp521",
257+
"ml-dsa-44/1",
258+
"ml-dsa-65/1",
259+
"ml-dsa-87/1",
260+
]:
256261
return "sha512"
257262

258263
raise ValueError(f"method not supported for scheme {self.scheme}")

0 commit comments

Comments
 (0)