@@ -41,63 +41,61 @@ def setUpClass(cls):
41
41
password = "password"
42
42
)
43
43
44
- def test_update (self ):
45
- trusted_set = TrustedMetadataSet (self .metadata ["root" ])
46
- trusted_set .root_update_finished ()
44
+ def setUp (self ) -> None :
45
+ self .trusted_set = TrustedMetadataSet (self .metadata ["root" ])
47
46
48
- trusted_set .update_timestamp (self .metadata ["timestamp" ])
49
- trusted_set .update_snapshot (self .metadata ["snapshot" ])
50
- trusted_set .update_targets (self .metadata ["targets" ])
51
- trusted_set .update_delegated_targets (
47
+ def test_update (self ):
48
+ self .trusted_set .root_update_finished ()
49
+ self .trusted_set .update_timestamp (self .metadata ["timestamp" ])
50
+ self .trusted_set .update_snapshot (self .metadata ["snapshot" ])
51
+ self .trusted_set .update_targets (self .metadata ["targets" ])
52
+ self .trusted_set .update_delegated_targets (
52
53
self .metadata ["role1" ], "role1" , "targets"
53
54
)
54
- trusted_set .update_delegated_targets (
55
+ self . trusted_set .update_delegated_targets (
55
56
self .metadata ["role2" ], "role2" , "role1"
56
57
)
57
-
58
58
# the 4 top level metadata objects + 2 additional delegated targets
59
- self .assertTrue (len (trusted_set ), 6 )
59
+ self .assertTrue (len (self . trusted_set ), 6 )
60
60
61
61
def test_out_of_order_ops (self ):
62
- trusted_set = TrustedMetadataSet (self .metadata ["root" ])
63
-
64
62
# Update timestamp before root is finished
65
63
with self .assertRaises (RuntimeError ):
66
- trusted_set .update_timestamp (self .metadata ["timestamp" ])
64
+ self . trusted_set .update_timestamp (self .metadata ["timestamp" ])
67
65
68
- trusted_set .root_update_finished ()
66
+ self . trusted_set .root_update_finished ()
69
67
with self .assertRaises (RuntimeError ):
70
- trusted_set .root_update_finished ()
68
+ self . trusted_set .root_update_finished ()
71
69
72
70
# Update snapshot before timestamp
73
71
with self .assertRaises (RuntimeError ):
74
- trusted_set .update_snapshot (self .metadata ["snapshot" ])
72
+ self . trusted_set .update_snapshot (self .metadata ["snapshot" ])
75
73
76
- trusted_set .update_timestamp (self .metadata ["timestamp" ])
74
+ self . trusted_set .update_timestamp (self .metadata ["timestamp" ])
77
75
78
76
# Update targets before snapshot
79
77
with self .assertRaises (RuntimeError ):
80
- trusted_set .update_targets (self .metadata ["targets" ])
78
+ self . trusted_set .update_targets (self .metadata ["targets" ])
81
79
82
- trusted_set .update_snapshot (self .metadata ["snapshot" ])
80
+ self . trusted_set .update_snapshot (self .metadata ["snapshot" ])
83
81
84
82
# update timestamp after snapshot
85
83
with self .assertRaises (RuntimeError ):
86
- trusted_set .update_timestamp (self .metadata ["timestamp" ])
84
+ self . trusted_set .update_timestamp (self .metadata ["timestamp" ])
87
85
88
86
# Update delegated targets before targets
89
87
with self .assertRaises (RuntimeError ):
90
- trusted_set .update_delegated_targets (
88
+ self . trusted_set .update_delegated_targets (
91
89
self .metadata ["role1" ], "role1" , "targets"
92
90
)
93
91
94
- trusted_set .update_targets (self .metadata ["targets" ])
95
- trusted_set .update_delegated_targets (
92
+ self . trusted_set .update_targets (self .metadata ["targets" ])
93
+ self . trusted_set .update_delegated_targets (
96
94
self .metadata ["role1" ], "role1" , "targets"
97
95
)
98
96
99
- trusted_set .update_targets (self .metadata ["targets" ])
100
- trusted_set .update_delegated_targets (
97
+ self . trusted_set .update_targets (self .metadata ["targets" ])
98
+ self . trusted_set .update_delegated_targets (
101
99
self .metadata ["role1" ], "role1" , "targets"
102
100
)
103
101
@@ -111,13 +109,12 @@ def test_update_with_invalid_json(self):
111
109
with self .assertRaises (exceptions .RepositoryError ):
112
110
TrustedMetadataSet (json .dumps (root .to_dict ()).encode ())
113
111
114
- trusted_set = TrustedMetadataSet (self .metadata ["root" ])
115
- trusted_set .root_update_finished ()
112
+ self .trusted_set .root_update_finished ()
116
113
117
114
top_level_md = [
118
- (self .metadata ["timestamp" ], trusted_set .update_timestamp ),
119
- (self .metadata ["snapshot" ], trusted_set .update_snapshot ),
120
- (self .metadata ["targets" ], trusted_set .update_targets ),
115
+ (self .metadata ["timestamp" ], self . trusted_set .update_timestamp ),
116
+ (self .metadata ["snapshot" ], self . trusted_set .update_snapshot ),
117
+ (self .metadata ["targets" ], self . trusted_set .update_targets ),
121
118
]
122
119
for metadata , update_func in top_level_md :
123
120
# metadata is not json
@@ -148,7 +145,6 @@ def test_verify_with_threshold(self):
148
145
verify_with_threshold (targets , "foo" , delegated_role )
149
146
150
147
def test_invalid_update_root (self ):
151
- trusted_set = TrustedMetadataSet (self .metadata ["root" ])
152
148
# new_root data with invalid snapshot type
153
149
invalid_type_data = json .loads (self .metadata ["root" ])
154
150
invalid_type_data ["signed" ]["_type" ] = "snapshot"
@@ -157,7 +153,7 @@ def test_invalid_update_root(self):
157
153
# RepositoryError is thrown during new_root deserialization.
158
154
# It's not thrown when checking new_root.signed.type != "root"
159
155
with self .assertRaises (exceptions .RepositoryError ):
160
- trusted_set .update_root (invalid_type_data )
156
+ self . trusted_set .update_root (invalid_type_data )
161
157
162
158
# new_root data with threshold which cannot be verified.
163
159
modified_threshold_data = copy .deepcopy (
@@ -166,26 +162,26 @@ def test_invalid_update_root(self):
166
162
modified_threshold_data ["signed" ]["roles" ]["root" ]["threshold" ] = 2
167
163
modified_threshold_data = json .dumps (modified_threshold_data ).encode ()
168
164
with self .assertRaises (exceptions .UnsignedMetadataError ):
169
- trusted_set .update_root (modified_threshold_data )
165
+ self . trusted_set .update_root (modified_threshold_data )
170
166
171
167
# new_root.signed.version has the same version as old root
172
168
with self .assertRaises (exceptions .ReplayedMetadataError ):
173
- trusted_set .update_root (self .metadata ["root" ])
169
+ self . trusted_set .update_root (self .metadata ["root" ])
174
170
175
171
# if _root_update_finished, then fail when calling update_root
176
- trusted_set .root_update_finished ()
172
+ self . trusted_set .root_update_finished ()
177
173
with self .assertRaises (RuntimeError ):
178
- trusted_set .update_root (self .metadata ["root" ])
174
+ self .trusted_set .update_root (self .metadata ["root" ])
175
+ self .trusted_set ._root_update_finished = False
179
176
180
177
def test_root_update_finished_expired (self ):
181
- trusted_set = TrustedMetadataSet (self .metadata ["root" ])
182
178
# call root_update_finished when trusted root has expired
183
179
expired_datetime = datetime .strptime (
184
180
"1970-01-01T00:00:00Z" , "%Y-%m-%dT%H:%M:%SZ"
185
181
)
186
- trusted_set .root .signed .expires = expired_datetime
182
+ self . trusted_set .root .signed .expires = expired_datetime
187
183
with self .assertRaises (exceptions .ExpiredMetadataError ):
188
- trusted_set .root_update_finished ()
184
+ self . trusted_set .root_update_finished ()
189
185
190
186
def _sign_modified_obj (
191
187
self ,
@@ -198,20 +194,19 @@ def _sign_modified_obj(
198
194
return signature .to_dict ()
199
195
200
196
def test_update_timestamp (self ):
201
- trusted_set = TrustedMetadataSet (self .metadata ["root" ])
202
- trusted_set .root_update_finished ()
203
- trusted_set .update_timestamp (self .metadata ["timestamp" ])
197
+ self .trusted_set .root_update_finished ()
198
+ self .trusted_set .update_timestamp (self .metadata ["timestamp" ])
204
199
# new_timestamp.version < trusted_timestamp.version
205
- trusted_set .timestamp .signed .version = 2
200
+ self . trusted_set .timestamp .signed .version = 2
206
201
with self .assertRaises (exceptions .ReplayedMetadataError ):
207
- trusted_set .update_timestamp (self .metadata ["timestamp" ])
208
- trusted_set .timestamp .signed .version = 1
202
+ self . trusted_set .update_timestamp (self .metadata ["timestamp" ])
203
+ self . trusted_set .timestamp .signed .version = 1
209
204
210
205
# new_timestamp.snapshot.version < trusted_timestamp.snapshot.version
211
- trusted_set .timestamp .signed .meta ["snapshot.json" ].version = 2
206
+ self . trusted_set .timestamp .signed .meta ["snapshot.json" ].version = 2
212
207
with self .assertRaises (exceptions .ReplayedMetadataError ):
213
- trusted_set .update_timestamp (self .metadata ["timestamp" ])
214
- trusted_set .timestamp .signed .meta ["snapshot.json" ].version = 1
208
+ self . trusted_set .update_timestamp (self .metadata ["timestamp" ])
209
+ self . trusted_set .timestamp .signed .meta ["snapshot.json" ].version = 1
215
210
216
211
# new_timestamp has expired
217
212
timestamp = Metadata .from_bytes (self .metadata ["timestamp" ])
@@ -221,7 +216,7 @@ def test_update_timestamp(self):
221
216
self ._sign_modified_obj ("timestamp" , timestamp )
222
217
new_timestamp_byte_data = json .dumps (timestamp .to_dict ()).encode ()
223
218
with self .assertRaises (exceptions .ExpiredMetadataError ):
224
- trusted_set .update_timestamp (new_timestamp_byte_data )
219
+ self . trusted_set .update_timestamp (new_timestamp_byte_data )
225
220
226
221
def _calculate_modified_hashes (
227
222
self , true_hashes ,
@@ -237,86 +232,84 @@ def _calculate_modified_hashes(
237
232
return modified_hashes
238
233
239
234
def test_update_snapshot (self ):
240
- trusted_set = TrustedMetadataSet (self .metadata ["root" ])
241
- trusted_set .root_update_finished ()
242
- trusted_set .update_timestamp (self .metadata ["timestamp" ])
235
+ self .trusted_set .root_update_finished ()
236
+ self .trusted_set .update_timestamp (self .metadata ["timestamp" ])
243
237
# new_snapshot data with invalid targets type
244
238
invalid_type_data = json .loads (self .metadata ["snapshot" ])
245
239
invalid_type_data ["signed" ]["_type" ] = "targets"
246
240
invalid_type_data ["signed" ]["targets" ] = {}
247
241
invalid_type_data = json .dumps (invalid_type_data ).encode ()
248
- timestamp_meta = trusted_set .timestamp .signed .meta ["snapshot.json" ]
242
+ timestamp_meta = self . trusted_set .timestamp .signed .meta ["snapshot.json" ]
249
243
true_hashes = timestamp_meta .hashes or {}
250
244
modified_hashes = self ._calculate_modified_hashes (
251
245
true_hashes , invalid_type_data
252
246
)
253
- trusted_set .timestamp .signed .meta ["snapshot.json" ].hashes = modified_hashes
247
+ self . trusted_set .timestamp .signed .meta ["snapshot.json" ].hashes = modified_hashes
254
248
255
249
with self .assertRaises (exceptions .RepositoryError ):
256
- trusted_set .update_snapshot (invalid_type_data )
257
- trusted_set .timestamp .signed .meta ["snapshot.json" ].hashes = true_hashes
250
+ self . trusted_set .update_snapshot (invalid_type_data )
251
+ self . trusted_set .timestamp .signed .meta ["snapshot.json" ].hashes = true_hashes
258
252
# cannot update snapshot after targets update completes or targets != None
259
253
targets_obj = Metadata .from_bytes (self .metadata ["targets" ])
260
- trusted_set ._trusted_set ["targets" ] = targets_obj
254
+ self . trusted_set ._trusted_set ["targets" ] = targets_obj
261
255
with self .assertRaises (RuntimeError ):
262
- trusted_set .update_snapshot (self .metadata ["snapshot" ])
263
- del trusted_set ._trusted_set ["targets" ]
256
+ self . trusted_set .update_snapshot (self .metadata ["snapshot" ])
257
+ del self . trusted_set ._trusted_set ["targets" ]
264
258
265
259
# Deserialization error - failed to decode the new_snapshot JSON.
266
- timestamp_meta = trusted_set .timestamp .signed .meta ["snapshot.json" ]
260
+ timestamp_meta = self . trusted_set .timestamp .signed .meta ["snapshot.json" ]
267
261
true_hashes = timestamp_meta .hashes or {}
268
262
269
263
modified_hashes = self ._calculate_modified_hashes (
270
264
true_hashes , b'{""sig": }'
271
265
)
272
- trusted_set .timestamp .signed .meta ["snapshot.json" ].hashes = modified_hashes
266
+ self . trusted_set .timestamp .signed .meta ["snapshot.json" ].hashes = modified_hashes
273
267
with self .assertRaises (exceptions .RepositoryError ):
274
- trusted_set .update_snapshot (b'{""sig": }' )
275
- trusted_set .timestamp .signed .meta ["snapshot.json" ].hashes = true_hashes
268
+ self . trusted_set .update_snapshot (b'{""sig": }' )
269
+ self . trusted_set .timestamp .signed .meta ["snapshot.json" ].hashes = true_hashes
276
270
277
271
# root data with threshold which cannot be verified for new_snapshot
278
- trusted_set .root .signed .roles ["snapshot" ].threshold = 2
272
+ self . trusted_set .root .signed .roles ["snapshot" ].threshold = 2
279
273
with self .assertRaises (exceptions .UnsignedMetadataError ):
280
- trusted_set .update_snapshot (self .metadata ["snapshot" ])
281
- trusted_set .root .signed .roles ["snapshot" ].threshold = 1
274
+ self . trusted_set .update_snapshot (self .metadata ["snapshot" ])
275
+ self . trusted_set .root .signed .roles ["snapshot" ].threshold = 1
282
276
283
277
# new_snapshot.version != trusted timestamp.meta["snapshot"].version
284
- trusted_set .timestamp .signed .meta ["snapshot.json" ].version = 2
278
+ self . trusted_set .timestamp .signed .meta ["snapshot.json" ].version = 2
285
279
with self .assertRaises (exceptions .BadVersionNumberError ):
286
- trusted_set .update_snapshot (self .metadata ["snapshot" ])
287
- trusted_set .timestamp .signed .meta ["snapshot.json" ].version = 1
280
+ self . trusted_set .update_snapshot (self .metadata ["snapshot" ])
281
+ self . trusted_set .timestamp .signed .meta ["snapshot.json" ].version = 1
288
282
289
283
290
284
def test_update_snapshot_after_succesfull_update (self ):
291
- trusted_set = TrustedMetadataSet (self .metadata ["root" ])
292
- trusted_set .root_update_finished ()
293
- trusted_set .update_timestamp (self .metadata ["timestamp" ])
294
- trusted_set .update_snapshot (self .metadata ["snapshot" ])
285
+ self .trusted_set .root_update_finished ()
286
+ self .trusted_set .update_timestamp (self .metadata ["timestamp" ])
287
+ self .trusted_set .update_snapshot (self .metadata ["snapshot" ])
295
288
296
289
# Test removing a meta_file in new_snapshot compared to the old snapshot
297
290
snapshot_obj = Metadata .from_bytes (self .metadata ["snapshot" ])
298
291
snapshot_obj .signed .meta = {}
299
292
# prepare timestamp.meta["snapshot"].hashes
300
293
self ._sign_modified_obj ("snapshot" , snapshot_obj )
301
- timestamp_meta = trusted_set .timestamp .signed .meta ["snapshot.json" ]
294
+ timestamp_meta = self . trusted_set .timestamp .signed .meta ["snapshot.json" ]
302
295
true_hashes = timestamp_meta .hashes or {}
303
296
modified_snapshot_data = json .dumps (snapshot_obj .to_dict ()).encode ()
304
297
modified_hashes = self ._calculate_modified_hashes (
305
298
true_hashes , modified_snapshot_data
306
299
)
307
- trusted_set .timestamp .signed .meta ["snapshot.json" ].hashes = modified_hashes
300
+ self . trusted_set .timestamp .signed .meta ["snapshot.json" ].hashes = modified_hashes
308
301
309
302
with self .assertRaises (exceptions .RepositoryError ):
310
- trusted_set .update_snapshot (modified_snapshot_data )
311
- trusted_set .timestamp .signed .meta ["snapshot.json" ].hashes = true_hashes
303
+ self . trusted_set .update_snapshot (modified_snapshot_data )
304
+ self . trusted_set .timestamp .signed .meta ["snapshot.json" ].hashes = true_hashes
312
305
313
306
# snapshot.meta["project1"].version != new_snapshot.meta["project1"].version
314
- for meta_file_path in trusted_set .snapshot .signed .meta .keys ():
315
- trusted_set .snapshot .signed .meta [meta_file_path ].version = 2
307
+ for meta_file_path in self . trusted_set .snapshot .signed .meta .keys ():
308
+ self . trusted_set .snapshot .signed .meta [meta_file_path ].version = 2
316
309
with self .assertRaises (exceptions .BadVersionNumberError ):
317
- trusted_set .update_snapshot (self .metadata ["snapshot" ])
318
- for meta_file_path in trusted_set .snapshot .signed .meta .keys ():
319
- trusted_set .snapshot .signed .meta [meta_file_path ].version = 1
310
+ self . trusted_set .update_snapshot (self .metadata ["snapshot" ])
311
+ for meta_file_path in self . trusted_set .snapshot .signed .meta .keys ():
312
+ self . trusted_set .snapshot .signed .meta [meta_file_path ].version = 1
320
313
321
314
# new_snapshot has expired
322
315
snapshot_obj = Metadata .from_bytes (self .metadata ["snapshot" ])
@@ -328,42 +321,41 @@ def test_update_snapshot_after_succesfull_update(self):
328
321
modified_hashes = self ._calculate_modified_hashes (
329
322
true_hashes , modified_snapshot_data
330
323
)
331
- trusted_set .timestamp .signed .meta ["snapshot.json" ].hashes = modified_hashes
324
+ self . trusted_set .timestamp .signed .meta ["snapshot.json" ].hashes = modified_hashes
332
325
with self .assertRaises (exceptions .ExpiredMetadataError ):
333
- trusted_set .update_snapshot (modified_snapshot_data )
334
- trusted_set .timestamp .signed .meta ["snapshot.json" ].hashes = true_hashes
326
+ self . trusted_set .update_snapshot (modified_snapshot_data )
327
+ self . trusted_set .timestamp .signed .meta ["snapshot.json" ].hashes = true_hashes
335
328
336
329
def test_update_targets (self ):
337
- trusted_set = TrustedMetadataSet (self .metadata ["root" ])
338
- trusted_set .root_update_finished ()
339
- trusted_set .update_timestamp (self .metadata ["timestamp" ])
340
- trusted_set .update_snapshot (self .metadata ["snapshot" ])
330
+ self .trusted_set .root_update_finished ()
331
+ self .trusted_set .update_timestamp (self .metadata ["timestamp" ])
332
+ self .trusted_set .update_snapshot (self .metadata ["snapshot" ])
341
333
342
334
# remove meta information with information about targets from snapshot
343
- trusted_set .snapshot .signed .meta = {}
335
+ self . trusted_set .snapshot .signed .meta = {}
344
336
with self .assertRaises (exceptions .RepositoryError ):
345
- trusted_set .update_targets (self .metadata ["targets" ])
337
+ self . trusted_set .update_targets (self .metadata ["targets" ])
346
338
snapshot = Metadata .from_bytes (self .metadata ["snapshot" ])
347
- trusted_set .snapshot .signed .meta = snapshot .signed .meta
339
+ self . trusted_set .snapshot .signed .meta = snapshot .signed .meta
348
340
349
341
# observed_hash != stored hash in snapshot meta for targets
350
342
true_hashes = {}
351
- for target_path , meta_file in trusted_set .snapshot .signed .meta .items ():
343
+ for target_path , meta_file in self . trusted_set .snapshot .signed .meta .items ():
352
344
true_hashes [target_path ] = meta_file .hashes
353
- trusted_set .snapshot .signed .meta [target_path ].hashes = {"sha256" : "b" }
345
+ self . trusted_set .snapshot .signed .meta [target_path ].hashes = {"sha256" : "b" }
354
346
with self .assertRaises (exceptions .BadHashError ):
355
- trusted_set .update_targets (self .metadata ["targets" ])
347
+ self . trusted_set .update_targets (self .metadata ["targets" ])
356
348
# Return to the original hash values
357
349
for target_path in true_hashes .keys ():
358
- trusted_set .snapshot .signed .meta [target_path ].hashes = \
350
+ self . trusted_set .snapshot .signed .meta [target_path ].hashes = \
359
351
true_hashes [target_path ]
360
352
361
353
# new_delegate.signed.version != meta.version stored in snapshot
362
- for target_path in trusted_set .snapshot .signed .meta .keys ():
363
- trusted_set .snapshot .signed .meta [target_path ].version = 2
354
+ for target_path in self . trusted_set .snapshot .signed .meta .keys ():
355
+ self . trusted_set .snapshot .signed .meta [target_path ].version = 2
364
356
with self .assertRaises (exceptions .BadVersionNumberError ):
365
- trusted_set .update_targets (self .metadata ["targets" ])
366
- trusted_set .snapshot .signed .meta [target_path ].version = 1
357
+ self . trusted_set .update_targets (self .metadata ["targets" ])
358
+ self . trusted_set .snapshot .signed .meta [target_path ].version = 1
367
359
368
360
# new_delegate has expired
369
361
targets_obj = Metadata .from_bytes (self .metadata ["targets" ])
@@ -373,7 +365,7 @@ def test_update_targets(self):
373
365
self ._sign_modified_obj ("targets" , targets_obj )
374
366
modified_targets_data = json .dumps (targets_obj .to_dict ()).encode ()
375
367
with self .assertRaises (exceptions .ExpiredMetadataError ):
376
- trusted_set .update_targets (modified_targets_data )
368
+ self . trusted_set .update_targets (modified_targets_data )
377
369
378
370
# TODO test updating over initial metadata (new keys, newer timestamp, etc)
379
371
0 commit comments