Repository navigation
Expand file tree
/
Copy pathconformance-client.py
More file actions
executable file
·133 lines (106 loc) · 3.61 KB
/
Copy pathconformance-client.py
File metadata and controls
executable file
·133 lines (106 loc) · 3.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/usr/bin/env python3
"""Conformance client for python-tuf, part of tuf-conformance"""
# Copyright 2024 tuf-conformance contributors
# SPDX-License-Identifier: MIT OR Apache-2.0
import argparse
import logging
import os
import shutil
import sys
from securesystemslib.signer import KEY_FOR_TYPE_AND_SCHEME, SSlibKey
from tuf.ngclient import Updater
# ML-DSA is not in securesystemslib default verifiers yet in v1.5.0:
# enable it in the conformance client
KEY_FOR_TYPE_AND_SCHEME.update(
{
("ml-dsa", "ml-dsa-44/1"): SSlibKey,
("ml-dsa", "ml-dsa-65/1"): SSlibKey,
("ml-dsa", "ml-dsa-87/1"): SSlibKey,
}
)
def init(metadata_dir: str, trusted_root: str) -> None:
"""Initialize local trusted metadata"""
# No need to actually run python-tuf code at this point
shutil.copyfile(trusted_root, os.path.join(metadata_dir, "root.json"))
print(f"python-tuf test client: Initialized repository in {metadata_dir}")
def refresh(metadata_url: str, metadata_dir: str) -> None:
"""Refresh local metadata from remote"""
updater = Updater(
metadata_dir,
metadata_url,
bootstrap=None,
)
updater.refresh()
print(f"python-tuf test client: Refreshed metadata in {metadata_dir}")
def download_target(
metadata_url: str,
metadata_dir: str,
target_name: str,
download_dir: str,
target_base_url: str,
) -> None:
"""Download target."""
updater = Updater(
metadata_dir,
metadata_url,
download_dir,
target_base_url,
bootstrap=None,
)
target_info = updater.get_targetinfo(target_name)
if not target_info:
raise RuntimeError(f"{target_name} not found in repository")
if not updater.find_cached_target(target_info):
updater.download_target(target_info)
def main() -> int:
"""Main TUF Client Example function"""
parser = argparse.ArgumentParser(description="TUF Client Example")
parser.add_argument("--metadata-url", required=False)
parser.add_argument("--metadata-dir", required=True)
parser.add_argument("--target-name", required=False)
parser.add_argument("--target-dir", required=False)
parser.add_argument("--target-base-url", required=False)
parser.add_argument("-v", "--verbose", action="count", default=0)
sub_command = parser.add_subparsers(dest="sub_command")
init_parser = sub_command.add_parser(
"init",
help="Initialize client with given trusted root",
)
init_parser.add_argument("trusted_root")
sub_command.add_parser(
"refresh",
help="Refresh the client metadata",
)
sub_command.add_parser(
"download",
help="Downloads a target",
)
command_args = parser.parse_args()
if command_args.verbose <= 1:
loglevel = logging.WARNING
elif command_args.verbose == 2:
loglevel = logging.INFO
else:
loglevel = logging.DEBUG
logging.basicConfig(level=loglevel)
# initialize the TUF Client Example infrastructure
if command_args.sub_command == "init":
init(command_args.metadata_dir, command_args.trusted_root)
elif command_args.sub_command == "refresh":
refresh(
command_args.metadata_url,
command_args.metadata_dir,
)
elif command_args.sub_command == "download":
download_target(
command_args.metadata_url,
command_args.metadata_dir,
command_args.target_name,
command_args.target_dir,
command_args.target_base_url,
)
else:
parser.print_help()
return 0
if __name__ == "__main__":
sys.exit(main())