<?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-code-point-exhaustion-00" category="std" consensus="true" submissionType="IETF" updates="9580" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title>Code Point Exhaustion in OpenPGP</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="18"/>

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

    <abstract>


<?line 37?>

<t>This document specifies variable-length encoding mechanisms to expand the current one-octet OpenPGP registries beyond 256 values.</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-code-point-exhaustion"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-gallagher-openpgp-code-point-exhaustion/"/>.
      </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-code-point-exhaustion"/>.</t>
    </note>


  </front>

  <middle>


<?line 41?>

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

<t>We are motivated to define a variable-length encoding for OpenPGP code points so that we can have more than 256 of each.
While there is no immediate prospect of any of the OpenPGP registries exceeding 256 entries, problems have already been encountered with the limited number of private and experimental use code points in the Public Key Algorithms registry <xref target="STRENZKE-2024"></xref>.
It is also prudent to define and reserve an extension scheme significantly in advance of it becoming necessary.</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 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="single-octet-code-point-registries"><name>Single-Octet Code Point Registries</name>

<t>The following OpenPGP registries currently define single-octet code points with up to 256 values:</t>

<texttable title="OpenPGP Single-Octet Registries" anchor="single-octet-registries">
      <ttcol align='left'>Registry Name</ttcol>
      <ttcol align='left'>Notes</ttcol>
      <c>OpenPGP String-to-Key (S2K) Types</c>
      <c>&#160;</c>
      <c>OpenPGP User Attribute Subpacket Types</c>
      <c>&#160;</c>
      <c>OpenPGP Image Attribute Encoding Format</c>
      <c>&#160;</c>
      <c>OpenPGP Signature Subpacket Types</c>
      <c>(1)</c>
      <c>OpenPGP Reason for Revocation (Revocation Octet)</c>
      <c>&#160;</c>
      <c>OpenPGP Public Key Algorithms</c>
      <c>&#160;</c>
      <c>OpenPGP Symmetric Key Algorithms</c>
      <c>(2)</c>
      <c>OpenPGP Hash Algorithms</c>
      <c>&#160;</c>
      <c>OpenPGP Compression Algorithms</c>
      <c>&#160;</c>
      <c>OpenPGP Secret Key Encryption (S2K Usage Octet)</c>
      <c>(2)</c>
      <c>OpenPGP Signature Types</c>
      <c>(3)</c>
      <c>OpenPGP Image Attribute Versions</c>
      <c>(3)</c>
      <c>OpenPGP AEAD Algorithms</c>
      <c>&#160;</c>
      <c>OpenPGP Key and Signature Versions</c>
      <c>(3)</c>
</texttable>

<t><list style="numbers" type="1">
  <t>The Signature Subpacket Types registry has only 128 usable code points in practice, due to the criticality bit (see <xref target="subpacket-type-encoding"/>).</t>
  <t>The Secret Key Encryption registry automatically includes the code points from the Symmetric Key Algorithms registry, although their use is deprecated.
 The Secret Key Encryption registry is therefore the only one that assigns code points greater than 110 -- specifically the S2K algorithms 253, 254 and 255, to avoid code point clash.</t>
  <t>These registries do not contain a private and experimental use area.</t>
</list></t>

<t>The OpenPGP Packet Type registry supports only code points in the range (0..63), however we consider it separately in <xref target="packet-type-encoding"/>.</t>

<t>Note that the following single-octet identifiers have no associated registry, and are not considered in this document:</t>

<t><list style="symbols">
  <t>SEIPD packet version</t>
  <t>PKESK packet version</t>
  <t>SKESK packet version</t>
  <t>Literal data packet format (printable ASCII character)</t>
  <t>One-Pass Signature nesting octet</t>
</list></t>

<t>The most heavily populated single-octet registries are currently Signature Subpacket Types (51/128 or 102/256) and Public Key Algorithms (28/256).
Other registries are unlikely to ever exceed their capacity, however we define a generic scheme here for future reference.</t>

</section>
<section anchor="extended-code-points"><name>Extended Code Points</name>

<t>We specify three encoding methods for extended code points, one generic, one for subpacket types, and one for packet types.</t>

<section anchor="utf-8ish-encoding"><name>UTF-8ish Encoding</name>

<t>For registries other than subpacket types or packet types, we use a similar encoding scheme to UTF-8, but with two- and four-octet encodings omitted, i.e.:</t>

<figure><artwork><![CDATA[
if the 1st octet <  128, then
    lengthOfEncoding = 1
    codePoint = 1st_octet

if the 1st octet >= 224 and < 240, then
   lengthOfEncoding = 3
    codePoint = ((1st_octet - 224) << 12) + ((2nd_octet - 128) << 6) + (3rd_octet - 128)

if the 1st octet >= 240, then
    lengthOfEncoding = 1
    codePoint = 1st_octet
]]></artwork></figure>

<t>The second and third octets <bcp14>MUST</bcp14> be &gt;= 128 and &lt; 192.
This ensures that none of the octets in a multi-octet encoding can be incorrectly interpreted as a single-octet encoding of another code point.
This means that strings of multi-octet code points are self-synchronising.</t>

<t><list style="symbols">
  <t>single-octet encodings have an octet value &lt; 128 and are fully backwards compatible</t>
  <t>octet values in the range 192..223 correspond to the first octet of two-octet UTF-8 encodings and <bcp14>MUST NOT</bcp14> be used</t>
  <t>three-octet encodings have a first octet in the range 224..239, and represent code points in the range 128..65535</t>
  <t>octet values in the range 240..247 correspond to the first octet of four-octet UTF-8 encodings and <bcp14>MUST NOT</bcp14> be used</t>
  <t>legacy single-octet encodings have an octet value in the range 248..255</t>
  <t>overlong encodings <bcp14>MUST NOT</bcp14> be used</t>
</list></t>

<t>We reserve initial octet values in the range 248..255, which are not used in UTF-8, for legacy single-octet encodings of code points with the same values.
This ensures backwards compatibility of existing secret key encryption (S2K Usage) code points.
Since Secret Key Encryption code points in this range are in current use, they <bcp14>MUST</bcp14> be represented by legacy single-octet encodings.
Legacy single-octet encodings <bcp14>MUST NOT</bcp14> be used in any other context.
The corresponding code points 248..255 will be reserved in the Symmetric Encryption Algorithms registry to avoid ambiguity.</t>

<t>The top half of the extended range (code points 32768..65535) is reserved for additional private and experimental use code points in registries that already contain a private and experimental use range.</t>

<t>Two- and four-octet encodings are not used, for the reasons outlined in <xref target="algorithm-preferences"/> below.</t>

</section>
<section anchor="subpacket-type-encoding"><name>Subpacket Type Encoding</name>

<t>The criticality bit means that the first octet of any multi-octet signature subpacket type encoding is effectively limited to values less than 128.
We therefore cannot use UTF-8ish encoding for signature subpacket types, and cannot make use of its self-synchronisation properties.
Luckily, subpacket types are only found as the second field of a subpacket, immediately after the packet length, so self-synchronisation is not required.</t>

<t>Code point 127 is reserved as a surrogate code point to indicate that the actual subpacket type is encoded in the following two octets.</t>

<t>The standard subpacket type encoding (including criticality bit) continues to represent code points 0..126 as usual, as well as the surrogate code point 127.
Surrogate subpacket type encoding is used to represent code points 128..65535, and <bcp14>MUST NOT</bcp14> be used to represent code points 0..127.</t>

<t>The criticality bit is the most significant bit of the first octet when surrogate encoding is used, but applies to the specific subpacket type being encoded, not the use of 127 as a surrogate code point.</t>

<t>The top half of the extended range (code points 32768..65535) is reserved for additional private or experimental use code points.</t>

<t>For consistency, User Attribute Subpackets use the same surrogate encoding format as Signature Subpackets, even though they don't have a criticality bit.
The most significant bit of the surrogate octet is therefore always 0.</t>

</section>
<section anchor="packet-type-encoding"><name>Packet Type Encoding</name>

<t>It may eventually become necessary to also expand the Packet Type registry, which currently has 24 of 64 possible entries allocated.
The encoding space is highly restricted due to the small number of free bits available in the OpenPGP packet framing.</t>

<t>Code point 16 was initially intended to indicate a "comment" packet but was never used, and is not encodable in Legacy packet framing.
We therefore reserve it as a surrogate code point to indicate that the actual packet type is encoded in the two octets immediately following the length field.</t>

<t>The OpenPGP packet type encoding continues to represent code points 0..63 as usual, including the surrogate code point 16.
Surrogate packet type encoding is used to represent code points 64..65535, and <bcp14>MUST NOT</bcp14> be used to represent code points 0..63.</t>

<t>Code points in the range 64..16383 represent non-critical packets.
Code points in the range 16384..32767 represent critical packets.
The top half of the extended range (code points 32768..65535) is reserved for additional private or experimental use code points.</t>

</section>
</section>
<section anchor="support-and-compatibility"><name>Support and Compatibility</name>

<t>Implementations <bcp14>SHOULD</bcp14> support surrogate encodings of Signature Subpacket Types and User Attribute Subpacket Types.</t>

<t>Implementations <bcp14>MUST</bcp14> gracefully ignore UTF-8ish encodings of unknown code points, and <bcp14>MAY</bcp14> support known code points with UTF-8ish encodings, in the following registries:</t>

<t><list style="symbols">
  <t>OpenPGP Public Key Algorithms</t>
  <t>OpenPGP Symmetric Key Algorithms</t>
  <t>OpenPGP Hash Algorithms</t>
  <t>OpenPGP Compression Algorithms</t>
  <t>OpenPGP AEAD Algorithms</t>
</list></t>

<t>These code points may be found in the following contexts:</t>

<t><list style="symbols">
  <t>key material packets</t>
  <t>signature packets and subpackets</t>
  <t>OPS packets</t>
  <t>PKESK and SKESK packets</t>
  <t>compressed data packets</t>
</list></t>

<t>See the subsections below for further discussion of each of these contexts.</t>

<t>Implementations <bcp14>MAY</bcp14> support UTF-8ish encodings of code points from the following registries:</t>

<t><list style="symbols">
  <t>OpenPGP String-to-Key (S2K) Types</t>
  <t>OpenPGP Image Attribute Encoding Format</t>
  <t>OpenPGP Reason for Revocation (Revocation Octet)</t>
  <t>OpenPGP Secret Key Encryption (S2K Usage Octet)</t>
  <t>OpenPGP Signature Types</t>
  <t>OpenPGP Image Attribute Versions</t>
  <t>OpenPGP Key and Signature Versions</t>
</list></t>

<t>Implementations <bcp14>MAY</bcp14> also support surrogate encodings of code points from the OpenPGP Packet Types registry.</t>

<t>UTF-8ish and surrogate encodings should be legacy-safe in these registries, as parsing is normally halted immediately if the code point in question is not supported.
However, for safety with legacy code that might not safely ignore unknown code points, they <bcp14>MUST</bcp14> only appear in an OpenPGP packet sequence that was first specified in <xref target="RFC9580"></xref> or later, i.e.:</t>

<t><list style="symbols">
  <t>a key material, signature, OPS, SKESK, or PKESK packet of version 6 or later</t>
  <t>a User Attribute packet attached to a primary key of version 6 or later</t>
  <t>an SEIPD packet of version 2 or later</t>
  <t>a compressed data packet signed by a signature of version 6 or later, and/or encrypted in an SEIPD packet of version 2 or later</t>
</list></t>

<section anchor="v6-key-material-packets"><name>v6 Key Material Packets</name>

<t>After the packet version identifier, a v6 key material packet contains the following fields:</t>

<t><list style="symbols">
  <t>Creation time</t>
  <t>Public key algorithm</t>
  <t>Length of public key material</t>
</list></t>

<t>It is therefore theoretically possible for a continuation octet of a UTF-8ish encoding of the public key algorithm to be misinterpreted as the first octet of the following length parameter, resulting in a mis-parsing of the remaining packet data, and a possible out of bounds read.
This introduces no new vulnerabilities however, as an attacker can already create a key material packet with an incorrect "length of public key material" parameter, and so a compliant implementation <bcp14>SHOULD</bcp14> already have protections against out of bounds read of the remaining packet.</t>

<t>A secret key material packet further contains a Secret Key Encryption (S2K Usage) parameter, followed by variable fields that cannot be parsed if the Secret Key Encryption parameter is not supported.
These variable fields may include an S2K specifier, which always begins with an S2K specifier type.
The remainder of the S2K specifier cannot be parsed if the S2K specifier type is not supported.</t>

<t>UTF-8ish encodings are therefore safe in v6 key material packets.</t>

</section>
<section anchor="v6-signature-packets"><name>v6 Signature Packets</name>

<t>After the packet version identifier, a v6 signature packet contains a string of three potentially UTF-8ish code point fields:</t>

<t><list style="symbols">
  <t>Signature Type ID</t>
  <t>public key algorithm</t>
  <t>hash algorithm</t>
</list></t>

<t>The remainder of the packet cannot be parsed if the public key and hash algorithm code points are unsupported, and a signature digest cannot be constructed if the signature type is unsupported.</t>

<t>The trailer contains the same UTF-8ish fields, however the following features prevent malleability:</t>

<t><list style="symbols">
  <t>The trailer contains a length field that covers the UTF-8ish fields.</t>
  <t>All octets used in UTF-8ish encoding map to currently unassigned octet values.</t>
</list></t>

<t>UTF-8ish encodings are therefore safe in v6 signature packets.</t>

</section>
<section anchor="signature-subpackets"><name>Signature Subpackets</name>

<t>Signature subpackets are prefixed by a length and a type parameter.
The remainder of each subpacket cannot be parsed if the type parameter is not supported.</t>

<t>The same considerations apply to User Attribute Subpackets, as they are constructed identically.</t>

<t>UTF-8ish and surrogate encodings are generally safe in subpackets, subject to constraints:</t>

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

<t>The Revocation Key subpacket contains a symmetric algorithm ID field, however it is only defined for v4 targets and is now deprecated.
UTF-8ish encoded code points are therefore not valid in this subpacket and <bcp14>MUST NOT</bcp14> be used.</t>

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

<t>The Signature Target subpacket contains three fields:</t>

<t><list style="symbols">
  <t>symmetric key algorithm</t>
  <t>hash algorithm</t>
  <t>hashed data</t>
</list></t>

<t>The hashed data cannot be parsed if the hash algorithm is unknown.</t>

</section>
<section anchor="reason-for-revocation"><name>Reason for Revocation</name>

<t>A Reason for Revocation subpacket contains a (potentially UTF-8ish) reason identifier.
The remainder of the subpacket contains an unparsed human-readable comment in UTF-8.
A UTF-8ish encoding of the reason field might overflow into the human-readable UTF-8 comment, however a UTF-8 compliant client <bcp14>SHOULD</bcp14> convert the continuation bytes to replacement characters and display the rest of the comment unchanged.</t>

</section>
<section anchor="algorithm-preferences"><name>Algorithm Preferences</name>

<t>Care should be taken when handling the following signature subpackets, which consist of arrays of code points in which unknown code points <bcp14>MUST</bcp14> be gracefully ignored.</t>

<t><list style="symbols">
  <t>Preferred Symmetric Ciphers subpacket (array of Symmetric Key Algorithm code points)</t>
  <t>Preferred AEAD Ciphersuites subpacket (array of {Symmetric Key Algorithm, AEAD Algorithm} code point tuples)</t>
  <t>Preferred Hash Algorithms (array of Hash Algorithm code points)</t>
  <t>Preferred Compression Algorithms (array of Compression Algorithm code points)</t>
</list></t>

<t>Multi-octet encodings of code points in the Preferred AEAD Ciphersuites subpacket could potentially result in desynchronisation of the tuple parsing in legacy code that assumes all encoded tuples are two octets wide.
Tuples where one or both code points are encoded in three octets will have an even number of octets overall (either four or six), and a legacy parser that correctly ignores unknown octet values should skip over the entire tuple.</t>

<t>UTF-8ish encodings are therefore safe in algorithm preference subpackets.</t>

</section>
<section anchor="issuer-and-intended-recipient-fingerprints"><name>Issuer and Intended Recipient Fingerprints</name>

<t>Version-tagged fingerprints (fingerprints prefixed by a version field) are generally safe to use with UTF-8ish encodings of version numbers, as fingerprints are generally understood to have variable lengths and unknown fingerprint versions should be ignored.</t>

</section>
</section>
<section anchor="v6-one-pass-signature-packets"><name>v6 One-Pass Signature Packets</name>

<t>After the packet version identifier, a v6 OPS packet contains a string of three potentially UTF-8ish code point fields:</t>

<t><list style="symbols">
  <t>Signature type ID</t>
  <t>Hash algorithm</t>
  <t>Public key algorithm</t>
</list></t>

<t>The remainder of the packet cannot be parsed if the hash algorithm code point is unsupported.</t>

<t>UTF-8ish encodings are therefore safe in v6 OPS packets.</t>

</section>
<section anchor="v6-pkesk-packets"><name>v6 PKESK Packets</name>

<t>A v6 PKESK packet contains two potentially UTF-8ish code point fields, the fingerprint version number and the algorithm identifier.
The fingerprint version is covered by a preceding length field that allows unsupported fingerprints to be safely skipped.
The algorithm identifier is immediately followed by a variable-length field that cannot be parsed if the algorithm is unsupported.</t>

<t>UTF-8ish encodings are therefore safe in v6 PKESK packets.</t>

</section>
<section anchor="v6-skesk-packets"><name>v6 SKESK Packets</name>

<t>A v6 SKESK packet contains the following fields:</t>

<t><list style="symbols">
  <t>Symmetric algorithm ID</t>
  <t>AEAD algorithm ID</t>
  <t>S2K specifier length</t>
  <t>S2K specifier</t>
  <t>An initialisation value</t>
</list></t>

<t>All five fields are covered by a preceding length field, and the string-to-key specifier is further covered by its own length field.
The S2K specifier always begins with an S2K specifier type, and the remainder of the S2K specifier cannot be parsed if the S2K specifier type is not supported.
The length of the initialisation value depends on the AEAD algorithm, and therefore cannot be parsed if the AEAD algorithm is not supported.</t>

<t>Secret Key Encryption (S2K Usage) parameters are not supplied in a v6 SKESK, as AEAD mode is always used.</t>

<t>UTF-8ish encodings are therefore safe in v6 SKESK packets.</t>

</section>
<section anchor="image-attribute-subpackets"><name>Image Attribute Subpackets</name>

<t>Image Attribute Subpackets are prefixed by the following fields:</t>

<t><list style="symbols">
  <t>Header length (2 octets)</t>
  <t>Image Attribute Version</t>
  <t>Image Attribute Type</t>
</list></t>

<t>The remainder of the subpacket cannot be parsed if the version and type are not supported.</t>

<t>UTF-8ish encodings are therefore safe in Image Attribute subpackets.</t>

</section>
<section anchor="v2-seipd-packets"><name>v2 SEIPD Packets</name>

<t>After the packet version identifier, a v2 SEIPD packet contains the following fields:</t>

<t><list style="symbols">
  <t>Symmetric cipher algorithm ID</t>
  <t>AEAD algorithm identifier</t>
  <t>A 1-octet chunk size</t>
  <t>32 octets of salt</t>
  <t>Encrypted data (variable length)</t>
</list></t>

<t>If the values of the symmetric cipher algorithm and the AEAD algorithm were not checked immediately, it might be possible for legacy code to misidentify the field boundaries and pass incorrectly bounded fields to the HKDF function.
Even if this were the case, the decryption process would not be able to proceed any further without the symmetric and AEAD algorithms being supported, so it is highly unlikely that any information could be leaked to an attacker.</t>

<t>UTF-8ish encodings are therefore almost certainly safe in v2 SEIPD packets.</t>

</section>
<section anchor="compressed-data-packets"><name>Compressed Data Packets</name>

<t>A compressed data packet consists of a compression algorithm ID followed by data that cannot be parsed if the compression algorithm is unsupported.</t>

<t>UTF-8ish encodings are therefore safe in compressed data packets.</t>

</section>
</section>
<section anchor="pgp-grease"><name>PGP-GREASE</name>

<t>The following values <bcp14>MAY</bcp14> be used as additional PGP-GREASE code points (see <xref target="I-D.gallagher-openpgp-grease"/>) in any registry that supports both PGP-GREASE and UTF-8ish or surrogate encoding:</t>

<texttable title="Additional PGP-GREASE Code Points" anchor="additional-pgp-grease-code-points">
      <ttcol align='left'>Sequence</ttcol>
      <ttcol align='left'>Code Point (Decimal)</ttcol>
      <c>9</c>
      <c>222</c>
      <c>10</c>
      <c>333</c>
      <c>11</c>
      <c>444</c>
      <c>12</c>
      <c>555</c>
      <c>13</c>
      <c>666</c>
      <c>14</c>
      <c>777</c>
      <c>15</c>
      <c>888</c>
      <c>16</c>
      <c>999</c>
</texttable>

<t>Note that the division of the extended packet type registry into critical and non-critical ranges in <xref target="packet-type-encoding"/> above ensures that the additional PGP-GREASE code points fall into the non-critical range.</t>

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

<t>The individual security considerations listed in each subsection of <xref target="support-and-compatibility"/> should be carefully examined.</t>

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

<t>IANA is requested to perform the following tasks:</t>

<t><list style="symbols">
  <t>extend the OpenPGP Packet Types registry and each of the other registries listed in <xref target="single-octet-registries"/> to 65535 entries, and reserve the range (32768..65535) with the description "Private and Experimental Use" in each.</t>
  <t>allocate the code point 127 in the OpenPGP Signature Subpacket Types and OpenPGP User Attribute Subpacket Types registries, with the description "Surrogate code point" and a reference to this document.</t>
  <t>allocate the code point 16 in the OpenPGP Packet Types registry, with the description "Surrogate code point" and a reference to this document.</t>
  <t>allocate the additional code points in <xref target="additional-pgp-grease-code-points"/> in each registry listed in <xref target="single-octet-registries"/> that supports PGP-GREASE code points, with the description "Reserved (PGP-GREASE)" a reference to this document.</t>
</list></t>

</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="I-D.gallagher-openpgp-grease">
   <front>
      <title>GREASE Code Points in OpenPGP</title>
      <author fullname="Andrew Gallagher" initials="A." surname="Gallagher">
         <organization>PGPKeys.EU</organization>
      </author>
      <date day="3" month="February" year="2025"/>
      <abstract>
	 <t>   This document reserves code points in various OpenPGP registries for
   use in interoperability testing, by analogy with GREASE in TLS.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-gallagher-openpgp-grease-00"/>
   
</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="STRENZKE-2024" target="https://mailarchive.ietf.org/arch/msg/openpgp/EhX8qElgHdV1-S75o_4lCIoKuc4/">
  <front>
    <title>PQC encryption algorithm selection</title>
    <author initials="F." surname="Strenzke" fullname="Falko Strenzke">
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>


    </references>


<?line 418?>

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

<t>The author would like to thank Daniel Huigens for discussions.</t>

</section>


  </back>

<!-- ##markdown-source:
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

-->

</rfc>

