@@ -361,7 +361,7 @@ def test_metadata_verify_delegate(self) -> None:
361361
362362 # Add a key to snapshot role, make sure the new sig fails to verify
363363 ts_keyid = next (iter (root .signed .roles [Timestamp .type ].keyids ))
364- root .signed .add_key (Snapshot . type , root .signed .keys [ts_keyid ])
364+ root .signed .add_key (root .signed .keys [ts_keyid ], Snapshot . type )
365365 snapshot .signatures [ts_keyid ] = Signature (ts_keyid , "ff" * 64 )
366366
367367 # verify succeeds if threshold is reached even if some signatures
@@ -390,7 +390,7 @@ def test_key_class(self) -> None:
390390 with self .assertRaises (ValueError ):
391391 Key .from_securesystemslib_key (sslib_key )
392392
393- def test_root_add_key_and_remove_key (self ) -> None :
393+ def test_root_add_key_and_revoke_key (self ) -> None :
394394 root_path = os .path .join (self .repo_dir , "metadata" , "root.json" )
395395 root = Metadata [Root ].from_file (root_path )
396396
@@ -410,8 +410,12 @@ def test_root_add_key_and_remove_key(self) -> None:
410410 self .assertNotIn (keyid , root .signed .roles [Root .type ].keyids )
411411 self .assertNotIn (keyid , root .signed .keys )
412412
413+ # Assert that add_key with old argument order will raise an error
414+ with self .assertRaises (ValueError ):
415+ root .signed .add_key (Root .type , key_metadata ) # type: ignore
416+
413417 # Add new root key
414- root .signed .add_key (Root .type , key_metadata )
418+ root .signed .add_key (key_metadata , Root .type )
415419
416420 # Assert that key is added
417421 self .assertIn (keyid , root .signed .roles [Root .type ].keyids )
@@ -423,30 +427,30 @@ def test_root_add_key_and_remove_key(self) -> None:
423427
424428 # Try adding the same key again and assert its ignored.
425429 pre_add_keyid = root .signed .roles [Root .type ].keyids .copy ()
426- root .signed .add_key (Root .type , key_metadata )
430+ root .signed .add_key (key_metadata , Root .type )
427431 self .assertEqual (pre_add_keyid , root .signed .roles [Root .type ].keyids )
428432
429433 # Add the same key to targets role as well
430- root .signed .add_key (Targets .type , key_metadata )
434+ root .signed .add_key (key_metadata , Targets .type )
431435
432436 # Add the same key to a nonexistent role.
433437 with self .assertRaises (ValueError ):
434- root .signed .add_key ("nosuchrole" , key_metadata )
438+ root .signed .add_key (key_metadata , "nosuchrole" )
435439
436440 # Remove the key from root role (targets role still uses it)
437- root .signed .remove_key ( Root .type , keyid )
441+ root .signed .revoke_key ( keyid , Root .type )
438442 self .assertNotIn (keyid , root .signed .roles [Root .type ].keyids )
439443 self .assertIn (keyid , root .signed .keys )
440444
441445 # Remove the key from targets as well
442- root .signed .remove_key ( Targets .type , keyid )
446+ root .signed .revoke_key ( keyid , Targets .type )
443447 self .assertNotIn (keyid , root .signed .roles [Targets .type ].keyids )
444448 self .assertNotIn (keyid , root .signed .keys )
445449
446450 with self .assertRaises (ValueError ):
447- root .signed .remove_key ( Root . type , "nosuchkey" )
451+ root .signed .revoke_key ( "nosuchkey" , Root . type )
448452 with self .assertRaises (ValueError ):
449- root .signed .remove_key ( "nosuchrole" , keyid )
453+ root .signed .revoke_key ( keyid , "nosuchrole" )
450454
451455 def test_is_target_in_pathpattern (self ) -> None :
452456 # pylint: disable=protected-access
@@ -507,9 +511,13 @@ def test_targets_key_api(self) -> None:
507511 }
508512 key = Key .from_dict ("id2" , key_dict )
509513
514+ # Assert that add_key with old argument order will raise an error
515+ with self .assertRaises (ValueError ):
516+ targets .add_key ("role1" , key ) # type: ignore
517+
510518 # Assert that delegated role "role1" does not contain the new key
511519 self .assertNotIn (key .keyid , targets .delegations .roles ["role1" ].keyids )
512- targets .add_key ("role1" , key )
520+ targets .add_key (key , "role1" )
513521
514522 # Assert that the new key is added to the delegated role "role1"
515523 self .assertIn (key .keyid , targets .delegations .roles ["role1" ].keyids )
@@ -519,46 +527,89 @@ def test_targets_key_api(self) -> None:
519527
520528 # Try adding the same key again and assert its ignored.
521529 past_keyid = targets .delegations .roles ["role1" ].keyids .copy ()
522- targets .add_key ("role1" , key )
530+ targets .add_key (key , "role1" )
523531 self .assertEqual (past_keyid , targets .delegations .roles ["role1" ].keyids )
524532
525533 # Try adding a key to a delegated role that doesn't exists
526534 with self .assertRaises (ValueError ):
527- targets .add_key ("nosuchrole" , key )
535+ targets .add_key (key , "nosuchrole" )
528536
529537 # Add the same key to "role2" as well
530- targets .add_key ("role2" , key )
538+ targets .add_key (key , "role2" )
531539
532540 # Remove the key from "role1" role ("role2" still uses it)
533- targets .remove_key ( "role1" , key .keyid )
541+ targets .revoke_key ( key .keyid , "role1" )
534542
535543 # Assert that delegated role "role1" doesn't contain the key.
536544 self .assertNotIn (key .keyid , targets .delegations .roles ["role1" ].keyids )
537545 self .assertIn (key .keyid , targets .delegations .roles ["role2" ].keyids )
538546
539547 # Remove the key from "role2" as well
540- targets .remove_key ( "role2" , key .keyid )
548+ targets .revoke_key ( key .keyid , "role2" )
541549 self .assertNotIn (key .keyid , targets .delegations .roles ["role2" ].keyids )
542550
543551 # Try remove key not used by "role1"
544552 with self .assertRaises (ValueError ):
545- targets .remove_key ( "role1" , key .keyid )
553+ targets .revoke_key ( key .keyid , "role1" )
546554
547555 # Try removing a key from delegated role that doesn't exists
548556 with self .assertRaises (ValueError ):
549- targets .remove_key ( "nosuchrole" , key .keyid )
557+ targets .revoke_key ( key .keyid , "nosuchrole" )
550558
551559 # Remove delegations as a whole
552560 targets .delegations = None
553- # Test that calling add_key and remove_key throws an error
561+ # Test that calling add_key and revoke_key throws an error
554562 # and that delegations is still None after each of the api calls
555563 with self .assertRaises (ValueError ):
556- targets .add_key ("role1" , key )
564+ targets .add_key (key , "role1" )
557565 self .assertTrue (targets .delegations is None )
558566 with self .assertRaises (ValueError ):
559- targets .remove_key ( "role1" , key .keyid )
567+ targets .revoke_key ( key .keyid , "role1" )
560568 self .assertTrue (targets .delegations is None )
561569
570+ def test_targets_key_api_with_succinct_roles (self ) -> None :
571+ targets_path = os .path .join (self .repo_dir , "metadata" , "targets.json" )
572+ targets : Targets = Metadata [Targets ].from_file (targets_path ).signed
573+ key_dict = {
574+ "keytype" : "ed25519" ,
575+ "keyval" : {
576+ "public" : "edcd0a32a07dce33f7c7873aaffbff36d20ea30787574ead335eefd337e4dacd"
577+ },
578+ "scheme" : "ed25519" ,
579+ }
580+ key = Key .from_dict ("id2" , key_dict )
581+
582+ # Remove delegated roles.
583+ assert targets .delegations is not None
584+ assert targets .delegations .roles is not None
585+ targets .delegations .roles = None
586+ targets .delegations .keys = {}
587+
588+ # Add succinct_roles information.
589+ targets .delegations .succinct_roles = SuccinctRoles ([], 1 , 8 , "foo" )
590+ self .assertEqual (len (targets .delegations .keys ), 0 )
591+ self .assertEqual (len (targets .delegations .succinct_roles .keyids ), 0 )
592+
593+ # Add a key to succinct_roles and verify it's saved.
594+ targets .add_key (key )
595+ self .assertIn (key .keyid , targets .delegations .keys )
596+ self .assertIn (key .keyid , targets .delegations .succinct_roles .keyids )
597+ self .assertEqual (len (targets .delegations .keys ), 1 )
598+
599+ # Try adding the same key again and verify that noting is added.
600+ targets .add_key (key )
601+ self .assertEqual (len (targets .delegations .keys ), 1 )
602+
603+ # Remove the key and verify it's not stored anymore.
604+ targets .revoke_key (key .keyid )
605+ self .assertNotIn (key .keyid , targets .delegations .keys )
606+ self .assertNotIn (key .keyid , targets .delegations .succinct_roles .keyids )
607+ self .assertEqual (len (targets .delegations .keys ), 0 )
608+
609+ # Try removing it again.
610+ with self .assertRaises (ValueError ):
611+ targets .revoke_key (key .keyid )
612+
562613 def test_length_and_hash_validation (self ) -> None :
563614
564615 # Test metadata files' hash and length verification.
0 commit comments