<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.14 (Ruby 3.3.7) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

<!ENTITY RFC9580 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9580.xml">
<!ENTITY RFC2119 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC8174 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC4880 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4880.xml">
]>


<rfc ipr="trust200902" docName="draft-dkg-openpgp-revocation-02" category="info" submissionType="IETF" xml:lang="en" updates="9580">
  <front>
    <title>Revocation in OpenPGP</title>

    <author initials="D. K." surname="Gillmor" fullname="Daniel Kahn Gillmor">
      <organization>ACLU</organization>
      <address>
        <email>dkg@fifthhorseman.net</email>
      </address>
    </author>
    <author initials="A." surname="Gallagher" fullname="Andrew Gallagher">
      <organization></organization>
      <address>
        <email>andrewg@andrewg.com</email>
      </address>
    </author>

    <date year="2025" month="March" day="19"/>

    <area>Security</area>
    <workgroup>openpgp</workgroup>
    <keyword>OpenPGP, revocation</keyword>

    <abstract>


<?line 27?>

<t>Cryptographic revocation is a hard problem.
OpenPGP's revocation mechanisms are imperfect, not fully understood, and not as widely implemented as they could be.
Additionally, some historical OpenPGP revocation mechanisms simply do not work in certain contexts.
This document provides clarifying guidance on how OpenPGP revocation works, documents outstanding problems, and introduces a new mechanism for delegated revocations that improves on previous mechanism.</t>



    </abstract>

    <note title="About This Document" removeInRFC="true">
      <t>
        The latest revision of this draft can be found at <eref target="https://dkg.gitlab.io/openpgp-revocation/"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-dkg-openpgp-revocation/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        OpenPGP Working Group mailing list (<eref target="mailto:openpgp@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/openpgp/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/openpgp/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://gitlab.com/dkg/openpgp-revocation"/>.</t>
    </note>


  </front>

  <middle>


<?line 34?>

<section anchor="introduction"><name>Introduction</name>

<t>OpenPGP revocation is complicated.
This document attempts to clean it up and build a consensus around syntax, semantics, use cases, and workflows.</t>

<t>The only substantive wire format changes are the introduction of the "Delegated Revoker" mechanism described in <xref target="delegated-revoker"/>, and the deprecation of the little-used "Revocable" subpacket in <xref target="revocable-subpacket"/>.</t>

<section anchor="terminology"><name>Terminology</name>

<t>The term "OpenPGP Certificate" is used in this document interchangeably with "OpenPGP Transferable Public Key", as defined in <xref section="10.1" sectionFormat="of" target="RFC9580"/>.</t>

<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>

<?line -18?>

</section>
</section>
<section anchor="what-can-be-revoked-keys-subkeys-certifications"><name>What Can Be Revoked: Keys, Subkeys, Certifications?</name>

<t>There are three kinds of signatures that perform revocation: Key Revocation (0x20), Subkey Revocation (0x28), and Certification Revocation (0x30).</t>

<t><list style="symbols">
  <t>A Key Revocation Signature (0x20) directly invalidates a Primary Key packet, and thereby (indirectly) revokes a full OpenPGP certificate (a.k.a. "Transferable Public Key").</t>
  <t>A Subkey Revocation Signature (0x28) directly revokes a Subkey packet, without affecting other key material attached to the same Primary Key.</t>
  <t>A Certification Revocation Signature (0x30) revokes:
  <list style="symbols">
      <t>all previous Certification Signatures (0x10..0x13) over the same primary key and User ID or User Attribute, or</t>
      <t>all previous Direct Key Signatures (0x1f) over the same primary key,
 that were made by the same key that made the revocation.</t>
    </list></t>
</list></t>

<t>All revocation types are permanent and cannot be un-revoked.
A key may be temporarily invalidated by specifying an expiry date on a new Direct Key, Subkey Binding, or Certification Signature.
This expiry date can then be overridden on a later signature of the same type.</t>

<section anchor="revoking-key"><name>Revoking a Primary Key</name>

<t>A Key Revocation signature invalidates the Primary Key packet that it is made over.
By implication, this revokes the entire certificate (Transferable Public Key) anchored by the Primary Key.</t>

<section anchor="key-retirement"><name>Key Retirement</name>

<t>A key owner may wish to retire a key, for example if it is using an older algorithm or it is no longer required.
This can be achieved by making a Key Revocation Signature with a soft revocation reason (see <xref target="soft-vs-hard"/>) and publishing it directly.</t>

</section>
<section anchor="key-compromise"><name>Key Compromise</name>

<t>If a key owner loses control of their private key material, for example if their storage device is stolen or their computer is infected with malware, they will normally wish to invalidate their key.
This can be achieved by making a Key Revocation Signature with a Reason for Revocation of "Key Compromise" (0x02) and publishing it directly.</t>

<t>If the key owner has also lost access to their private key material, for example if all copies of it were stolen, they cannot generate a new revocation and must follow the "Loss of Access" procedure in the next section.</t>

</section>
<section anchor="loss-of-access"><name>Loss of Access</name>

<t>If a key owner loses access to their private key material, for example if they forget an encryption passphrase or a storage medium is destroyed, they will generally wish to invalidate their key.
This can be achieved by publishing an escrowed Key Revocation Signature (see <xref target="escrowed-revocation"/>).</t>

<t>If the key owner does not have such a revocation stored safely, there is nothing further that they can do cryptographically.
In such circumstances, they will need to inform their correspondents by other means.
See <xref target="revoking-certification"/> below for possible alternative methods in a controlled environment.</t>

</section>
</section>
<section anchor="revoking-subkey"><name>Revoking a Subkey</name>

<t>A Subkey packet may be revoked because its private key material has been compromised.
It is possible for a Subkey to be compromised without the Primary Key being affected, for example if the private Subkey and Primary Key material are stored on separate devices.
In such a case, it is not necessary for a Subkey Revocation Signature to be generated ahead of time and escrowed, since the Primary Key is still usable and can generate a revocation as required.</t>

<t>FIXME: are other kinds of subkey revocation meaningful, see #1 ABG</t>

</section>
<section anchor="revoking-certification"><name>Revoking a Certification</name>

<t>User ID and User Attribute self-certifications and Direct Key self-signatures can be explicitly expired or replaced by the keyholder by issuing a superseding signature, so the only reason for a certification revocation is for third-party certifications.</t>

<t>[RFC1991] provided guidance for the interpretation of Certification Revocations as follows:</t>

<ul empty="true"><li>
  <t>&lt;30&gt; - public key packet and user ID packet, revocation ("I retract all my previous statements that this key is related to this user")  (*)</t>
</li></ul>

<t>While this language was not carried over into later specifications of the OpenPGP standard, neither was it explicitly contradicted.</t>

<t>FIXME: are first-party certificaton revocations meaningful, see #3 ABG</t>

<t>When Alice revokes her third-party certification over Bob's Primary Key and User ID, she is saying one of the following:</t>

<t><list style="symbols">
  <t>Key is Compromised (0x02): "I believe that Bob's key has been compromised"</t>
  <t>User ID No Longer Valid (0x32): "I believe that Bob no longer controls this identity"</t>
</list></t>

<t>Hard third-party certification revocations are useful in an environment where Alice is treated as an authority (say as a member of a corporate IT department) but does not have control over Bob's key material or access to an escrowed revocation of Bob's key.</t>

<t>FIXME: we need to specify what a receiving application should do when seeing an 0x02 certification revocation made by a trusted authority; ABG</t>

<t>Alice's Certification Revocation signature packet could get attached to Bob's certificate by several methods:</t>

<t><list style="symbols">
  <t>By submitting it to a keystore that performs an unauthenticated merge; this is however vulnerable to abuse</t>
  <t>By submitting it to a keystore whose administrators can override Bob's published certificate, for example a corporate directory</t>
  <t>By attaching it to her own key as an Embedded Signature subpacket (FIXME: using a method TBC, see #16 ABG)</t>
</list></t>

<t>Alice could issue a superseding certification of her own over Bob's User ID or User Attribute instead of using a soft revocation type, however she may wish to be explicit about the finality of her decision.</t>

<t>FIXME: Given an initial certification at time <spanx style="verb">T</spanx>, if the superseding certification has a timestamp of <spanx style="verb">T</spanx>+1, then will a verifier that cares about the certification still accept signatures from the key based on the User ID that were made exactly at time <spanx style="verb">T</spanx>?
Alternately, if the superseding certification has a timestamp of time <spanx style="verb">T</spanx> exactly, will verifiers prefer its expiration date or the initial certification's expiration date (or lack thereof)?</t>

<t>FIXME: specify how third-party certification revocations interact with third-party direct signatures; ABG</t>

</section>
</section>
<section anchor="challenges-with-openpgp-revocation"><name>Challenges with OpenPGP Revocation</name>

<t>This section describes a number of outstanding challenges with implementing OpenPGP revocation in the state of the field before this document.
Some of these problems are fixed by this document.</t>

<section anchor="obtaining-revocation-information"><name>Obtaining Revocation Information</name>

<t>How does the user know that they have the correct revocation status?
Where do they look for revocations from?
With what frequency?</t>

<t>When the keyholder changes to a new key, how do they distribute revocations for older keys?</t>

<section anchor="revocation-stripping"><name>Revocation Stripping</name>

<t>Given the chance to tamper with an OpenPGP certificate, the simplest thing that an adversary can do is to strip signature subpackets.
Stripping a revocation signature subpacket is trivial, and the resulting certificate looks valid.</t>

<t>An OpenPGP implementation needs a reliable channel to fetch revocation signatures from, and a reliable and well-indexed storage mechanism to retain them safely to avoid using revoked certificates.</t>

</section>
</section>
<section anchor="revocations-using-weak-cryptography"><name>Revocations Using Weak Cryptography</name>

<t>What if we find a Key Revocation signature made using SHA1 or MD5?</t>

<t>Should we consider the indicated key revoked?</t>

</section>
<section anchor="revoking-primary-key-binding-signatures"><name>Revoking Primary Key Binding Signatures</name>

<t>Primary keys sign Subkey Binding Signatures.
Signing-capable subkeys sign Primary Key Binding Signatures.</t>

<t>A Primary Key Binding Signature is only valid in an Embedded Signature subpacket of another signature.
If the enclosing signature is revoked, the embedded signature is no longer meaningful.
It is therefore not necessary to define a method to explicitly revoke a Primary Key Binding Signature.</t>

</section>
<section anchor="implications-for-revoked-key-material"><name>Implications for Revoked Key Material</name>

<t>If a primary key is revoked with Reason for Revocation 2 (key has been compromised), then an implementation <bcp14>MAY</bcp14> infer that any other certificate containing the same key material has also been compromised.
Note that testing key material for equality is nontrivial due to flexibility in representation, and is therefore outside the scope of this document.</t>

<t>If a primary key is revoked for any reason other than key compromise, an implementation <bcp14>MUST NOT</bcp14> infer anything about any other certificate containing the same key material.</t>

<t>If a subkey is revoked for any reason, an implementation <bcp14>MUST NOT</bcp14> infer anything about any other certificate containing the same key material.
This is because a key owner can create a valid subkey revocation signature over a subkey containing arbitrary key material:</t>

<t><list style="symbols">
  <t>embedded Primary Key Binding Signatures are not required in Subkey Revocation Signatures</t>
  <t>an earlier valid Subkey Binding Signature is not required to validate a later Subkey Revocation Signature</t>
</list></t>

<t>Encryption subkeys cannot create embedded Primary Key Binding Signatures, but a malicious subkey binding over an arbitrary encryption subkey has no security implications, since the only person adversely affected would be the attacker themselves, whose correspondents would encrypt to the wrong key.
By contrast, if a malicious revocation over such a subkey was interpreted as a valid revocation over the original key material, the key's actual owner might no longer be able to receive encrypted messages at all.</t>

<t>Therefore, the meaning of a Subkey Revocation Signature <bcp14>MUST</bcp14> be limited to the context of the primary key that made the revocation signature.</t>

</section>
<section anchor="no-revocation-expiration"><name>No Revocation Expiration</name>

<t>Key material can be marked with an expiration date (e.g. in a self-signature).
Signatures themselves can also be marked with an expiration date.</t>

<t>While Revocation Signatures are signatures, the act of revocation is permanent, so expiration is not applicable to revocations.</t>

<t>An implementation generating a Revocation Signature <bcp14>MUST NOT</bcp14> include an Signature Expiration Time subpacket or a Key Expiration Time subpacket in either the hashed subpackets area or the unhashed subpackets area of the signature packet.
An implementation encountering a Revocation Signature packet that contains either expiration subpacket <bcp14>MUST</bcp14> ignore the subpacket.</t>

</section>
<section anchor="reasons-for-revocation-mismatch"><name>Reasons for Revocation Mismatch</name>

<t>How should an implementation interpret a Key Revocation signature or Subkey Revocation signature with Reason for Revocation subpacket with ID 32 ("User ID information is no longer valid")?</t>

<t>How should an implementation interpret a Certification Revocation with a Reason for Revocation with, say, ID 1 ("Key is superseded")?</t>

<t>Do we just say these Revocation signatures are invalid?
Do we ignore the Reasons for Revocation subpacket?</t>

</section>
<section anchor="revocation-key-subpacket-challenges"><name>Revocation Key Subpacket Challenges</name>

<t>The Revocation Key Subpacket is deprecated because it suffers from several significant challenges in use.
The Delegated Revoker mechanism (described in <xref target="delegated-revoker"/>) is intended to avoid all of these problems.</t>

<section anchor="finding-the-revocation-key"><name>Finding the Revocation Key</name>

<t>The "Revocation Key" subpacket contains only a fingerprint.
If a verifier observes such a packet, and a Key Revocation Signature that claims to be issued by the identified key, how does the verifier obtain the revoking key itself if they do not already have a copy of it?</t>

</section>
<section anchor="what-if-the-revocation-key-is-itself-revoked-or-unusable"><name>What If the Revocation Key is Itself Revoked or Unusable?</name>

<t>What happens if the revocation key's public key packet is known, but it is not part of a certificate at all?</t>

<t>What if it is enclosed in a certificate, but that certificate indicates that it is expired, revoked, or otherwise invalid?</t>

<t>The following questions are based on the assumption that key A has pointed to key B in a "Revocation Key" subpacket.</t>

<t>What if B revokes both itself and key A: is A valid?</t>

<t>What if, instead, B indicates (via the deprecated "Revocation Key" subpacket) that key A is permitted to revoke key B?
In this scenario, what happens when both A and B revoke each other?</t>

<t>What if A designates that B can revoke A, and B designates that C can revoke B?
In that case, if C revokes B and then B revokes A, is A still valid?</t>

</section>
<section anchor="social-graph-leakage"><name>Social Graph Leakage</name>

<t>If it's possible to find a certificate containing the matching fingerprint in a deprecated "Revocation Key" subpacket, then an observer can learn who the keyholder trusts even when no revocation is needed.</t>

<t>An attacker that wants to target Alice, for example, can observe that Alice has indicated Bob seems trustworthy if Alice has pointed to Bob's key's fingerprint with a deprecated "Revocation Key" subpacket.
The attacker might then go after Bob as a way to get to Alice.</t>

</section>
<section anchor="what-if-the-signature-containing-the-revocation-key-is-revoked-or-superseded"><name>What if the Signature Containing the Revocation Key is Revoked or Superseded?</name>

<t><xref section="5.2.3.3" sectionFormat="of" target="RFC4880"/> states:</t>

<ul empty="true"><li>
  <t>Revoking a direct-key signature cancels that signature.</t>
</li></ul>

<t>and</t>

<ul empty="true"><li>
  <t>An implementation that encounters multiple self-signatures on the same object may resolve the ambiguity in any way it sees fit, but it is <bcp14>RECOMMENDED</bcp14> that priority be given to the most recent self-signature.</t>
</li></ul>

<t>The revised version, <xref section="5.2.3.10" sectionFormat="of" target="RFC9580"/> makes this last sentence even stronger:</t>

<ul empty="true"><li>
  <t>An implementation that encounters multiple self-signatures on the same object <bcp14>MUST</bcp14> select the most recent valid self-signature, and ignore all other self-signatures.</t>
</li></ul>

<t>Consider the following sequence of events:</t>

<t><list style="symbols">
  <t>At time t0, key A makes a self-signed Direct Key Signature X on itself that contains a Revocation Key subpacket pointing to key B.</t>
  <t>At time t1, key A decides to update preferences or expiration date on itself and issues a new Direct Key Signature Y (which lacks a Revocation Key subpacket).</t>
  <t>At time t2, key B produces a Key Revocation signature Z to revoke key A.</t>
</list></t>

<t>The verifier examines this sequence of packets: A, X, Y, Z.</t>

<t>X appears to have been superseded by Y.
Should A be considered revoked?</t>

<t>But what if signature packet Y was a revocation signature instead:</t>

<t><list style="symbols">
  <t>At time t1, key A creates a Certification Revocation signature Y over Direct Key signature X.</t>
</list></t>

<t>Or, what if signature packet Y pointed to a <em>different</em> Revocation Key:</t>

<t><list style="symbols">
  <t>At time t1, key A creates a Direct Key Signature Y that looks exactly like X, except that its Revocation Key subpacket points to key C.</t>
</list></t>

<t>If, in any of these situations, the verifier does <em>not</em> consider A to be revoked by Z due to the presence of signature Y, then the mechanism does not work to protect the keyholder of A.
An adversary who has taken control of A can create a signature packet Y to evade the third-party revocation capabilities that B is supposed to wield.</t>

<t>If delegating revocation power to a third party is intended to defend against an adversary, this implies that the guidance about superseding signatures cannot apply to signature packets that contain a Revocation Key.
But then, if signature X is not revoked or superseded by signature Y (in whatever form Y takes), how should implementations deal with the <em>other</em> subpackets in signature X?</t>

</section>
<section anchor="what-can-the-revocation-key-revoke"><name>What can the Revocation Key Revoke?</name>

<t>Surely it can issue a Key Revocation signature that covers the primary key itself.</t>

<t>But can it issue a Subkey Revocation signature on behalf of the primary key?
Can it issue a Certification Revocation signature on behalf of the primary key?</t>

</section>
</section>
<section anchor="revocation-signature-subpacket-limitations"><name>Revocation Signature Subpacket limitations</name>

<t>When generating a revocation signature, an implementation:</t>

<t><list style="symbols">
  <t><bcp14>SHOULD</bcp14> include a Signature Creation Time subpacket</t>
  <t><bcp14>SHOULD NOT</bcp14> set the critical bit for any subpacket</t>
  <t><bcp14>MUST NOT</bcp14> set the critical bit for any subpacket other than Signature Creation Time</t>
  <t><bcp14>MUST NOT</bcp14> place Signature Creation Time or Reason for Revocation packets in the unhashed area</t>
</list></t>

<t>When consuming a revocation signature, an implementation:</t>

<t><list style="symbols">
  <t><bcp14>MUST</bcp14> ignore the critical bit for every subpacket</t>
  <t><bcp14>MUST</bcp14> ignore any Signature Creation Time or Reason for Revocation subpacket in the unhashed area</t>
</list></t>

<t>An implementation <bcp14>MUST</bcp14> support the Signature Creation Time subpacket.
If a revocation signature does not contain a valid Signature Creation Time subpacket, a receiving implementation <bcp14>MAY</bcp14> treat it as if it was created in the infinite past.</t>

</section>
<section anchor="what-about-revocations-from-the-future"><name>What About Revocations From the Future?</name>

<t>If a Revocation signature appears to have been made in the future, its interpretation will depend on whether it is hard or soft:</t>

<t><list style="symbols">
  <t>If a hard revocation is from the future, then its creation date is irrelevant, since hard revocations are retrospective.
Hard revocations <bcp14>MUST</bcp14> be treated as if their creation date was in the infinite past, regardless of the value of the creation date subpacket.</t>
  <t>If a soft revocation is from the future, then the revocation <bcp14>SHOULD NOT</bcp14> take effect until that date.</t>
</list></t>

</section>
</section>
<section anchor="dealing-with-revoked-certificates"><name>Dealing With Revoked Certificates</name>

<t>Implementations <bcp14>MUST NOT</bcp14> encrypt to a revoked certificate.
Implementations <bcp14>MUST NOT</bcp14> accept a signature made by a revoked certificate as valid unless the revocation is "soft" (see <xref target="soft-vs-hard"/>) and the timestamp of the signature predates the timestamp of the revocation.
Implementations <bcp14>MUST NOT</bcp14> use secret key material corresponding to a revoked certificate for signing, unless the secret key material also corresponds to a non-revoked certificate.</t>

<t>Implementations <bcp14>MAY</bcp14> use the secret key material corresponding to a revoked certificate.</t>

</section>
<section anchor="soft-vs-hard"><name>Hard vs. Soft Revocations</name>

<t>Reasons for Revocation subpacket allows different values.</t>

<t>Some of them suggest that a verifier can still accept signatures from before the timestamp of the Revocation.
These are "soft" revocations.</t>

<t>All the rest require that a verifier <bcp14>MUST</bcp14> treat the certificate as "hard" revoked, meaning that even signatures that have creation timestamps before the creation timestamp of the revocation signature should themselves be rejected.</t>

<section anchor="when-is-soft-revocation-useful"><name>When is Soft Revocation Useful?</name>

<t>Expiration makes just as much sense as a soft revocation in many circumstances, and is typically better supported.
Soft revocation can however be useful if the signer wishes to explicitly indicate that their decision is final.
Since revocations are permanent, a correspondent who sees a soft revocation does not need to poll for further updates to see whether an expiration date has been extended.
The only reason to poll for an update to a soft-revoked key would be to check whether the soft revocation had been upgraded to a hard revocation.</t>

<t>Since an encryption subkey is not useful for historical purposes, only for creating new encrypted data, there is no practical distinction between soft and hard revocation reasons, and all soft encryption subkey revocations <bcp14>SHOULD</bcp14> be treated as hard revocations with reason "none" (0x00).</t>

<t>FIXME: what about encryption-only primary keys; ABG</t>

</section>
</section>
<section anchor="revocation-certificates"><name>Revocation Certificates</name>

<t>A revocation certificate indicates that a given primary key is revoked.</t>

<t>This can take two common forms.
Each form is a sequence of OpenPGP packets:</t>

<t><list style="symbols">
  <t>A standalone Key Revocation signature packet by key X over X (this form is valid only for primary keys earlier than version 6)</t>
  <t>Primary Key X + Key Revocation signature by X over X</t>
</list></t>

<t>Additionally, there is a deprecated form:</t>

<t><list style="symbols">
  <t>Primary Key X + Direct Key Signature with Revocation Key subpacket pointing to Y + Key Revocation signature by Y over X (this form is valid only for primary keys earlier than version 6)</t>
</list></t>

<t>This document introduces a new form in <xref target="delegated-revoker"/>:</t>

<t><list style="symbols">
  <t>Primary Key X + Delegated Revoker Signature with Delegated Revoker Subpacket containing Y + Key Revocation signature by Y over X</t>
</list></t>

<section anchor="handling-a-revocation-certificate"><name>Handling a Revocation Certificate</name>

<t>When an implementation observes any of the above forms of revocation certificate for a certificate with primary key X, it should record it and indicate that X has been revoked and is no longer to be used, along with all of its User IDs and Subkeys.</t>

</section>
<section anchor="publishing-a-revocation-certificate"><name>Publishing a Revocation Certificate</name>

<t>FIXME: talk about interactions with HKP, VKS, WKD, OPENPGPKEY (DANE), or other key discovery methods?</t>

</section>
</section>
<section anchor="escrowed-revocation"><name>Escrowed Revocation Certificate</name>

<t>An escrowed revocation certificate is just a valid revocation certificate that is not published.
The parties who can retrieve or reassemble the escrowed revocation certificate can publish it to inform the rest of the world that the certificate has been revoked.
It is described in <xref section="13.9" sectionFormat="of" target="RFC9580"/>.</t>

<t>Since the reason for publishing an escrowed revocation cannot be known in advance, escrowed revocations <bcp14>SHOULD NOT</bcp14> include a Reason for Revocation subpacket.
If such a subpacket is included, it <bcp14>SHOULD</bcp14> explicitly state a reason of "none" (0x00).</t>

<t>Since the reason for publishing an escrowed revocation cannot be known in advance, escrowed revocations <bcp14>SHOULD NOT</bcp14> include a Reason for Revocation subpacket.
If such a subpacket is included, it <bcp14>SHOULD</bcp14> explicitly state a reason of "none" (0x00).</t>

<t>In what circumstances does escrowed revocation work?
When is it inappropriate?</t>

<section anchor="escrowed-hard-revocation-workflow"><name>Escrowed Hard Revocation Workflow</name>

<t>An escrowed hard revocation certificate covers the use case where where the keyholder has lost control of the secret key material, and someone besides the keyholder may have gotten access to the secret key material.</t>

<t>At key creation time, keyholder creates a hard revocation certificate.
Optionally, they encrypt it to a set of trusted participants.
The keyholder stores the revocation certificate somewhere they or one of the trusted participants will be able to access it.</t>

<t>If the keyholder sends it to any trusted participant immediately, that participant can trigger a revocation any time they like.
In this case, the keyholder and the trusted participants should clarify between themselves what an appropriate signal should be for when the trusted participant should act</t>

<t>If physical access is retained by the keyholder, then the keyholder has to be capable of consenting for the revocation to be published.</t>

</section>
<section anchor="escrowed-soft-revocation-workflow"><name>Escrowed Soft Revocation Workflow</name>

<t>Do regular updates of the escrowed revocation  (e.g. after each signing).
Store them somewhere safe?</t>

</section>
<section anchor="k-of-n-escrowed-revocation"><name>K-of-N Escrowed Revocation</name>

<t>FIXME: how to split an escrowed revocation certificate among N parties so that any K of them can reconstruct it.</t>

</section>
</section>
<section anchor="delegated-revoker"><name>The Delegated Revoker</name>

<t>[ See also https://gitlab.com/openpgp-wg/rfc4880bis/-/merge_requests/18 where this was originally specified, in a slightly different form ]</t>

<t>This document introduces a new mechanism for permitting a distinct key to revoke an OpenPGP certificate.
It should effectively replace the deprecated "Revocation Key subpacket", and should resolve the concerns described in {#revocation-key-subpacket-challenges}.</t>

<t>It uses a novel signature type and a novel subpacket type, is self-contained, irrevocable, and can only be used to revoke the entire OpenPGP certificate rooted in the primary key it corresponds to.</t>

<section anchor="delegated-revoker-signature"><name>Delegated Revoker Signature</name>

<t>This introduces a new Signature Type, "Delegated Revoker Signature" with type ID TBD.</t>

<t>This signature type is made over data structured in the same way as a Direct Key Signature, but it does not supersede or replace any other signature, and it cannot be revoked or superseded itself.
It is a permanent delegation.</t>

<t>A Delegated Revoker Signature <bcp14>MUST</bcp14> be made over the primary key of a given certificate, and its hashed subpackets area <bcp14>MUST</bcp14> contain exactly one each of the following three subpackets:</t>

<t><list style="symbols">
  <t>Signature Creation Time (see <xref section="5.2.3.11" sectionFormat="of" target="RFC9580"/>)</t>
  <t>Issuer Fingerprint (see <xref section="5.2.3.35" sectionFormat="of" target="RFC9580"/>)</t>
  <t>Delegated Revoker (defined in <xref target="delegated-revoker-subpacket"/> of this document)</t>
</list></t>

<t>The Issuer Fingerprint subpacket contains the fingerprint of the primary key that is asserting this delegation.
All subpackets <bcp14>MUST</bcp14> be marked as Critical.</t>

<t>No corresponding revocation signature type is defined for the Delegated Revoker Signature.
This is intentional.</t>

<t>FIXME: What should a verifier do if the set of hashed subpackets does not match this list?</t>

<section anchor="transmitting-a-delegated-revoker-signature-in-openpgp-certificate"><name>Transmitting a Delegated Revoker Signature in OpenPGP Certificate</name>

<t>The Delegated Revoker Signature packet can be placed in an OpenPGP certificate immediately after the Primary Key packet, before any Key Revocation Signature or Direct Key Signature packet.</t>

<t>FIXME: test implementations with this placement strategy to see whether they choke on the certificate.
If this does not work, consider recommending its inclusion in an unhashed Embedded Signature subpacket the relevant associated Key Revocation Signature packet (if it is travelling with the revocation), or in such a subpacket of a Direct Key Signature packet directly.</t>

</section>
<section anchor="sensitivity"><name>"Sensitivity"?</name>

<t>FIXME: how do we deal with avoiding a leak of the existence of this relationship (e.g., the "Sensitive" bit in the deprecated "Revocaton Key" subpacket)?
Do we need to?</t>

<t>Someone concerned about the risk of social graph leakage (see <xref target="social-graph-leakage"/>) can simply mint a new secret key and encrypt its corresponding Secret Key packet to their preferred revoker.</t>

<t>Or should we add an "Exportable" subpacket to the list above and describe its syntax more explicitly?</t>

<t>Alternately: what if we said that this is simply <em>always</em> treated as sensitive, in that without explicitly being part of the described workflow, it must not be transmitted except in the presence of a valid revocation?
This puts the burden on the holder of the secret key to keep a copy of the delegation lying around, which is a novel use case.</t>

</section>
</section>
<section anchor="delegated-revoker-subpacket"><name>Delegated Revoker Subpacket</name>

<t>The Delegated Revoker Subpacket has type ID 36.</t>

<t>It is only valid in the hashed subpackets section of a Delegated Revoker Signature (see <xref target="delegated-revoker-signature"/>) over a primary key.
It <bcp14>MUST</bcp14> be marked as Critical.</t>

<t>The contents of this subpacket are a full Public Key packet, see <xref section="5.5.1.1" sectionFormat="of" target="RFC9580"/>.</t>

<t>The embedded Public Key packet <bcp14>MUST</bcp14> be signing-capable.</t>

</section>
<section anchor="delegated-revokers-cannot-be-superseded-or-revoked"><name>Delegated Revokers Cannot Be Superseded or Revoked</name>

<t>Unlike other OpenPGP Signature packets, a Delegated Revoker Signature cannot be revoked, and is not superseded by any other Signature packet, including other Delegated Revoker Signature packets.
If multiple valid Delegated Revoker Signatures are issued by a primary key X, they are all capable of issuing Key Revocation signatures over X on behalf of X.</t>

</section>
<section anchor="delegated-revokers-are-independent-of-any-openpgp-certificate"><name>Delegated Revokers Are Independent of Any OpenPGP Certificate</name>

<t>This Public Key <bcp14>MAY</bcp14> be the same Public Key packet that is the root of a larger OpenPGP certificate, but it need not be.
In the Delegated Revoker context, this Public Key packet is used on its own, regardless of the status of any matching OpenPGP certificate.</t>

</section>
<section anchor="delegated-revoker-only-issues-key-revocation-signatures"><name>Delegated Revoker Only Issues Key Revocation Signatures</name>

<t>If an OpenPGP certificate with primary key X has an associated Delegated Revoker containing Public Key Y, that only indicates that the Y <bcp14>MAY</bcp14> make a valid Key Revocation signature on behalf of X, revoking X itself.</t>

<t>The Delegated Revoker Public Key (Y in the example above) <bcp14>MUST NOT</bcp14> be used to validate any other type of signature associated with that OpenPGP certificate.</t>

<t>FIXME: should we constrain the types of Key Revocations it can issue (i.e., the contents of any Reason for Revocation subpackets, or "hard" or "soft" choices)?</t>

</section>
<section anchor="cryptographic-algorithm-choices"><name>Cryptographic Algorithm Choices</name>

<t>FIXME: What if the Delegated Revoker Signature is made over a digest algorithm that is deemed unsafe in the future?
FIXME: What if the embedded Public Key Packet is known to be weak or compromised?</t>

</section>
<section anchor="reasonable-workflows"><name>Reasonable Workflows</name>

<t>The Delegated Revoker mechanism is only useful for a potential scenario where the keyholder has lost control of the primary secret key.
Otherwise, the keyholder could simply issue the desired Key Revocation signature (type 0x20) directly.</t>

<t>If the keyholder needs a hard revocation, and they have access to an escrowed Key Revocation signature, they can use that.</t>

<t>So the circumstances where a Delegated Revoker is relevant</t>

<section anchor="delegator-selection"><name>Delegator Selection</name>

<t>Keyholder needs to choose who they think will be responsible for handling the delegated responsibility of revoking when the time is needed.
This could be another individual, or it could be a machine that has distinct security and operational characteristics from the machine that holds the primary key.</t>

</section>
<section anchor="delegated-key-selection"><name>Delegated Key Selection</name>

<t><list style="symbols">
  <t>Keyholder generates revocation secret key</t>
  <t>Keyholder selects signing-capable key or subkey already belonging to delegate</t>
</list></t>

</section>
<section anchor="delegation-publication"><name>Delegation Publication</name>

<t><list style="symbols">
  <t>private communication</t>
  <t>public (keyservers)</t>
</list></t>

</section>
</section>
<section anchor="k-of-n-delegated-revokers"><name>K-of-N Delegated Revokers</name>

<t>FIXME: should this document outline how a group of trusted parties could effectively revoke a given certificate that authorized them to do so?</t>

</section>
</section>
<section anchor="revocable-subpacket"><name>Deprecation of the "Revocable" Signature Subpacket</name>

<t>The "Revocable" subpacket is not commonly supported, and when used as described is effectively non-functional.
It is hereby deprecated.</t>

<section anchor="non-functionality-of-the-revocable-signature-subpacket"><name>Non-functionality of the "Revocable" Signature Subpacket</name>

<t><xref section="5.2.3.20" sectionFormat="of" target="RFC9580"/> states:</t>

<ul empty="true"><li>
  <t>Signatures that are not revocable have any later revocation signatures ignored.
They represent a commitment by the signer that he cannot revoke his signature for the life of his key.
If this packet is not present, the signature is revocable.</t>
</li></ul>

<t>But this is not an effective constraint on the key owner's future behaviour:</t>

<t><list style="symbols">
  <t>Since there is no such thing as a document revocation signature, this is only applicable to self-signatures and third party certifications.</t>
  <t>If a key is compromised, then the timestamp on any revocation can be trivially backdated.
So this must only apply to revocations by valid or soft-revoked keys.</t>
  <t>A soft revocation of a self-signature or third-party certification is functionally equivalent to a later signature with an expiry date, which is not covered by the "Revocable" semantics.</t>
  <t>A hard revocation has the same semantics regardless of its creation date.
In particular, an escrowed revocation signature (such as the revocation signatures commonly made at key generation time) will have a creation time significantly in the past compared to when it is typically published.
A "non-revocable" certification created after the escrowed revocation sig cannot prevent the escrowed revocation taking effect.</t>
</list></t>

<t>Therefore any "non-revocable" signature can still be effectively "revoked" by one of the following unremarkable events:</t>

<t><list style="symbols">
  <t>by a later signature with an explicit expiry date, which has the same practical effect as a soft revocation,</t>
  <t>or by an escrowed hard revocation, which has the same practical effect as a later hard revocation.</t>
</list></t>

<t>The "revocable" subpacket is therefore non-functional.</t>

</section>
</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>This draft asks IANA to do several things, all within the OpenPGP protocol group.</t>

<section anchor="signature-subpacket-types-add-delegated-revoker-and-deprecate-revocable"><name>Signature Subpacket Types: Add "Delegated Revoker" and Deprecate "Revocable"</name>

<t>The "OpenPGP Signature Subpacket Types" registry should be updated as follows:</t>

<t><list style="symbols">
  <t>Add an entry "Delegated Revoker" to OpenPGP subpackets, type 36, referencing this document, <xref target="delegated-revoker-subpacket"/>.</t>
  <t>Mark the "Revocable" subpacket entry as "deprecated", referencing this document, <xref target="revocable-subpacket"/>.</t>
</list></t>

</section>
<section anchor="reason-for-revocation-code-add-hard-vs-soft-column"><name>Reason for Revocation Code: Add Hard vs. Soft Column</name>

<t>The "OpenPGP Reason for Revocation Code" registry should add a column to indicate "Hard/Soft".
Only "Key is Superseded" and "Key is retired and no longer used" are marked "Soft".
All other values should be treated as "Hard".</t>

</section>
<section anchor="signature-types-add-delegated-revoker-row"><name>Signature Types: Add Delegated Revoker Row</name>

<t>Add an entry "Delegated Revoker Signature" to the "OpenPGP Signature Types" registry, type ID TBD, referencing this document, <xref target="delegated-revoker-signature"/>.</t>

</section>
<section anchor="signature-types-update-references"><name>Signature Types: Update References</name>

<t>The "OpenPGP Signature Types" registry entries should have References updated:</t>

<t><list style="symbols">
  <t>0x20 references should additionally point to this document, <xref target="revoking-key"/></t>
  <t>0x28 references should additionally point to this document, <xref target="revoking-subkey"/></t>
  <t>0x30 references should additionally point to this document, <xref target="revoking-certification"/></t>
</list></t>

</section>
<section anchor="signature-subpacket-types-update-references"><name>Signature Subpacket Types: Update References</name>

<t>The "Reason for Revocation Code" entry in the "OpenPGP Signature Subpacket Types" registry should have its References column updated to point to this document.</t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>This document describes ways that the OpenPGP ecosystem deals with revoked certificates.
Revocation is a security measure because it is a method of last resort for dealing with cryptographic credentials that are known to have failed for one reason or another.</t>

<t>The entire document is therefore focused on security.
Implementers who ignore this guidance may either allow known-bad key material to be used (by ignoring a valid revocation signature) or may issue revocation signatures that other implementations are likely to ignore.</t>

</section>


  </middle>

  <back>


    <references title='Normative References' anchor="sec-normative-references">

&RFC9580;
&RFC2119;
&RFC8174;


    </references>

    <references title='Informative References' anchor="sec-informative-references">

&RFC4880;


    </references>


<?line 599?>

<section anchor="augmenting-sop-for-revocation"><name>Augmenting SOP For Revocation</name>

<t>FIXME: Can all of the plausible workflows described in this document be done with the Stateless OpenPGP Interface?
If not, what is missing?</t>

</section>
<section anchor="test-vectors"><name>Test Vectors</name>

<t>FIXME: This document should include several different valid OpenPGP Revocation Certificates.</t>

</section>
<section anchor="acknowledgements"><name>Acknowledgements</name>

<t>Phil Zimmermann motivated the Delegated Revoker work.
Thanks to the people who have given useful reviews, feedback, and suggestions on this document, including:
Daniel Huigens, and
Heiko Schaefer.</t>

</section>
<section anchor="substantive-changes-to-this-document"><name>Substantive changes to this document</name>

<t>RFC Editor Note: Please delete this section before publication.</t>

<section anchor="substantive-changes-from-draft-dkg-openpgp-revocation-02-to-03"><name>Substantive Changes From draft-dkg-openpgp-revocation-02 to -03</name>

<t><list style="symbols">
  <t>Updated references to RFC9580</t>
</list></t>

</section>
<section anchor="substantive-changes-from-draft-dkg-openpgp-revocation-01-to-02"><name>Substantive Changes From draft-dkg-openpgp-revocation-01 to -02</name>

<t><list style="symbols">
  <t>Deprecated the Revocable subpacket</t>
  <t>Un-deprecated Subkey and Certification Revocations</t>
</list></t>

</section>
<section anchor="substantive-changes-from-draft-dkg-openpgp-revocation-00-to-01"><name>Substantive Changes From draft-dkg-openpgp-revocation-00 to -01</name>

<t><list style="symbols">
  <t>Enumerate problems with Revocation Key subpacket, including superseded signatures</t>
  <t>Offer doubt about deprecating Subkey Revocation and Certification Revocation (maybe a future version will un-deprecate with clearer guidance?)</t>
  <t>Change mechanism from Direct Key Signature to dedicated Delegated Revoker Signature Type</t>
</list></t>

</section>
</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA+V925bbVpLlO78CQz04U01SSqlcbWfXchaVkqxcti6tlMtS
XdY0SB6SqAQBFgBmiu2lf+lvmS+b2BFxbgBIya5a8zIvdooEzyVOnLjsuGA8
Hg8W5bxIN+Y8WVTpshkvblbjcmuK7Wo7rsxtOU+brCzGedqYuhnstgv8cZ58
+/U3Dwf03XmSFctyUO9mm6yu6clmv6Wxrp69ez7IttV50lS7unn08OG3Dx8N
8rRYnSemGDRZk9NTb934NErymmZ98/2bQVqZ9Dy5NvNdlTX7wR39RBc0uLk7
t4+NEr+6wa0pduZ8kCSrqtxtz5OhPjSkj2RBw5/L6iYrVsn3eAKfb9Isp891
6D9mpllOymqFr9Jqvqav1k2zrc8fPMCT+Ci7NRP72AN88GBWlXe1eaBjPMBv
K7Mtg9+uaKfpbDIvNw+Isg+6lMVvhLjBr+jRif4yK3t+RDOlu2ZdVueDMZGO
zuPpJPlhknyf5fmmrGhIOdKnaZGZPPkhXRfBd7T882R6+eNP9LcRMtCEf1xm
y2ZNY9b0WTEpTGPHntLAaZ6nq7XxQ0+LRWXuoi90rJS/Wf1R/4+9D8bjcZLO
6qZK581gcFntt025qtLtOpsH55hkdZIm67RaJNuqnOVmMxnoSX5Vh89tzHxN
W6s39HxlkmyzNdXSzJtRUpRNstzl+T7ZFQtT1U1ZLkZYEn+T1sldtjD0Lf2E
hjdFYxb4tFmbfTIvd/kimZnJYLpYZJiINrcfJXW5Mck6o7GqbJ7mlgMPLKjG
0PtkUfKMd8R2YO65qZoU/6cbYj429WTwjkakp+Y7rAL7vaWV1cmcWC1b7sGq
q122SIu5SWiCdXnXNy+Gr0dumDopd03d0Hbxe6VhLfvPiqYqF7u5AY0LOjq3
5mRZVglRxaxSkMMPD7qkDWhFq6Pf0YRb+jYrd7X/9WTAp7vJFovcDAb3kiud
iG/moGfRtG/iiW1OxKT52pRIm8ZstrSVpiRimJSeb5Ldlvcw22V0QimoWJui
3uH4SzropN4XTfqRjgq822Rz2vOuNsk8rY1uH5Ra5nRdab3v1qApHRKJLVCr
oZtNjEGcRJTY0I6xtZUR5iLWcLTj5ZdL/mz41FEMcuzGVMOApHSU8yqbGdA9
+eUXR12+xPTsp0+yLIy0MERVpY0OnmcNScgx7WGRDEVM0lEOseBtOr8xjQxb
2W/G7otPn2iD9+4l70y1yYoyL1d72XBDHzjBmFwSP2ZLPoEhDoRnojGb6Cxo
36YSYtAse6JRs/ZjvKvSol6aCgtI3uxmdKDJD2Y/HOFGLcwyK+z2SZjz7s4e
Ts6wxf/19vklNAgvFou7oetHJ7Sok+HLn67f0RD8/+TVa/777bP//Onq7bOn
+Pv6xfTHH90fA33i+sXrn3586v/yv7x8/fLls1dP5cf0aRJ9NBi+nH4YylkM
X795d/X61fTHYZcSzAklCQehCR2YSI5BdNBPLt/8n/85+x3tGDt8dHb27adP
+o9vzv79d/SPu7UpZDZmQPknpM8g3W5NWmEUkjrEudusSfOaaVnT7ScRYCoS
TYP7fwFl/nae/GE235797jv9ABuOPrQ0iz5kmnU/6fxYiNjzUc80jprR5y1K
x+udfoj+bekefPiHi5zYJxmffXPx3QBS5WdIokuSBk+M3rfFObiNKHS9m93w
H56pIbwumLXo3OQWV4bYLCuIxYgB62xVpM2uMirioD/o6gdSigcPLZSThx8f
PTy1s7W/+eZUTjVaQuuhxw9PcX7JtD30tV2NTpIsSBbNG6ip4jbNM7a5SOy9
qbJNWu3553LbnRCpzGyfnND29JeniQga/Az60CmPub/4yUk6uZmkk2R46CbT
erHc7pbjFX8TrNhPq7+yC4XsIO2UpEtoauinEuvmq08y11QZqVYS/ul8TZeJ
7hrkYE22RrhtWc9BIkfLInLb1cA0TO7zxXIKLB7k2jME/ZTk1IT++/g0Ib1X
+ZVsdSVYMwj/U03fXj0li0r+nDYNyYJdY0YJW1rtOZ8ylfj8WhMuj0w1wkjM
pndg5026MAmdtnsUq+Gv+Rt87NmYGG5KKwi0L+xh0WzE9KQtWbrRXuZpAYOF
JNyuUC1Funmq57PHF1DMZUX2ScSZCyym3pq5mi10R83HbUZrx7cwGsTe8Jt3
l+hJxpYKqHXoPNQ8CEeklWKXBZYEolVketC/eCKY0pW/3lafMp2wc1GOLEB4
rdGd+uVepV+MaXWfiHTtm+oHDm8mZujeTTWeGqhXPhmsdTJ4IsanbnQkesbe
GoxEBwJTJLqoBy7oKRF7Tia7nEFrGbzVe7oDDMmK7Jd7tDU6X/sB7xJnQSqG
KIeTvsvqNS6gPEQ0Ag+ykWg+prCbk2yp+9rVeuJlTtY2MfuKbORmvcGByhNF
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
hOnNIFJvBhLDt7Zj5rGwEBTu4P8CnwhJSOGLAAA=

-->

</rfc>

