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


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

]>


<rfc ipr="trust200902" docName="draft-hko-openpgp-identifiers-for-legacy-devices-03" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="OpenPGP identifiers for legacy devices">OpenPGP key identifiers for legacy hardware devices</title>

    <author initials="H." surname="Schäfer" fullname="Heiko Schäfer">
      <organization></organization>
      <address>
        <email>heiko.schaefer@posteo.de</email>
      </address>
    </author>

    <date year="2026" month="August" day="27"/>

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

    <abstract>


<t>This document describes an approach for storing a fingerprint-based identifier for an OpenPGP key packet on a hardware security device that has a size-constrained identifier field.</t>



    </abstract>

    <note title="About This Document" removeInRFC="true">
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-hko-openpgp-identifiers-for-legacy-devices/"/>.
      </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/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://codeberg.org/heiko/openpgp-identifiers-for-legacy-devices"/>.</t>
    </note>


  </front>

  <middle>


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

<t>Private key material for an OpenPGP component key may be stored on a hardware security device (also see <xref target="I-D.dkg-openpgp-external-secrets"></xref>).
Some such devices offer an informational data field for key identification.</t>

<t>Many currently available hardware devices that target use with OpenPGP keys offer a 20 octet identifier field for this purpose (originally designed to store an OpenPGP v4 fingerprint).</t>

<t>For example, the "OpenPGP card" specification defines a 20 octet "fingerprint" field for each secret key packet stored on the card (see page 23 in <xref target="OPENPGP-SMARTCARD"/>, under the tag "C5").
This field was designed to match the size of an OpenPGP version 4 fingerprint (based on a SHA-1 hash digest).
Note that the field's name is "fingerprint", based on its original intended use.</t>

<t>This document describes an interoperable scheme for using such a size-constrained identifier field to refer to an OpenPGP component key with version &gt; 4.
It deals with two limitations of existing identifier fields:</t>

<t><list style="symbols">
  <t>They don't allow storing the key packet version.</t>
  <t>Modern OpenPGP fingerprints exceed the field size. For example, an OpenPGP version 6 key packet uses a 32 octet SHA-256 fingerprint (see <xref section="5.5.4.3" sectionFormat="of" target="RFC9580"/>).</t>
</list></t>

<section anchor="requirements-language"><name>Requirements Language</name>

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

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

<t><list style="symbols">
  <t>"Transferable Secret Key" or just "TSK" refers to an OpenPGP Transferable Secret Key (see <xref section="10.2" sectionFormat="of" target="RFC9580"/>).</t>
  <t>"Component key" refers to a single key object found within an OpenPGP certificate.
A certificate's primary key is a "component key", and any subkey in the certificate is also a "component key".</t>
  <t>"Keyholder" is the party that has legitimate access to the secret key material corresponding to the component keys in a certificate.
The keyholder can sign messages that can be verified with the certificate, decrypt messages that were encrypted to the certificate, and update the certificate itself over time.</t>
</list></t>

</section>
</section>
<section anchor="scope"><name>Scope</name>

<t>This document describes an interoperable scheme for using a class of widely available hardware security devices (such as the "OpenPGP card" family of devices) for an OpenPGP key packet with version &gt; 4.</t>

<t>This scheme may be applied to handle an OpenPGP key packet on a hardware security device that has an informational key identification field with size fixed to 20 octets.
The scheme <bcp14>MUST NOT</bcp14> be applied in any other context, without a specification that describes why the scheme is appropriate for that context.</t>

<t>As additional informational background, this document outlines current practices for handling OpenPGP v4 keys on such devices, and how these practices interact with the scheme described in this document.</t>

</section>
<section anchor="motivation"><name>Motivation</name>

<t>For the last decades, widely available hardware security devices have typically stored a full v4 key fingerprint as identifier when uploading an OpenPGP v4 key packet.
While this fingerprint information is not required to perform cryptographic operations, it is useful for various purposes (more on this in <xref target="purposes"/>).</t>

<t>Since the identifier field on many existing devices is size-limited to exactly 20 octets, a full modern fingerprint can not be stored in it.
Separately, the key packet version can also not be stored explicitly on most of these devices.</t>

<t>This document describes an approach for storing an identifier for a modern OpenPGP key (with version &gt; 4) on existing hardware.
The identifier scheme matches the properties of existing practice for v4 keys as closely as possible, given the constraints of existing hardware devices.</t>

</section>
<section anchor="encoding-an-identifier-for-an-openpgp-key"><name>Encoding an identifier for an OpenPGP key</name>

<t>This document describes a 20-octet-sized identifier that represents an OpenPGP key packet.
This identifier can be stored on a hardware device with a field of that fixed length.</t>

<section anchor="encoding-for-a-v4-openpgp-key-packet"><name>Encoding for a v4 OpenPGP key packet</name>

<t>The fingerprint for a v4 key packet has historically been stored verbatim on a device with a 20 octet identifier field.</t>

<t>This document notes this existing practice, and specifies that a v4 key packet should continue to be handled in this way, going forward.</t>

<t>However, note that this existing use of the identifier field interacts with this document, which outlines a separate scheme for using the same field for any key with version &gt; 4 (more on this in <xref target="overloading"/>).</t>

<t>Existing practice for storing and identifying a v4 key packet needs to be taken into account by implementers.
Even an implementation that doesn't support v4 keys needs to be able to gracefully handle an identifier field that contains a verbatim v4 fingerprint.</t>

</section>
<section anchor="encoding-post-v4"><name>Encoding for a post-v4 OpenPGP key packet</name>

<t>To store a fingerprint-based key identifier on a hardware device for an OpenPGP key with version &gt; 4, instead of the full fingerprint, an application should store the concatenation of:</t>

<t><list style="symbols">
  <t>A "version marker" that specifies the key packet's version.</t>
  <t>A prefix of the full fingerprint.</t>
</list></t>

<t>The version marker clearly identifies the key packet version, while the fingerprint prefix enables both visual inspection and positive confirmation if key material on the device is associated with a specific OpenPGP key packet.</t>

<t>To encode an OpenPGP key packet with version &gt; 4, an application should store the concatenation of the following two parts:</t>

<t><list style="symbols">
  <t>12 octets of <em>version marker</em>, consisting of 11 copies of the value <spanx style="verb">0x00</spanx>, followed by one octet of key version. For a version 6 key, the version marker is <spanx style="verb">000000000000000000000006</spanx>.</t>
  <t>The leftmost 8 octets of the full fingerprint.</t>
</list></t>

<t>Note that the legal values of the version marker overlap with a subset of the v4 fingerprint namespace.
Some legitimate v4 fingerprints will be interpreted as post-v4 identifiers, under this scheme (more on this in <xref target="overloading"/>).
With this in mind, the size of the version marker is intentionally large, so that the fraction of the v4 fingerprint namespace that it overlaps with is small.</t>

</section>
<section anchor="example-identifier-for-a-version-6-openpgp-key-packet"><name>Example: Identifier for a version 6 OpenPGP key packet</name>

<t>The full version 6 fingerprint of the primary key packet of the Transferable Secret Key in <xref section="A.4" sectionFormat="of" target="RFC9580"/> is <spanx style="verb">cb186c4f0609a697e4d52dfa6c722b0c1f1e27c18a56708f6525ec27bad9acc9</spanx>.</t>

<t>When uploading this component key to e.g. an OpenPGP card device, the identifier on the card should be set to <spanx style="verb">000000000000000000000006cb186c4f0609a697</spanx>.</t>

</section>
</section>
<section anchor="purposes"><name>Purposes of the identifier field</name>

<t>The identifier value stored on a hardware device can serve some or all of the following purposes.</t>

<section anchor="detect-if-key-material-is-associated-with-an-openpgp-key-packet"><name>Detect if key material is associated with an OpenPGP key packet</name>

<t>Goal: An application can detect if key material on a hardware device is associated with an OpenPGP key packet.</t>

<t>Context: Bare key material on a hardware device may be associated with different protocols.
Even on an "OpenPGP card" device, some users may store cryptographic key material that is associated with another (non-OpenPGP) protocol.</t>

<t>This detection is currently possible for a v4 OpenPGP key by testing if the v4 fingerprint stored on the device corresponds to the public key material and associated metadata stored on the device.</t>

<t>This scheme extends this property to version &gt; 4.</t>

</section>
<section anchor="detect-the-openpgp-key-packet-version"><name>Detect the OpenPGP key packet version</name>

<t>Goal: A user or application can easily detect the OpenPGP key packet version of a key on a hardware device.</t>

<t>By default, version 4 is assumed, for historical reasons.</t>

<t>This scheme explicitly encodes the key packet version in the identifier, for key packet version &gt; 4.</t>

</section>
<section anchor="identification-of-an-openpgp-key-packet-stored-on-a-device"><name>Identification of an OpenPGP key packet stored on a device</name>

<t>Goal: A user or application can easily compare an identifier stored on a hardware device with a fingerprint that is known to them.</t>

<t>By default, the identifier field is assumed to contain a version 4 OpenPGP fingerprint, stored verbatim.</t>

<t>For key version &gt; 4, this scheme stores an 8 octet fingerprint prefix in the identifier field.
This fingerprint prefix can be visually inspected by a user, or processed by an application for various purposes (more on these in <xref target="use-cases"/>).</t>

</section>
<section anchor="validate-reconstruction-of-an-openpgp-key-packet-from-a-device"><name>Validate reconstruction of an OpenPGP key packet from a device</name>

<t>Goal: An application may want to reconstruct the exact OpenPGP key packet that is associated with key material on a hardware device, without having a separate copy of the full key packet available.</t>

<t>The identifier field can be used to achieve positive confirmation that an OpenPGP key packet has been correctly reconstructed from the public parameters and metadata stored on the device.</t>

<t>This positive confirmation validates all parameters of a key packet, including the public key material, version number, creation time, algorithm id, and additional elliptic curve or KDF parameters, if applicable.</t>

<t>Validation of a reconstructed key packet is possible both for version 4 and version &gt; 4, with the scheme described here.</t>

<t>Note that with this validation, an application can detect when it fails to interpret the intended usage of key material on a device correctly. 
Incorrect interpretation can for example occur when:</t>

<t><list style="symbols">
  <t>There are two different OpenPGP key packet forms that a given set of on-device key data could be associated with.</t>
  <t>An application is only aware of one of those possible forms.</t>
</list></t>

<t>If an application is not aware that two candidate key packet forms exists, it can neither detect the ambiguity, nor resolve it correctly.
That is, without an additional signal, an application can not detect if on-device data is associated with an OpenPGP key packet form that it doesn't know of.</t>

<t>The identifier scheme in this document allows robust detection of this case.</t>

<t>When detecting that the identifier on a device doesn't match the expected identifier for a key packet reconstruction, an application must not use the key material on the card.
This prevents using key material in an unintended way, with potentially confusing outcomes for the user, or possible security implications.</t>

</section>
</section>
<section anchor="use-cases"><name>Use cases</name>

<section anchor="finding-a-hardware-device-that-matches-a-given-openpgp-public-key-packet"><name>Finding a hardware device that matches a given OpenPGP public key packet</name>

<t>When using the identifier scheme outlined in this document, an application can determine if a hardware device contains key material that corresponds to a given OpenPGP key packet, as follows:</t>

<t><list style="numbers">
  <t>Given an OpenPGP key packet, the application determines that component key's full fingerprint.</t>
  <t>If the key packet is version &gt; 4, the application considers only the leftmost 8 octets of the full fingerprint (for key packet version 4, the fingerprint is compared verbatim, and step 3 is skipped).</t>
  <t>The application then checks that:
  <list style="symbols">
      <t>The first 12 octets of the identifier on the card conform to the "version marker" format described in <xref target="encoding-post-v4"/>, and that the version octet in the marker matches the key packet.</t>
      <t>The following 8 octets of the identifier on the card correspond to the leftmost 8 octets of the fingerprint.</t>
    </list></t>
  <t>If a key on a device matches this identifier convention, the application assumes that it contains the expected key material.</t>
</list></t>

</section>
<section anchor="determine-fingerprint"><name>Determining the full OpenPGP fingerprint (and key packet details) without relying on external data</name>

<t>In some contexts, it may be desirable to determine the full OpenPGP fingerprint of the OpenPGP key packet that corresponds to an on-device key, without relying on any data that is external to the device.</t>

<t>For example, consider an OpenPGP card device that has been initialized following the scheme outlined in this document, that stores a version 6 OpenPGP key packet.
The identifier field then only contains 8 octets of the fingerprint prefix.
Without additional context, it is not possible to perform a keyserver lookup with this information:</t>

<t>A privacy-preserving public key server doesn't allow lookup of a version 6 key by 8 octet fingerprint prefix. To perform a lookup on such a keyserver, the full 32 octet fingerprint is needed.</t>

<t>To obtain the full fingerprint of a post-v4 key that is stored on a legacy hardware device, applications can use the following method:</t>

<t><list style="numbers">
  <t>For the on-device key, the application obtains the following information from the device:
  <list style="symbols">
      <t>The basic algorithm setting (e.g. RSA, ECDH) and parameters (e.g. the OID, for ECC key material).</t>
      <t>The key version (e.g. <spanx style="verb">0x06</spanx>), if the first 12 octets of the identifier conform to the "version marker" format defined in <xref target="encoding-post-v4"/>.</t>
      <t>8 octets of fingerprint prefix, from the identifier field.</t>
      <t>The (4 octet) key creation timestamp.</t>
      <t>The public key parameters of the key.</t>
    </list></t>
  <t>From this information, the application can construct a set of candidate OpenPGP public key packets, by iterating over all key packet properties that are unspecified on the card (for example, the set of plausible KDF parameters for an ECDH key packet). Usually, this search space will be small, often it contains just one candidate.</t>
  <t>The key packet version may be assumed to be <spanx style="verb">0x04</spanx>, if the first 12 octets of the identifier on an OpenPGP card device don't conform to the "version marker" format. If the first 12 octets of the identifier <em>do</em> conform to the "version marker" format, the encoded version value is taken as the key packet's version number.</t>
  <t>The full OpenPGP fingerprint is calculated for each of the candidate public key packets.</t>
  <t>For a key packet with version &gt; 4, if the fingerprint of a candidate public key packet matches the 8 octet fingerprint prefix in the identifier, the application assumes that this candidate public key packet corresponds to the key slot in question.</t>
  <t>The full OpenPGP fingerprint for that public key packet can now be used for any purpose (e.g. for certificate lookup on a privacy-preserving key server).</t>
</list></t>

</section>
<section anchor="finding-the-openpgp-certificate-that-corresponds-to-a-hardware-backed-key"><name>Finding the OpenPGP certificate that corresponds to a hardware-backed key</name>

<t>With the scheme outlined in this document, given a key on a hardware security device, some additional work is needed to find the associated OpenPGP certificate:</t>

<t>Because the identifier field on the device only contains the first 8 octets of the full fingerprint, not all certificate lookup methods are directly applicable.</t>

<section anchor="lookup-in-a-local-key-store-by-fingerprint-prefix"><name>Lookup in a local key store by fingerprint prefix</name>

<t>If an application has access to a set of candidate certificates, locally, it may be able to search them by the 8 octet fingerprint prefix from the device.
Depending on the application, such a local lookup may be efficient and acceptable.</t>

<t>However, an application should consider if collisions of the 8 octet fingerprint prefix are a concern in the expected threat model of their users.</t>

<t>Collisions should not normally be an issue if the lookup is performed on a set of curated certificates that the user has explicitly associated with themself.</t>

</section>
<section anchor="lookup-by-full-fingerprint-eg-from-a-public-key-server"><name>Lookup by full fingerprint (e.g. from a public key server)</name>

<t>In order to perform a certificate lookup by fingerprint, an application can perform the "determining the full OpenPGP fingerprint" procedure (as described in <xref target="determine-fingerprint"/>), and then perform a network lookup based on the confirmed fingerprint, e.g. from a public key server.</t>

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

<section anchor="collision-risk-for-identifiers"><name>Collision risk for identifiers</name>

<t>This document describes use of (effectively) an 8 octet identifier to recognize a key on an OpenPGP card, instead of previously a 20 octet identifier.</t>

<t>This raises the question if there are any risks associated with that shortened identifier.</t>

<t>Conceivable risks fall into at least two classes:</t>

<t><list style="numbers">
  <t>Accidental occurrence of a duplicate identifier in a user's context.</t>
  <t>An attacker who intentionally causes a duplicate identifier to be present in a user's context.</t>
</list></t>

<t>It is important to keep in mind that an identifier stored on a hardware security device only exists within the user's local computing environment.
It is only visible locally, when a user plugs in, for example, a USB device that implements the "OpenPGP card" application.</t>

<section anchor="accidental-occurrence-of-duplicate-identifiers"><name>Accidental occurrence of duplicate identifiers</name>

<t>Accidental collision of 8 octet fingerprint prefixes between multiple hardware-backed OpenPGP component keys in a user's local environment is exceedingly unlikely.</t>

<t>And even if a collision were to occur, it could be detected and resolved safely by an application, e.g. by reconstructing the full key packet and checking the complete fingerprint for each hardware-backed key.</t>

</section>
<section anchor="duplicate-identifiers-caused-by-an-attacker"><name>Duplicate identifiers caused by an attacker</name>

<t>Note that this case only arises if an attacker introduces a hardware security device into a user's computing environment.</t>

<t>For example, when an attacker underhandedly replaces a user's OpenPGP card.</t>

<t>In such a scenario, it's unclear if this document - and in particular, the 8 octet fingerprint prefix stored as part of the identifier - adds any risks over the status quo for v4 key packets:</t>

<t><list style="symbols">
  <t>If an application takes the identifier field at face value, then an attacker can mislead the user by writing any value into that field, on a device that is used in an attack (including in the pre-existing v4 case). A longer value doesn't improve this case.</t>
  <t>Assuming an "honest" device (which truthfully reports the public key parameters that correspond to the private key stored on the device): If an application checks for consistency between reported public key material and the reported identifier, it would require non-trivial effort to find an 8 octet collision with a pre-existing user key.
  <list style="symbols">
      <t>But in any case, the user's software is not limited to checking the 8 octets of fingerprint prefix in the identifier field. It can instead compare the full fingerprint of the reconstructed key packet against the expected fingerprint.</t>
    </list></t>
  <t>Assuming a "dishonest" device (which reports "untrue" public key parameters to the host system), an attacker can mislead a user independent of the identifier scheme used. A dishonest device can report the expected public key material and fingerprint values, independent of the private key material used by the device. The private key material that a hardware security device uses can, by definition, not be inspected directly by the host system.</t>
</list></t>

<t>In short, relying on self-reported information from a hardware device is always a losing proposition, if the device is malicious.
This document does not attempt to mitigate risks associated with adversarial devices.</t>

<t>(As a side-note, it is unclear under which circumstances an attacker benefits from causing a target keyholder to use a different private key than the one they intended to use. While there might be edge cases in which such attacks are important to consider, underhandedly replacing a user's private key material is not a typical attack scenario.)</t>

</section>
</section>
</section>
<section anchor="additional-considerations"><name>Additional considerations</name>

<section anchor="overloading"><name>Some version 4 fingerprint values are overloaded by this identifier scheme</name>

<t>Because the scheme outlined here reuses a pre-existing data field (which can legitimately contain any possible value), and uses this field to encode additional information, the scheme necessarily overloads a subset of that field's range of values.</t>

<t>This necessarily involves a tradeoff. The chosen tradeoff is:</t>

<t>The identifier for a version 4 key packets with a fingerprint that starts with 12 octets that match the "version marker" format specified in <xref target="encoding-post-v4"/> becomes ambiguous.
Such an identifier would (erroneously) be interpreted to refer to a key packet with a different version.</t>

<t>In other words, to allow explicit encoding of key versions &gt; 4, a (small) portion of the identifier namespace gets reserved for special handling, thereby rendering that fraction v4 fingerprint namespace unusable.</t>

<t>Concretely, the fraction of the v4 fingerprint namespace that becomes unusable with this scheme is <spanx style="verb">1 : 2^88</spanx> (any identifier value in which the first 11 octets are all zero).
This document considers the blocked part of the namespace sufficiently small that it is disregarded in the remainder of the document.</t>

<t>(Note though that an application could in theory recognize and correctly handle OpenPGP v4 keys with fingerprints that start with what looks like a version marker segment, by reconstructing and validating a reconstruction of that shape of key packet.
However, the added complexity of such special case handling would not be well-spent. This document does not recommend implementing handling that case.)</t>

</section>
<section anchor="handling-seeming-inconsistencies-of-on-device-data"><name>Handling (seeming) inconsistencies of on-device data</name>

<t>Since there is redundancy within the on-device data (public key material, associated metadata, and the identifier), the combination of values may appear inconsistent to applications.</t>

<t>Note that this is the case for the long-established use of v4 OpenPGP keys on hardware devices, and analogously the case for the scheme outlined in this document.</t>

<t>Such inconsistencies may have different underlying root causes.
These are discussed in the following.</t>

<section anchor="case-1-the-key-material-is-not-associated-with-an-openpgp-key-packet"><name>Case 1: The key material is not associated with an OpenPGP key packet</name>

<t>Some key material stored on hardware devices (including on "OpenPGP card" devices) is not linked to an OpenPGP key packet.</t>

<t>Such keys don't have a consistent OpenPGP identifier set on the device.
This fact is unchanged by this document.</t>

</section>
<section anchor="case-2-the-application-cant-interpret-the-identifier-because-it-lacks-knowledge"><name>Case 2: The application can't interpret the identifier because it lacks knowledge</name>

<t>In some cases, even though the identifier is in fact consistent with all other on-device data, it may appear inconsistent to an application, because the application does not interpret the flavor of key material on the device correctly.</t>

<t>When an application cannot find an internally consistent interpretation of the on-device data as an OpenPGP key packet, it should assume that the device contains key material that it doesn't know how to handle.
It must neither use that key on the device, nor alter any data on the device without user confirmation.</t>

<t>If appropriate from a UX perspective, it may inform the user about the issue.</t>

</section>
<section anchor="case-3-the-application-understands-the-key-flavor-can-validate-all-public-key-data-against-additional-information-about-the-openpgp-key-packet-but-the-identifier-field-doesnt-match-the-expected-value"><name>Case 3: The application understands the key flavor, can validate all public key data against additional information about the OpenPGP key packet, but the identifier field doesn't match the expected value</name>

<t>In this case, the application has access to a key on a hardware security device, as well as to a complete representation of the associated OpenPGP key packet (e.g., the certificate associated with the hardware device may be available as part of the local state of the application).</t>

<t>If the application can verify that the public key material and other data on the device (including algorithm setting and key creation time) corresponds to a key packet format that it can handle, and only the identifier information stored on the device is inconsistent, it may consider the key usable, and the identifier on the device to be in error.</t>

<t>In this case, the application may use the key on the device.
It may also optionally update the identifier field on the device to conform to the guidance in this document.</t>

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

<t>This document does not require any action from IANA.</t>

</section>


  </middle>

  <back>


    <references title='Normative References'>



<reference anchor='RFC9580' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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'>




<reference anchor='I-D.dkg-openpgp-external-secrets' target='https://datatracker.ietf.org/doc/html/draft-dkg-openpgp-external-secrets-03'>
   <front>
      <title>OpenPGP External Secret Keys</title>
      <author fullname='Daniel Kahn Gillmor' initials='D. K.' surname='Gillmor'>
         <organization>American Civil Liberties Union</organization>
      </author>
      <author fullname='Heiko Schaefer' initials='H.' surname='Schaefer'>
         </author>
      <date day='22' month='July' year='2026'/>
      <abstract>
	 <t>   This document defines a standard wire format for indicating that the
   secret component of an OpenPGP asymmetric key is stored externally,
   for example on a hardware device or other comparable subsystem.

	 </t>
      </abstract>
   </front>
   <seriesInfo name='Internet-Draft' value='draft-dkg-openpgp-external-secrets-03'/>
   
</reference>


<reference anchor="OPENPGP-SMARTCARD" target="https://gnupg.org/ftp/specs/OpenPGP-smart-card-application-3.4.1.pdf">
  <front>
    <title>Functional Specification of the OpenPGP application on ISO Smart Card Operating Systems, Version 3.4.1</title>
    <author initials="A." surname="Pietig" fullname="Achim Pietig">
      <organization></organization>
    </author>
    <date year="2020" month="March" day="18"/>
  </front>
</reference>


    </references>


<section anchor="alternative-designs-considered"><name>Alternative designs considered</name>

<t>The option space for encoding a 20 octet identifier for a key packet is large.
The following substantively different design options were considered:</t>

<section anchor="octet-prefix-of-fingerprint"><name>20 octet prefix of fingerprint</name>

<t>One alternative design would encode the first 20 octets of the full fingerprint on the device, matching the length of the field on the constrained device, without an explicit version marker.
With this approach, an application would, for example, store the first 20 octets of a version 6 fingerprint on an OpenPGP card device.</t>

<t>For the version 6 fingerprint of the primary key packet of the Transferable Secret Key in <xref section="A.4" sectionFormat="of" target="RFC9580"/>, the identifier on a hardware device would be set to <spanx style="verb">cb186c4f0609a697e4d52dfa6c722b0c1f1e27c1</spanx> (truncated from the full fingerprint <spanx style="verb">cb186c4f0609a697e4d52dfa6c722b0c1f1e27c18a56708f6525ec27bad9acc9</spanx>).</t>

<t>This approach would be practically viable, but it has at least one downside compared to the scheme described in this document:</t>

<t>The version number is not encoded explicitly. This is not in itself a reason to reject the approach. However, there is no known upside that counterbalances this downside.</t>

</section>
<section anchor="key-packet-version-only"><name>Key packet version only</name>

<t>Another alternative design would omit any key-specific data from the identifier field, except for the key's version number.</t>

<t>For the version 6 fingerprint of the primary key packet of the Transferable Secret Key in <xref section="A.4" sectionFormat="of" target="RFC9580"/>, the identifier on a hardware device would be set to <spanx style="verb">0000000000000000000000000000000000000006</spanx> (as it would be for any other version 6 key packet).</t>

<t>This scheme is sufficient for performing cryptographic operations, under normal circumstances. The scheme has the advantage that the data on the device cannot be internally inconsistent.</t>

<t>However, this scheme does not allow an application to reason about the key material on a device, in the absence of an externally available copy of the OpenPGP key packet data:</t>

<t><list style="symbols">
  <t>An application can not conclusively detect if the on-device key is intended for use in an OpenPGP context, without additional information.</t>
  <t>An application can not deduce the shape of the associated OpenPGP key packet, without additional information.</t>
</list></t>

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

<t>The following people have contributed to this document in various ways,
offering reviews, suggestions, corrections, and implementation notes:</t>

<t><list style="symbols">
  <t>Andrew Gallagher</t>
  <t>Daniel Huigens</t>
  <t>Daniel Kahn Gillmor</t>
  <t>Paul Schaub</t>
  <t>Simo Sorce</t>
  <t>Simon Josefsson</t>
  <t>Werner Koch</t>
</list></t>

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

<section numbered="false" anchor="substantive-changes-from-draft-hko-openpgp-identifiers-for-legacy-devices-02-to-draft-hko-openpgp-identifiers-for-legacy-devices-03"><name>Substantive Changes from draft-hko-openpgp-identifiers-for-legacy-devices-02 to draft-hko-openpgp-identifiers-for-legacy-devices-03</name>

<t><list style="symbols">
  <t>Editorial and structural changes only</t>
</list></t>

</section>
<section numbered="false" anchor="substantive-changes-from-draft-hko-openpgp-identifiers-for-legacy-devices-01-to-draft-hko-openpgp-identifiers-for-legacy-devices-02"><name>Substantive Changes from draft-hko-openpgp-identifiers-for-legacy-devices-01 to draft-hko-openpgp-identifiers-for-legacy-devices-02</name>

<t><list style="symbols">
  <t>Further elaborate the purpose of the identifier</t>
  <t>Add guidance for dealing with (seemingly) inconsistent identifier values</t>
  <t>Add some more context about the status quo of handling v4 keys on hardware devices</t>
  <t>Edits for clarity</t>
</list></t>

</section>
<section numbered="false" anchor="substantive-changes-from-draft-hko-openpgp-identifiers-for-legacy-devices-00-to-draft-hko-openpgp-identifiers-for-legacy-devices-01"><name>Substantive Changes from draft-hko-openpgp-identifiers-for-legacy-devices-00 to draft-hko-openpgp-identifiers-for-legacy-devices-01</name>

<t><list style="symbols">
  <t>Change the version marker from 12 octets of <spanx style="verb">&lt;version&gt;</spanx> to 11 octets of <spanx style="verb">0x00</spanx> and one octet of <spanx style="verb">&lt;version&gt;</spanx></t>
  <t>Add an explicit description of the identifier field's purpose(s)</t>
</list></t>

</section>
</section>


  </back>

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

-->

</rfc>

