Skip to content

Commit 5fab635

Browse files
author
Lukas Puehringer
committed
ngclient: support dsse in Updater
* Add `use_dsse` updater config parameter which indicates, if an updater instance expects metadata to come in a DSSE envelope. * Update TrustedMetadataSet to take an Unwrapper instance. * Update Updater, to pass an EnvelopeUnwrapper to TrustedMetadataSet, if configured with `use_dsse`. Signed-off-by: Lukas Puehringer <lukas.puehringer@nyu.edu>
1 parent d859bac commit 5fab635

4 files changed

Lines changed: 27 additions & 9 deletions

File tree

tests/test_trusted_metadata_set.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -198,17 +198,17 @@ def test_root_with_invalid_json(self) -> None:
198198
for test_func in [TrustedMetadataSet, self.trusted_set.update_root]:
199199
# root is not json
200200
with self.assertRaises(exceptions.RepositoryError):
201-
test_func(b"")
201+
test_func(b"") # type: ignore[operator]
202202

203203
# root is invalid
204204
root = Metadata.from_bytes(self.metadata[Root.type])
205205
root.signed.version += 1
206206
with self.assertRaises(exceptions.UnsignedMetadataError):
207-
test_func(root.to_bytes())
207+
test_func(root.to_bytes()) # type: ignore[operator]
208208

209209
# metadata is of wrong type
210210
with self.assertRaises(exceptions.RepositoryError):
211-
test_func(self.metadata[Snapshot.type])
211+
test_func(self.metadata[Snapshot.type]) # type: ignore[operator]
212212

213213
def test_top_level_md_with_invalid_json(self) -> None:
214214
top_level_md: List[Tuple[bytes, Callable[[bytes], Signed]]] = [

tuf/ngclient/_internal/trusted_metadata_set.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868

6969
from tuf.api import exceptions
7070
from tuf.api.metadata import Root, Signed, Snapshot, Targets, Timestamp
71-
from tuf.ngclient._internal.wrapping import MetadataUnwrapper
71+
from tuf.ngclient._internal.wrapping import MetadataUnwrapper, Unwrapper
7272

7373
logger = logging.getLogger(__name__)
7474

@@ -82,19 +82,24 @@ class TrustedMetadataSet(abc.Mapping):
8282
what is updated.
8383
"""
8484

85-
def __init__(self, root_data: bytes):
85+
def __init__(self, root_data: bytes, unwrapper: Optional[Unwrapper] = None):
8686
"""Initialize ``TrustedMetadataSet`` by loading trusted root metadata.
8787
8888
Args:
8989
root_data: Trusted root metadata as bytes. Note that this metadata
9090
will only be verified by itself: it is the source of trust for
9191
all metadata in the ``TrustedMetadataSet``
92+
unwrapper: Used to unwrap and verify metadata. Default is
93+
MetadataUnwrapper.
9294
9395
Raises:
9496
RepositoryError: Metadata failed to load or verify. The actual
9597
error type and content will contain more details.
9698
"""
97-
self._unwrapper = MetadataUnwrapper()
99+
if unwrapper is None:
100+
unwrapper = MetadataUnwrapper()
101+
self._unwrapper = unwrapper
102+
98103
self._trusted_set: Dict[str, Signed] = {}
99104
self.reference_time = datetime.datetime.utcnow()
100105

tuf/ngclient/config.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ class UpdaterConfig:
2323
are used, target download URLs are formed by prefixing the filename
2424
with a hash digest of file content by default. This can be
2525
overridden by setting ``prefix_targets_with_hash`` to ``False``.
26-
26+
use_dsse: If true, expect metadata in a DSSE Envelope. Use
27+
traditional Metadata (canonical json) otherwise.
2728
"""
2829

2930
max_root_rotations: int = 32
@@ -33,3 +34,4 @@ class UpdaterConfig:
3334
snapshot_max_length: int = 2000000 # bytes
3435
targets_max_length: int = 5000000 # bytes
3536
prefix_targets_with_hash: bool = True
37+
use_dsse: bool = False

tuf/ngclient/updater.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,11 @@
4646

4747
from tuf.api import exceptions
4848
from tuf.api.metadata import Root, Snapshot, TargetFile, Targets, Timestamp
49-
from tuf.ngclient._internal import requests_fetcher, trusted_metadata_set
49+
from tuf.ngclient._internal import (
50+
requests_fetcher,
51+
trusted_metadata_set,
52+
wrapping,
53+
)
5054
from tuf.ngclient.config import UpdaterConfig
5155
from tuf.ngclient.fetcher import FetcherInterface
5256

@@ -94,10 +98,17 @@ def __init__(
9498

9599
# Read trusted local root metadata
96100
data = self._load_local_metadata(Root.type)
97-
self._trusted_set = trusted_metadata_set.TrustedMetadataSet(data)
98101
self._fetcher = fetcher or requests_fetcher.RequestsFetcher()
99102
self.config = config or UpdaterConfig()
100103

104+
unwrapper: Optional[wrapping.Unwrapper] = None
105+
if self.config.use_dsse:
106+
unwrapper = wrapping.EnvelopeUnwrapper()
107+
108+
self._trusted_set = trusted_metadata_set.TrustedMetadataSet(
109+
data, unwrapper
110+
)
111+
101112
def refresh(self) -> None:
102113
"""Refresh top-level metadata.
103114

0 commit comments

Comments
 (0)