11* TAP: 8
22* Title: Key rotation and explicit self-revocation
33* Version: 2
4- * Last-Modified: 16-Nov-2022
4+ * Last-Modified: 26-Mar-2024
55* Author: Hannes Mehnert, Justin Cappos, Marina Moore
6- * Status: Draft
6+ * Status: Accepted
77* Content-Type: text/markdown
88* Created: 10-May-2017
99
@@ -30,26 +30,12 @@ Snapshot and timestamp cannot use this rotation mechanism.
3030
3131Conceptually, the rotation process says if you trusted threshold of keys
3232X = X_0, ... X_n, now instead trust threshold of keys Y = Y_0, ... Y_n. Rotation
33- of a key may be performed any number of times, transferring trust from X to Y, then
33+ of a role may be performed any number of times, transferring trust from X to Y, then
3434from Y to Z, etc. Trust can even be transferred back from Z to X, allowing a key
3535to be added to a role, then later removed. If a single key needs to be replaced,
3636it can be safely rotated using the mechanism in this TAP.
3737
38- The mechanism in this TAP has an additional use case: if a rotation
39- to a null key is detected, it causes the role to no longer be trusted.
40- A role could use a rotation to a null key if they suspect a threshold of keys
41- have been compromised
42- (a lost hard drive, system breach, etc). The role is able to create a
43- rotation to null without the help of the delegator, so they are able to
44- explicitly revoke trust in the role immediately, improving response time
45- to a key compromise. A rotation to a null key revokes trust in the role,
46- not specific keys, so all keys associated with the role will be invalid
47- after a rotation to null. The client will detect a rotation
48- to a null key and treat it as if the metadata was unsigned.
49-
50- A delegator to a role A is able to help A recover from a rotation to null of A by
51- delegating to a new set of keys for A with a new role name.
52- Additionally, a delegator can overrule a rotate file by delegating to a new role
38+ A delegator can overrule a rotate file by delegating to a new role
5339with a new set of keys. This ensures that the delegator is still the source of
5440trust, but allows the role to act independently.
5541
@@ -71,7 +57,7 @@ delegations to be redone whenever this quorum changed.) Adding and
7157removing delegations of a project often uses the project role's key which is
7258delegated to. This project role gives persons with access to it elevated
7359privileges, and needs intervention from a higher level of delegations if
74- it needs to be rotated or revoked .
60+ it needs to be rotated.
7561
7662With TAP 8, the delegation can be assigned to a role (that contains a set
7763of keys and a threshold value). Developers could then collectively sign
@@ -130,15 +116,15 @@ role T to delegate to the new keyset e. If one of role D's keys is
130116compromised, they have to wait for role T to replace the key with a new,
131117trusted key.
132118
133- With this proposal, the owner of role D can replace their own key, and also
134- revoke their key without relying on the delegator. This will improve
119+ With this proposal, the owner of role D can replace their own key
120+ without relying on the delegator. This will improve
135121response time to key compromises and prevent key sharing by allowing keys to be
136122rotated more regularly. Combined with multi-role delegations this allows
137123project teams to shrink and grow without delegation to a project key.
138124
139125TUF already contains a key rotation mechanism, which is only specified
140126and used for the root file. This proposal allows the rotation
141- mechanism to be used by other delegations, and extends it with self-revocation .
127+ mechanism to be used by other delegations.
142128
143129
144130# Specification
@@ -152,7 +138,7 @@ delegations stay intact, the targets can rotate keys, remove keys, or add keys.
152138## Rotate file
153139
154140The signed portion of a ` rotate ` file is as follows (there's also a
155- signatures wrapper as in tuf spec , not shown here):
141+ signatures wrapper as in the TUF specification , not shown here):
156142
157143``` python
158144{
@@ -162,12 +148,12 @@ signatures wrapper as in tuf spec, not shown here):
162148 " keys" : {
163149 KEYID : KEY
164150 , ... } ,
165- " threshold" : THRESHOLD }
151+ " threshold" : THRESHOLD
166152}
167153```
168154
169155Where ROLE, KEYID, KEY, and THRESHOLD are as defined in the original
170- tuf spec . The value of ROLE has to be the same as the role for the
156+ tuf specification . The value of ROLE has to be the same as the role for the
171157delegation. The value of THRESHOLD is its new value. VERSION is
172158the integer version number of rotate files for this role. Version
173159numbers MUST increase by exactly 1 from the previous rotate file for
@@ -221,16 +207,13 @@ The client will then look for all files that begin with `rotate/foo.rotate` in
221207the snapshot metadata. The client will process these in version order (ie starting
222208with ` rotate/foo.rotate.1 ` , then ` rotate/foo.rotate.2 ` by first checking for this
223209version file in a local cache. The client will then fetch the rotate file from
224- remote. If the remote file is a rotation to null, and is signed with the currently
225- trusted keys, the client will halt the verification of this metadata and act as if
226- it is unverified when continuing the update process (and look for metadata from
227- the next role in the pre-order depth-first search). Otherwise, the client should
210+ remote. The client should then
228211ensure that the cached file is identical to the remote version. The client will
229212then verify the rotate file using the currently trusted public key(s) for this role.
230213If a rotate
231214file is successfully verified, the client will update the set of trusted keys for
232- this role to be the set listed in the rotate files. If key data is missing
233- or there is a rotation to null, the targets file is invalid and the client will
215+ this role to be the set listed in the rotate files. If key data is missing,
216+ the targets file is invalid and the client will
234217proceed with the update process as if verification for this role failed (by moving
235218on to another trusted role for this target, or reporting an error to the user).
236219
@@ -294,20 +277,6 @@ foo.rotate.2 is created, which contains the existing keyids as well as
294277Evelyn's public key, and a threshold value of 3. This
295278is signed with at least 2 keys from the current set of keyids.
296279
297- ## Rotation to Null
298-
299- Clients need to check for rotations to a null key, and any delegation pointing
300- to a rotation to a null key is invalid. The null key is a hard coded value used across
301- tuf implementations. This enables a role to explicitly revoke their
302- own key(s) by introducing a rotation to null.
303-
304- ** Prioritizing Self Revocation**
305- Rotation files are immutable unless replaced with a revocation (rotate
306- to null). This is the only case in which they can be replaced or
307- modified. If a client wants to rotate to a different
308- key, without having access to their currently delegated private key,
309- this requires a key revocation by the delegating metadata.
310-
311280Rotations which do not have any entry point anymore (the delegation they
312281stem from has can been replaced with new keys) can be
313282safely removed from the repository. If the delegation of foo is
@@ -327,7 +296,7 @@ The interaction between the Fulcio TAP and this TAP may impact the security
327296considerations in this TAP. If the Fulcio server or OIDC issuer is compromised,
328297an attacker could gain control over all TUF roles controlled by that entity.
329298If this happens, the attacker could use TAP 8 to create large-scale rotations
330- to null to perform a denial of service. However, this attack can be safely
299+ to perform a denial of service. However, this attack can be safely
331300recovered from using the delegator to replace all effected keys. This is
332301especially effective if the top-level targets is controlled by offline keys.
333302For this reason, we recommend that both root and top-level targets are
@@ -347,25 +316,16 @@ provide a simple mechanism for extending and shrinking project membership
347316without an individual with elevated privileges, but based
348317on a threshold of signatures.
349318
350- Clients need to take care to check for rotation to a null key (rotate
351- files that contain a null key). This shall be handled in the
352- same manner as an invalid metadata signature on by the role possessing
353- the key. The role will be invalid until it is re-delegated to with a new key.
354- Clients MUST use snapshot metadata to ensure that they recieve all rotate files
319+ Clients MUST use snapshot metadata to ensure that they receive all rotate files
355320in the chain.
356321
357- Intentionally rotating to null enables a repository, a
358- project, and individuals to explicitly revoke their key material
359- themselves. An individual whose key is compromised can introduce
360- a rotation to null, and all delegations to them will be invalid.
361-
362322For mitigation of private key compromises, rotation can be used if and
363323only if it can be assured that the legitimate holder is faster (at the
364324snapshot service, and/or at the client) than the attacker who got
365325control over the private key. Because this is hard to achieve, it is
366326recommended for proper mitigation that the delegation itself is changed from
367327the compromised key to a new key as soon as possible. Key revocation using
368- rotation defined in this TAP can be used as a stop-gap for delegations made
328+ rotation defined in TAP 20 can be used as a stop-gap for delegations made
369329by offline keys that may take some time to update.
370330
371331As a general note, this TAP only extends the possibilities of a target,
@@ -396,7 +356,7 @@ verify the rotation chain.
396356
397357# Augmented Reference Implementation
398358
399- TODO
359+ https://github.com/theupdateframework/python-tuf/pull/2257/files
400360
401361# Copyright
402362
0 commit comments