|
18 | 18 |
|
19 | 19 | from __future__ import annotations
|
20 | 20 |
|
| 21 | +import base64 |
21 | 22 | import json
|
22 | 23 | import logging
|
23 | 24 | from abc import ABC
|
|
26 | 27 |
|
27 | 28 | import rekor_types
|
28 | 29 | import requests
|
| 30 | +from cryptography.hazmat.primitives import serialization |
| 31 | +from cryptography.x509 import Certificate |
29 | 32 | from sigstore_protobuf_specs.dev.sigstore.rekor.v1 import TransparencyLogEntry
|
30 | 33 |
|
31 | 34 | from sigstore._internal import USER_AGENT
|
| 35 | +from sigstore._internal.rekor_tiles.dev.sigstore.common import v1 |
32 | 36 | from sigstore._internal.rekor_tiles.dev.sigstore.rekor import v2
|
| 37 | +from sigstore.hashes import Hashed |
33 | 38 | from sigstore.models import LogEntry
|
34 | 39 |
|
35 | 40 | _logger = logging.getLogger(__name__)
|
@@ -241,6 +246,34 @@ def __del__(self) -> None:
|
241 | 246 | """
|
242 | 247 | self.session.close()
|
243 | 248 |
|
| 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 | + |
244 | 277 | @classmethod
|
245 | 278 | def production(cls) -> RekorClient:
|
246 | 279 | """
|
@@ -314,6 +347,32 @@ def create_entry(self, request: v2.CreateEntryRequest) -> TransparencyLogEntry:
|
314 | 347 | _logger.debug(f"integrated: {integrated_entry}")
|
315 | 348 | return LogEntry._from_dict_rekor(integrated_entry)
|
316 | 349 |
|
| 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 | + |
317 | 376 | @classmethod
|
318 | 377 | def production(cls) -> RekorClient:
|
319 | 378 | """
|
|
0 commit comments