Skip to content

Commit 8ef13fc

Browse files
authored
Merge pull request #485 from jku/minimal-tuf-upgrade
TUF upgrade
2 parents fce107e + cf51cb2 commit 8ef13fc

File tree

20 files changed

+58
-57
lines changed

20 files changed

+58
-57
lines changed

action-constraints.txt

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
#
77
annotated-types==0.7.0
88
# via pydantic
9-
appdirs==1.4.4
10-
# via sigstore
119
azure-core==1.32.0
1210
# via
1311
# azure-identity
@@ -30,9 +28,7 @@ cachetools==5.5.0
3028
certifi==2024.8.30
3129
# via requests
3230
cffi==1.17.1
33-
# via
34-
# cryptography
35-
# pynacl
31+
# via cryptography
3632
charset-normalizer==3.4.0
3733
# via requests
3834
click==8.1.7
@@ -105,6 +101,8 @@ msal-extensions==1.2.0
105101
# via azure-identity
106102
multidict==6.1.0
107103
# via grpclib
104+
platformdirs==4.3.6
105+
# via sigstore
108106
portalocker==2.10.1
109107
# via msal-extensions
110108
proto-plus==1.25.0
@@ -123,11 +121,12 @@ pyasn1==0.6.1
123121
# via
124122
# pyasn1-modules
125123
# rsa
124+
# sigstore
126125
pyasn1-modules==0.4.1
127126
# via google-auth
128127
pycparser==2.22
129128
# via cffi
130-
pydantic==2.10.1
129+
pydantic==2.10.2
131130
# via
132131
# id
133132
# sigstore
@@ -136,13 +135,11 @@ pydantic-core==2.27.1
136135
# via pydantic
137136
pygments==2.18.0
138137
# via rich
139-
pyjwt==2.10.0
138+
pyjwt==2.10.1
140139
# via
141140
# msal
142141
# sigstore
143-
pynacl==1.5.0
144-
# via securesystemslib
145-
pyopenssl==24.2.1
142+
pyopenssl==24.3.0
146143
# via sigstore
147144
python-dateutil==2.9.0.post0
148145
# via
@@ -156,28 +153,29 @@ requests==2.32.3
156153
# msal
157154
# sigstore
158155
# tuf
156+
rfc8785==0.1.4
157+
# via sigstore
159158
rich==13.9.4
160159
# via sigstore
161160
rsa==4.9
162161
# via google-auth
163162
s3transfer==0.10.4
164163
# via boto3
165-
securesystemslib==0.31.0
164+
securesystemslib==1.2.0
166165
# via
167-
# sigstore
168166
# tuf
169167
# tuf-on-ci (repo/pyproject.toml)
170-
sigstore==2.1.5
168+
sigstore==3.5.3
171169
# via securesystemslib
172170
sigstore-protobuf-specs==0.3.2
173171
# via sigstore
174-
sigstore-rekor-types==0.0.11
172+
sigstore-rekor-types==0.0.13
175173
# via sigstore
176174
six==1.16.0
177175
# via
178176
# azure-core
179177
# python-dateutil
180-
tuf==3.1.1
178+
tuf==5.1.0
181179
# via
182180
# sigstore
183181
# tuf-on-ci (repo/pyproject.toml)

repo/pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ name = "tuf-on-ci"
1111
description = "TUF-on-CI repository tools, intended to be executed on a CI system"
1212
readme = "README.md"
1313
dependencies = [
14-
"securesystemslib[awskms, azurekms, gcpkms, sigstore, pynacl] ~= 0.31.0",
15-
"tuf ~= 3.1",
14+
"securesystemslib[awskms, azurekms, gcpkms, sigstore] ~= 1.2",
15+
"tuf ~= 5.1",
1616
"click ~= 8.1",
1717
]
1818
requires-python = ">=3.10"

repo/tuf_on_ci/_repository.py

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import os
44
import shutil
55
from dataclasses import dataclass
6-
from datetime import datetime, timedelta
6+
from datetime import UTC, datetime, timedelta
77
from enum import Enum, unique
88
from glob import glob
99

@@ -222,7 +222,7 @@ def close(self, rolename: str, md: Metadata) -> None:
222222

223223
_, expiry_days = self.signing_expiry_period(rolename)
224224

225-
md.signed.expires = datetime.utcnow() + timedelta(days=expiry_days)
225+
md.signed.expires = datetime.now(UTC) + timedelta(days=expiry_days)
226226

227227
md.signatures.clear()
228228
for key in self._get_keys(rolename):
@@ -244,9 +244,8 @@ def close(self, rolename: str, md: Metadata) -> None:
244244
md.signatures[key.keyid] = Signature(key.keyid, "")
245245

246246
if rolename in ["timestamp", "snapshot"]:
247-
root_md: Metadata[Root] = self.open("root")
248247
# repository should never write unsigned online roles
249-
root_md.verify_delegate(rolename, md)
248+
self.root().verify_delegate(rolename, md.signed_bytes, md.signatures)
250249

251250
self._write(rolename, md)
252251

@@ -321,7 +320,7 @@ def open_prev(self, role: str) -> Metadata | None:
321320
return None
322321

323322
def _validate_role(
324-
self, delegator: Metadata, rolename: str
323+
self, delegator: Root | Targets, rolename: str
325324
) -> tuple[bool, str | None]:
326325
"""Validate role compatibility with this repository
327326
@@ -340,7 +339,7 @@ def _validate_role(
340339
return False, f"Version {md.signed.version} is not valid for {rolename}"
341340

342341
days = md.signed.unrecognized_fields["x-tuf-on-ci-expiry-period"]
343-
if md.signed.expires > datetime.utcnow() + timedelta(days=days):
342+
if md.signed.expires > datetime.now(UTC) + timedelta(days=days):
344343
return False, f"Expiry date is further than expected {days} days ahead"
345344

346345
if isinstance(md.signed, Root):
@@ -384,7 +383,7 @@ def _validate_role(
384383
# * check that target files in metadata match the files in targets/
385384

386385
try:
387-
delegator.verify_delegate(rolename, md)
386+
delegator.verify_delegate(rolename, md.signed_bytes, md.signatures)
388387
except UnsignedMetadataError:
389388
return False, None
390389

@@ -483,16 +482,18 @@ def _get_signing_status(
483482
# Find delegating metadata. For root handle the special case of known good
484483
# delegating metadata.
485484
if known_good:
486-
delegator = None
485+
delegator: Root | Targets | None = None
487486
if rolename == "root":
488-
delegator = self.open_prev("root")
487+
root_md = self.open_prev("root")
488+
if root_md:
489+
delegator = root_md.signed
489490
if not delegator:
490491
# Not root role or there is no known-good root metadata yet
491492
return None
492493
elif rolename in ["root", "targets"]:
493-
delegator = self.open("root")
494+
delegator = self.root()
494495
else:
495-
delegator = self.open("targets")
496+
delegator = self.targets()
496497

497498
# Build list of invites to all delegated roles of rolename
498499
delegation_names = []
@@ -503,7 +504,7 @@ def _get_signing_status(
503504
for delegation_name in delegation_names:
504505
invites.update(self.state.invited_signers_for_role(delegation_name))
505506

506-
role = delegator.signed.get_delegated_role(rolename)
507+
role = delegator.get_delegated_role(rolename)
507508

508509
# Build lists of signed signers and not signed signers
509510
for key in self._get_keys(rolename, known_good):
@@ -585,15 +586,14 @@ def build(self, metadata_path: str, artifact_path: str | None):
585586

586587
def bump_expiring(self, rolename: str) -> int | None:
587588
"""Create a new version of role if it is about to expire"""
588-
now = datetime.utcnow()
589589
bumped = True
590590

591591
with self.edit(rolename) as signed:
592592
signing_days, _ = self.signing_expiry_period(rolename)
593593
delta = timedelta(days=signing_days)
594594

595595
logger.debug(f"{rolename} signing period starts {signed.expires - delta}")
596-
if now + delta < signed.expires:
596+
if datetime.now(UTC) + delta < signed.expires:
597597
# no need to bump version
598598
bumped = False
599599
raise AbortEdit
@@ -622,13 +622,13 @@ def update_targets(self, rolename: str) -> bool:
622622

623623
def is_signed(self, rolename: str) -> bool:
624624
"""Return True if role is correctly signed"""
625-
role_md = self.open(rolename)
625+
md = self.open(rolename)
626626
if rolename in ["root", "timestamp", "snapshot", "targets"]:
627-
delegator = self.open("root")
627+
delegator: Root | Targets = self.root()
628628
else:
629-
delegator = self.open("targets")
629+
delegator = self.targets()
630630
try:
631-
delegator.verify_delegate(rolename, role_md)
631+
delegator.verify_delegate(rolename, md.signed_bytes, md.signatures)
632632
except UnsignedMetadataError:
633633
return False
634634

@@ -639,4 +639,4 @@ def is_in_signing_period(self, rolename: str) -> bool:
639639
role_md = self.open(rolename)
640640
signing_days, _ = self.signing_expiry_period(rolename)
641641
delta = timedelta(days=signing_days)
642-
return datetime.utcnow() >= role_md.signed.expires - delta
642+
return datetime.now(UTC) >= role_md.signed.expires - delta

signer/pyproject.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ name = "tuf-on-ci-sign"
77
description = "Signing tools for TUF-on-CI"
88
readme = "README.md"
99
dependencies = [
10-
"packaging >= 23.2,< 25.0",
10+
"packaging ~= 24.0",
1111
"platformdirs ~= 4.2",
12-
"securesystemslib[awskms,azurekms,gcpkms,hsm,sigstore] ~= 0.31.0",
13-
"tuf ~= 3.1",
12+
"securesystemslib[awskms,azurekms,gcpkms,hsm,sigstore] ~= 1.2",
13+
"tuf ~= 5.1",
1414
"click ~= 8.1",
1515
]
1616
requires-python = ">=3.9"

signer/tuf_on_ci_sign/_signer_repository.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import os
1212
from contextlib import AbstractContextManager
1313
from dataclasses import dataclass
14-
from datetime import datetime, timedelta
14+
from datetime import datetime, timedelta, timezone
1515
from enum import Enum, unique
1616

1717
import click
@@ -348,7 +348,7 @@ def close(self, role: str, md: Metadata) -> None:
348348

349349
# Set expiry based on custom metadata
350350
days = md.signed.unrecognized_fields["x-tuf-on-ci-expiry-period"]
351-
md.signed.expires = datetime.utcnow() + timedelta(days=days)
351+
md.signed.expires = datetime.now(timezone.utc) + timedelta(days=days)
352352

353353
# figure out if there are open invites to delegations of this role
354354
open_invites = False

signer/tuf_on_ci_sign/delegate.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ def _collect_online_key(user_config: User) -> Key:
260260
if choice == 0:
261261
# This could be generic support, but for now it's a hidden test key.
262262
# key value 1d9a024348e413892aeeb8cc8449309c152f48177200ee61a02ae56f450c6480
263-
uri = "envvar:LOCAL_TESTING_KEY"
263+
uri = f"file2:{os.getenv('TUF_ON_CI_TEST_KEY')}"
264264
pub_key = "fa472895c9756c2b9bcd1440bf867d0fa5c4edee79e9792fa9822be3dd6fcbb3"
265265
return SSlibKey(
266266
"fa47289",

tests/e2e.sh

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
# Python dependencies
1717
# * signer: pip install ./signer/
1818
# * repo: pip install ./repo/
19-
# * pynacl: pip install pynacl # for the testing ed25519 key
2019
#
2120
#
2221
# Set DEBUG_TESTS=1 for more visibility. This will leave the temp directories in place.
@@ -519,7 +518,7 @@ repo_online_sign()
519518

520519
cd $REPO_GIT
521520

522-
if LOCAL_TESTING_KEY=$ONLINE_KEY tuf-on-ci-online-sign --push >> $REPO_DIR/out 2>&1; then
521+
if tuf-on-ci-online-sign --push >> $REPO_DIR/out 2>&1; then
523522
echo "generated=true" >> $REPO_DIR/out
524523
else
525524
echo "generated=false" >> $REPO_DIR/out
@@ -917,7 +916,9 @@ export TZ="UTC"
917916
WORK_DIR=$(mktemp -d)
918917
SCRIPT_DIR=$(dirname $(readlink -f "$0"))
919918

920-
ONLINE_KEY="1d9a024348e413892aeeb8cc8449309c152f48177200ee61a02ae56f450c6480"
919+
# setup online signing workaround with file based key
920+
export TUF_ON_CI_TEST_KEY=online-test-key
921+
export CRYPTO_SIGNER_PATH_PREFIX=$SCRIPT_DIR
921922

922923
# Run tests
923924
test_basic

tests/expected/basic/metadata/1.root.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
"public": "fa472895c9756c2b9bcd1440bf867d0fa5c4edee79e9792fa9822be3dd6fcbb3"
2525
},
2626
"scheme": "ed25519",
27-
"x-tuf-on-ci-online-uri": "envvar:LOCAL_TESTING_KEY"
27+
"x-tuf-on-ci-online-uri": "file2:online-test-key"
2828
}
2929
},
3030
"roles": {

tests/expected/delegated/metadata/1.root.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
"public": "fa472895c9756c2b9bcd1440bf867d0fa5c4edee79e9792fa9822be3dd6fcbb3"
2525
},
2626
"scheme": "ed25519",
27-
"x-tuf-on-ci-online-uri": "envvar:LOCAL_TESTING_KEY"
27+
"x-tuf-on-ci-online-uri": "file2:online-test-key"
2828
}
2929
},
3030
"roles": {

tests/expected/multi-user-signing/metadata/1.root.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
"public": "fa472895c9756c2b9bcd1440bf867d0fa5c4edee79e9792fa9822be3dd6fcbb3"
3333
},
3434
"scheme": "ed25519",
35-
"x-tuf-on-ci-online-uri": "envvar:LOCAL_TESTING_KEY"
35+
"x-tuf-on-ci-online-uri": "file2:online-test-key"
3636
}
3737
},
3838
"roles": {

0 commit comments

Comments
 (0)