Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Simplified interface for custom metadata #104

Merged
merged 7 commits into from
Feb 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 41 additions & 11 deletions examples/repo/repo_workflow_example.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,22 @@

APP_NAME = 'example_app'

# Specify local paths
BASE_DIR = pathlib.Path(__file__).resolve().parent
# Default base directory
EXAMPLE_DIR = pathlib.Path(__file__).resolve().parent
BASE_DIR = EXAMPLE_DIR

# This script is also used to create/update test data, in which case we need to
# override some variables. Everything related to _UPDATE_TEST_DATA can be ignored for
# normal use.
_UPDATE_TEST_DATA = os.getenv('UPDATE_TEST_DATA') # see dirs_to_clean for values
TEST_DATA_EXPIRATION_DAYS = None
if _UPDATE_TEST_DATA is not None:
TEST_DATA_EXPIRATION_DAYS = 10000
PROJECT_DIR = EXAMPLE_DIR.parent.parent
BASE_DIR = PROJECT_DIR / 'tests' / 'data'
logger.warning(f'updating test data in {BASE_DIR}')

# Specify local example paths
KEYS_DIR = BASE_DIR / DEFAULT_KEYS_DIR_NAME
ONLINE_DIR = KEYS_DIR / 'online_secrets'
OFFLINE_DIR_1 = KEYS_DIR / 'offline_secrets_1'
Expand All @@ -51,23 +65,33 @@
META_DIR = REPO_DIR / DEFAULT_META_DIR_NAME
TARGETS_DIR = REPO_DIR / DEFAULT_TARGETS_DIR_NAME

if _UPDATE_TEST_DATA is not None:
# start with clean slate
dirs_to_clean = dict(
keys=[KEYS_DIR, META_DIR], # metadata depends on keys, so remove both
metadata=[META_DIR],
targets=[TARGETS_DIR, META_DIR], # metadata depends on targets, so remove both
all=[KEYS_DIR, META_DIR, TARGETS_DIR],
)
for dir_path in dirs_to_clean.get(_UPDATE_TEST_DATA, []):
for path in dir_path.iterdir():
if path.suffix in ['.gz', '.patch', '.json']:
path.unlink()

# Settings
_TEST_EXPIRATION = int(os.getenv('TEST_EXPIRATION', 0)) # for creating test repo data
if _TEST_EXPIRATION:
logger.warning(f'using TEST_EXPIRATION: {_TEST_EXPIRATION} days')
EXPIRATION_DAYS = dict(
root=_TEST_EXPIRATION or 365,
targets=_TEST_EXPIRATION or 100,
snapshot=_TEST_EXPIRATION or 7,
timestamp=_TEST_EXPIRATION or 1,
root=TEST_DATA_EXPIRATION_DAYS or 365,
targets=TEST_DATA_EXPIRATION_DAYS or 100,
snapshot=TEST_DATA_EXPIRATION_DAYS or 7,
timestamp=TEST_DATA_EXPIRATION_DAYS or 1,
)
THRESHOLDS = dict(root=2, targets=1, snapshot=1, timestamp=1)
KEY_MAP = copy.deepcopy(DEFAULT_KEY_MAP)
KEY_MAP['root'].append('root_two') # use two keys for root
ENCRYPTED_KEYS = ['root', 'root_two', 'targets']

# Custom metadata
DUMMY_METADATA = dict(whatever='important')
DUMMY_METADATA = dict(changes=['this has changed', 'that has changed', '...'])

# Create repository instance
repo = Repository(
Expand Down Expand Up @@ -145,7 +169,7 @@
repo.add_bundle(
new_version=new_version,
new_bundle_dir=dummy_bundle_dir,
custom_metadata_for_patch=DUMMY_METADATA, # just to point out the option
custom_metadata=DUMMY_METADATA, # just to point out the option
)
repo.publish_changes(private_key_dirs=[OFFLINE_DIR_1, OFFLINE_DIR_2, ONLINE_DIR])

Expand Down Expand Up @@ -174,3 +198,9 @@
new_private_key_encrypted=False,
)
repo.publish_changes(private_key_dirs=[OFFLINE_DIR_1, OFFLINE_DIR_2, ONLINE_DIR])

# restore example config if necessary (ignore for normal use)
if _UPDATE_TEST_DATA:
repo.keys_dir = EXAMPLE_DIR / DEFAULT_KEYS_DIR_NAME
repo.repo_dir = EXAMPLE_DIR / DEFAULT_REPO_DIR_NAME
repo.save_config()
9 changes: 3 additions & 6 deletions src/tufup/repo/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -728,8 +728,7 @@ def add_bundle(
new_bundle_dir: Union[pathlib.Path, str],
new_version: Optional[str] = None,
skip_patch: bool = False,
custom_metadata_for_archive: Optional[dict] = None,
custom_metadata_for_patch: Optional[dict] = None,
custom_metadata: Optional[dict] = None, # archive only
):
"""
Adds a new application bundle to the local repository.
Expand Down Expand Up @@ -762,17 +761,15 @@ def add_bundle(
if not latest_archive or latest_archive.version < new_archive.version:
# register new archive
self.roles.add_or_update_target(
local_path=new_archive.path, custom=custom_metadata_for_archive
local_path=new_archive.path, custom=custom_metadata
)
# create patch, if possible, and register that too
if latest_archive and not skip_patch:
patch_path = Patcher.create_patch(
src_path=self.targets_dir / latest_archive.path,
dst_path=self.targets_dir / new_archive.path,
)
self.roles.add_or_update_target(
local_path=patch_path, custom=custom_metadata_for_patch
)
self.roles.add_or_update_target(local_path=patch_path)

def remove_latest_bundle(self):
"""
Expand Down
1 change: 1 addition & 0 deletions tests/data/keystore/offline_secrets_1/root
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"keytype": "ed25519", "scheme": "ed25519", "keyid": "b7ad916e4138911155b771d0ede66666e9647e7fb6c85a1904be97dee5653568", "keyid_hash_algorithms": ["sha256", "sha512"], "keyval": {"public": "4cec23f563ae4d97e22c823ed8c3c2effed9ca568fab68179f0a338526003813", "private": "aad6a081d799da1b05ba8caed5bb5af28b4c27323fbce91dae4d0f4576fba041"}}
1 change: 1 addition & 0 deletions tests/data/keystore/offline_secrets_1/targets
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"keytype": "ed25519", "scheme": "ed25519", "keyid": "cd9930c92ac25c02a2f92ae3128b50459b53d7532ef9c0f364e78f388d5808a5", "keyid_hash_algorithms": ["sha256", "sha512"], "keyval": {"public": "6849e4a7ca3e121cce7368dc939419fd2de031f4f33fc86083ff1bed4db8403a", "private": "2dc257cdcc46987b204365569a773e7937c53cd37df60fbc23e86fac01aef424"}}
1 change: 1 addition & 0 deletions tests/data/keystore/offline_secrets_2/root_three
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"keytype": "ed25519", "scheme": "ed25519", "keyid": "1bd53d9d6f08f6efba19477880b348906f5f29a67d78cbca8a44aedfad12d003", "keyid_hash_algorithms": ["sha256", "sha512"], "keyval": {"public": "b64b98945cc9e4c0997a896e3856f3198309d369ed2c54d59a7193ac63a40854", "private": "e9faa5edf1a174fb33cb6f2fc206af95e7a5c40dcade96053f79e445f26ccce1"}}
1 change: 1 addition & 0 deletions tests/data/keystore/offline_secrets_2/root_three.pub
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"keytype": "ed25519", "scheme": "ed25519", "keyid_hash_algorithms": ["sha256", "sha512"], "keyval": {"public": "b64b98945cc9e4c0997a896e3856f3198309d369ed2c54d59a7193ac63a40854"}}
1 change: 1 addition & 0 deletions tests/data/keystore/offline_secrets_2/root_two
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"keytype": "ed25519", "scheme": "ed25519", "keyid": "d4ec748f9476f9f7e1f0a247b917dde4abe8a024de9ba34c7458b41bec8be6b2", "keyid_hash_algorithms": ["sha256", "sha512"], "keyval": {"public": "4e156bc0a9ba4cce79cd53405d597a906f70e6b4a737c96b21fb69ca8d0c0efc", "private": "4530c21c6bdc83c2f5d2dbd401b5745c93cb7bd40d344c7b8053e43b127bb06a"}}
1 change: 1 addition & 0 deletions tests/data/keystore/online_secrets/snapshot
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"keytype": "ed25519", "scheme": "ed25519", "keyid": "5ef48ab6f5398d2bf17f1f4c4fc0e0440c4aa3734a05ae523561e02e8a99957a", "keyid_hash_algorithms": ["sha256", "sha512"], "keyval": {"public": "98dfc1375ce8818259ba23aa24bb596d6a60026e555285baccc1d3524677bcfe", "private": "67dd8d2478ebf07e26a942728d956c2453be98196f9f701a9b4f24eae6e5d23b"}}
1 change: 1 addition & 0 deletions tests/data/keystore/online_secrets/timestamp
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"keytype": "ed25519", "scheme": "ed25519", "keyid": "eddb87d254d513c1404d71e17620ecf5260e1836babdaa55197916c582f37a00", "keyid_hash_algorithms": ["sha256", "sha512"], "keyval": {"public": "6479fe966d5b5fb11d3339c18b42235bbe2a49e54966d6d1bc6a79e7985aedf8", "private": "0538bb26a32387c00775f6b1f980ffe56d6b069faebb95d8f5bc1cf80a970bb7"}}
2 changes: 1 addition & 1 deletion tests/data/keystore/root.pub
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"keytype": "ed25519", "scheme": "ed25519", "keyid_hash_algorithms": ["sha256", "sha512"], "keyval": {"public": "f5033e2659886185ceedec69e2cfee0f348ea63dfffafd5f8566d001b45c470d"}}
{"keytype": "ed25519", "scheme": "ed25519", "keyid_hash_algorithms": ["sha256", "sha512"], "keyval": {"public": "4cec23f563ae4d97e22c823ed8c3c2effed9ca568fab68179f0a338526003813"}}
2 changes: 1 addition & 1 deletion tests/data/keystore/root_two.pub
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"keytype": "ed25519", "scheme": "ed25519", "keyid_hash_algorithms": ["sha256", "sha512"], "keyval": {"public": "c8eaa5bf0f26e7247c965388a7ce7d3a25113899139c3d9bd2dbbb5e95577397"}}
{"keytype": "ed25519", "scheme": "ed25519", "keyid_hash_algorithms": ["sha256", "sha512"], "keyval": {"public": "4e156bc0a9ba4cce79cd53405d597a906f70e6b4a737c96b21fb69ca8d0c0efc"}}
2 changes: 1 addition & 1 deletion tests/data/keystore/snapshot.pub
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"keytype": "ed25519", "scheme": "ed25519", "keyid_hash_algorithms": ["sha256", "sha512"], "keyval": {"public": "41bf1adabf1f564de734fa5fb584a65b943317978a4dcbe39bab03ee722ee73f"}}
{"keytype": "ed25519", "scheme": "ed25519", "keyid_hash_algorithms": ["sha256", "sha512"], "keyval": {"public": "98dfc1375ce8818259ba23aa24bb596d6a60026e555285baccc1d3524677bcfe"}}
2 changes: 1 addition & 1 deletion tests/data/keystore/targets.pub
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"keytype": "ed25519", "scheme": "ed25519", "keyid_hash_algorithms": ["sha256", "sha512"], "keyval": {"public": "a27a0209711787a4227cbfed23735a75b5f7f5cb0cd6acbf7a239fa2c3535434"}}
{"keytype": "ed25519", "scheme": "ed25519", "keyid_hash_algorithms": ["sha256", "sha512"], "keyval": {"public": "6849e4a7ca3e121cce7368dc939419fd2de031f4f33fc86083ff1bed4db8403a"}}
2 changes: 1 addition & 1 deletion tests/data/keystore/timestamp.pub
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"keytype": "ed25519", "scheme": "ed25519", "keyid_hash_algorithms": ["sha256", "sha512"], "keyval": {"public": "2ec5e87c77fe70d918d92a1d849f4ec12907a34cf208123bbbc6d1e4bd584885"}}
{"keytype": "ed25519", "scheme": "ed25519", "keyid_hash_algorithms": ["sha256", "sha512"], "keyval": {"public": "6479fe966d5b5fb11d3339c18b42235bbe2a49e54966d6d1bc6a79e7985aedf8"}}
40 changes: 20 additions & 20 deletions tests/data/repository/metadata/1.root.json
Original file line number Diff line number Diff line change
@@ -1,78 +1,78 @@
{
"signatures": [
{
"keyid": "104c43225506bf7637a0061775a0d23ca8693e6bb4b270bc9ee9664259eb77d8",
"sig": "aa37e6a5e46938eb7c72054f2f2ff929e949283be67149c2a4fe481e51b91d8cc16876cbce03619af1d0b331ebf1d72ec368069ca49cca8d95a96eeaa06bfc07"
"keyid": "b7ad916e4138911155b771d0ede66666e9647e7fb6c85a1904be97dee5653568",
"sig": "8582f12a66a923c8069a4385ef594c345ca2bd69741c0ba2691c4cb20e005e7a771f6ca651852d1264d13107d108c5843d3f9b69bcd20500f7108cca6e6c8901"
},
{
"keyid": "eb456bc4372b9aef1aea4790911d748a741d27ad0bd0eabcfe41e7fe3c6e9a8f",
"sig": "b70196c013a883d0ae5fede183e1c49556ee26fecb0798968e41a391121c39ab229ed2e1f7067760232aeac0b709ecf48a29df34f0184349c5d96f4e9be91703"
"keyid": "d4ec748f9476f9f7e1f0a247b917dde4abe8a024de9ba34c7458b41bec8be6b2",
"sig": "3f2a6d6cd8232d0ca1f2b75445a7dc9bc4342f72fe88204fac7e7acad48eb6102ff1ba4b1efaf8f8ec32ee11cf68a5f92e34300f66b37e5970e878f77b2e9c0b"
}
],
"signed": {
"_type": "root",
"consistent_snapshot": false,
"expires": "2051-06-24T09:37:39Z",
"expires": "2051-06-25T13:08:41Z",
"keys": {
"0eb56770be481c3a117f0487e7b6762edd0eaac7860ba85530dba400edf7de03": {
"5ef48ab6f5398d2bf17f1f4c4fc0e0440c4aa3734a05ae523561e02e8a99957a": {
"keytype": "ed25519",
"keyval": {
"public": "2ec5e87c77fe70d918d92a1d849f4ec12907a34cf208123bbbc6d1e4bd584885"
"public": "98dfc1375ce8818259ba23aa24bb596d6a60026e555285baccc1d3524677bcfe"
},
"scheme": "ed25519"
},
"104c43225506bf7637a0061775a0d23ca8693e6bb4b270bc9ee9664259eb77d8": {
"b7ad916e4138911155b771d0ede66666e9647e7fb6c85a1904be97dee5653568": {
"keytype": "ed25519",
"keyval": {
"public": "c8eaa5bf0f26e7247c965388a7ce7d3a25113899139c3d9bd2dbbb5e95577397"
"public": "4cec23f563ae4d97e22c823ed8c3c2effed9ca568fab68179f0a338526003813"
},
"scheme": "ed25519"
},
"3515ef592c09ddb3a09da0096802afc26852dc7a1978cb1c99fbe3a6f5c0c1a1": {
"cd9930c92ac25c02a2f92ae3128b50459b53d7532ef9c0f364e78f388d5808a5": {
"keytype": "ed25519",
"keyval": {
"public": "a27a0209711787a4227cbfed23735a75b5f7f5cb0cd6acbf7a239fa2c3535434"
"public": "6849e4a7ca3e121cce7368dc939419fd2de031f4f33fc86083ff1bed4db8403a"
},
"scheme": "ed25519"
},
"5fcbe7c4faa87ab25bea551c0c4b0ac6e47a07caf5e7633314a784c54ad2ea8a": {
"d4ec748f9476f9f7e1f0a247b917dde4abe8a024de9ba34c7458b41bec8be6b2": {
"keytype": "ed25519",
"keyval": {
"public": "41bf1adabf1f564de734fa5fb584a65b943317978a4dcbe39bab03ee722ee73f"
"public": "4e156bc0a9ba4cce79cd53405d597a906f70e6b4a737c96b21fb69ca8d0c0efc"
},
"scheme": "ed25519"
},
"eb456bc4372b9aef1aea4790911d748a741d27ad0bd0eabcfe41e7fe3c6e9a8f": {
"eddb87d254d513c1404d71e17620ecf5260e1836babdaa55197916c582f37a00": {
"keytype": "ed25519",
"keyval": {
"public": "f5033e2659886185ceedec69e2cfee0f348ea63dfffafd5f8566d001b45c470d"
"public": "6479fe966d5b5fb11d3339c18b42235bbe2a49e54966d6d1bc6a79e7985aedf8"
},
"scheme": "ed25519"
}
},
"roles": {
"root": {
"keyids": [
"eb456bc4372b9aef1aea4790911d748a741d27ad0bd0eabcfe41e7fe3c6e9a8f",
"104c43225506bf7637a0061775a0d23ca8693e6bb4b270bc9ee9664259eb77d8"
"d4ec748f9476f9f7e1f0a247b917dde4abe8a024de9ba34c7458b41bec8be6b2",
"b7ad916e4138911155b771d0ede66666e9647e7fb6c85a1904be97dee5653568"
],
"threshold": 2
},
"snapshot": {
"keyids": [
"5fcbe7c4faa87ab25bea551c0c4b0ac6e47a07caf5e7633314a784c54ad2ea8a"
"5ef48ab6f5398d2bf17f1f4c4fc0e0440c4aa3734a05ae523561e02e8a99957a"
],
"threshold": 1
},
"targets": {
"keyids": [
"3515ef592c09ddb3a09da0096802afc26852dc7a1978cb1c99fbe3a6f5c0c1a1"
"cd9930c92ac25c02a2f92ae3128b50459b53d7532ef9c0f364e78f388d5808a5"
],
"threshold": 1
},
"timestamp": {
"keyids": [
"0eb56770be481c3a117f0487e7b6762edd0eaac7860ba85530dba400edf7de03"
"eddb87d254d513c1404d71e17620ecf5260e1836babdaa55197916c582f37a00"
],
"threshold": 1
}
Expand Down
44 changes: 22 additions & 22 deletions tests/data/repository/metadata/2.root.json
Original file line number Diff line number Diff line change
@@ -1,82 +1,82 @@
{
"signatures": [
{
"keyid": "104c43225506bf7637a0061775a0d23ca8693e6bb4b270bc9ee9664259eb77d8",
"sig": "629f1d19e28f6a217b728509222b565ca7168be8cc094fed2e9c547c35da39b127b9914b49628789abef754d0615147aada1377af2fc6355ff49a42f31253e0a"
"keyid": "b7ad916e4138911155b771d0ede66666e9647e7fb6c85a1904be97dee5653568",
"sig": "740d4c6945050abd3abba7023cb5128a4e344e83ae0f52f9c978b7b3582dd21213e72a66dec6cd4206093c634cb973cf3ec0940103e54e6a81c4424322cf2d01"
},
{
"keyid": "eb456bc4372b9aef1aea4790911d748a741d27ad0bd0eabcfe41e7fe3c6e9a8f",
"sig": "05cd311026a0e5cece1d6d54b6b7f957f4824a704b7a319619621448a9ccb65ad9b1068429cf813aace000887eacf7a20000bacbc52777c9b11e9641d6f78f0c"
"keyid": "1bd53d9d6f08f6efba19477880b348906f5f29a67d78cbca8a44aedfad12d003",
"sig": "58ed242676830567413936feec20c80cd79d03fc31bdad38ffd0ef69e40298dfd8fe15edb7a4fd504a01ee5a7cddd3bfbd169ccd9bd2c6067e452aeee3a18102"
},
{
"keyid": "1784b06ef8e18f906f3fd62f2fd81aa088bb58317da624e10b5a3ecb72bd662f",
"sig": "933b34c60eeca55793e875e45993397ec2447608c3d73777f6e20b452223ab949a4c1c2b0e9a9f2374bd7ac9cdc06f397407320b1039ff256e21ea52500a6106"
"keyid": "d4ec748f9476f9f7e1f0a247b917dde4abe8a024de9ba34c7458b41bec8be6b2",
"sig": "7ea041490934e6637998eb22ab367f1d260b3d0cdde144cc5a776dda7a65c27a6061d1b62986851ecbc49ad04c7a428987b323c1c961f65f8e0143c792deb706"
}
],
"signed": {
"_type": "root",
"consistent_snapshot": false,
"expires": "2051-06-24T09:37:39Z",
"expires": "2051-06-25T13:08:48Z",
"keys": {
"0eb56770be481c3a117f0487e7b6762edd0eaac7860ba85530dba400edf7de03": {
"1bd53d9d6f08f6efba19477880b348906f5f29a67d78cbca8a44aedfad12d003": {
"keytype": "ed25519",
"keyval": {
"public": "2ec5e87c77fe70d918d92a1d849f4ec12907a34cf208123bbbc6d1e4bd584885"
"public": "b64b98945cc9e4c0997a896e3856f3198309d369ed2c54d59a7193ac63a40854"
},
"scheme": "ed25519"
},
"1784b06ef8e18f906f3fd62f2fd81aa088bb58317da624e10b5a3ecb72bd662f": {
"5ef48ab6f5398d2bf17f1f4c4fc0e0440c4aa3734a05ae523561e02e8a99957a": {
"keytype": "ed25519",
"keyval": {
"public": "8ffc27373c8e9c5e32344b16d1b7f50a44323da6df4855deb6eadf8eb744eea8"
"public": "98dfc1375ce8818259ba23aa24bb596d6a60026e555285baccc1d3524677bcfe"
},
"scheme": "ed25519"
},
"3515ef592c09ddb3a09da0096802afc26852dc7a1978cb1c99fbe3a6f5c0c1a1": {
"b7ad916e4138911155b771d0ede66666e9647e7fb6c85a1904be97dee5653568": {
"keytype": "ed25519",
"keyval": {
"public": "a27a0209711787a4227cbfed23735a75b5f7f5cb0cd6acbf7a239fa2c3535434"
"public": "4cec23f563ae4d97e22c823ed8c3c2effed9ca568fab68179f0a338526003813"
},
"scheme": "ed25519"
},
"5fcbe7c4faa87ab25bea551c0c4b0ac6e47a07caf5e7633314a784c54ad2ea8a": {
"cd9930c92ac25c02a2f92ae3128b50459b53d7532ef9c0f364e78f388d5808a5": {
"keytype": "ed25519",
"keyval": {
"public": "41bf1adabf1f564de734fa5fb584a65b943317978a4dcbe39bab03ee722ee73f"
"public": "6849e4a7ca3e121cce7368dc939419fd2de031f4f33fc86083ff1bed4db8403a"
},
"scheme": "ed25519"
},
"eb456bc4372b9aef1aea4790911d748a741d27ad0bd0eabcfe41e7fe3c6e9a8f": {
"eddb87d254d513c1404d71e17620ecf5260e1836babdaa55197916c582f37a00": {
"keytype": "ed25519",
"keyval": {
"public": "f5033e2659886185ceedec69e2cfee0f348ea63dfffafd5f8566d001b45c470d"
"public": "6479fe966d5b5fb11d3339c18b42235bbe2a49e54966d6d1bc6a79e7985aedf8"
},
"scheme": "ed25519"
}
},
"roles": {
"root": {
"keyids": [
"eb456bc4372b9aef1aea4790911d748a741d27ad0bd0eabcfe41e7fe3c6e9a8f",
"1784b06ef8e18f906f3fd62f2fd81aa088bb58317da624e10b5a3ecb72bd662f"
"b7ad916e4138911155b771d0ede66666e9647e7fb6c85a1904be97dee5653568",
"1bd53d9d6f08f6efba19477880b348906f5f29a67d78cbca8a44aedfad12d003"
],
"threshold": 2
},
"snapshot": {
"keyids": [
"5fcbe7c4faa87ab25bea551c0c4b0ac6e47a07caf5e7633314a784c54ad2ea8a"
"5ef48ab6f5398d2bf17f1f4c4fc0e0440c4aa3734a05ae523561e02e8a99957a"
],
"threshold": 1
},
"targets": {
"keyids": [
"3515ef592c09ddb3a09da0096802afc26852dc7a1978cb1c99fbe3a6f5c0c1a1"
"cd9930c92ac25c02a2f92ae3128b50459b53d7532ef9c0f364e78f388d5808a5"
],
"threshold": 1
},
"timestamp": {
"keyids": [
"0eb56770be481c3a117f0487e7b6762edd0eaac7860ba85530dba400edf7de03"
"eddb87d254d513c1404d71e17620ecf5260e1836babdaa55197916c582f37a00"
],
"threshold": 1
}
Expand Down
Loading
Loading