<?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;">

]>


<rfc ipr="trust200902" docName="draft-gallagher-openpgp-signatures-01" category="std" consensus="true" submissionType="IETF" updates="9580" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title>OpenPGP Signatures and Signed Messages</title>

    <author fullname="Andrew Gallagher" role="editor">
      <organization>PGPKeys.EU</organization>
      <address>
        <email>andrewg@andrewg.com</email>
      </address>
    </author>

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

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

    <abstract>


<?line 100?>

<t>This document specifies several updates and clarifications to the OpenPGP signature and message format specifications.</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-signatures"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-gallagher-openpgp-signatures/"/>.
      </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-signatures"/>.</t>
    </note>


  </front>

  <middle>


<?line 104?>

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

<t>OpenPGP signatures have a rich vocabulary, however this is often under-specified.
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>
  <t>Constraining the formal message grammar.</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 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>

<t>The semantic distinctions between the certification signature types were left ill-defined and most software treats them as equivalent.
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>0x11 Persona Certification is deprecated and <bcp14>SHOULD NOT</bcp14> be created.</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="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>

</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 <xref target="RFC4880"></xref>.
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.</t>

<t>(See also <xref target="key-flags"/>)</t>

</section>
<section anchor="timestamp-signature"><name>Timestamp Signature (0x40)</name>

<t><xref section="6.2.1" sectionFormat="of" target="RFC1991"/> defined the Timestamp signature as:</t>

<ul empty="true"><li>
  <t>&lt;40&gt; - time stamping ("I saw this document")</t>

  <t>Type &lt;40&gt; is intended to be a signature of a signature, as a notary seal on a signed document.</t>
</li></ul>

<t>The second statement implies that a v3 0x40 sig is made over a signature packet.
But the first statement implies a signature over a document, just with different semantics.</t>

<t>By <xref section="5.2.1.14" sectionFormat="of" target="RFC9580"/>, this has changed to:</t>

<ul empty="true"><li>
  <t>0x40: Timestamp signature.
This signature is only meaningful for the timestamp contained in it.</t>
</li></ul>

<t>This avoids the apparent contradiction of <xref target="RFC1991"></xref>, but is less informative.
And there is no explicit construction given in <xref section="5.2.4" sectionFormat="of" target="RFC9580"/>.</t>

<t>We note also that <xref target="RFC9580"></xref> introduced a Key Flag for timestamping.
This indicates that timestamping documents is sufficiently different from signing them that separate keys should be used.
This is consistent with the idea that "I wrote this document" and "I saw this document" are distinct statements with different consequences.
This is crucial in the case of an automated timestamping service that makes no claims about the accuracy of document contents.</t>

<t>We define type 0x40 Timestamp signatures as follows:</t>

<ul empty="true"><li>
  <t>A type 0x40 Timestamp signature is made over a Literal Data Packet, and is constructed the same way as a type 0x00 Binary Document Signature.
If the message is a text document, it <bcp14>MUST</bcp14> already be in Canonical Text form.
By default a Timestamp signature conveys no opinion about the validity of the document; it only claims that the document existed at the timestamp of signature creation.
This interpretation <bcp14>MAY</bcp14> be modified by adding notation subpackets, the meaning of which are application-dependent.
It can be made over an otherwise unsigned document, or it can be one of many signatures over the same document.
The Cleartext Signature Framework <bcp14>MUST NOT</bcp14> be used with Timestamp signatures.</t>
</li></ul>

<t>Countersigning a Signature packet only (including blind countersigning) is done using the type 0x50 Third Party Confirmation signature.</t>

</section>
<section anchor="tpc-signature"><name>Third Party Confirmation Signature (0x50)</name>

<t><xref section="5.2.1.15" sectionFormat="of" target="RFC9580"/> defines a Third-Party Confirmation signature as:</t>

<ul empty="true"><li>
  <t>This signature is a signature over some other OpenPGP Signature packet(s).
It is analogous to a notary seal on the signed data.
A Third-Party Confirmation signature <bcp14>SHOULD</bcp14> include a Signature Target subpacket that identifies the confirmed signature.</t>
</li></ul>

<t>A concrete construction is provided, but the placement and semantics are still not well-defined.
We clarify these as follows:</t>

<ul empty="true"><li>
  <t>By default, a Third Party Confirmation signature makes no claim about the validity of the other signature, just its existence, and makes no claim whatsoever about the subject of that signature.
This interpretation <bcp14>MAY</bcp14> be modified by adding notation subpackets, the meaning of which are application-dependent.
It <bcp14>MAY</bcp14> be included in an Embedded Signature packet in the unhashed area of the signature it notarises; if it is so located, a Signature Target <bcp14>SHOULD NOT</bcp14> be included.
Otherwise, it <bcp14>SHOULD</bcp14> be distributed as a detached signature.</t>
</li></ul>

<section anchor="signature-target-subpacket"><name>Signature Target Subpacket</name>

<t>The Signature Target subpacket is not a unique identifier of a signature packet <xref target="REVOC-13"></xref> and so does not fulfil its design goals.</t>

<t>It is deprecated for use in revocation signatures by <xref target="I-D.dkg-openpgp-revocation"></xref> ((TBC: this is just an issue for now, not in the draft)), and we hereby deprecate it entirely.</t>

<t>((TODO: use the Approved Certifications subpacket instead! But rename it to "target signatures"...))</t>

</section>
<section anchor="tpc-signature-applications"><name>Use of Third Party Confirmation Signatures by Applications</name>

<t>We may wish to allow the application layer to make validity claims using countersignatures.
For example, a key server may wish to record that it has verified a User ID by automated means.
The key server may not wish to make a Certification signature, to prevent the cumulation of many such automated signatures (<xref target="cumulation-of-signatures"/>).
For the same reason, it may not wish to embed its countersignature in an unhashed area of a signature packet in the certificate.</t>

<t>It could make a Third-Party Confirmation signature over the most recent self-certification, and distribute it as a detached signature, perhaps in a mixed keyring (<xref section="8.1" sectionFormat="of" target="I-D.gallagher-openpgp-hkp"/>).</t>

<t>((TBC))</t>

</section>
</section>
</section>
<section anchor="message-grammar"><name>Message Grammar</name>

<t>The accepted convention is that a prefixed Signature packet signs over the next literal packet only, skipping any intervening signatures - however this is not explicitly specified in <xref target="RFC9580"></xref>.
Historically, PGP 2.X treated a prefixed Signature packet as applying to the entire following sequence of packets, but this usage is deprecated <xref target="FINNEY1998"></xref>.
See <xref target="nested-signatures"/> for an alternative construction.</t>

<t>In addition, One-Pass Signature (OPS) nesting semantics are complex, and under-specified <xref target="SCHAUB2022"></xref>.
<xref section="5.4" sectionFormat="of" target="RFC9580"/> defines the nesting octet as:</t>

<ul empty="true"><li>
  <t>A 1-octet number holding a flag showing whether the signature is nested.
A zero value indicates that the next packet is another One-Pass Signature packet that describes another signature to be applied to the same message data.</t>
</li></ul>

<t>The terminology is imprecise, and non-zero "nesting" flags are completely unspecified.
One self-consistent interpretation is as follows:</t>

<t><list style="symbols">
  <t>A zero nesting octet means that the following OPS and its counterpart signature are not signed over by the current OPS.
  <list style="symbols">
      <t>This process is recursive if multiple sequential OPS packets have a nesting octet of zero.</t>
    </list></t>
  <t>To add multiple OPS signatures over the same message data, all OPS constructions except the innermost one have the nesting octet zeroed.
  <list style="symbols">
      <t>It is not clear what happens if the innermost nesting octet is zero but no OPS packet follows.</t>
    </list></t>
</list></t>

<t>The above implies that an OPS with a nonzero nesting octet signs over all packets between the OPS packet and its matching signature packet, including any further signatures, however it is not clear whether any current implementation supports this.</t>

<t>This is further expanded in <xref target="OPENPGPDEVBOOK"></xref>.</t>

<t>This still leaves us with an overly complex grammar that resists rigorous formalisation.
We attempt to improve the formalism below.</t>

<section anchor="ops-message-constraints"><name>OPS Message Constraints</name>

<t>We constrain OPS structures to a subset of previously-allowed configurations:</t>

<t><list style="symbols">
  <t>A prefixed Signature packet signs over the next literal or compressed packet, ignoring any intervening signature or OPS packets.</t>
  <t>Prefixed signatures and OPS signatures <bcp14>MUST NOT</bcp14> both be used in the same message.</t>
  <t>When generating a version 4 OPS packet that is not followed by another OPS packet, the nesting octet <bcp14>SHOULD</bcp14> be set to 1.
  <list style="symbols">
      <t>Otherwise, the nesting octet <bcp14>SHOULD</bcp14> be set to 0.</t>
    </list></t>
  <t>When consuming an OPS packet, the nesting octet <bcp14>MUST</bcp14> be ignored.</t>
</list></t>

<t>This effectively deprecates the nesting octet, while maintaining backwards compatibility with legacy code.</t>

</section>
<section anchor="subject-normalisation"><name>Subject Normalisation</name>

<t>The <em>subject</em> of an OpenPGP signature refers to the packet(s) that are signed over.
The <em>type-specific data</em> of an OpenPGP signature refers to the section of the data stream that is passed to the signature's digest function after the optional salt and before the trailer.
The type-specific data differs from the subject in that it has been normalised, the details of which are dependent on the signature type.</t>

<t>The subject of a signature in the Literal Data category (<xref target="signature-categories"/>) is the Literal Data packet that immediately follows one or more prefixed signatures, or is enclosed by one or more OPS constructions.
The Literal Data packet <bcp14>MAY</bcp14> be encoded in a Compressed Data packet.
If no Literal Data or Compressed Data packet is present, or if the Compressed Data packet does not decompress to a Literal packet, the signature is malformed.</t>

<t>The following normalisation steps are applied to the subject of the signature to produce the type-specific data:</t>

<t><list style="symbols">
  <t>Any Compressed Data packet is replaced by its uncompressed contents, which <bcp14>MUST</bcp14> be a Literal Data packet.</t>
  <t>The framing of the Literal Data packet is discarded, and any partial-length packets are concatenated.</t>
  <t>If the Signature Type is 0x01, the Literal Data packet body is converted to Canonical Text, by converting line endings to CRLF and removing any trailing whitespace.</t>
</list></t>

<t>A One-Pass Signature over a Literal Data packet, a prefixed Signature over the same packet, and a detached signature over a file containing the body of the same packet are all calculated the same way.
This means that they can be losslessly transformed into each other with the exception of the Literal Data metadata fields, which an application <bcp14>MAY</bcp14> assume contain their recommended default values as per <xref section="5.9" sectionFormat="of" target="RFC9580"/>.</t>

</section>
<section anchor="nested-signatures"><name>Nested Signatures</name>

<t>To sign over an entire signed message together with its signatures, the wire format of the inner message <bcp14>SHOULD</bcp14> first be encapsulated in a Literal Data packet.
A Canonical Text signature <bcp14>MUST NOT</bcp14> be made over such a nested message, and the Cleartext Signature Framework <bcp14>MUST NOT</bcp14> be used.</t>

<t>Beware that the outer signature will thus be sensitive to the inner message's packet framing, i.e. the otherwise inconsequential choice of packet header format and partial body lengths.
If the inner message is parsed and re-serialised unmodified, but using a different framing, the outer signature will no longer validate.</t>

</section>
<section anchor="formal-grammar"><name>Formal Grammar</name>

<t>The message grammar in <xref section="10.3" sectionFormat="of" target="RFC9580"/> is therefore updated to:</t>

<t><list style="symbols">
  <t>OpenPGP Message:<br />
  Encrypted Message | Unencrypted Message.</t>
  <t>Unencrypted Message:<br />
  Signed Message | Unsigned Message.</t>
  <t>Unsigned Message:<br />
  Compressed Message | Literal Message.</t>
  <t>Compressed Message:<br />
  Compressed Data Packet.</t>
  <t>Literal Message:<br />
  Literal Data Packet.</t>
  <t>ESK:<br />
  Public Key Encrypted Session Key Packet | Symmetric Key Encrypted Session Key Packet.</t>
  <t>ESK Sequence:<br />
  ESK | ESK Sequence, ESK.</t>
  <t>Encrypted Data:<br />
  Symmetrically Encrypted Data Packet | Symmetrically Encrypted and Integrity Protected Data Packet.</t>
  <t>Encrypted Message:<br />
  Encrypted Data | ESK Sequence, Encrypted Data.</t>
  <t>Nested One-Pass Signed Message:<br />
  Nested One-Pass Signature Packet, One-Pass Signed Message, Corresponding Signature Packet.</t>
  <t>Literal Body One-Pass Signed Message:<br />
  Literal Body One-Pass Signature Packet, Unsigned Message, Corresponding Signature Packet.</t>
  <t>Verbatim One-Pass Signed Message:<br />
  Verbatim One-Pass Signature Packet, Unencrypted Message, Corresponding Signature Packet.</t>
  <t>One-Pass Signed Message:<br />
  Nested One-Pass Signed Message | Literal Body One-Pass Signed Message | Verbatim One-Pass Signed Message.</t>
  <t>Signed Message:<br />
  Signature Packet, Unencrypted Message | One-Pass Signed Message.</t>
  <t>Optionally Padded Unencrypted Message:<br />
  Unencrypted Message | Unencrypted Message, Padding Packet.</t>
</list></t>

<t>In addition to these rules, a Marker packet (<xref section="5.8" sectionFormat="of" target="RFC9580"/>) can appear anywhere in the sequence.</t>

</section>
<section anchor="unwrapping-encrypted-and-compressed-messages"><name>Unwrapping Encrypted and Compressed Messages</name>

<t><xref target="RFC9580"></xref> permits an encrypted message to contain another encrypted message, and a compressed message to contain another compressed message, possibly recursively.
Such messages require potentially unbounded resources for negligible added utility, and therefore <bcp14>MUST NOT</bcp14> be created.</t>

<t>In addition, encrypt-then-sign messages are not idiomatic OpenPGP, and <bcp14>SHOULD NOT</bcp14> be generated.</t>

<t>The guidance in <xref section="10.3.1" sectionFormat="of" target="RFC9580"/> is therefore updated to:</t>

<t><list style="symbols">
  <t>Decrypting a version 2 Symmetrically Encrypted and Integrity Protected Data packet <bcp14>MUST</bcp14> yield a valid Optionally Padded Unencrypted Message.</t>
  <t>Decrypting a version 1 Symmetrically Encrypted and Integrity Protected Data packet or -- for historic data -- a Symmetrically Encrypted Data packet <bcp14>MUST</bcp14> yield a valid Unencrypted Message.</t>
  <t>Decompressing a Compressed Data packet <bcp14>MUST</bcp14> yield a valid Literal Message.</t>
</list></t>

<t>((TODO: is this too constraining on compressed data packet contents?))</t>

</section>
<section anchor="marker-packet"><name>Marker Packet</name>

<t><xref section="5.8" sectionFormat="of" target="RFC9580"/> defines the Marker Packet as follows:</t>

<ul empty="true"><li>
  <t>The body of the Marker packet consists of:</t>

  <t><list style="symbols">
    <t>The three octets 0x50, 0x47, 0x50 (which spell "PGP" in UTF-8).</t>
  </list></t>

  <t>Such a packet <bcp14>MUST</bcp14> be ignored when received.</t>
</li></ul>

<t>We update this to include:</t>

<t><list style="symbols">
  <t>If a receiving implementation encounters a Marker Packet with any other contents, the entire packet sequence <bcp14>SHOULD</bcp14> be ignored.</t>
  <t>A Marker Packet <bcp14>MAY</bcp14> be added by an application to notify non-OpenPGP software that a data stream contains OpenPGP data.
  If so, the Marker Packet <bcp14>SHOULD</bcp14> be the first packet in the sequence, and <bcp14>SHOULD NOT</bcp14> use a Legacy header, so that it can be easily detected.</t>
</list></t>

</section>
</section>
<section anchor="recursive-embedding"><name>Recursive embedding inside Signature Subpackets</name>

<t><xref section="5.2.3" sectionFormat="of" target="RFC9580"/> specifies two subpackets which could recursively include a signature inside a signature:</t>

<t><list style="symbols">
  <t>Embedded Signature (type 32): contains a signature packet</t>
  <t>Key Block (type 38, experimental): contains an entire certificate, which may itself include signature packets</t>
</list></t>

<t>We wish to prevent infinite recursion via embedded signatures, in order to avoid resource exhaustion.
This can be achieved as follows:</t>

<t><list style="symbols">
  <t>Signatures contained within Embedded Signature subpackets <bcp14>MUST NOT</bcp14> contain any Embedded Signature subpackets:
  <list style="symbols">
      <t>An Embedded Signature subpacket <bcp14>MUST</bcp14> contain a signature of an Embeddable signature type.</t>
      <t>An Embeddable signature <bcp14>MUST NOT</bcp14> contain Embedded Signature subpackets.</t>
      <t>Initially, only the Primary Key Binding and Third Party Confirmation signature types are specified as Embeddable.</t>
    </list></t>
  <t>A Key Block subpacket <bcp14>MUST</bcp14> only be used inside a signature type in the Literal Data Signature Category.</t>
</list></t>

<t>((TODO: Key Block allows us to smuggle a key into the OpenPGP layer without requiring support by the application layer.
We could instead update the message grammar to allow TPKs to be appended to a Literal Message.
Going further, we could unify the packet sequence grammar so that there is only one kind of sequence, which would include both messages and keyrings.
See also "mixed keyrings" in <xref section="8.1" sectionFormat="of" target="I-D.gallagher-openpgp-hkp"/>.))</t>

</section>
<section anchor="signature-categories"><name>Signature Categories</name>

<t>Signature Type code points are spaced out into identifiable ranges of types with similar semantics.
These also mostly correspond to the various Key Flags.
These ranges and their mapping to the Key Flags are not specified in <xref target="RFC9580"></xref>.</t>

<t>We define Signature Categories to cover each range of type values:</t>

<t><list style="symbols">
  <t>Literal Data Signature Category (0x00..0x07)
  <list style="symbols">
      <t>0x00 Signature over a Binary document</t>
      <t>0x01 Signature over a Canonical Text document</t>
      <t>0x02 Standalone signature (null document)</t>
    </list></t>
  <t>Unassigned (0x08..0x0F)</t>
  <t>Certification Category (0x10..0x17)
  <list style="symbols">
      <t>0x10 Generic certification</t>
      <t>0x11 Persona certification</t>
      <t>0x12 Casual certification</t>
      <t>0x13 Positive certification</t>
      <t>(0x16 Approved certifications)</t>
    </list></t>
  <t>Key Binding Category (0x18..0x1F)
  <list style="symbols">
      <t>0x18 Subkey bind</t>
      <t>0x19 Primary key bind</t>
      <t>0x1F Direct key (self bind)</t>
    </list></t>
  <t>Primary Key Revocation Category (0x20..0x27)
  <list style="symbols">
      <t>0x20 Primary Key revocation</t>
    </list></t>
  <t>Subkey Revocation Category (0x28..0x2F)
  <list style="symbols">
      <t>0x28 Subkey revocation</t>
    </list></t>
  <t>Certification Revocation Category (0x30..0x37)
  <list style="symbols">
      <t>0x30 Certification revocation</t>
    </list></t>
  <t>Unassigned (0x38..0x3F)</t>
  <t>Timestamping Category (0x40..0x47)
  <list style="symbols">
      <t>0x40 Timestamp</t>
    </list></t>
  <t>Unassigned (0x48..0x4F)</t>
  <t>Countersignature Category (0x50..0x57)
  <list style="symbols">
      <t>0x50 Third party confirmation</t>
    </list></t>
  <t>Unassigned (0x58..0x5F)</t>
  <t>Private and Experimental Range (0x60..0x6F)</t>
  <t>Unassigned (0x70..0xFE)</t>
  <t>RESERVED (0xFF)</t>
</list></t>

<t>We have defined a Private and Experimental signature type range.
This is 0x60..0x6F (96..111) for consistency with the existing private and experimental range in other registries.
It does not form a Category and does not have a corresponding Key Flag.</t>

<t>Self-certifications over v4 Primary User IDs are used to convey the same information as Key Binding signatures.
Therefore, unless specifically stated otherwise, any stipulations that apply to Key Binding signatures also apply to self-certifications over v4 Primary User IDs.</t>

<section anchor="key-flags"><name>Key Flags</name>

<t>A Key Flags subpacket <bcp14>SHOULD</bcp14> be included in a Direct Key or Subkey Binding signature (or for v4 keys, a self-certification over the primary User ID).
It applies only to a single key material packet; for a Direct Key signature (or primary User ID self-cert) it applies to the primary key only, and for a Subkey Binding signature, it applies only to that subkey.</t>

<t>Previously, it was also specified for use in third-party Certification Signatures.
This is not widely supported and is hereby deprecated.</t>

<t>The following Key Flags permit the creation of signatures in one or more Signature Categories:</t>

<t><list style="symbols">
  <t>0x01.. Third-party signatures in the Certification and Certification Revocation Categories</t>
  <t>0x02.. Literal Data Signature Category</t>
  <t>0x0008.. Timestamping Category</t>
  <t>((TBC)) Primary Key Revocation Category</t>
  <t>((TBC)) Countersignature Category</t>
</list></t>

<t>The following exceptional usages are always permitted regardless of Key Flags:</t>

<t><list style="symbols">
  <t>Primary keys are always permitted to make self-signatures in the Certification, Key Binding, Certification Revocation, Key Revocation and Subkey Revocation Categories.</t>
  <t>Subkeys with signing-capable algorithms are always permitted to make Primary Key Binding signatures.</t>
  <t>Any key is permitted to make a signature in the Private and Experimental range.</t>
</list></t>

<t>Otherwise:</t>

<t><list style="symbols">
  <t>A signature made by a key that does not have the corresponding Key Flag <bcp14>MUST</bcp14> be considered invalid.</t>
  <t>A key with no Key Flags subpacket <bcp14>MUST NOT</bcp14> create signatures.</t>
</list></t>

<t><xref section="5.2.1.10" sectionFormat="of" target="RFC9580"/> also explicitly allows keys with the 0x01 Key Flag to create third-party 0x1F Direct Key Signatures.
This is not widely supported and is hereby deprecated.</t>

</section>
<section anchor="authentication-signatures"><name>Authentication Signatures</name>

<t>OpenPGP defines no authentication signature types, but does have an authentication Key Flag.
Traditionally, authentication is performed by converting the key material into that of another protocol (usually OpenSSH) and performing authentication in that protocol.</t>

<t>It should be noted that cross-protocol usage can be exploited to evade the domain separation protections of Key Flags.
For example, there is no distinction between signature, certification and authentication usage in OpenSSH, and once converted an OpenPGP authentication key may be used as a OpenSSH CA or to sign git commits.</t>

<t>((TODO: Guidance for the use of authentication keys should be provided.))</t>

</section>
</section>
<section anchor="signature-subpacket-categories"><name>Signature Subpacket Categories</name>

<t>Signature subpacket types may also be categorised, depending on where they are used:</t>

<section anchor="general-subpackets"><name>General subpackets.</name>

<t>These may be attached to any signature type, and define properties of the signature itself.
Some of these subpackets are self-verifying (SV), i.e. they contain hints to locate the issuing key that can be confirmed after the fact.
It <bcp14>MAY</bcp14> be reasonable to place self-verifying general subpackets in the unhashed area.
All other general subpackets <bcp14>MUST</bcp14> be placed in the hashed area.</t>

<t>Subpacket types: Signature Creation Time, Signature Expiration Time, Issuer Key ID (SV), Notation Data, Signer's User ID, Issuer Fingerprint (SV).</t>

<t>(Notation subpackets are categorised here as general subpackets, however the notations within them may have arbitrary semantics at the application layer)</t>

</section>
<section anchor="context-subpackets"><name>Context subpackets.</name>

<t>These have semantics that are meaningful only when used in signatures of a particular type or category:</t>

<section anchor="direct-subpackets"><name>Direct subpackets.</name>

<t>These are normally only meaningful in a direct self-sig (or for v4 keys, a self-cert over the primary User ID) and define usage preferences for the certificate as a whole.
They <bcp14>MAY</bcp14> be used in self-certs over other User IDs, in which case they define usage preferences for just that User ID (but this is not always meaningful or universally supported).
The Replacement Key subpacket <bcp14>MAY</bcp14> also be used as a key revocation subpacket.
They <bcp14>SHOULD NOT</bcp14> be used elsewhere.
They <bcp14>MUST</bcp14> be placed in the hashed area.</t>

<t>A Direct subpacket <bcp14>MUST</bcp14> be ignored if it is in a self-cert made over a User ID by a v6 or later primary key.</t>

<t>Subpacket types: (Additional Decryption Key), Preferred Symmetric Ciphers, Revocation Key (deprecated), Preferred Hash Algorithms, Preferred Compression Algorithms, Key Server Preferences, Preferred Key Server, Features, (Preferred AEAD Algorithms), Preferred AEAD Ciphersuites, (Replacement Key).</t>

</section>
<section anchor="revocation-subpackets"><name>Revocation subpackets.</name>

<t>These are only meaningful in signatures of the Key Revocation, Subkey Revocation or Certificate Revocation categories.
They <bcp14>SHOULD NOT</bcp14> be used elsewhere.
They <bcp14>MUST</bcp14> be placed in the hashed area.</t>

<t>Subpacket types: Reason for Revocation.</t>

</section>
<section anchor="key-binding-subpackets"><name>Key Binding subpackets.</name>

<t>These are only meaningful in a signature of the Key Binding category (or for v4 keys, a self-cert over the primary User ID) and define properties of that particular component key.
They <bcp14>SHOULD NOT</bcp14> be used elsewhere.
They <bcp14>MUST</bcp14> be placed in the hashed area.</t>

<t>A Key Binding subpacket <bcp14>MUST</bcp14> be ignored if it is in a self-cert over a User ID that is not currently the primary User ID, or in a self-cert made over a User ID by a v6 or later primary key.</t>

<t>Subpacket types: Key Expiration Time, Key Flags.</t>

</section>
<section anchor="first-party-certification-subpackets"><name>First-party Certification subpackets.</name>

<t>These are only meaningful in a self-certification over a User ID, and define properties of that User ID.
They <bcp14>SHOULD NOT</bcp14> be used elsewhere.
They <bcp14>MUST</bcp14> be placed in the hashed area.</t>

<t>Subpacket types: Primary User ID</t>

</section>
<section anchor="third-party-certification-subpackets"><name>Third-party Certification subpackets.</name>

<t>These are only meaningful in third-party certification signatures and define properties of the Web of Trust.
They <bcp14>SHOULD NOT</bcp14> be used elsewhere.
They <bcp14>MUST</bcp14> be placed in the hashed area.</t>

<t>Subpacket types: Exportable Certification, Trust Signature, Regular Expression, Revocable, Policy URI, (Trust Alias).</t>

</section>
<section anchor="literal-data-subpackets"><name>Literal Data subpackets.</name>

<t>These are only meaningful in signatures of the Literal Data category, and define properties of the document or message.
They <bcp14>SHOULD NOT</bcp14> be used elsewhere.
Some of these subpackets are self-verifying (SV) and <bcp14>MAY</bcp14> be placed in the unhashed area.
All other Literal Data subpackets <bcp14>MUST</bcp14> be placed in the hashed area.
(Beware that the usefulness of all of these subpackets has been questioned)</t>

<t>Subpacket types: Intended Recipient Fingerprint, (Key Block (SV)), (Literal Data Meta Hash).</t>

</section>
<section anchor="attribute-value-subpackets"><name>Attribute Value subpackets.</name>

<t>These are only meaningful in signature types whose specification explicitly requires them.
They <bcp14>SHOULD NOT</bcp14> be used elsewhere.
They have no intrinsic semantics; all semantics are defined by the enclosing signature.</t>

<t>Subpacket types: Signature Target, Embedded Signature, (Delegated Revoker), (Approved Certifications).</t>

</section>
</section>
<section anchor="subpackets-summary"><name>Subpackets summary</name>

<texttable title="OpenPGP Signature Subpacket Types" anchor="subpacket-types">
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Category</ttcol>
      <ttcol align='left'>Critical</ttcol>
      <ttcol align='left'>Self-Verifying</ttcol>
      <ttcol align='left'>Context</ttcol>
      <ttcol align='left'>Notes</ttcol>
      <c>0</c>
      <c>Reserved</c>
      <c>-</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>never used</c>
      <c>1</c>
      <c>Reserved</c>
      <c>-</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>never used</c>
      <c>2</c>
      <c>Signature Creation Time</c>
      <c>General</c>
      <c><bcp14>SHOULD</bcp14></c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c><bcp14>MUST</bcp14> always be present in hashed area</c>
      <c>3</c>
      <c>Signature Expiration Time</c>
      <c>General</c>
      <c><bcp14>SHOULD</bcp14></c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>4</c>
      <c>Exportable Certification</c>
      <c>Third Party</c>
      <c><bcp14>MUST</bcp14> IFF false</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>boolean, default true</c>
      <c>5</c>
      <c>Trust Signature</c>
      <c>Third Party</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>6</c>
      <c>Regular Expression</c>
      <c>Third Party</c>
      <c><bcp14>SHOULD</bcp14></c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>7</c>
      <c>Revocable</c>
      <c>Third Party</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>boolean, default false (deprecated in <xref target="I-D.dkg-openpgp-revocation"></xref>)</c>
      <c>8</c>
      <c>Reserved</c>
      <c>-</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>never used</c>
      <c>9</c>
      <c>Key Expiration Time</c>
      <c>Key Binding</c>
      <c><bcp14>SHOULD</bcp14></c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>10</c>
      <c>(Additional Decryption Key/ARR)</c>
      <c>Key Binding</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>PGP.com proprietary feature</c>
      <c>11</c>
      <c>Preferred Symmetric Ciphers</c>
      <c>Direct</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>12</c>
      <c>Revocation Key (deprecated)</c>
      <c>Direct</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>13-15</c>
      <c>Reserved</c>
      <c>-</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>never used</c>
      <c>16</c>
      <c>Issuer Key ID</c>
      <c>General</c>
      <c>&#160;</c>
      <c>Yes</c>
      <c>&#160;</c>
      <c>issuer fingerprint is preferred</c>
      <c>17-19</c>
      <c>Reserved</c>
      <c>-</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>never used</c>
      <c>20</c>
      <c>Notation Data</c>
      <c>General</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>notations may be further classified</c>
      <c>21</c>
      <c>Preferred Hash Algorithms</c>
      <c>Direct</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>22</c>
      <c>Preferred Compression Algorithms</c>
      <c>Direct</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>23</c>
      <c>Key Server Preferences</c>
      <c>Direct</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>24</c>
      <c>Preferred Key Server</c>
      <c>Direct</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>25</c>
      <c>Primary User ID</c>
      <c>First Party</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>boolean, default false</c>
      <c>26</c>
      <c>Policy URI</c>
      <c>Third Party</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>(effectively a human-readable notation)</c>
      <c>27</c>
      <c>Key Flags</c>
      <c>Key Binding</c>
      <c><bcp14>SHOULD</bcp14></c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>28</c>
      <c>Signer's User ID</c>
      <c>General</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>29</c>
      <c>Reason for Revocation</c>
      <c>Revocation</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>free text field is effectively a human-readable notation</c>
      <c>30</c>
      <c>Features</c>
      <c>Direct</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>31</c>
      <c>Signature Target</c>
      <c>Attr Value</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>0x50 3-p conf</c>
      <c>not a unique identifier <xref target="REVOC-13"></xref></c>
      <c>32</c>
      <c>Embedded Signature</c>
      <c>Attr Value</c>
      <c>&#160;</c>
      <c>Yes IFF it contains an 0x19 signature</c>
      <c>0x18 sbind</c>
      <c>&#160;</c>
      <c>33</c>
      <c>Issuer Fingerprint</c>
      <c>General</c>
      <c>&#160;</c>
      <c>Yes</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>34</c>
      <c>(Preferred AEAD Algorithms)</c>
      <c>Direct</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c><xref target="I-D.ietf-openpgp-rfc4880bis"></xref></c>
      <c>35</c>
      <c>Intended Recipient Fingerprint</c>
      <c>Literal Data</c>
      <c><bcp14>SHOULD</bcp14></c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>36</c>
      <c>(Delegated Revoker)</c>
      <c>Attr Value</c>
      <c><bcp14>MUST</bcp14></c>
      <c>&#160;</c>
      <c>TBD</c>
      <c><xref target="I-D.dkg-openpgp-revocation"></xref></c>
      <c>37</c>
      <c>(Approved Certifications)</c>
      <c>Attr Value</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>0x16 1pa3pc</c>
      <c><xref target="I-D.dkg-openpgp-1pa3pc"></xref></c>
      <c>38</c>
      <c>(Key Block)</c>
      <c>Literal Data</c>
      <c>&#160;</c>
      <c>Yes</c>
      <c>&#160;</c>
      <c><xref target="I-D.ietf-openpgp-rfc4880bis"></xref></c>
      <c>39</c>
      <c>Preferred AEAD Ciphersuites</c>
      <c>Direct</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>40</c>
      <c>(Literal Data Meta Hash)</c>
      <c>Literal Data</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>not yet implemented <xref target="I-D.koch-librepgp"></xref></c>
      <c>41</c>
      <c>(Trust Alias)</c>
      <c>Third Party</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>not yet implemented <xref target="I-D.koch-librepgp"></xref></c>
      <c>TBD</c>
      <c>(Replacement Key)</c>
      <c>Direct</c>
      <c><bcp14>SHOULD NOT</bcp14></c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c><xref target="I-D.ietf-openpgp-replacementkey"></xref></c>
</texttable>

<t>Three subpacket types are Boolean, with different default values for when they are absent (two true, one false).
It is <bcp14>RECOMMENDED</bcp14> that these subpackets not be used to convey their default values, only the non-default value.
The default value <bcp14>SHOULD</bcp14> instead be conveyed by the absence of the subpacket.</t>

<t>Unless otherwise indicated, subpackets <bcp14>SHOULD NOT</bcp14> be marked critical.
In particular, a critical subpacket that invalidates a self-signature will leave the previous self-signature (or no self-signature!) as the most recent valid self-signature from the PoV of some receiving implementations.
A generating implementation <bcp14>MUST</bcp14> be sure that all receiving implementations will behave as intended if a signature containing a critical subpacket is invalidated.
Otherwise, with the possible exception of Literal Data signatures, it is <bcp14>NOT RECOMMENDED</bcp14> to set the critical bit.</t>

<t>It is <bcp14>RECOMMENDED</bcp14> that a signature's creator places all subpackets in the hashed area, even self-verifying subpackets for which this is not strictly necessary.
The unhashed area <bcp14>MAY</bcp14> be used for informational subpackets attached by third parties (which can be safely stripped).</t>

</section>
<section anchor="guidance-for-management-of-the-signature-subpacket-registry"><name>Guidance for management of the Signature Subpacket Registry</name>

<t><list style="symbols">
  <t>Future boolean subpackets <bcp14>SHOULD NOT</bcp14> contain an explicit value; a value of TRUE <bcp14>SHOULD</bcp14> be indicated by the presence of the subpacket, and FALSE otherwise.</t>
  <t>Specification of new subpackets <bcp14>SHOULD</bcp14> address classification, criticality and self-verification as outlined above.</t>
  <t>Subpackets <bcp14>SHOULD</bcp14> be implemented in the private/experimental area first, then reassigned to a permanent code point.</t>
</list></t>

</section>
<section anchor="unhashed-subpacket-deduplication"><name>Unhashed Subpacket Deduplication</name>

<t>Unhashed subpacket areas are malleable and so may have subpackets added or removed in transit, either innocently or maliciously.
A receiving implementation <bcp14>SHOULD</bcp14> clean the unhashed area of subpackets that are not meaningful or trustworthy outside the hashed area.
If two signature packets are bitwise identical apart from differences in their unhashed subpacket areas, an implementation <bcp14>MAY</bcp14> merge them into a single signature.
If two unhashed subpackets in the merged signature are bitwise identical, they <bcp14>MUST</bcp14> be deduplicated.
Otherwise, the unhashed subpacket area of the merged signature <bcp14>SHOULD</bcp14> contain the useful subpackets from both original signatures, even if this means multiple subpackets of the same type.</t>

</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>Cryptographic Validation (the signature data was calculated correctly)</t>
  <t>Structural Validation (the signature packet is placed in the correct context)</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="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>
</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>

</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 (Subkey Binding signatures, Primary Key Binding signatures, Direct Key signatures, BUT NOT self-certifications over v4 Primary User IDs) <bcp14>SHOULD NOT</bcp14> contain Signature Expiration Time subpackets.</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; 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>, and <xref target="REVOC-19"></xref>).</t>

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

<t>It is not customary for Certification signatures, even self-certifications over v4 Primary User IDs, to contain Key Expiration Time subpackets.
Instead, the Signature Expiration Time subpacket is used.
In addition, User IDs and User Attributes do not contain a creation time field.
Together, this means that we cannot solve the temporal validity issue for Certifications as easily as we did for Key Bindings.</t>

<t>One possible solution is specified in <xref section="5" sectionFormat="of" target="I-D.gallagher-openpgp-user-attributes"/>.</t>

</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 (see <xref target="I-D.dkg-openpgp-revocation"></xref>).</t>

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

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

<t>The OPS Subject Type octet is not signed over and is malleable in principle.
An intermediary could swap a Nested OPS with its inner OPS by also swapping the type octets.
The order of OPS nesting therefore <bcp14>MUST NOT</bcp14> be considered meaningful.</t>

<t>In addition, the normalisation applied during Literal Body signature calculation may result in semantic collisions.
It is possible to construct distinct sequences of packets that map to the same sequence of octets after Literal Body normalisation is applied.
It is not known whether such a pair of colliding packet sequences might also have different semantics.</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 add a column to the OpenPGP Signature Types registry, called "Embeddable".
This column should be empty by default.</t>

<t>IANA is requested to register the following new entry in the registry:</t>

<texttable title="OpenPGP Signature Types (new)" anchor="signature-types-new">
      <ttcol align='left'>ID</ttcol>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Embeddable</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>0x60-0x6F</c>
      <c>Private or Experimental Use</c>
      <c>&#160;</c>
      <c><xref target="signature-categories"/></c>
</texttable>

<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 (Deprecated)</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="recursive-embedding"/></c>
      <c>0x20</c>
      <c>Primary Key Revocation Signature</c>
      <c>&#160;</c>
      <c><xref target="RFC9580"></xref>, <xref target="primary-key-revocation-signature"/></c>
      <c>0x40</c>
      <c>Timestamp Signature</c>
      <c>&#160;</c>
      <c><xref target="RFC9580"></xref>, <xref target="timestamp-signature"/></c>
      <c>0x50</c>
      <c>Third Party Confirmation Signature</c>
      <c>Yes</c>
      <c><xref target="RFC9580"></xref>, <xref target="tpc-signature"/>, <xref target="recursive-embedding"/></c>
</texttable>

</section>
<section anchor="openpgp-key-flags-registry"><name>OpenPGP Key Flags Registry</name>

<t>IANA is requested to register the following new entries in the OpenPGP Key Flags registry:</t>

<texttable title="OpenPGP Key Flags (new)" anchor="key-flags-new">
      <ttcol align='left'>Flag</ttcol>
      <ttcol align='left'>Definition</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>((TBC))</c>
      <c>This key may be used to make signatures in the Primary Key Revocation Category (0x20..0x27)</c>
      <c><xref target="signature-categories"/>, <xref target="I-D.dkg-openpgp-revocation"/></c>
      <c>((TBC))</c>
      <c>This key may be used to make signatures in the Countersignature Category (0x50..0x57)</c>
      <c><xref target="signature-categories"/></c>
</texttable>

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

<texttable title="OpenPGP Key Flags (update)" anchor="key-flags-update">
      <ttcol align='left'>Flag</ttcol>
      <ttcol align='left'>Definition</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>0x01..</c>
      <c>This key may be used to make signatures over other keys, in the Certification and Certification Revocation Categories (0x10..0x17 and 0x30..0x37)</c>
      <c><xref target="signature-categories"/></c>
      <c>0x02...</c>
      <c>This key may be used to make signatures in the Literal Data Signature Category (0x00..0x07)</c>
      <c><xref target="signature-categories"/></c>
      <c>0x0008...</c>
      <c>This key may be used to make signatures in the Timestamping Category (0x40..0x47)</c>
      <c><xref target="signature-categories"/></c>
</texttable>

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

<t>IANA is requested to add columns for "Category", "Critical", and "Self-Verifying" to the OpenPGP Signature Subpacket Types registry, and populate them with initial values as listed in <xref target="subpacket-types"/>.</t>

</section>
</section>


  </middle>

  <back>


    <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="I-D.ietf-openpgp-rfc4880bis">
   <front>
      <title>OpenPGP Message Format</title>
      <author fullname="Werner Koch" initials="W." surname="Koch">
         <organization>GnuPG e.V.</organization>
      </author>
      <author fullname="brian m. carlson" initials="B. M." surname="carlson">
         </author>
      <author fullname="Ronald Henry Tse" initials="R. H." surname="Tse">
         <organization>Ribose</organization>
      </author>
      <author fullname="Derek Atkins" initials="D." surname="Atkins">
         </author>
      <author fullname="Daniel Kahn Gillmor" initials="D. K." surname="Gillmor">
         </author>
      <date day="31" month="August" year="2020"/>
      <abstract>
	 <t>   { Work in progress to update the OpenPGP specification from RFC4880 }

   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.

   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>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-openpgp-rfc4880bis-10"/>
   
</reference>

<reference anchor="I-D.ietf-openpgp-replacementkey">
   <front>
      <title>OpenPGP Key Replacement</title>
      <author fullname="Daphne Shaw" initials="D." surname="Shaw">
         <organization>Jabberwocky Tech</organization>
      </author>
      <author fullname="Andrew Gallagher" initials="A." surname="Gallagher">
         <organization>PGPKeys.EU</organization>
      </author>
      <date day="3" month="February" year="2025"/>
      <abstract>
	 <t>   This document specifies a method in OpenPGP to suggest a replacement
   for an expired, revoked, or deprecated primary key.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-openpgp-replacementkey-03"/>
   
</reference>

<reference anchor="I-D.dkg-openpgp-revocation">
   <front>
      <title>Revocation in OpenPGP</title>
      <author fullname="Daniel Kahn Gillmor" initials="D. K." surname="Gillmor">
         <organization>ACLU</organization>
      </author>
      <date day="17" month="August" year="2023"/>
      <abstract>
	 <t>   Cryptographic revocation is a hard problem.  OpenPGP&#x27;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>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-dkg-openpgp-revocation-01"/>
   
</reference>

<reference anchor="I-D.dkg-openpgp-1pa3pc">
   <front>
      <title>First-Party Approved Third-Party Certifications in OpenPGP</title>
      <author fullname="Daniel Kahn Gillmor" initials="D. K." surname="Gillmor">
         <organization>ACLU</organization>
      </author>
      <date day="6" month="September" year="2024"/>
      <abstract>
	 <t>   An OpenPGP certificate can grow in size without bound when third-
   party certifications are included.  This document describes a way for
   the owner of the certificate to explicitly approve of specific third-
   party certifications, so that relying parties can safely prune the
   certificate of any unapproved certifications.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-dkg-openpgp-1pa3pc-02"/>
   
</reference>

<reference anchor="I-D.gallagher-openpgp-hkp">
   <front>
      <title>OpenPGP HTTP Keyserver Protocol</title>
      <author fullname="Daphne Shaw" initials="D." surname="Shaw">
         <organization>Jabberwocky Tech</organization>
      </author>
      <author fullname="Andrew Gallagher" initials="A." surname="Gallagher">
         <organization>PGPKeys.EU</organization>
      </author>
      <date day="31" month="December" year="2024"/>
      <abstract>
	 <t>   This document specifies a series of conventions to implement an
   OpenPGP keyserver using the Hypertext Transfer Protocol (HTTP).  As
   this document is a codification and extension of a protocol that is
   already in wide use, strict attention is paid to backward
   compatibility with these existing implementations.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-gallagher-openpgp-hkp-06"/>
   
</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="11" month="February" 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-00"/>
   
</reference>

<reference anchor="I-D.koch-librepgp">
   <front>
      <title>LibrePGP Message Format</title>
      <author fullname="Werner Koch" initials="W." surname="Koch">
         <organization>g10 Code GmbH</organization>
      </author>
      <author fullname="Ronald Henry Tse" initials="R. H." surname="Tse">
         <organization>Ribose</organization>
      </author>
      <date day="9" month="September" year="2024"/>
      <abstract>
	 <t>   This document specifies the message formats used in LibrePGP.
   LibrePGP is an extension of the OpenPGP format which provides
   encryption with public-key or symmetric cryptographic algorithms,
   digital signatures, compression and key management.

   This document is maintained in order to publish all necessary
   information needed to develop interoperable applications based on the
   LibrePGP 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.

   This document is based on: RFC 4880 (OpenPGP), RFC 5581 (Camellia in
   OpenPGP), and RFC 6637 (Elliptic Curves in OpenPGP).

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-koch-librepgp-02"/>
   
</reference>
<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="RFC4880">
  <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="D. Shaw" initials="D." surname="Shaw"/>
    <author fullname="R. Thayer" initials="R." surname="Thayer"/>
    <date month="November" year="2007"/>
    <abstract>
      <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>OpenPGP software uses a combination of strong public-key and symmetric cryptography to provide security services for electronic communications and data storage. These services include confidentiality, key management, authentication, and digital signatures. This document specifies the message formats used in OpenPGP. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="4880"/>
  <seriesInfo name="DOI" value="10.17487/RFC4880"/>
</reference>

<reference anchor="OPENPGPDEVBOOK" target="https://openpgp.dev/book/">
  <front>
    <title>OpenPGP for Application Developers</title>
    <author >
      <organization></organization>
    </author>
    <date year="2024" month="May" day="06"/>
  </front>
</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="FINNEY1998" target="https://mailarchive.ietf.org/arch/msg/openpgp/U4Qg3Z9bj-RDgpwW5nmRNetOZKY/">
  <front>
    <title>Re: More spec-ulations - update</title>
    <author initials="H." surname="Finney" fullname="Hal Finney">
      <organization></organization>
    </author>
    <date year="1998" month="March" day="26"/>
  </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="REVOC-19" target="https://gitlab.com/dkg/openpgp-revocation/-/issues/19">
  <front>
    <title>Add validity period guidance?</title>
    <author initials="A." surname="Gallagher" fullname="Andrew Gallagher">
      <organization></organization>
    </author>
    <date year="2024" month="October" day="30"/>
  </front>
</reference>
<reference anchor="REVOC-13" target="https://gitlab.com/dkg/openpgp-revocation/-/issues/13">
  <front>
    <title>Deprecate use of 'Signature Target' subpacket in revocation signatures</title>
    <author initials="A." surname="Gallagher" fullname="Andrew Gallagher">
      <organization></organization>
    </author>
    <date year="2024" month="April" day="07"/>
  </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>
<reference anchor="SCHAUB2022" target="https://mailarchive.ietf.org/arch/msg/openpgp/uepOF6XpSegMO4c59tt9e5H1i4g/">
  <front>
    <title>[openpgp] Proposing a Simplification of Message Syntax</title>
    <author initials="P." surname="Schaub" fullname="Paul Schaub">
      <organization></organization>
    </author>
    <date year="2022" month="October" day="07"/>
  </front>
</reference>


    </references>


<?line 823?>

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

<t>This document would not have been possible without the extensive work of the authors of <xref target="OPENPGPDEVBOOK"></xref>.</t>

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

</section>
<section anchor="document-history"><name>Document History</name>

<t>Note to RFC Editor: this section should be removed before publication.</t>

<section anchor="changes-between-draft-gallagher-openpgp-signatures-00-and-draft-gallagher-openpgp-signatures-01"><name>Changes Between draft-gallagher-openpgp-signatures-00 and draft-gallagher-openpgp-signatures-01</name>

<t><list style="symbols">
  <t>Expanded temporal validity.</t>
  <t>Renamed "Document" and "Data Type" Signature Categories to "Literal Data" and "Attribute Value" respectively.</t>
  <t>Expanded experimental range to cover 0x60..0x6F (96..111).</t>
  <t>Add explicit category ranges to the Key Flags registry.</t>
  <t>Add explicit note about when to ignore Direct and Key Binding subpackets.</t>
  <t>Distinguish between signature subject and signature type-specific data.</t>
  <t>Deprecated the nesting octet.</t>
  <t>Minor errata.</t>
</list></t>

</section>
</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA9V92XIbSZLgO74ih3oQKQMggKQuVm/1UDwkdpUkNkmpukYr
W0sAASCbiUxUHqQwUv3LPOyX7P7Y+hVXHiAoVfXYyvogMjMuDw+/3aPX63WK
qIjVQbD1bqmS81fnwWU0S8KizFQehMmEfqpJ8EbleThT+VZnHBZqlmargyAv
Jp1JOk7CBbSfZOG06M3COA5nc5X1UuhuOVv2ctNdbzDslMsJNM8PghdPng86
0TI7CIqszIvdweDFYLcTZio8CKKk6Nym2fUsS8vlQSA9da7VCp5ODoKzpFBZ
ooreMY7ZycvRIsrzKE2uVkuYydnJ1WnnRiWlOugEgXSil7cFjwr6bOsXGCJK
ZsEr/AKfL8Iohucy3r9Hqpj202yGr8JsPIdX86JY5gePH+OX+Ci6UX392WN8
8HiUpbe5eix9PMa2mVqmTtsZwDsc9cfp4jHAN1O3s0la4K86xLB1jPAqnPZe
o770FqWNzfMCvv5fYZwmsOCVyjvL6CD4WKTjbpCnWZGpaQ5/rRb4x6dOWBbz
NEOg9eC/QTAt45g395DGDF7p3aXXsOYwif4zLADyBwHA9ie1yvsn7+mlYmDK
ZP9d/h9XTa+zFHFOTaIizTpJmi2glxvar4vTI8SNg06UTN3nZ71jArVBrGw6
3n/+fDCK8ubXahmHY7VQSQGIoz+ZXM+cL27SMc++4e1wGe4tx/pNHa/n18v2
l2UOP8KiyKJRieguH16n43kvjkYwt9lSFjt88WIof+7u7w/kT1wZ/vnu/OQt
QPb45MPLd+9+OiDYFWE2U4ARGiFk0P5E3Twepen1Y/6qcqwBmMHhchlHvOTg
WN2oGJpmhGVBgOfyINgd7O73Bk96g6fw8PDyp6OTi6ufTz6c/Nw8NACsP42m
xRzwJoctT/pwLB+P4nT2eLac9cL8ujdWWdGLcbDeOE3yaKIyNenNw2wB6NWf
F4vYm+5DaBf0Ki0fBkemafCam/KsLcriv578fxAw2h4Dfqo4+CmcJ8GrKI4X
aeatdbiHa90dwMPTs7dvT36FzXjevNL2E7/IZ+a4v9//+2zvP16M/tm7OJ4t
b395kiwu3qri3X/89Ku/KxfwP2/STAX5Uo17ZUx7kge9gAnkJot7HcbBaZQk
auWsCRfQG+z1dp9a5PnbZW/4fDBoXhfQj3nJ1EgW8c/c+Qvoaqnyx9je3ybD
JYIx0GzCqCJaqCDKgXwHxVwB9cDXDwOVZYB6iH7hcgkEPiniVXATxtEkMKRq
k/We3YRJ8FrFcRVdh4Pe7nN7bF6eXfaeDVtXq2mvPqq3s8eWkjzu6RU/G3rr
PVbLTCHno6XB8Q7SafAQCF5w8nkZZQyAKwDAw2AZjq9VkQfbyGaCFzsIjw9P
cK35JstsJLVmtbvARHsDWu3Jh3dHveGLOxcKZ/RxneTZlQ5feCs9nEx4d6Ji
FQB5iNJJMCujSZiM1V+/fwG0XXsDu4C971/AXstW6W2yuHpFozwMQGTgbcLN
sX0GPuv93pUO4D/P4OHl0evD9y/hUQtWbkZbjgbn+28+3/72t5ejz5dPXw9+
Tf9xerqXnvxt79CnLR+lxafg7wAeWhf8xwLBYuwmizwPyzi4HM/DcuSvb9gb
7vYI9mZ9u9+zvlIt350+/cfyUs3evNsfP3lRFC/Uk9fDaH/Wtr7zLF2mOcpw
IaxvAcxtqtkb7LuIrMHlKinCz9+11l3EWtjLTq/XC8JRXmThuOh0ruZA7kAC
LlHKIFIOEwC5OQemlQF5FmmX5OgxgMBMLw+KlCiJ5s4G8ejbhcycBSDdsTTt
8ywW0WQSq07nAYrDWTopx7TuLw8i5+fvnU5thDyYhzcwTpBF43mAqD8C/pOt
usE8vcWJw8SQiucAw0IlQZkA3+3pxU36lVWDlKMWy4JWFE7gQOQ5dzACoavz
CLENloR7hOfLW0lwC4dGBR9F5PsEncLskrQgyXMVTFQ+BgmKaa76HAEuYzcZ
/A39FCALjBSsJUrLDPd7AhJfuoKniAkk+GmAPQqAqmFbbxNk+LZmwSSaTgEa
zM4i/APUDqAthcEwO3PctQiAAK8nagwwAHkIx9XECAcvEyBIE5o/ssTeMgOx
PJgq3hX8GqUcQK0owc+JhyICxAYfZlm4WIRZv4p5Bm4M3xVMZxUkQJpuo0xj
EeLNAxwBNCNeH875WE1hNP795cHYvu1N7JvfcTzYBZUtrDx5BNIZg1JtIbLQ
2ghW7swIZnCgkpkKR7CltyBu2D6usjDJAcbwSgXn5QiE0wB46lY3CKEPnAD3
+eXLpWL0Hg76Q4T8vwnkf/+9707uKF0sAagwMMj8a6YFuLpQIE4omA5scQj7
FgFgV9gMNwj4A/wlXeMzVDzzYOvN+8srmB39f/D2Hf19cfL392cXJ8f49+Xr
w59/Nn905IvL1+/e/3xs/7Itj969eXPy9pgbw9PAe9TZenP4KwIDNmrr3fnV
2bu3hz9v1VcDQhWuCA6KQVFYdJh39AEiCLw8Ov8//zXcB2Ai8HaHwxe//y4/
ng+f7cMPOA8Jj5YmuFf0EwC06oDkpkI6CsDrgnG4jIowzmmbcqAaSYAnCcD1
6CNC5tNB8JfReDnc/1Ee4IK9hxpm3kOCWf1JrTEDseFRwzAGmt7zCqT9+R7+
6v3WcHce/uWvMWBmAFL1X3/s4KlyBAyQ+fJO51IYgCXrKAzmtFOGkiI4owQk
HCA7heoGcPqmZS4kDn4AJZhEY1CQYStC0Kw7vyjhKEKQKtQUNmOaxnF6S0f9
gXNCI4//0xyD7cFnOEx9+N+9HTz67sfWhtCjeQMBsEfwSX+Xz6A5gnJUcXig
xLxSeO916YDCHbnfOQSEWoQrxF7SJJCqr/TBLOT4AYrBL1QhEPWzCQjZWbFi
XNWNw3iMehRSWGRi5mi/B108ODsWuZw7oWeHWj+XV/3OWYIsjIge9F0B4EWD
mEiy4zVyfMtdYeV4SCwsYDdeA+9Kgd/CC5i1BxjggsiF6MQtwonC1ds1Rtj8
NMryokdLBtEinvYqHVDbEbAZ0L/GJYxEpAxhkTGIaATqHFR0QCBCKTjdyK6A
/CoQ7a1ILBPSYgRyfCKDpN8XQKEnxIjHPPZIFbdKscbXtuGMEdRrrKbAFOK4
p6k77WCaA+sCaeOWKBliAcoQaoEorX4rI9BHgM71aRqM4sTMDbcCiQY+vEnj
G737pIt+dA0YnxgUQDeRVgGQzTkkMQVxMnilAM1ghZWTw8RFoMwcBdVZ2iXZ
Fn9H+tzhMDhXWZ4mVUxC2q2VFIaApV/OOZBedoOjMC+BmHxPJ3vBOQjKaEvb
cHENeAZ4cAgIP1bRDYLfF5cCovO0d/qQNoGGTgcIJ/B/iDHhCHZL00Z3r0ma
pBe8MwaZeBfDYOqciT9ghD07AhPPcxEIUMV3Tr6lottX3HR3gORT5IceECtH
R7V0tE5B+8MWIoqzbh01zAFbfwxI/LMHDH445G8CQt8YjSxpYgjoSOGWMbUC
nPgxONQ/6HXE4iMLEYgD+Mk7xImmWeRMoxp67iJ5hZdhsG2Rc8ftBFbWRZmh
jCeEpdauxyahxvGEAqGSRtvPcs2SvkKSsUwLJARIXS0XJekkKgAyCaM3zxHm
5u4tdodLBwWSZL4AVKuUOIcWUpEKT0Hdw50JWdjCiYBIhqIqSbRpiR38BocU
CUoWbOclqFYh7yV+FpzG4SzfYkmuwWq05ZDfHbSTwXRxM2Am7mzFI0MTRaD8
QpIA0PCUWBHBB4dErKzQX+xu65H09agVwbbo8JOapPmriByo3VidwBE27o+Q
rrC9BjHdz74RQVtH+n5EvYtAiBAmWLWehDxHEsI6xx9BPdaN+S0ExIUiYgQ+
49mu2z754ht3rkiXbPt3Zond0RlE60Ja4kxSVoV4rD+X+iznWUjS+da3zI2U
UUObUNTMCxUCHt66Qr17wpyD+P/Hljljfv9OrMHhRvVm7QHbG9RVnE3P2V77
OdtgBs3HTWsNaIEIsxhZhtZSWpUmWsrZcc7yUDHP0nI2D1h9A2AfEwIQNao3
ws9Od3AXzwoH6GQ/n+jty5F7OGhM7/CFwQ7T7wab26dVqwrCgq5bGg3NDArY
H2pu6a+fp1JogIkIb9YghkzSdKwfSg5TKM29HvvVHd73txcnGaOpg5o2AZV5
cItuLbZVrdOjDZOMiChvjsm4x3bZXKyoZLNWIlkQK2djzm3qNETlHw+j6QCW
bBDblYxVCFIHLOd2jpZdttmQOy50ekORmWVkI+FYCCmhdSw1O8SI7dgjkFBw
Jh/FWQ06lfo8VstC9CEQdnxUdOQKIGXoj+G53cJug6atJtoOTuI8KB1JQcoo
zPmjuPM+9Tsvy4J5AqnF5iPQQkHPdg+kC+KgTOAnK/MkGI5QAtTaLkpDd6Lb
FizvhnRbOmuRY2hNyMgLxNmVK6uYdmVdhWuMCZZYwKRMX01ADBhj4EWUKyO5
3gLdhFnk5XKZZgWKNr6ea88oTGn7UkHLOE+DL19Q2piiXPr77ztEUVESzYtw
sXRJ6ODzPlHPQr9sIZdPHbMQxjQYWslExPadV4njX/YHPwY9VtnpE+RP21tn
QBxufUvn1k7nR6QriPzUirzNgA2CSSOEnEOmpu5P0gdCBBkyqVyBRo1yLH2A
HFTGMNYOxB6cT6HYku0e1TC42QsQMtgaZ0HGFaJq7gS0XUkjsGB5rU9v0tyJ
nk43+GeZF2w3t4dY22KQFb5cBTWm5VG1LgMRbSRsiUdYEeRxBQdNW9NvlDfY
RqVCdE9My9gceoMaZLUMtdU+KrSjIrxJowkfUR0D4Bg4HWcKIg4QlVFJclSM
viQnDKjfOWRRhqeTpOgIiqNx5BPXYBbhqfX8BnVSz+oTYIOcB9pX69Cx5i/Y
DK3B8Yr1akmOYzIOdGZMFJIJufOF2UjyqOXlFEhAxDEQdjunWbogUIvfZ8H9
5ApghcwM1T2Hb7NIdiVeOhKd8oI4BWIJQhlIQsh9wDG6zVJiiO5BYk206YgR
A9ImPoureRUFcVj1W4nUNHcmA3sAeriOARmHQv4S9LymC5JVPfCA2HMTjRVP
dhFeE31FZhEtcmRDcnLC8bjMwjGZdYzfA1EIp8ZbydRGW3TgaDbgdV7VWw/X
f1892j9HBdn1j1FiOafTbcitQUGheCTaAO9msiPDDAbByyhBAnSsV3HpHroz
tlpph19ETdXnwqEHgO1kawtjEHgmK3b7BEdhkiZoYA6u8HM8M9jfS6T/07CM
SWhoWCAZUVcE9BQ2hFR7A3UTByLGND2JH3ASRA1ko7T8YveG3LV4eIoKiYCu
nNFFZjP0puJjfXP4K65vkU7YY4JSJ3tykYyziGwMJ10BHdEnRw7KiOrowLce
8ENkGEjpSR5G+9BIuducsAXoFrlsmVT4A6k2kWmGLlwYaoEmR9cJ4Au4hrew
UHyEIiZtq2W0pxl8iVGvgfaYGXssnbwmbAbEPwJdE0CmiUfo9KgdHrhP23Ca
45IgN4ojDEfw2u2QORnXwg4o2jLG2CcD3BmQu87J1noEKmxE9NhVT1gja/3O
EyeesDixHK/Xu540610hj9JbN5t2I0eN0eYpbI9v76sCcDvXmhN2ALJkOktL
DneoChOFKDyILkAhWLneYL5ihOc9Ut4mcsSSE7DEMiriL8eaiNyL3bo6Ghnr
4fkYncE+e4wwTCG9gT4mzGpJedfBskTOjHzBHksStEnWVNZ1Q/5IDqggBRJF
Up+4WuLT1fu2Fosq9H8NIeIdc0Q7EpLQRMl0B5iSdg56Pd4C8PKUglxs5wDb
f6KsTX0j261JQf8NVEnGEJQgeQoIzslipEhtqp1yYbhlAmLeHOkuUFYNLecI
FIyyQNlyIOJTfIBnJA3ilFSEbhPy+Y4lPSUyCmk6SWxJvhux/MC+1QmzvwnA
bjyvIOiDBw8aBtOQYzl8zUkQM1UIi45AELGHIqtI/hpGH3XIIcfrwKrdgKNp
FIuRGxsGsxTEQpgkn3vH1YYyIGp1bZGDiA4f22PNPwXb21cvjw5MlBWhbpiw
xYV6T9LbLs1KNpVSK3Z2tC+3ptgh7HHpGeiBqONtX707fndAk8Tmh0s87qpi
tMi9IEgyRv5bgIqK+BGigpVkgboNjOz3+zs7vHnvWbq7m+4TUJzo87zKAXrO
WcBwg18U+fUBteZEaZGoaP3BhLDH4Qq5bEqn3NIIkUmYkzl8TvPMU4ogC9FE
g+iOJi+UQqErd0gAbZpNjEkAtSf4hA+8DSrAo28EWzzked/EDDmdsp7OHdNk
q/YAh5TBJ7CvN+SiRNpeLiQ83MoZ5F0ywzqot/3li/2+l06dZBBQ8nnpRioB
CpFjoENU1OaoFhQ0VOQ1+AkhqtGZhuMWVaMCFB+nMekxAoYNuKORpShOAB3Q
pAFX/dN8PCzlwXW10J4uBjbPw6UYxxbRZ/aDZmR5sKLIc7ZotCaAEEw7dJ7p
SJiQ01ccqCfGtDGayNTEDViIjCEBQzBo/BpJx+k6kmSC8mIsCogj23WD/Dpa
kjKFyEG8CoYh5cpiRq8W3Yn7rfXneOWHJRk9uF8JXUEBabf/D3b000lonz8C
Hz2ZJFCymY+plBPDoVVIBLNhmCyTUPCeKEEO+f1oMzVgdmjO+vIFBEN45SE7
JxxgvBrmipH5wJOCEBXdaJ93iQIszHNXVn13frkTYN88U1ckYgvvZ/GQ+hGy
wUcbEA1TdCXb/XZngh4nBQWy0BLsYTDs8YOkhCOZwSbGE5bz0XJHwXf483au
TLyUJ/AyZFgQ/U+VpUglkVVWDBYavSxnBXWSpeI6XFxBVEcY2gaO25kNckiw
raGXKI9Wb1lINvGbUZKCcL3yzJxdsXMmPZr+loBpi9bv7gVZ20Fbs3HKMHUh
E9ZCUpHkoopB4JEGk78bRNgtqCz6AoaY0F+hlGRfd1SRTHFkLqsFdJrF4TIu
M7KkQCd9Cjd/xNImcOsxWb5yJHYl0F7AXZDVgK4XEaxUDg3GO9AEdNiWeEP8
qQO+4YIwDOiKArRtN9i2VWV1t6hLAW34uefD0LZ/MjglCWwg0mdUImkmdaTG
ieDG8FrPjATHHheUzaHlEshrjsv1u/V7goa0TUgpQLi3UHAiIK0fwzfdJvQ5
6dSowCUN++1QXly5BrAb6+YMqREAGNd47pFd+aIbWO0bSfS0zPyjktvY+6gG
FT7Z2E4jTCXySiz/HHavTa7wHz2Mogh8Iex+QuEn/TmreDDijUKyK+BJCAYU
VEPkTgegMyRh3nCqAEmjWZqhSszR6lEuJh2Q4SQ5AA8/nuhU0EJ/uACQwm6x
9QAhqvmnCYQvcpIFx/o3Iy2hICEtaeEgyOaM6ig4RTCVeNUjkZGZ7jSalRxs
o8/4tzFdCstFwpSjVcbs7SxJs7XcFxs6BxXP4rmeQMWvWDmT1hSEkUDaHiSC
lXtOsc9fMKJzhiGMnG8QosCKadHBvouuOkqB1J5UoIRyrKb45tNuwxm2Oh6C
HMA/xPP8yNUEN2g0MPPFnS0XDL47hiZgoAKKAJewVFiHmk6Rv96Qt1XLCQ08
tYuad4x6RUROCrKFwWC3IYb248YC2EZRjCoEoX+sZmhxHqcTZWJ5yFDw1sVz
JjSPxIjwqOJadX3+U9gNzQaNackGlTkcgnWIR2iB02LFmCjxpt3nyrhVSIFE
c3WOMtvCbP8yJCzWDXRHDzHvZQZwA/LBMb4BKJ9yGtIle1MB9WKmeyOOPSN7
IZzPWM+9PnVxHeTs7HDtLpF1vKKWNUISmwiI0SLBcTGwZXHu20+MzcS1vdmQ
N+3Js+YdV0mRQ+RZ9HVpA9QBrGoqTyPSoVhyr7TzTtZioSZRSOKIMCM2EoMm
iKBa1k8+m5QBk4FLpDmfRrdJjfMyjJumIGYj6CnVVqPgyNIs59N+52yKvNPr
BUZs/pqNhio3BnBGrJaPjVllojTBZEr9s6e+dOvyKmw6MgcTdG5FrcQ9dIDM
aplbI5qDyK4xT/nS6JI9esa67SMos4ZktQYCUlOANgg5fpk4/EB7o7qCoZpc
hU0bRfIYrg8YqtgF27AK1Z8oHwOV0r59ZDSUHBDGvVglM6BVWkRheThBlE10
+Lf4lBxLGlr2I4wkGgy7reOO0slK/FpAkgoGse9m6iIg5D2ugtJiFGX70YYf
Xfx8SjPO1CK90TySCAVrLTBsDsOxtbpB1Whyu2ncaVQ9fSHWfEoh43U7gO5/
inxBfNfa/UHL11hkO2OcoyQoE3znevvEFeprDCvtLYLjnaNXOyYoJDnjOkoN
qUTvEAs2flyWsB1K7kFiAQsi0gr6TjwxiIdar2MlQ5IAUC0XZonYU5SRhQuI
FYmG2klI6iEpRUuYh6u6vqh6z4EhviXt0jHzwaFNCbzGkyYavzA3rVUU6UzZ
leJRcqkhLtTJXNRrJ2XAdCEyBYdUMMkLl7nsCNG9xmN3WPWUWmRw/W7WG8jG
NlGk9ehdE1R5P1cehmsoznLRymRaFp7WfIuCeDEvcxaXEsnaEPLmweBhbrQe
JiMgjPZV33pIyIOJKWaJozKO52nkGlyCuYLFZhrYuDAhLnwGmMLkxC/q20CS
RJZLCgpwy1xlEXNuII/aRcI2nVJStd3AB5l3KyQSdE0kM3hB9l02IgLqnXJm
rGdoq6TJ1jJHK6GczMklep5jcCUy5pERsEQhOQgC0lpPknG2Ilue1lT+59fg
faKqj5HsNjzW3VxGbk0l7iP3nnEH/jPd2uFPTg8a250O6h82dOGEMmCbSje6
QUPgA359cvmT/sKm7zpQulRUl4meciuc6uUKyE6RbfC1jAFv2Exo9gGeQUfu
qy7+ou9NfzhZA3I9JsUC+t80Ta3yGSI3lp2aYTg21h0oOAG9Co+2Ha8MWJ+7
9x67EtrqMcV6v01f8enR0SktHXQBBzJAgWXKyfnVhi4uvEQycMdE2r/1p1NF
6k3m8UFlI+Bli7vm0PxddfzaqdxkCt+wDc3Hcx0s8bu71oqTaZ7DRmvFIdb0
/G5pwmXPOT53DRVr6b4RwufiINcQdY3vwtuAVWVlTEHewZswuwaSLwxq25VD
nntEfIckK0lPB+GSSzpoA4kcL+YY75PbLGQ/iX+u62QS5BgbCbhEy3TBwfqm
nRVkjFCl7Se1j7T86egKa5rXv+oGSxAboxGFGos9GB29lyiZyDeom/xWRpVc
uDKhVBSFjDlPy2xMOdoZCDOzOJpFWHWBd7ksyO5hxBphiq74YvJJfb+JrLYH
jTiRws5Im76jSYSeSiD3wlW7DemqYrcyip8uOVRn4tXk83Vs/FjR7Hxr2O63
UXmtYSNMVihwY5eUq7LRqem3TWf4XdOB3ez1aFPn4qhjawvWqVnP9NrX0z57
wU1eQIue3NBhTTYxMQqRFIsp0tQaeaVYjHMSJk7/Ws/+K0chaFpxLkEj7bTC
c7d5rerZjL7+55MjcSehMeqA4tFZlS/mmVJsaswpbq6LYaXPuhxDt826Wb5U
INRuYSFKxOz3V6e95xheBr1csqLhQtEaOzldn5Ov6Yy4tSAIfjouh/D+DG1d
ranaaB1ir74ltQIIsfuvAk2MtE3D8d5qS7l23VrrrrHMoo3d71gMU3w8yNrs
KakwfyAVGEmGrj5j3jQ1AdhX7toxhW7mRlRnZyIyJlh9nnYbttnOtDDR+H6w
Qm4ksgqJwmAaUCnZJMwaE9bQNJZLUfBVmEdkh+ajSjV3LowTj8IqiA9GlO7m
8OxLW37hywND5numRS1EsqLM2OJTmDzkFnMgvOOYC4d9OMGGrk2UZuU84hJO
9agzLm63t7tzYDeiHgLS4UTjl3E6vtZNnnepfFMWET7GXgfGXODEjGirBoao
ABtW8dRMvToc+4p0DIsOookSymJSevUAv5solL2o2GEBC9JswkFFlLRgGCdM
eh6WOXu2yMQjOx6O55G64Tg315HsxD7ZrAg8XlFjGJ+zY4brWtFgtb7JgbhU
D9d3zT2bXiuZMrotFWOqWtIr/Ve+qc147WyNAxhzyzishGKU8fy5WdUvo0Rc
ppNNgkebKuzAntgJM1myCFmBi1cCo34SOB66yWtg13gk/gOHwdnhQvYFcOhw
vihnMxS/OLs9qZSD48g2XVqARTtyKbKrV0cQ1ILhOCaXzrrE9LnJxVX7iAms
uzr/KbfhGiadKqwz7lcpTkM8y5S8zKOViUQB17iDHkzTykKn7xC80c1xjfHo
mBZgaK8kCco6+LCTB9TKlokJ2Mo5CoiSeLa8UK58y5ce7w7n4sjG+o4iXf3y
oNEl1OlUDOvoeQEpHH3Xgo3kMsCNpH3WYap0hjLMxyK3lhTJQf6bRwssmOhm
eV1xfDWuEcMhyCWvdVZtG7wJM/R9m2wl00wGEdk+wpBE1oOkoWlgo1VagsGc
PJtGGJE+Q9WX0JhN4+q1iWmZaOMdxwezBAZUIWrwbEeIBaXO1BwDkkuj8yvs
t8P6txW7b70N6AVYLpuqZbtJ1EmJaaby+Q4Z5kB7Zt0ZZ/qcZnqKb/ygTnc9
UvHKWY9Tb8iLY7Qf2PpBLR+Y0kAt752qP01f4LSe2vBgv9rPjmbeQoW9xdCS
h6fOYp7rjP0RfG8fvzAUvf7uVCe54qtt4uz4wQ6FRzQW13DnsEsA3XUAujvw
2tmQa+TGtXICXl+0nl1nPbtmPV43rUm8bm97NLM9Z2Z7g0pLr1MfnfZoLnuE
Tlduppw7xD4Nse8M4eav1frcpz73GUWrAb1uv0+o3ydOvyb9R0otOby3NswT
GubJqezgDfIdJDonjrwXXBBRgK+f0lhPT+sn6hm9OT3BNxcnlycXH06O8fkp
fIsUiMLLTAGx9qEqvJvIkU1VtDMItl887feHw+EOF93Q4YLjleuJk/KjS2c0
V5AVahdJ8hhs8YxCkTHi/MxxiaObhaiRQJ2ClvVLCeEbe/ZITZ77WFewofob
krebfYP7EprOxLyUGA9O87OeSpNVy6V83IPuhspfacNKFzg8peOamoNoUaDs
0In1NXVJVAU4LU1Fc9bcdEGj5nGYr5mPGkvctSySTXuGgaEb2XIzK+A5Kqqb
UONm2cPGy4mvTTDYlgLmMAFMxUULZX2S1ve89Ce5QwjAcQoi9nDYGgwSc6oA
BvKj20ykpx84ermlqAe8qoxgZ7NDUe8ylI41cmubUsA44hyP0LbkrtuPnjJn
R+nSqOcm1o4+ppIOuI9WdnAyZdyCcG21M+zRbCprsK6qgR8pYhGATbccbKur
g7j5pxT/70baNAk1Uh5wMOz3JVtBKjF6vZAv2FtYvUxInV9A99z5LnR+h1TE
Hw5Q3GhmDPCBpCLcxT+dL1vZQRWqJhQB61pbA28YU3kShnRBluZZmE2IVgCo
zV4QFB1ZoKW1zo8hhL4Dwl2XnHRbYd2tQsHWUGvekb6RF4w8TkmyIPUvSWgP
Y/ywmC/uWESTMutSVw43kopL9eYN0WqtrE54W8eEYUqgq+1B1xYNbY0fn+3Q
KWlkPMYY6VRpihIy7bJOTRWSEVJJ2kh+rX2AnAh+BnMt83fgW7aIqDiJKqJH
2+3BiZPIb+aLDI9HcumOK3J6dVW+g/IA8zks0fdR1OmZrb2uDc8AntD/umK+
4DgJ2hcWBZJqAysMXGH1DO146Fa/Y4yS+CI/SquYV5iOmB9CqQvE8gsoBUU6
TuNgu0QVAwCCq7m8fL3DISLcOdlnKiNLOKfugJO+bPUKLLkheXXjLM3znhmJ
0320JRV2PI3kPKgbxF4KBE0xfleXxsDxluwXYTFh6mq/XqKfsTskqVvB1gT1
O6xvXKPjlSVKXlKiQaKLZo+VEy3nhOlWmjPwrbGJstSkq+DoELlRIWFUM6pt
skAHpGNUeqWdY7oCi64yVBvHLRuik75rRg5je3bZkmPWcJLPyUiBc6dTSWWX
uQVF6nJArrhv2BVL0W9aEj2gA0NaL4rnjkVQLBUClbCQSD2Uk9zCCjQBSfRj
MwQsaqmoTnJTtjOykX7nkpL8p+JkdiytZJ5BTkOZnZSotn35YceGUa2MRXNO
9pxCJ0pzJFSel9jGEFRBXZuOb0OnsYIoyYHiCOHkS2InaKvGsNLqVGY1ODVm
eXMJbT60DU007ZbIVenBa9+59Df4wJU+tNyEIke38RYReXWG+csZnT+QSBmO
b3U+/DGlEVHAQfYw13KraXQaYYgXCKpJQS0R19/Wc+k5vNViXMAV0/KGdbu3
WSiTl59rC3yBRXYQ25jMZqOoyLiSg8nyK5pNrOx0PELH2OeiCYepR9uPie93
CieZ8vomn8PNw5qSFxBwGuNLuYY4pZ7oe/c491oYWcME2IiH4XHxqlazSarB
cVsRstbqN+1qjXsMmSLacuK5IU2OK4cJ3e08jUkNB0SRw2CgoAcVhY+RWut6
5J4Rd1aYC2lZOz6l1tMGaEVp2+SW6uoBLLy5m5OhNRu986zjajFgh6PuL+y9
cqyYWSkHA22FLFq67tuQ7OcCAT8KgpqpOFe3fKECA2mDE3xYw4eaB9lUe2Df
j9lft76Rm9Ye3DxFWHBxRUeHbKIX24cTLYuYIAcWVoAInNOu4BRs4N9RtIQV
wpb6VSO9ipJuy9ew2uDQyN3uKx2GgF24X5CIxyn45xYv3Jb2i25wqrQPcNt+
cHhyeOz06c2I3skySoxjh5YV3NiRGhcXDdvvH9eGU+pTBG2md9Waug6D6RvO
cXPejB3t5o/EuxomXBBfo9Nnhxc4eHrQxoCo+Ck1JHRHNmfnu4lYVZYIC5cO
j927Zf7o09sImo2PcOX0uhl+kjMar5pWz6k8fzw5aKhw3nUFc8IG91aLSjGM
++BGix0utGtcv8Py2Z98LCp2S4bAVatRbHMItN+0UMksbZWXf1EjKuKC1/D+
yVAAnABWSkJvxZJDo1vpEvnCjE4dNBHirnnFCLW58xSkMgDnxRmQXW58GEdh
rkmuZ0v7HqLbmB94hwZiiuClmc3P3QCw99VTaBYiQvn70KogtMBlk+3crmau
wPQBbIlY+jAnqmnuJqXzN7mMEDh7A2qc6TKuF2ocLbFCpqsUwCY7gUSwdGDF
295a3ij4H5QSNAbY230+UMmLb0AC7ZOfp7nyL1ty7VESeMs31mx+gEhNSFIq
NIrRJmOrM/xAwPQLjmh3l0R+cKqoZ1Bcr8dx9axuQ2QOQPJYYa5zobgA/jUo
OfCwpWzUjsmF1juclxjgsep0vhzwHY3/o36XuGNjoOuntoIHZkP0HVMUPRF8
xXB6dFG1/vtqnWf8C6Qz8uvD3+Qg+2BOyVetqH1FVVTleHMi/Pvau+vf19Zf
Xxu/aO6zM5AJXygqBjVpX1LQ837V/naf8e+EtFvErc7wXzPMrjxqsQ44jbSJ
R77n07B2GClpSsoY2aoo1xiPo0OEOnu1GVTEjG+fQWdfnrcxKTtXNxjtK038
7PQ0mILup742r26Ugs4bJl2TZ1lkpeo80f35zC+o/quM6L1pW81TeV7no+v7
3gRSz0zfwo9rM/7medchRWB19UIKSVpTX2+n89zM7089Di/kUYO0W2nkSveb
gXg44OftivXjw4uLnVrfmywBCDPeq0yCC2iEVMFUbiHtDIfyTbvOLr2IvWFz
0HWGu/x8jcr/7X3v9YZP/gWE9ik/8m2dTcP49Md986vKG4eJuM+pYwrlogu8
EZ3hs97wxb+AyAvmeabbey6xdRhjhhVDvy5RNI4x/geDBjq7NQys2H5Mb/fH
kt3dat/NxqNv6nuPnzebndwevqHv/eq8nVG8Hr6h7ye6bz+kpPrvKyvsfwAx
7+zKKbJKXG006eD+/GPbLQcUBvMShOgeFkonPqURcKez+4y/t+7qtjncn3jv
PufnVXdHve97H6HO7gt+3mhn83pwH28GuykmMJFbgwpKBJXiSq3Q7OwJzdBG
1BZYfhN+7gk9qKoy9b5R4xNlr6VvCmfc69E9FVOmR43lg22h4M6ekIyGjIZN
h0eCjwIiX1NhUl0oOtZob185iDbHCFhatpCTBgdZZdx7c5rOnpCTNZZu6eHe
28WSGQgVUyuaTcd4j88oygGaQmzWa/v4havcb3bq9oSqNGiza3eKBPjKqq5e
Hnst1smbnT0hJa0ac8vATeCkiOzhMtxbjpsH5ncwqNAYaxfxV2m79iHpvmmT
RO7YQ6FAa1wh0s/9D/u+FntbbDubrKqlbzrsK+VUT4SZ00qv0/G8F0ejTMFS
P3X2heB4ZsVGyN6fO206B8a/r3WPUq1HD8aO2eleJ9QOcq1Wn9A8hpygGvaB
ZqiXmqNXboOp1A9CtkT+bRP+EY5In9/G7ERUfrsUd0nyAMfHArNxrmQ3Vkbf
mIjwGzVFNUdZZQpOTllC5fWdl+zI9R7ZKxg4a2qkb0axJjdawdj4oBxHbuc9
x0a7NXe4vu6k687etwouMDV1EozFekW3j1t3E7qv9Kva7Q+JroWTaw9IpWoO
FfIUjw9H6VY/26Y685Wn/7ajr+FzS21zDnelvanid55+oJjalCqKN2cc51h3
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
osAAAA==

-->

</rfc>

