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


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

<!ENTITY I-D.ietf-openpgp-crypto-refresh SYSTEM "https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-openpgp-crypto-refresh.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-01" category="info" submissionType="IETF" xml:lang="en">
  <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>

    <date year="2023" month="August" day="17"/>

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

    <abstract>


<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>


<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 change is the introduction of the "Delegated Revoker" subpacket described in <xref target="delegated-revoker"/>.</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="I-D.ietf-openpgp-crypto-refresh"/>.</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>

</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 do revocation: Key Revocation (0x20), Subkey Revocation (0x28), and Certification Revocation (0x30).</t>

<t>This document focuses on revoking full OpenPGP certificates (a.k.a. "Transferable Public Keys") using Key Revocation signatures (0x20).</t>

<t>This document also explicitly deprecates the remaining two signature types: Subkey Revocation (0x28) and Certification Revocation (0x30).</t>

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

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

<t>When Alice revokes her certification over Bob's Primary Key and User ID, what is she saying specifically?</t>

<t>How does Alice's Certification Revocation signature packet get placed into Bob's certificate?</t>

<t>Why doesn't Alice just issue a superseding certification of her own over Bob's User ID instead of revoking it?</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>

</section>
<section anchor="revoking-subkeys"><name>Instead of Revoking a Subkey</name>

<t>Why bother revoking a subkey?
Why not just issue an superseding Subkey Binding Signature?</t>

<t>FIXME: One reason why revoking a subkey might be nice is if a subkey has been compromised, <em>and</em> multiple historical subkey bindings have been made.
In that case, to have the same effect the keyholder would need to issue one superseding expiring Subkey Binding Signature for each known Subkey Binding Signature, which is kind of a mess.</t>

<t>What happens when a Subkey Binding Signature is revoked, and then later a new Subkey Binding Signature is made over the same subkey?</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>Is there ever a scenario where a signing-capable subkey might want to revoke its own Primary Key Binding Signature?</t>

<t>If so, how is that done?</t>

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

<t>You find a self-revoked primary key, and you find another OpenPGP certificate in the wild that uses the same key material (but maybe different creation date, or used as a subkey instead of as a primary key).
Is it acceptable for use?</t>

<t>In certificate with primary key X, there is a revoked subkey Y (it was revoked by X issuing a valid Subkey Revocation signature).
But the certificate with primary key Z, <em>also</em> has subkey Y.
Is subkey Y valid for the Z certificate?</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="I-D.ietf-openpgp-crypto-refresh"/> 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="what-about-revocations-from-the-future"><name>What About Revocations From the Future?</name>

<t>FIXME: If a Revocation signature appears to have been made in the future, what should be done with it?</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.</t>

<t>FIXME: describe the circumstances under which a soft revocation would be preferable over an expiration.
If there are none, explicitly discourage soft revocation.</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-certificate"><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="I-D.ietf-openpgp-crypto-refresh"/>.</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 four subpackets:</t>

<t><list style="symbols">
  <t>Signature Creation Time (see <xref section="5.2.3.11" sectionFormat="of" target="I-D.ietf-openpgp-crypto-refresh"/>)</t>
  <t>Issuer Fingerprint (see <xref section="5.2.3.35" sectionFormat="of" target="I-D.ietf-openpgp-crypto-refresh"/>)</t>
  <t>Revocable (see <xref section="5.2.3.20" sectionFormat="of" target="I-D.ietf-openpgp-crypto-refresh"/>)</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.
The Revocable subpacket flag <bcp14>MUST</bcp14> be set to 0.
All subpackets <bcp14>MUST</bcp14> be marked as Critical.</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="I-D.ietf-openpgp-crypto-refresh"/>.</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="iana-considerations"><name>IANA Considerations</name>

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

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

<t>Add an entry "Delegated Revoker" to OpenPGP subpackets, type 36, referencing this document, <xref target="delegated-revoker-subpacket"/>.</t>

</section>
<section anchor="reasons-for-revocation-add-hard-vs-soft-column"><name>Reasons for Revocation: Add Hard vs. Soft Column</name>

<t>The "Reasons 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 OpenPGP Signature Types, 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>"Signature Types" registry entries should have References updated:</t>

<t><list style="symbols">
  <t>0x20 references should additionally point to this document</t>
  <t>0x28 references should be marked "deprecated", and additionally point to this document, <xref target="revoking-subkeys"/></t>
  <t>0x30 references should be marked "deprecated", and additionally point to this document, <xref target="revoking-certification"/></t>
</list></t>

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

<t>The "Reason for Revocation" entry in the "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'>

&I-D.ietf-openpgp-crypto-refresh;
&RFC2119;
&RFC8174;


    </references>

    <references title='Informative References'>

&RFC4880;


    </references>


<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.</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-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:
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
/WAAAA==

-->

</rfc>

