Skip to content

Commit 9b60fb6

Browse files
committed
Rekor: Tweak the log submitter abstraction
* Make sure the exposed signatures actually are abstract: the request payload can be just a dict so both clients actually implement the same API * There is still a "EntryRequest" NewType being used instead of dict just to make the intent clear Signed-off-by: Jussi Kukkonen <[email protected]>
1 parent 80422f2 commit 9b60fb6

File tree

4 files changed

+31
-24
lines changed

4 files changed

+31
-24
lines changed

sigstore/_internal/rekor/__init__.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@
2020

2121
import base64
2222
from abc import ABC, abstractmethod
23+
from typing import Any, NewType
2324

2425
import rekor_types
2526
from cryptography.x509 import Certificate
2627

27-
from sigstore._internal.rekor.v2_types.dev.sigstore.rekor import v2
2828
from sigstore._utils import base64_encode_pem_cert
2929
from sigstore.dsse import Envelope
3030
from sigstore.hashes import Hashed
@@ -34,12 +34,19 @@
3434
"_hashedrekord_from_parts",
3535
]
3636

37+
EntryRequest = NewType("EntryRequest", dict[str, Any])
38+
3739

3840
class RekorLogSubmitter(ABC):
41+
"""Abstract class to represent a Rekor log entry submitter.
42+
43+
Intended to be implemented by RekorClient and RekorV2Client
44+
"""
45+
3946
@abstractmethod
4047
def create_entry(
4148
self,
42-
request: rekor_types.Hashedrekord | rekor_types.Dsse | v2.CreateEntryRequest,
49+
request: EntryRequest,
4350
) -> LogEntry:
4451
"""
4552
Submit the request to Rekor.
@@ -50,7 +57,7 @@ def create_entry(
5057
@abstractmethod
5158
def _build_hashed_rekord_request(
5259
self, hashed_input: Hashed, signature: bytes, certificate: Certificate
53-
) -> rekor_types.Hashedrekord | v2.CreateEntryRequest:
60+
) -> EntryRequest:
5461
"""
5562
Construct a hashed rekord request to submit to Rekor.
5663
"""
@@ -60,7 +67,7 @@ def _build_hashed_rekord_request(
6067
@abstractmethod
6168
def _build_dsse_request(
6269
self, envelope: Envelope, certificate: Certificate
63-
) -> rekor_types.Dsse | v2.CreateEntryRequest:
70+
) -> EntryRequest:
6471
"""
6572
Construct a dsse request to submit to Rekor.
6673
"""

sigstore/_internal/rekor/client.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
from sigstore._internal import USER_AGENT
3434
from sigstore._internal.rekor import (
35+
EntryRequest,
3536
RekorLogSubmitter,
3637
)
3738
from sigstore.dsse import Envelope
@@ -153,13 +154,12 @@ def get(
153154

154155
def post(
155156
self,
156-
proposed_entry: rekor_types.Hashedrekord | rekor_types.Dsse,
157+
payload: EntryRequest,
157158
) -> LogEntry:
158159
"""
159160
Submit a new entry for inclusion in the Rekor log.
160161
"""
161162

162-
payload = proposed_entry.model_dump(mode="json", by_alias=True)
163163
_logger.debug(f"proposed: {json.dumps(payload)}")
164164

165165
resp: requests.Response = self.session.post(self.url, json=payload)
@@ -270,21 +270,19 @@ def log(self) -> RekorLog:
270270
"""
271271
return RekorLog(f"{self.url}/log", session=self.session)
272272

273-
def create_entry( # type: ignore[override]
274-
self, request: rekor_types.Hashedrekord | rekor_types.Dsse
275-
) -> LogEntry:
273+
def create_entry(self, request: EntryRequest) -> LogEntry:
276274
"""
277275
Submit the request to Rekor.
278276
"""
279277
return self.log.entries.post(request)
280278

281279
def _build_hashed_rekord_request( # type: ignore[override]
282280
self, hashed_input: Hashed, signature: bytes, certificate: Certificate
283-
) -> rekor_types.Hashedrekord:
281+
) -> EntryRequest:
284282
"""
285-
Construct a hashed rekord request to submit to Rekor.
283+
Construct a hashed rekord payload to submit to Rekor.
286284
"""
287-
return rekor_types.Hashedrekord(
285+
rekord = rekor_types.Hashedrekord(
288286
spec=rekor_types.hashedrekord.HashedrekordV001Schema(
289287
signature=rekor_types.hashedrekord.Signature(
290288
content=base64.b64encode(signature).decode(),
@@ -304,14 +302,15 @@ def _build_hashed_rekord_request( # type: ignore[override]
304302
),
305303
),
306304
)
305+
return EntryRequest(rekord.model_dump(mode="json", by_alias=True))
307306

308307
def _build_dsse_request( # type: ignore[override]
309308
self, envelope: Envelope, certificate: Certificate
310-
) -> rekor_types.Dsse:
309+
) -> EntryRequest:
311310
"""
312311
Construct a dsse request to submit to Rekor.
313312
"""
314-
return rekor_types.Dsse(
313+
dsse = rekor_types.Dsse(
315314
spec=rekor_types.dsse.DsseSchema(
316315
# NOTE: mypy can't see that this kwarg is correct due to two interacting
317316
# behaviors/bugs (one pydantic, one datamodel-codegen):
@@ -329,3 +328,4 @@ def _build_dsse_request( # type: ignore[override]
329328
),
330329
),
331330
)
331+
return EntryRequest(dsse.model_dump(mode="json", by_alias=True))

sigstore/_internal/rekor/client_v2.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
from cryptography.x509 import Certificate
2828

2929
from sigstore._internal import USER_AGENT
30-
from sigstore._internal.rekor import RekorLogSubmitter
30+
from sigstore._internal.rekor import EntryRequest, RekorLogSubmitter
3131
from sigstore._internal.rekor.v2_types.dev.sigstore.common import v1 as common_v1
3232
from sigstore._internal.rekor.v2_types.dev.sigstore.rekor import v2
3333
from sigstore._internal.rekor.v2_types.io import intoto as v2_intoto
@@ -72,12 +72,10 @@ def __del__(self) -> None:
7272
"""
7373
self.session.close()
7474

75-
# TODO: when we remove the original Rekor client, remove the type ignore here
76-
def create_entry(self, request: v2.CreateEntryRequest) -> LogEntry: # type: ignore[override]
75+
def create_entry(self, payload: EntryRequest) -> LogEntry:
7776
"""
7877
Submit a new entry for inclusion in the Rekor log.
7978
"""
80-
payload = request.to_dict()
8179
_logger.debug(f"proposed: {json.dumps(payload)}")
8280
resp = self.session.post(
8381
f"{self.url}/log/entries",
@@ -100,11 +98,11 @@ def _build_hashed_rekord_request(
10098
hashed_input: Hashed,
10199
signature: bytes,
102100
certificate: Certificate,
103-
) -> v2.CreateEntryRequest:
101+
) -> EntryRequest:
104102
"""
105103
Construct a hashed rekord request to submit to Rekor.
106104
"""
107-
return v2.CreateEntryRequest(
105+
req = v2.CreateEntryRequest(
108106
hashed_rekord_request_v0_0_2=v2.HashedRekordRequestV002(
109107
digest=hashed_input.digest,
110108
signature=v2.Signature(
@@ -120,15 +118,16 @@ def _build_hashed_rekord_request(
120118
),
121119
)
122120
)
121+
return EntryRequest(req.to_dict())
123122

124123
@classmethod
125124
def _build_dsse_request(
126125
cls, envelope: Envelope, certificate: Certificate
127-
) -> v2.CreateEntryRequest:
126+
) -> EntryRequest:
128127
"""
129128
Construct a dsse request to submit to Rekor.
130129
"""
131-
return v2.CreateEntryRequest(
130+
req = v2.CreateEntryRequest(
132131
dsse_request_v0_0_2=v2.DsseRequestV002(
133132
envelope=v2_intoto.Envelope(
134133
payload=envelope._inner.payload,
@@ -153,6 +152,7 @@ def _build_dsse_request(
153152
],
154153
)
155154
)
155+
return EntryRequest(req.to_dict())
156156

157157

158158
class RekorClientError(Exception):

sigstore/sign.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545
from typing import Optional
4646

4747
import cryptography.x509 as x509
48-
import rekor_types
4948
from cryptography.hazmat.primitives import hashes
5049
from cryptography.hazmat.primitives.asymmetric import ec
5150
from cryptography.x509.oid import NameOID
@@ -60,6 +59,7 @@
6059
ExpiredCertificate,
6160
FulcioClient,
6261
)
62+
from sigstore._internal.rekor import EntryRequest
6363
from sigstore._internal.rekor.client import RekorClient
6464
from sigstore._internal.sct import verify_sct
6565
from sigstore._internal.timestamp import TimestampAuthorityClient, TimestampError
@@ -175,7 +175,7 @@ def _finalize_sign(
175175
self,
176176
cert: x509.Certificate,
177177
content: MessageSignature | dsse.Envelope,
178-
proposed_entry: rekor_types.Hashedrekord | rekor_types.Dsse,
178+
proposed_entry: EntryRequest,
179179
) -> Bundle:
180180
"""
181181
Perform the common "finalizing" steps in a Sigstore signing flow.

0 commit comments

Comments
 (0)