<?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.35 (Ruby 3.3.8) -->


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

]>


<rfc ipr="trust200902" docName="draft-gallagher-openpgp-certificates-00" category="std" consensus="true" submissionType="IETF" updates="9580" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title>OpenPGP Certificate Grammar</title>

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

    <date year="2026" month="June" day="04"/>

    <area>int</area>
    <workgroup>openpgp</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 66?>

<t>This document specifies several updates and clarifications to the grammar and semantics of OpenPGP certificates.</t>



    </abstract>

    <note title="About This Document" removeInRFC="true">
      <t>
        The latest revision of this draft can be found at <eref target="https://andrewgdotcom.gitlab.io/openpgp-certificates"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-gallagher-openpgp-certificates/"/>.
      </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/andrewgdotcom/openpgp-certificates"/>.</t>
    </note>


  </front>

  <middle>


<?line 70?>

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

<t>OpenPGP certificates have a complex grammar and sometimes poorly-understood semantics.
This document attempts to address this by:</t>

<t><list style="symbols">
  <t>Expanding on specifications where <xref target="RFC9580"></xref> does not fully describe the existing or expected behaviour of deployed implementations.</t>
  <t>Adding clarification where deployed implementations differ in their interpretation of <xref target="RFC9580"></xref> and its predecessors.</t>
  <t>Deprecating unused or error-prone features.</t>
</list></t>

<t>This document does not specify any new wire formats.</t>

</section>
<section anchor="conventions-definitions"><name>Conventions and Definitions</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 term "Component key" is used in this document to mean either a primary key or subkey.</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 anchor="signature-types"><name>Signature Types</name>

<t>Several signature types used in certificates are specified in incomplete, confusing or contradictory ways.
We update their specifications as follows.</t>

<section anchor="certification-signature-types"><name>Certification Signature Types (0x10..0x13)</name>

<t><xref section="5.2.1" sectionFormat="of" target="RFC9580"/> defines four types of certification signature (0x10..0x13).
All may be created by either the key owner or a third party, and may be calculated over either a User ID packet or a User Attribute packet.
In addition, a Certification Revocation signature revokes signatures of all four types.</t>

<t>Historically, certifications were only made by third parties.
First-party self-certifications only became customary later, and were made mandatory when preference subpackets were introduced.</t>

<section anchor="generic-casual-positive-certifications"><name>Generic, Casual and Positive Certifications (0x10, 0x12, 0x13)</name>

<t>The semantic distinctions between the certification signature types are ill-defined.
Since no definition of the phrase "some casual verification" (<xref section="5.2.1.6" sectionFormat="of" target="RFC9580"/>) was ever issued, there is no consensus on the semantics of a Casual Certification or how it differs in practice from the other certification types.</t>

<t>The following convention has evolved over time <xref target="ASKCERTLEVEL"></xref>, and is hereby specified:</t>

<t><list style="symbols">
  <t>0x10 Generic Certification <bcp14>SHOULD</bcp14> only be used for third-party certifications.</t>
  <t>0x12 Casual Certification is deprecated and <bcp14>SHOULD NOT</bcp14> be created.</t>
  <t>0x13 Positive Certification <bcp14>SHOULD</bcp14> only be used for self-certifications.</t>
</list></t>

<t>A receiving implementation <bcp14>MUST</bcp14> treat a third-party certification of any of the above types as equivalent to a type 0x10 signature, and a first-party certification of any of the above types as equivalent to a type 0x13 signature.</t>

</section>
<section anchor="persona-certifications"><name>Persona Certifications (0x11)</name>

<t>0x11 Persona Certification signatures are an exceptional case, because historically many implementations did not consider them when calculating trust values.
This follows from <xref section="5.2.1.5" sectionFormat="of" target="RFC9580"/>:</t>

<ul empty="true"><li>
  <t>The issuer of this certification has not done any verification of the claim that the owner of this key is the User ID specified.</t>
</li></ul>

<t>A receiving implementation therefore <bcp14>MUST NOT</bcp14> attribute any trust statement to the presence of a Persona Certification.
In addition, since an unverified self-certification is both a meaningless and reckless statement ("I have not checked whether this is my own identity"), a generating implementation <bcp14>MUST NOT</bcp14> generate Persona self-certifications, and a receiving implementation <bcp14>MUST</bcp14> ignore them.</t>

<t>Although a Persona Certification has no intrinsic semantic value, the semantics of signatures may be altered by adding subpackets such as notations.
A generating implementation <bcp14>MAY</bcp14> use a third-party Persona Certification to make a verifiable statement about a User ID (for example, by adding a notation) without making any trust statement about the relationship between the User ID and the primary key.</t>

</section>
</section>
<section anchor="primary-key-binding-signature"><name>Primary Key Binding Signature (Type 0x19)</name>

<t><xref section="5.2.1.9" sectionFormat="of" target="RFC9580"/> defines the Primary Key Binding Signature as:</t>

<ul empty="true"><li>
  <t>This signature is a statement by a signing subkey, indicating that it is owned by the primary key.</t>
</li></ul>

<t><xref section="10.1.5" sectionFormat="of" target="RFC9580"/> gives additional details:</t>

<ul empty="true"><li>
  <t>For subkeys that can issue signatures, the Subkey Binding signature <bcp14>MUST</bcp14> contain an Embedded Signature subpacket with a Primary Key Binding signature (Type ID 0x19) issued by the subkey on the top-level key.</t>
</li></ul>

<t>The motivation for this requirement is not contained in any of the RFCs, and the terms "signing subkey" and "subkeys that can issue signatures" are imprecise.
We hereby address these omissions by modifying the above text to read:</t>

<ul empty="true"><li>
  <t>A Subkey Binding signature <bcp14>MUST</bcp14> contain an Embedded Signature subpacket with a Primary Key Binding signature (Type ID 0x19) issued by the subkey on the top-level key, if the Subkey Binding signature contains a Key Flags subpacket permitting that subkey to create OpenPGP signatures.
A receiving implementation <bcp14>MUST</bcp14> reject any Subkey Binding signature that permits the creation of OpenPGP signatures by that subkey and does not contain a valid Subkey Binding signature.
A Primary Key Binding signature is <bcp14>OPTIONAL</bcp14> otherwise.</t>

  <t>An attacker could issue a Subkey Binding signature over a public subkey that belongs to a victim, and publish it as part of the attacker's own certificate.
A third party might then look up the subkey using the Issuer Key ID or Issuer Fingerprint subpacket from a signature made by the victim, and find the attacker's certificate instead.
The attacker could then use this to impersonate the victim to the third party.
The Primary Key Binding signature mitigates this attack, by requiring the subkey's owner to consent for it to be bound to a particular primary key.</t>
</li></ul>

</section>
<section anchor="primary-key-revocation-signature"><name>Primary Key Revocation Signature (Type 0x20)</name>

<t><xref section="5.2.1.11" sectionFormat="of" target="RFC9580"/> defines the Key Revocation Signature as:</t>

<ul empty="true"><li>
  <t>This signature is calculated directly on the key being revoked.
A revoked key is not to be used.
Only Revocation Signatures by the key being revoked, or by a (deprecated) Revocation Key, should be considered valid Revocation Signatures.</t>
</li></ul>

<t>The name and description are potentially confusing, as it can only revoke a Primary Key and not a Subkey -- other OpenPGP artifacts that are named "Key" without a qualifier (such as the "Key Flags" and "Key Expiration Time" subpackets) apply to both Primary Keys and Subkeys.</t>

<t>We therefore rename the 0x20 signature type to "<em>Primary</em> Key Revocation Signature" for clarity, and update its definition as follows:</t>

<ul empty="true"><li>
  <t>This signature is calculated directly on the primary key being revoked.
A revoked primary key is not to be used.
Only Revocation Signatures by the primary key being revoked, or by a (deprecated) Revocation Key, should be considered valid Primary Key Revocation Signatures.</t>
</li></ul>

</section>
<section anchor="subkey-revocation-signature"><name>Subkey Revocation Signature (Type 0x28)</name>

<t><xref section="5.2.1.11" sectionFormat="of" target="RFC9580"/> defines the Subkey Revocation Signature as:</t>

<ul empty="true"><li>
  <t>This signature is calculated directly on the primary key and the subkey being revoked.
A revoked subkey is not to be used.
Only Revocation Signatures by the top-level signature key that is bound to this subkey, or by a (deprecated) Revocation Key, should be considered valid Revocation Signatures.</t>
</li></ul>

<t>The phrasing "top-level signature key that is bound to this subkey" is confusing.
Instead, we update the definition for clarity:</t>

<ul empty="true"><li>
  <t>This signature is calculated directly on the primary key and the subkey being revoked.
A revoked subkey is not to be used.
Only Revocation Signatures by the primary key, or by a (deprecated) Revocation Key, should be considered valid Subkey Revocation Signatures.</t>
</li></ul>

<t>There are several other places in <xref target="RFC9580"></xref> that use the term "top-level key" instead of "Primary Key", but this is not explicitly defined.
It <bcp14>MUST</bcp14> be interpreted as a synonym for "Primary Key" in all these contexts.</t>

</section>
<section anchor="certification-revocation-signature"><name>Certification Revocation Signature (Type 0x30)</name>

<t><xref section="5.2.1.13" sectionFormat="of" target="RFC9580"/> defines the Certification Revocation Signature as:</t>

<ul empty="true"><li>
  <t>This signature revokes an earlier User ID certification signature (Type IDs 0x10 through 0x13) or Direct Key signature (Type ID 0x1F).
It should be issued by the same key that issued the revoked signature or by a (deprecated) Revocation Key.
The signature is computed over the same data as the certification that it revokes, and it should have a later creation date than that certification.</t>
</li></ul>

<t><xref section="5.2.4" sectionFormat="of" target="RFC9580"/> is clear that Direct Key signatures and Certification Signatures have completely different constructions.
This implies that there are two different ways to construct a Type 0x30 signature, each of which appears in a different part of an OpenPGP certificate.</t>

<t>The above definition dates back to <xref target="RFC2440"></xref>, except for the "or Direct Key Signature" clause which was added to the first sentence in [RFC4880].
But the third sentence still defines the construction unconditionally by reference to "the certification that it revokes", even though it does not necessarily revoke a certification.</t>

<t>The use of a Certification Revocation Signature to revoke a Direct Key Signature is imprecise and not widely supported, and is hereby deprecated.
Since Direct Key Signatures have no intrinsic semantics, the ability to revoke a Direct Key Signature is not necessary.
To retract a previous statement made by a Direct Key Signature, it is sufficient to create a new Direct Key Signature with a different set of subpackets.</t>

<t>We therefore update the definition to remove the reference to Direct Key Signatures:</t>

<ul empty="true"><li>
  <t>This signature revokes an earlier User ID certification signature (Type IDs 0x10 through 0x13).
It should be issued by the same key that issued the revoked signature or by a (deprecated) Revocation Key.
The signature is computed over the same data as the certification that it revokes, and it should have a later creation date than that certification.</t>
</li></ul>

</section>
</section>
<section anchor="time-evolution-of-signatures"><name>Time Evolution of Signatures</name>

<t>Validation of a Signature packet is performed in several stages:</t>

<t><list style="numbers" type="1">
  <t>Formal Validation (the signature packet is well-formed and parseable)</t>
  <t>Structural Validation (the signature packet is placed in the correct context)</t>
  <t>Cryptographic Validation (the signature data was calculated correctly)</t>
  <t>Temporal Validation (the signature has not expired or been revoked)</t>
  <t>Issuer Validation (the signature was made by a valid key)</t>
</list></t>

<t>Included in the Issuer Validation stage is validation (including Temporal Validation) of the binding signatures in the issuer's certificate.
If the Web of Trust is in use, this process is potentially recursive.</t>

<section anchor="conflicting-requirements"><name>Conflicting Requirements in Current Specifications</name>

<t><xref section="5.2.3.10" sectionFormat="of" target="RFC9580"/> states:</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>But <xref section="5.2.3.31" sectionFormat="of" target="RFC9580"/> states:</t>

<ul empty="true"><li>
  <t>If a key has been revoked because of a compromise, all signatures created by that key are suspect.</t>
</li></ul>

<t>These requirements are in explicit conflict and must be resolved by further specification.</t>

<t>In addition, the use of the unqualified term "valid" is ambiguous.
If read inclusively to mean that expired or revoked signatures are not "valid" for the purposes of this statement, it results in complex key validity calculations with questionable added utility and obscure failure modes.</t>

<t>We therefore update the first statement above to read:</t>

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

</section>
<section anchor="key-and-certification-validity-periods"><name>Key and Certification Validity Periods</name>

<t>Key Expiration Time subpackets are a rich source of footguns:</t>

<t><list style="numbers" type="1">
  <t>They specify an offset rather than an timestamp, but are not usable without first converting to a timestamp.</t>
  <t>The offset is calculated relative to the creation timestamp of a different packet (the component key packet).</t>
  <t>Some implementations interpret them as being inheritable in their raw form, so that the same offset value gets applied to different creation timestamps.</t>
  <t>It is unclear how to interpret Key Expiration Time subpackets in a v4 self-signature over a non-Primary User ID.</t>
</list></t>

<t>Further, their semantics overlaps that of Signature Expiration Time:</t>

<t><list style="numbers" type="1">
  <t>If the binding signature over a key expires, but the key does not, the key is nevertheless unusable due to lack of signatures.</t>
  <t>If a key expires, but the signature over it does not, the signature is unusable.</t>
</list></t>

<t>This means there are effectively two expiration dates on a Key Binding signature, the key expiration and the signature expiration, but without distinct semantics.</t>

<t>In addition, the Signature Creation Time subpacket has an overloaded meaning in both Key Binding and Certification signatures:</t>

<t><list style="numbers" type="1">
  <t>It is used as the "valid from" timestamp of the object being signed over</t>
  <t>It is used to order multiple similar signatures to determine which is valid</t>
</list></t>

<t>If this is interpreted strictly, it means that it is not possible to create a new Key Binding signature that reliably leaves the starting date of the key's validity unchanged.
Some implementations have worked around this by generating signatures with creation dates backdated to one second after that of the previous signature.</t>

<t>The ability to create a new signature with an unchanged valid-from date allows historical signatures to be losslessly cleaned from a TPK, saving space.
It is also more compatible with the historical interpretation favoured by PGP and GnuPG.</t>

<t>Finally, both Expiration Time subpackets use zero to mean "the infinite future", which requires explicit handling of the special case.</t>

</section>
<section anchor="key-binding-temporal-validity"><name>Key Binding Temporal Validity</name>

<t>To clean up the ambiguity in Key Binding signatures, we specify the following:</t>

<t><list style="numbers" type="1">
  <t>Key Binding signatures other than self-certifications over v4 Primary User IDs (Subkey Binding signatures, Primary Key Binding signatures, and Direct Key signatures) <bcp14>SHOULD NOT</bcp14> contain Signature Expiration Time subpackets, and any such subpackets <bcp14>MUST</bcp14> be ignored.</t>
  <t>The validity of a component key extends from its creation time until its revocation or key expiration time.</t>
  <t>If the most recent Key Binding signature has no Key Expiration Time subpacket, then the key does not expire.</t>
  <t>Key Binding signatures cannot be directly revoked; the corresponding revocation signatures affect the key, not the binding.</t>
  <t>A Key Binding signature is temporally valid if its creation time is later than the creation time of the primary key that made it.</t>
  <t>A Key Binding signature is temporally valid even if the primary has been hard-revoked (so that we can still associate the primary key with its subkeys).</t>
  <t>The creation time of the Key Binding signature is used only for ordering, not for calculation of signature validity.</t>
  <t>Key Expiration Time subpackets are only meaningful in Key Binding signatures (including self-certifications over v4 Primary User IDs); an implementation <bcp14>MUST</bcp14> ignore a Key Expiration Time subpacket in any other signature.</t>
</list></t>

<t>A signature other than a Key Binding signature is temporally valid if it was made by a component key during its validity period.</t>

<t>(See also <xref target="RFC4880BIS-71"></xref>, <xref target="OPENPGPJS-1800"></xref>).</t>

</section>
<section anchor="certification-temporal-validity"><name>Certification Temporal Validity</name>

<t>To clean up the ambiguity in Certification signatures, we specify the following:</t>

<t><list style="numbers" type="1">
  <t>Certification signatures other than self-certifications over v4 Primary User IDs <bcp14>SHOULD NOT</bcp14> contain Key Expiration Time subpackets, and any such subpackets <bcp14>MUST</bcp14> be ignored.</t>
  <t>The validity of a User ID or User Attribute extends from the Primary Key's creation time until the User ID or User Attribute's revocation or signature expiration time.</t>
  <t>If the most recent Certification signature has no Signature Expiration Time subpacket, then the ID or attribute does not expire.</t>
  <t>A Certification signature is NOT valid if the primary has been hard-revoked.</t>
  <t>The creation time of the Certification signature is used only for ordering, not for calculation of signature validity.</t>
</list></t>

<section anchor="conflicting-expiration-times-in-v4-self-certifications"><name>Conflicting Expiration Times in v4 Self-Certifications</name>

<t>The above rules permit a v4 self-certification over a Primary User ID to contain both Key Expiration Time and Signature Expiration Time subpackets, both of which are semantically meaningful.
If the calculated expiry times differ, it is <bcp14>RECOMMENDED</bcp14> that a receiving implementation interprets them as follows:</t>

<t><list style="numbers" type="1">
  <t>The Key Expiration Time applies to the Primary Key, while the Signature Expiration Time applies only to the identity link between the Primary User ID and the Primary Key.</t>
  <t>If the Key Expiration Time is earlier then the Signature Expiration Time is not meaningful, since the whole certificate becomes unusable after the Primary Key expires.</t>
  <t>If the Key Expiration Time is later or absent then the Primary Key remains usable in the interim, but is no longer linked to the identity in the Primary User ID.</t>
</list></t>

<t>The above rules ensure that a Key Expiration Time subpacket in a v4 self-certification over a Primary User ID has the same effect as if it had been contained in a Direct Key signature.</t>

</section>
<section anchor="issues-with-temporary-identities"><name>Issues with Temporary Identities</name>

<t>When making a third-party certification signature over a User ID, the third party may not wish to validate the User ID retrospectively.
This may arise when a keyholder adds a User ID to their existing certificate on a temporary basis, for example if they assume a role-based identity such as "chairperson@example.com".
It would be possible for such a keyholder to backdate a signature to a time when someone else held the identity, and thereby attempt to impersonate them.
It is therefore desirable to allow a third-party certifier to indicate a custom initial validity date for the User ID they certify.</t>

<t>There are possible approaches that do not require new wire formats:</t>

<t><list style="symbols">
  <t>We could specify that third-party certification signatures only validate the User ID from the signature creation time.</t>
  <t>We could specify that type 0x10 certification signatures only validate the User ID from the signature creation time.
This would allow both third parties and keyholders to choose whether to make retrospective or time-limited certifications.</t>
</list></t>

<t>There are common issues with the above proposals:</t>

<t><list style="symbols">
  <t>Current client behaviour is not consistent, so we cannot reliably enforce non-retrospective certifications if legacy clients are in use.</t>
  <t>If the signature creation time acts as the start of validity, we cannot losslessly clean up those certifications.</t>
</list></t>

<t>It would appear that the only way to reliably enforce a novel temporal validity interpretation would require new wire formats.
For example, we could define a new "Subject Valid From" subpacket that contains a timestamp field, by analogy with the Signature Creation Time subpacket.
If the critical bit were always set on this subpacket, a legacy client <bcp14>MUST</bcp14> automatically invalidate the certification.
This would also allow lossless clean up of all certifications.</t>

<t>((TODO: is this a reasonable trade-off?
See draft-signatures#9))</t>

<t>An alternative solution would be to define an identity format with intrinsic creation dates, for example as a novel User Attribute subpacket.</t>

</section>
</section>
<section anchor="cumulation-of-signatures"><name>Cumulation of Signatures</name>

<t>A cryptographically valid Key Binding, Certification or Literal Data signature automatically and permanently supersedes any earlier signature of the same Signature Category, by the same key pair, over the same subject.
If a later such signature expires before an earlier one, the earlier signature does not become valid again.</t>

<t>For the purposes of the above:</t>

<t><list style="symbols">
  <t>"same key pair" refers to the public key packet as identified by the Issuer KeyID or Issuer Fingerprint subpacket.</t>
  <t>"same subject" refers only to the packets being signed over, and not to the metadata contained in the Signature packets (including subpackets) or any corresponding OPS packet.</t>
</list></t>

<t>Note however that this does not apply to revocation signatures, which have their own cumulation rules (<xref target="revoking-signatures-and-keys"/>).</t>

<t>(See also <xref target="SCHAUB2021"></xref>)</t>

<t>FIXME: what about signatures with the same creation time? (issue #9)</t>

</section>
</section>
<section anchor="revoking-signatures-and-keys"><name>Revoking Signatures and Keys</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 a Key expiry date on a new Direct Key, Subkey Binding, or (for v4 keys) Primary User ID self-certification.
A User ID or User Attribute may be temporarily invalidated by specifying a Signature expiry date on a self-certification.
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.</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>

</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><xref section="6.2.1" sectionFormat="of" target="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>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 this key has been compromised"</t>
  <t>User ID No Longer Valid (0x32): "I no longer believe that this primary key should be associated with 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 (see #8)</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, as specified in <xref section="3.2.1.1" sectionFormat="of" target="I-D.gallagher-openpgp-user-attributes"/></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>

</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="revocation-signature-subpackets"><name>Revocation Signature Subpackets</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="revocations-from-the-future"><name>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 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="use-of-soft-revocations"><name>Use of Soft Revocations</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 a public encryption subkey is not useful to third parties 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).
Note however that for some public key algorithms (such as ECDH) the owner may need to keep the public subkey in order to decrypt historical data, if the secret key material only exists on an OpenPGP card.</t>

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

<t>FIXME: (all of this, see issue #3)</t>

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

<section anchor="dealing-with-a-revocation-certificate"><name>Dealing With 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>
</section>
<section anchor="revocation-guidance"><name>Revocation Guidance</name>

<t>This section describes a number of outstanding challenges with implementing OpenPGP revocation.</t>

<section anchor="freshness-considerations"><name>Freshness Considerations</name>

<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?
(issue #7)</t>

</section>
<section anchor="publication-of-certification-revocations"><name>Publication of Certification Revocations</name>

<t>Distribution of revocations has historically been unreliable.
In particular, a keystore that enforces self-sovereignty (<xref section="8" sectionFormat="of" target="I-D.dkg-openpgp-abuse-resistant-keystore"/>) cannot be relied upon to distribute third-party certification revocations.
In addition, it is not normally possible to distribute a self-certification revocation over a User ID without also distributing the contents of that User ID.
This is a significant impediment to reliable implementation of self-sovereign User ID redaction.</t>

<t>One possible solution is to allow the use of Embedded Signatures in User Attributes (<xref section="3.2.1" sectionFormat="of" target="I-D.gallagher-openpgp-user-attributes"/>).</t>

</section>
<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 certificate, how do they distribute revocations over older certificates?
(issue #7)</t>

</section>
<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 packets.
Stripping a revocation signature packet 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?
Should we consider the indicated key revoked? (issue #2)</t>

</section>
<section anchor="shared-key-material"><name>Shared 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="escrowed-revocation"><name>Escrowed Revocation Certificates</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?
(issue #6)</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?
(issue #6)</t>

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

<t>((TO BE COMPLETED))</t>

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

<section anchor="openpgp-signature-types-registry"><name>OpenPGP Signature Types Registry</name>

<t>IANA is requested to update the following existing entries in the registry:</t>

<texttable title="OpenPGP Signature Types (updated)" anchor="signature-types-updated">
      <ttcol align='left'>ID</ttcol>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Embeddable</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>0x10</c>
      <c>Generic Certification Signature</c>
      <c>&#160;</c>
      <c><xref target="RFC9580"></xref>, <xref target="certification-signature-types"/></c>
      <c>0x11</c>
      <c>Persona Certification Signature</c>
      <c>&#160;</c>
      <c><xref target="RFC9580"></xref>, <xref target="certification-signature-types"/></c>
      <c>0x12</c>
      <c>Casual Certification Signature (Deprecated)</c>
      <c>&#160;</c>
      <c><xref target="RFC9580"></xref>, <xref target="certification-signature-types"/></c>
      <c>0x13</c>
      <c>Positive Certification Signature</c>
      <c>&#160;</c>
      <c><xref target="RFC9580"></xref>, <xref target="certification-signature-types"/></c>
      <c>0x19</c>
      <c>Primary Key Binding Signature</c>
      <c>Yes</c>
      <c><xref target="RFC9580"></xref>, <xref target="primary-key-binding-signature"/>, ((TBC))</c>
      <c>0x20</c>
      <c>Primary Key Revocation Signature</c>
      <c>&#160;</c>
      <c><xref target="RFC9580"></xref>, <xref target="primary-key-revocation-signature"/>, <xref target="revoking-key"/></c>
      <c>0x28</c>
      <c>Subkey Revocation Signature</c>
      <c>&#160;</c>
      <c><xref target="RFC9580"></xref>, <xref target="revoking-subkey"/></c>
      <c>0x30</c>
      <c>Certification Revocation Signature</c>
      <c>&#160;</c>
      <c><xref target="RFC9580"></xref>, <xref target="revoking-certification"/></c>
</texttable>

<t>((TODO: avoid clash between the updates to 0x19 here and in draft-certificates))</t>

</section>
<section anchor="openpgp-signature-subpacket-types-registry"><name>OpenPGP Signature Subpacket Types Registry</name>

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

</section>
<section anchor="openpgp-reason-for-revocation-code-registry"><name>OpenPGP Reason for Revocation Code Registry</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>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

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



<reference anchor="RFC9580">
  <front>
    <title>OpenPGP</title>
    <author fullname="P. Wouters" initials="P." role="editor" surname="Wouters"/>
    <author fullname="D. Huigens" initials="D." surname="Huigens"/>
    <author fullname="J. Winter" initials="J." surname="Winter"/>
    <author fullname="Y. Niibe" initials="Y." surname="Niibe"/>
    <date month="July" year="2024"/>
    <abstract>
      <t>This document specifies the message formats used in OpenPGP. OpenPGP provides encryption with public key or symmetric cryptographic algorithms, digital signatures, compression, and key management.</t>
      <t>This document is maintained in order to publish all necessary information needed to develop interoperable applications based on the OpenPGP format. It is not a step-by-step cookbook for writing an application. It describes only the format and methods needed to read, check, generate, and write conforming packets crossing any network. It does not deal with storage and implementation questions. It does, however, discuss implementation issues necessary to avoid security flaws.</t>
      <t>This document obsoletes RFCs 4880 ("OpenPGP Message Format"), 5581 ("The Camellia Cipher in OpenPGP"), and 6637 ("Elliptic Curve Cryptography (ECC) in OpenPGP").</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9580"/>
  <seriesInfo name="DOI" value="10.17487/RFC9580"/>
</reference>
<reference anchor="RFC2119">
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author fullname="S. Bradner" initials="S." surname="Bradner"/>
    <date month="March" year="1997"/>
    <abstract>
      <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="2119"/>
  <seriesInfo name="DOI" value="10.17487/RFC2119"/>
</reference>
<reference anchor="RFC8174">
  <front>
    <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <date month="May" year="2017"/>
    <abstract>
      <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="8174"/>
  <seriesInfo name="DOI" value="10.17487/RFC8174"/>
</reference>



    </references>

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



<reference anchor="RFC1991">
  <front>
    <title>PGP Message Exchange Formats</title>
    <author fullname="D. Atkins" initials="D." surname="Atkins"/>
    <author fullname="W. Stallings" initials="W." surname="Stallings"/>
    <author fullname="P. Zimmermann" initials="P." surname="Zimmermann"/>
    <date month="August" year="1996"/>
    <abstract>
      <t>This document describes the format of "PGP files", i.e., messages that have been encrypted and/or signed with PGP. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="1991"/>
  <seriesInfo name="DOI" value="10.17487/RFC1991"/>
</reference>
<reference anchor="RFC2440">
  <front>
    <title>OpenPGP Message Format</title>
    <author fullname="J. Callas" initials="J." surname="Callas"/>
    <author fullname="L. Donnerhacke" initials="L." surname="Donnerhacke"/>
    <author fullname="H. Finney" initials="H." surname="Finney"/>
    <author fullname="R. Thayer" initials="R." surname="Thayer"/>
    <date month="November" year="1998"/>
    <abstract>
      <t>This document is maintained in order to publish all necessary information needed to develop interoperable applications based on the OpenPGP format. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="2440"/>
  <seriesInfo name="DOI" value="10.17487/RFC2440"/>
</reference>

<reference anchor="I-D.gallagher-openpgp-user-attributes">
   <front>
      <title>User Attributes in OpenPGP</title>
      <author fullname="Andrew Gallagher" initials="A." surname="Gallagher">
         <organization>PGPKeys.EU</organization>
      </author>
      <date day="3" month="November" year="2025"/>
      <abstract>
	 <t>   This document updates the specification of User Attribute Packets and
   Subpackets in OpenPGP.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-gallagher-openpgp-user-attributes-01"/>
   
</reference>

<reference anchor="I-D.dkg-openpgp-abuse-resistant-keystore">
   <front>
      <title>Abuse-Resistant OpenPGP Keystores</title>
      <author fullname="Daniel Kahn Gillmor" initials="D. K." surname="Gillmor">
         <organization>American Civil Liberties Union</organization>
      </author>
      <date day="18" month="August" year="2023"/>
      <abstract>
	 <t>   OpenPGP transferable public keys are composite certificates, made up
   of primary keys, revocation signatures, direct key signatures, user
   IDs, identity certifications (&quot;signature packets&quot;), subkeys, and so
   on.  They are often assembled by merging multiple certificates that
   all share the same primary key, and are distributed in public
   keystores.

   Unfortunately, since many keystores permit any third-party to add a
   certification with any content to any OpenPGP certificate, the
   assembled/merged form of a certificate can become unwieldy or
   undistributable.  Furthermore, keystores that are searched by user ID
   or fingerprint can be made unusable for specific searches by public
   submission of bogus certificates.  And finally, keystores open to
   public submission can also face simple resource exhaustion from
   flooding with bogus submissions, or legal or other risks from uploads
   of toxic data.

   This draft documents techniques that an archive of OpenPGP
   certificates can use to mitigate the impact of these various attacks,
   and the implications of these concerns and mitigations for the rest
   of the OpenPGP ecosystem.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-dkg-openpgp-abuse-resistant-keystore-06"/>
   
</reference>

<reference anchor="ASKCERTLEVEL" target="https://dkg.fifthhorseman.net/blog/gpg-ask-cert-level-considered-harmful.html">
  <front>
    <title>'gpg --ask-cert-level' Considered Harmful</title>
    <author initials="D. K." surname="Gillmor" fullname="Daniel Kahn Gillmor">
      <organization></organization>
    </author>
    <date year="2013" month="May" day="20"/>
  </front>
</reference>
<reference anchor="OPENPGPJS-1800" target="https://github.com/openpgpjs/openpgpjs/issues/1800">
  <front>
    <title>'Signature creation time is in the future' error for apparently valid signature</title>
    <author initials="I." surname="Hell" fullname="Ivan Hell">
      <organization></organization>
    </author>
    <date year="2024" month="October" day="28"/>
  </front>
</reference>
<reference anchor="RFC4880BIS-71" target="https://gitlab.com/openpgp-wg/rfc4880bis/-/issues/71">
  <front>
    <title>Deprecate the use of 'Key Expiration Time' packets (type 9) in V5 sigs</title>
    <author initials="A." surname="Gallagher" fullname="Andrew Gallagher">
      <organization></organization>
    </author>
    <date year="2022" month="January" day="08"/>
  </front>
</reference>
<reference anchor="SCHAUB2021" target="https://mailarchive.ietf.org/arch/msg/openpgp/C0P4MxwqJBbxS6H0YoXFF3oEJ3A/">
  <front>
    <title>[openpgp] Question on Signature Expiration</title>
    <author initials="P." surname="Schaub" fullname="Paul Schaub">
      <organization></organization>
    </author>
    <date year="2021" month="December" day="13"/>
  </front>
</reference>


    </references>

</references>


<?line 665?>

<section anchor="acknowledgments"><name>Acknowledgments</name>

<t>The authors would also like to thank Daniel Huigens, Heiko Schäfer, Neal Walfield, Justus Winter and Paul Schaub for additional discussions and suggestions.</t>

</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA+1923LbSJbgO78CSz9Y8pC0ZLm6bXVvuWVJttW+jqUqV0WN
YyNJJEm0QICNBCVzXPqXfdgvmfmxPbe8gQAlV/V0xMSuY6aaIoG8nDz3Ww6H
w16d1bk+TPrvl7r48PJDcqyrOptmE1Xr5GWlFgtV9Xv416ys1oeJqdNeWk4K
tYCX0kpN6+FM5bmazXU1LGGM5Ww5nPgxzHBvr7dapvjxMHn63ZO9XrasDpO6
Wpn60d7e071HPVVpdZhkRd27LqvLWVWuloeJjNW71Gv4Nj1MzopaV4Wuhyc4
a8+sxovMmKwsLtZLWMvZ6cWL3pUuVvqwlyQyiN1VH76q6bH+J5giK2awN3gC
v1+oLIfvZb6/ZLqejspqhj+pajKHn+Z1vTSHDx/ik/hVdqVH9rGH+MXDcVVe
G/1QxniI71Z6WQbvzgDMajyalIuHqkgrfT1Lyxr/aoMZvp/jhzoYIXptJONl
ZccApobn/5fKywI2vdamt8wOk1/qcjJITFnVlZ4a+LRe4IfPPbWq52WFgBvC
/yfJdJXnfMRHNGvy0p4x/Qz7VkX276oG6B8mAN/Xem1Gpz/Qj5oBKsv9i/wv
7px+rkpEN51mdYmDDeHcATFORsnrUfIyy/NFyXPw9Ccwj86T12peRL/CCmBt
x2+iKdPL2V+m2bSew14MfFeMAF16RVktYKVXhBcfXxwjDh72smLa+H7/6dN9
+fjo8eM9/Hg2PBltYvfKwB+qrqtsvEKslgdhdveIGsNDw0qbDM+hHgISG9gv
TXV0/vr49OPFm9MfT98c0vJrVc00HLU9aRhptLGPh+O8nD2cLWdDZS7psIe5
vtL5cFIWJkt1pdPhXFULOLrRvF7kPLIQ9314Lxk23ryfHLtXk1f8ap9e8+iA
/4byv7edCdL4YfJob/9guPfd8NEefPn+w+k7QI+/ng/3n+ztte8WMHm+YsoQ
8P3NBJ+AxlfaPMT34y2dZ7NC1atKJxPgH4iK8NtCJ5kBlErquQYsxp/vJ7qq
yiqB807UcgnMpqjzdXKl8ixNjB3kLhs/u1JF8krnebTdR4+H+3vDR08YdR4/
ebL3/Ox8+Mf9zt1aPmCR5Xr2sJpO8MVxZh4O7Y7/uB/t90QvK01cGbcG6JWU
0+Q+EF5y+mWZVQyACwDA/WSpJpe6NskOsrzk6S7C48fvcK/mLttsJXm320fD
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
dGVMZuuBJfWSw4H/F1OKqS2PogAA

-->

</rfc>

