@@ -310,43 +310,66 @@ def test_new_timestamp_unsigned(self) -> None:
310
310
311
311
@patch .object (datetime , "datetime" , wraps = datetime .datetime )
312
312
def test_expired_timestamp_version_rollback (self , mock_time : Mock ) -> None :
313
+
314
+ now = datetime .datetime .utcnow ()
315
+ self .sim .timestamp .expires = now .replace (
316
+ microsecond = 0
317
+ ) + datetime .timedelta (days = 7 )
318
+
319
+ self .sim .timestamp .version = 2
320
+
321
+ # Make a successful update of valid metadata which stores it in cache
313
322
self ._run_refresh ()
314
323
324
+ self .sim .timestamp .version = 1
325
+
326
+ self .sim .timestamp .expires = now .replace (
327
+ microsecond = 0
328
+ ) + datetime .timedelta (days = 21 )
329
+
315
330
mock_time .utcnow .return_value = (
316
- datetime .datetime .utcnow () + datetime .timedelta (seconds = 1 )
331
+ datetime .datetime .utcnow () + datetime .timedelta (days = 18 )
317
332
)
318
333
with patch ("datetime.datetime" , mock_time ):
319
- # Check for a rollback attack
320
- self .sim .timestamp .version = 2
321
- self ._run_refresh ()
322
-
323
- self .sim .timestamp .version = 1
334
+ # Check that a rollback protection is performed even if
335
+ # local timestamp has expired
324
336
with self .assertRaises (BadVersionNumberError ):
325
337
self ._run_refresh ()
326
338
327
- self ._assert_version_equals (Timestamp .type , 2 )
339
+ self ._assert_version_equals (Timestamp .type , 2 )
328
340
329
341
@patch .object (datetime , "datetime" , wraps = datetime .datetime )
330
342
def test_expired_timestamp_snapshot_rollback (self , mock_time : Mock ) -> None :
343
+
344
+ now = datetime .datetime .utcnow ()
345
+ self .sim .timestamp .expires = now .replace (
346
+ microsecond = 0
347
+ ) + datetime .timedelta (days = 7 )
348
+
349
+ # Bump the snapshot version number to 3
350
+ self .sim .update_snapshot ()
351
+ self .sim .update_snapshot ()
352
+
353
+ # Make a successful update of valid metadata which stores it in cache
331
354
self ._run_refresh ()
332
355
356
+ self .sim .snapshot .version = 1
357
+ # Snapshot version number is set to 2, which is still less than 3
358
+ self .sim .update_snapshot ()
359
+ self .sim .timestamp .expires = now .replace (
360
+ microsecond = 0
361
+ ) + datetime .timedelta (days = 21 )
362
+
333
363
mock_time .utcnow .return_value = (
334
- datetime .datetime .utcnow () + datetime .timedelta (seconds = 1 )
364
+ datetime .datetime .utcnow () + datetime .timedelta (days = 18 )
335
365
)
336
366
with patch ("datetime.datetime" , mock_time ):
337
- # Check for a rollback attack.
338
- self .sim .snapshot .version = 2
339
- self .sim .update_timestamp () # timestamp v2
340
- self ._run_refresh ()
341
-
342
- # Snapshot meta version is smaller than previous
343
- self .sim .timestamp .snapshot_meta .version = 1
344
- self .sim .timestamp .version += 1 # timestamp v3
345
-
367
+ # Assert that rollback protection is done even if
368
+ # local timestamp has expired
346
369
with self .assertRaises (BadVersionNumberError ):
347
370
self ._run_refresh ()
348
371
349
- self ._assert_version_equals (Timestamp .type , 2 )
372
+ self ._assert_version_equals (Timestamp .type , 3 )
350
373
351
374
def test_new_timestamp_version_rollback (self ) -> None :
352
375
# Check for a rollback attack
@@ -709,19 +732,27 @@ def test_expired_metadata(self, mock_time: Mock) -> None:
709
732
# Test that expired local timestamp/snapshot can be used for updating
710
733
# from remote
711
734
735
+ now = datetime .datetime .utcnow ()
736
+ self .sim .timestamp .expires = now .replace (
737
+ microsecond = 0
738
+ ) + datetime .timedelta (days = 7 )
739
+
712
740
# Make a successful update of valid metadata which stores it in cache
713
741
self ._run_refresh ()
714
742
715
- # Simulate expired local metadata by mocking system time one second ahead
743
+ self .sim .targets .version += 1
744
+ self .sim .update_snapshot ()
745
+ self .sim .timestamp .expires = now .replace (
746
+ microsecond = 0
747
+ ) + datetime .timedelta (days = 21 )
748
+
749
+ # Mocking time so that local timestam has expired
750
+ # but the new timestamp has not
716
751
mock_time .utcnow .return_value = (
717
- datetime .datetime .utcnow () + datetime .timedelta (seconds = 1 )
752
+ datetime .datetime .utcnow () + datetime .timedelta (days = 18 )
718
753
)
719
754
with patch ("datetime.datetime" , mock_time ):
720
- self .sim .targets .version += 1
721
- self .sim .update_snapshot ()
722
- # Create a new updater and perform a second update while
723
- # the metadata is already stored in cache (metadata dir)
724
- self ._run_refresh ()
755
+ self ._run_refresh ()
725
756
726
757
# Assert that the final version of timestamp/snapshot is version 2
727
758
# which means a successful refresh is performed
0 commit comments