Skip to content

Commit 5e734e4

Browse files
authored
Merge pull request #813 from jku/upgrade-sigstore
Upgrade sigstore dependency
2 parents bc6f882 + 6fae4c8 commit 5e734e4

File tree

7 files changed

+49
-44
lines changed

7 files changed

+49
-44
lines changed

Diff for: .github/workflows/test-sigstore.yml

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
name: Run Sigstore Signer tests
22

33
on:
4-
## Disabled temporarily: #781
5-
#push:
6-
# branches:
7-
# - main
8-
#pull_request:
4+
push:
5+
branches:
6+
- main
7+
pull_request:
98
workflow_dispatch:
109

1110
permissions: {}

Diff for: mypy.ini

-3
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,6 @@ ignore_missing_imports = True
2020
[mypy-asn1crypto.*]
2121
ignore_missing_imports = True
2222

23-
[mypy-sigstore.*]
24-
ignore_missing_imports = True
25-
2623
[mypy-sigstore_protobuf_specs.*]
2724
ignore_missing_imports = True
2825

Diff for: pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ azurekms = ["azure-identity", "azure-keyvault-keys", "cryptography>=40.0.0"]
5252
awskms = ["boto3", "botocore", "cryptography>=40.0.0"]
5353
hsm = ["asn1crypto", "cryptography>=40.0.0", "PyKCS11"]
5454
PySPX = ["PySPX>=0.5.0"]
55-
sigstore = ["sigstore~=2.0"]
55+
sigstore = ["sigstore~=3.0"]
5656
vault = ["hvac", "cryptography>=40.0.0"]
5757

5858
[tool.hatch.version]

Diff for: requirements-sigstore.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
sigstore==2.1.5
1+
sigstore==3.0.0

Diff for: securesystemslib/signer/_sigstore_signer.py

+27-34
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,7 @@
11
"""Signer implementation for project sigstore.
2-
3-
NOTE: SigstoreSigner and -Key are disabled temporarily around
4-
the Securesystemslib 1.0 release as the cyclic dependency
5-
(securesystemslib -> sigstore-python -> tuf -> securesystemslib)
6-
is problematic during API deprecations.
7-
See issue #781.
82
"""
93

10-
import io
4+
import json
115
import logging
126
from typing import Any, Dict, Optional, Tuple
137
from urllib import parse
@@ -66,37 +60,38 @@ def to_dict(self) -> Dict:
6660

6761
def verify_signature(self, signature: Signature, data: bytes) -> None:
6862
# pylint: disable=import-outside-toplevel,import-error
69-
result = None
7063
try:
71-
from sigstore.verify import VerificationMaterials, Verifier
64+
from sigstore.errors import VerificationError as SigstoreVerifyError
65+
from sigstore.models import Bundle
66+
from sigstore.verify import Verifier
7267
from sigstore.verify.policy import Identity
73-
from sigstore_protobuf_specs.dev.sigstore.bundle.v1 import Bundle
68+
except ImportError as e:
69+
raise VerificationError(IMPORT_ERROR) from e
7470

71+
try:
7572
verifier = Verifier.production()
7673
identity = Identity(
7774
identity=self.keyval["identity"], issuer=self.keyval["issuer"]
7875
)
79-
bundle = Bundle().from_dict(signature.unrecognized_fields["bundle"])
80-
materials = VerificationMaterials.from_bundle(
81-
input_=io.BytesIO(data), bundle=bundle, offline=True
82-
)
83-
result = verifier.verify(materials, identity)
76+
bundle_data = signature.unrecognized_fields["bundle"]
77+
bundle = Bundle.from_json(json.dumps(bundle_data))
8478

85-
except Exception as e:
86-
logger.info("Key %s failed to verify sig: %s", self.keyid, str(e))
87-
raise VerificationError(
88-
f"Unknown failure to verify signature by {self.keyid}"
89-
) from e
79+
verifier.verify_artifact(data, bundle, identity)
9080

91-
if not result:
81+
except SigstoreVerifyError as e:
9282
logger.info(
9383
"Key %s failed to verify sig: %s",
9484
self.keyid,
95-
getattr(result, "reason", ""),
85+
e,
9686
)
9787
raise UnverifiedSignatureError(
9888
f"Failed to verify signature by {self.keyid}"
99-
)
89+
) from e
90+
except Exception as e:
91+
logger.info("Key %s failed to verify sig: %s", self.keyid, str(e))
92+
raise VerificationError(
93+
f"Unknown failure to verify signature by {self.keyid}"
94+
) from e
10095

10196

10297
class SigstoreSigner(Signer):
@@ -189,9 +184,9 @@ def from_priv_key_uri(
189184

190185
key_identity = public_key.keyval["identity"]
191186
key_issuer = public_key.keyval["issuer"]
192-
if key_issuer != token.expected_certificate_subject:
187+
if key_issuer != token.federated_issuer:
193188
raise ValueError(
194-
f"Signer identity issuer {token.expected_certificate_subject} "
189+
f"Signer identity issuer {token.federated_issuer} "
195190
f"did not match key: {key_issuer}"
196191
)
197192
# TODO: should check ambient identity too: unfortunately IdentityToken does
@@ -246,9 +241,7 @@ def import_via_auth(cls) -> Tuple[str, SigstoreKey]:
246241

247242
# authenticate to get the identity and issuer
248243
token = Issuer.production().identity_token()
249-
return cls.import_(
250-
token.identity, token.expected_certificate_subject, False
251-
)
244+
return cls.import_(token.identity, token.federated_issuer, False)
252245

253246
def sign(self, payload: bytes) -> Signature:
254247
"""Signs payload using the OIDC token on the signer instance.
@@ -273,12 +266,12 @@ def sign(self, payload: bytes) -> Signature:
273266

274267
context = SigningContext.production()
275268
with context.signer(self._token) as sigstore_signer:
276-
result = sigstore_signer.sign(io.BytesIO(payload))
277-
278-
bundle = result.to_bundle()
279-
269+
bundle = sigstore_signer.sign_artifact(payload)
270+
# We want to access the actual signature, see
271+
# https://github.com/sigstore/protobuf-specs/blob/main/protos/sigstore_bundle.proto
272+
bundle_json = json.loads(bundle.to_json())
280273
return Signature(
281274
self.public_key.keyid,
282-
bundle.message_signature.signature.hex(),
283-
{"bundle": bundle.to_dict()},
275+
bundle_json["messageSignature"]["signature"],
276+
{"bundle": bundle_json},
284277
)

Diff for: tests/check_sigstore_signer.py

+15
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020
from tempfile import TemporaryDirectory
2121
from unittest import mock
2222

23+
from securesystemslib.exceptions import (
24+
UnverifiedSignatureError,
25+
VerificationError,
26+
)
2327
from securesystemslib.signer import (
2428
SIGNER_FOR_URI_SCHEME,
2529
Signer,
@@ -100,8 +104,19 @@ def test_sign(self):
100104
signer = Signer.from_priv_key_uri(uri, public_key)
101105

102106
sig = signer.sign(b"data")
107+
108+
# Successful verification
103109
public_key.verify_signature(sig, b"data")
104110

111+
# Signature mismatch
112+
with self.assertRaises(UnverifiedSignatureError):
113+
public_key.verify_signature(sig, b"incorrect data")
114+
115+
# Broken bundle
116+
sig.unrecognized_fields["bundle"]["verificationMaterial"] = None
117+
with self.assertRaises(VerificationError):
118+
public_key.verify_signature(sig, b"data")
119+
105120

106121
if __name__ == "__main__":
107122
unittest.main(verbosity=4, buffer=False)

Diff for: tox.ini

+1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ commands =
6363
deps =
6464
-r{toxinidir}/requirements-pinned.txt
6565
-r{toxinidir}/requirements-lint.txt
66+
-r{toxinidir}/requirements-sigstore.txt
6667
commands =
6768
black --check --diff .
6869
isort --check --diff .

0 commit comments

Comments
 (0)