Skip to content

Commit a0e6616

Browse files
refactor the building of the hashedrekord preposed entries
Signed-off-by: Ramon Petgrave <ramon.petgrave64@gmail.com>
1 parent 9a066e8 commit a0e6616

File tree

2 files changed

+68
-31
lines changed

2 files changed

+68
-31
lines changed

sigstore/_internal/rekor/client.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
from __future__ import annotations
2020

21+
import base64
2122
import json
2223
import logging
2324
from abc import ABC
@@ -26,10 +27,14 @@
2627

2728
import rekor_types
2829
import requests
30+
from cryptography.hazmat.primitives import serialization
31+
from cryptography.x509 import Certificate
2932
from sigstore_protobuf_specs.dev.sigstore.rekor.v1 import TransparencyLogEntry
3033

3134
from sigstore._internal import USER_AGENT
35+
from sigstore._internal.rekor_tiles.dev.sigstore.common import v1
3236
from sigstore._internal.rekor_tiles.dev.sigstore.rekor import v2
37+
from sigstore.hashes import Hashed
3338
from sigstore.models import LogEntry
3439

3540
_logger = logging.getLogger(__name__)
@@ -241,6 +246,34 @@ def __del__(self) -> None:
241246
"""
242247
self.session.close()
243248

249+
@classmethod
250+
def _build_hashed_rekord_request(
251+
cls,
252+
hashed_input: Hashed,
253+
signature: bytes,
254+
certificate: Certificate,
255+
) -> rekor_types.Hashedrekordkord:
256+
return rekor_types.Hashedrekord(
257+
spec=rekor_types.hashedrekord.HashedrekordV001Schema(
258+
signature=rekor_types.hashedrekord.Signature(
259+
content=base64.b64encode(signature).decode(),
260+
public_key=rekor_types.hashedrekord.PublicKey(
261+
content=base64.b64encode(
262+
certificate.public_bytes(
263+
encoding=serialization.Encoding.PEM
264+
)
265+
).decode()
266+
),
267+
),
268+
data=rekor_types.hashedrekord.Data(
269+
hash=rekor_types.hashedrekord.Hash(
270+
algorithm=hashed_input._as_hashedrekord_algorithm(),
271+
value=hashed_input.digest.hex(),
272+
)
273+
),
274+
),
275+
)
276+
244277
@classmethod
245278
def production(cls) -> RekorClient:
246279
"""
@@ -314,6 +347,32 @@ def create_entry(self, request: v2.CreateEntryRequest) -> TransparencyLogEntry:
314347
_logger.debug(f"integrated: {integrated_entry}")
315348
return LogEntry._from_dict_rekor(integrated_entry)
316349

350+
@classmethod
351+
def _build_create_entry_request(
352+
cls,
353+
hashed_input: Hashed,
354+
signature: bytes,
355+
certificate: Certificate,
356+
key_details: v1.PublicKeyDetails,
357+
) -> v2.CreateEntryRequest:
358+
return v2.CreateEntryRequest(
359+
hashed_rekord_request_v0_0_2=v2.HashedRekordRequestV002(
360+
digest=hashed_input.digest,
361+
signature=v2.Signature(
362+
content=signature,
363+
verifier=v2.Verifier(
364+
public_key=v2.PublicKey(
365+
raw_bytes=certificate.public_key().public_bytes(
366+
encoding=serialization.Encoding.DER,
367+
format=serialization.PublicFormat.SubjectPublicKeyInfo,
368+
)
369+
),
370+
key_details=key_details,
371+
),
372+
),
373+
)
374+
)
375+
317376
@classmethod
318377
def production(cls) -> RekorClient:
319378
"""

sigstore/sign.py

Lines changed: 9 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -303,39 +303,17 @@ def sign_artifact(
303303

304304
# Create the proposed hashedrekord entry
305305
if isinstance(self._signing_ctx._rekor, RekorV2Client):
306-
proposed_entry = v2.CreateEntryRequest(
307-
hashed_rekord_request_v0_0_2=v2.HashedRekordRequestV002(
308-
digest=hashed_input.digest,
309-
signature=v2.Signature(
310-
content=artifact_signature,
311-
verifier=v2.Verifier(
312-
public_key=v2.PublicKey(
313-
raw_bytes=cert.public_key().public_bytes(
314-
encoding=serialization.Encoding.DER,
315-
format=serialization.PublicFormat.SubjectPublicKeyInfo,
316-
)
317-
),
318-
key_details=key_to_details(self._private_key),
319-
),
320-
),
321-
)
306+
proposed_entry = RekorV2Client._build_create_entry_request(
307+
hashed_input=hashed_input,
308+
signature=artifact_signature,
309+
certificate=cert,
310+
key_details=key_to_details(self._private_key),
322311
)
323312
else:
324-
proposed_entry = rekor_types.Hashedrekord(
325-
spec=rekor_types.hashedrekord.HashedrekordV001Schema(
326-
signature=rekor_types.hashedrekord.Signature(
327-
content=base64.b64encode(artifact_signature).decode(),
328-
public_key=rekor_types.hashedrekord.PublicKey(
329-
content=b64_cert.decode()
330-
),
331-
),
332-
data=rekor_types.hashedrekord.Data(
333-
hash=rekor_types.hashedrekord.Hash(
334-
algorithm=hashed_input._as_hashedrekord_algorithm(),
335-
value=hashed_input.digest.hex(),
336-
)
337-
),
338-
),
313+
proposed_entry = RekorClient._build_hashed_rekord_request(
314+
hashed_input=hashed_input,
315+
signature=artifact_signature,
316+
certificate=cert,
339317
)
340318
return self._finalize_sign(cert, content, proposed_entry)
341319

0 commit comments

Comments
 (0)