Skip to content

Commit

Permalink
Simplified interface for custom metadata (#104)
Browse files Browse the repository at this point in the history
* remove custom_metadata_for_patch arg from Repository.add_bundle()

and rename the other arg to custom_metadata

* remove dummy keystore from test data: not used anymore

* add _UPDATE_TEST_DATA option to repo workflow example

* enable selective test data creation

* adapt test to custom archive metadata

* restore test data keystore

even though the keys are not used in current unit tests, they must be present for reproducibility, in case we want to update test data from a fresh installation
(otherwise we would get a mismatch between keys and metadata, so we would need to create all new keys and metadata every time)

* include keys in repo_workflow_example test data
  • Loading branch information
dennisvang authored Feb 7, 2024
1 parent c8e82a5 commit 61323f9
Show file tree
Hide file tree
Showing 22 changed files with 153 additions and 108 deletions.
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

0 comments on commit 61323f9

Please sign in to comment.