24
24
import rekor_types
25
25
import requests
26
26
from cryptography .hazmat .primitives import serialization
27
+ from cryptography .hazmat .primitives .asymmetric .ec import EllipticCurvePublicKey
27
28
from cryptography .x509 import Certificate
28
29
from sigstore_protobuf_specs .dev .sigstore .common import v1 as common_v1
29
30
from sigstore_protobuf_specs .dev .sigstore .rekor import v2
37
38
38
39
_logger = logging .getLogger (__name__ )
39
40
40
- DEFAULT_KEY_DETAILS = common_v1 .PublicKeyDetails .PKIX_ECDSA_P384_SHA_256
41
-
42
41
43
42
class _V2EntryRequest (EntryRequest ):
44
43
@classmethod
@@ -99,6 +98,18 @@ def create_entry(self, payload: EntryRequest) -> LogEntry:
99
98
_logger .debug (f"integrated: { integrated_entry } " )
100
99
return LogEntry ._from_dict_rekor (integrated_entry )
101
100
101
+ @staticmethod
102
+ def _get_key_details (certificate : Certificate ) -> common_v1 .PublicKeyDetails :
103
+ """Determine PublicKeyDetails from a certificate
104
+
105
+ We know that sign.Signer only uses secp256r1 so do not support anything else"""
106
+ public_key = certificate .public_key ()
107
+ if isinstance (public_key , EllipticCurvePublicKey ):
108
+ if public_key .curve .name == "secp256r1" :
109
+ return common_v1 .PublicKeyDetails .PKIX_ECDSA_P256_SHA_256
110
+ raise ValueError (f"Unsupported EC curve: { public_key .curve .name } " )
111
+ raise ValueError (f"Unsupported public key type: { type (public_key )} " )
112
+
102
113
@classmethod
103
114
def _build_hashed_rekord_request (
104
115
cls ,
@@ -109,6 +120,7 @@ def _build_hashed_rekord_request(
109
120
"""
110
121
Construct a hashed rekord request to submit to Rekor.
111
122
"""
123
+
112
124
req = v2 .HashedRekordRequestV002 (
113
125
digest = hashed_input .digest ,
114
126
signature = v2 .Signature (
@@ -119,7 +131,7 @@ def _build_hashed_rekord_request(
119
131
encoding = serialization .Encoding .DER
120
132
)
121
133
),
122
- key_details = DEFAULT_KEY_DETAILS , # type: ignore[arg-type]
134
+ key_details = cls . _get_key_details ( certificate ),
123
135
),
124
136
),
125
137
)
@@ -151,7 +163,7 @@ def _build_dsse_request(
151
163
encoding = serialization .Encoding .DER
152
164
)
153
165
),
154
- key_details = DEFAULT_KEY_DETAILS , # type: ignore[arg-type]
166
+ key_details = cls . _get_key_details ( certificate ),
155
167
)
156
168
],
157
169
)
0 commit comments