<?xml version="1.0" encoding="utf-8"?>
<rfc version="3" ipr="trust200902" docName="draft-vicente-lamps-pqchc-02"
     submissionType="IETF" category="std" xml:lang="en"
     xmlns:xi="http://www.w3.org/2001/XInclude">
<front>
  <title abbrev="PQCHC X.509 Extension">A Post-Quantum Hybrid-Commitment Certificate Extension (PQCHC)</title>
  <seriesInfo name="Internet-Draft" value="draft-vicente-lamps-pqchc-02"/>
  <author fullname="Brian Vicente">
    <organization>Sanctum SecOps LLC</organization>
    <address><email>brian@sanctumsecops.io</email></address>
  </author>
  <date year="2026" month="June"/>
  <area>Security</area>
  <workgroup>LAMPS</workgroup>
  <keyword>post-quantum</keyword><keyword>X.509</keyword>
  <keyword>certificate extension</keyword><keyword>crypto-agility</keyword>
  <abstract>
    <t>This document defines a non-critical X.509 certificate extension, the
Post-Quantum Hybrid Commitment (PQCHC), that allows a certificate issued
with a classical or hybrid key to carry a verifiable, cryptographically
bound commitment to a specific future post-quantum algorithm and a
Commitment Validity Time. The PQCHC commitment binds to a hash of the
committed future public key and algorithm identifier, enabling a relying
party to verify that a subsequently issued post-quantum certificate honors
the earlier commitment. This mechanism provides a crypto-agility signal
for certificate-lifecycle automation, including ACME Renewal Information
(ARI), to plan and verify PQC migration.</t>
  </abstract>
</front>
<middle>
  <section anchor="introduction"><name>Introduction</name>
    <t>The finalization of NIST post-quantum standards FIPS 203 <xref target="FIPS203"/>,
FIPS 204 <xref target="FIPS204"/>, and FIPS 205 <xref target="FIPS205"/> establishes the algorithms
to which existing PKIs must migrate. NIST IR 8547 <xref target="IR8547"/> sets a
deprecation calendar that makes migration time-bounded.</t>
    <t>Migration of an X.509 <xref target="RFC5280"/> hierarchy is gated by the certificate
lifecycle: a relying party is not protected against a cryptographically
relevant quantum computer (CRQC) until quantum-vulnerable certificates
have expired or been replaced. During the multi-year transition window, a
relying party frequently holds a certificate that is still classical (or
hybrid) but whose subject intends to migrate to a specific post-quantum
algorithm at a known time. Today there is no interoperable,
machine-verifiable way to express that intent inside the certificate itself.</t>
    <t>This document addresses that gap. PQCHC allows a certificate that is not
yet composite to carry a machine-verifiable commitment to the post-quantum
algorithm and the time by which the subject intends to migrate, such that
lifecycle automation (for example, ACME Renewal Information <xref target="RFC9773"/>)
can act on it and a relying party can later verify the migration was honored.</t>
    <t>Algorithm identifiers in this document use the registrations defined in
<xref target="RFC9881"/> (ML-DSA), <xref target="RFC9909"/> (SLH-DSA), and <xref target="RFC9935"/> (ML-KEM).
This document uses the post-quantum terminology of <xref target="RFC9794"/>.</t>
    <section anchor="relationship"><name>Relationship to Existing Work</name>
      <t><xref target="REDDYPQCOMMIT"/> defines a declarative post-quantum continuity signal
expressed as a period of time, without a cryptographic binding to a specific
future key. PQCHC differs by binding the commitment to a hash of the committed
future public key and algorithm identifier, permitting later verification that
an issued post-quantum certificate honors the prior commitment.</t>
      <t>Composite certificates (<xref target="COMPOSITESIGS"/>) address the transition phase.
PQCHC addresses the pre-transition phase. The two mechanisms are not mutually
exclusive; see <xref target="composite"/> for the interaction model.</t>
    </section>
  </section>

  <section anchor="requirements"><name>Requirements</name>
    <t>This section states requirements that a conforming PQCHC implementation SHOULD satisfy.</t>
    <dl>
      <dt>REQ-1:</dt><dd>A solution MUST embed a cryptographic hash of the future SubjectPublicKeyInfo
in the current certificate in a field covered by the CA's signature. The hash algorithm
MUST provide at least 128 bits of second-preimage resistance against a quantum adversary.</dd>
      <dt>REQ-2:</dt><dd>A solution MUST include an AlgorithmIdentifier for the intended committed
algorithm, enabling relying parties to assess algorithm support without waiting for the
successor certificate to be issued.</dd>
      <dt>REQ-3:</dt><dd>A PQCHC-aware relying party MUST be able to verify, at the time of
observing a successor certificate, whether the SPKI hash matches the Committed Key Hash
in the predecessor certificate. A mismatch MUST be treated as a commitment failure.</dd>
      <dt>REQ-4:</dt><dd>A solution MUST include a Commitment Validity Time expressed as a
<tt>GeneralizedTime</tt>. Relying parties MUST NOT enforce commitment semantics after this time.</dd>
      <dt>REQ-5:</dt><dd>A solution SHOULD be integrable with ACME Renewal Information (ARI)
<xref target="RFC9773"/> so that the <tt>suggestedWindow</tt> falls at or before the Commitment
Validity Time, and the resulting renewal uses the committed key.</dd>
      <dt>REQ-6:</dt><dd>The committed algorithm SHOULD be specified with sufficient precision to
identify the NIST security level of the intended future key.</dd>
      <dt>REQ-7:</dt><dd>A solution SHOULD provide an optional URI field pointing to a
human-readable or machine-parseable document describing the operator's migration policy.</dd>
      <dt>REQ-8:</dt><dd>A solution MUST be deployable as a non-critical X.509 v3 extension per
<xref target="RFC5280"/> Section 4.2. Legacy relying parties MUST be unaffected.</dd>
      <dt>REQ-9:</dt><dd>The extension value MUST be encoded in Distinguished Encoding Rules (DER)
per <xref target="RFC5280"/>. All internal fields MUST use DER canonical encoding.</dd>
      <dt>REQ-10:</dt><dd>Prior to formal IANA OID assignment, operators SHOULD be able to use a
private enterprise arc for experimental deployments.</dd>
    </dl>
  </section>

  <section anchor="conventions"><name>Conventions and Definitions</name>
    <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" 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.</t>
    <dl>
      <dt>Committed Algorithm:</dt><dd>the post-quantum algorithm, identified by an OID, to which
the subject commits for a future certificate.</dd>
      <dt>Committed Key Hash:</dt><dd>a cryptographic hash over the <tt>subjectPublicKeyInfo</tt> the
subject intends to use for the committed algorithm in a future certificate.</dd>
      <dt>Commitment Validity Time:</dt><dd>the time by which the committed algorithm is intended
to be in force, expressed as a <tt>GeneralizedTime</tt>.</dd>
      <dt>CRQC:</dt><dd>Cryptographically Relevant Quantum Computer, as described in <xref target="RFC9794"/>.</dd>
    </dl>
  </section>

  <section anchor="pqchc-extension"><name>The PQCHC Extension</name>
    <t>The PQCHC extension is a non-critical X.509 v3 certificate extension.
Relying parties that do not understand the extension MUST ignore it per <xref target="RFC5280"/>.</t>
    <section anchor="asn1-module"><name>Encoding</name>
      <artwork name="" type="asn1"><![CDATA[
PQCHC-2025
  { iso(1) identified-organization(3) dod(6) internet(1)
    private(4) enterprise(1) 65953 modules(0) pqchc(1) }

DEFINITIONS IMPLICIT TAGS ::= BEGIN

IMPORTS
    AlgorithmIdentifier FROM PKIX1Explicit88
        { iso(1) identified-organization(3) dod(6) internet(1)
          security(5) mechanisms(5) pkix(7) id-mod(0) id-pkix1-explicit(18) }
    DigestInfo FROM CryptographicMessageSyntax2004
        { iso(1) member-body(2) us(840) rsadsi(113549)
          pkcs(1) pkcs-9(9) smime(16) modules(0) cms-2004(24) }
    EXTENSION FROM PKIX-CommonTypes-2009
        { iso(1) identified-organization(3) dod(6) internet(1)
          security(5) mechanisms(5) pkix(7) id-mod(0)
              id-mod-pkixCommon-02(57) } ;

id-ce-pqchc-experimental OBJECT IDENTIFIER ::= { 1 3 6 1 4 1 65953 1 1 }
-- id-ce-pqchc OBJECT IDENTIFIER ::= { id-ce TBD1 }

ext-pqchc EXTENSION ::= {
    SYNTAX       PQCHCommitment
    IDENTIFIED BY id-ce-pqchc-experimental }

PQCHCommitment ::= SEQUENCE {
    commitmentValid     BOOLEAN DEFAULT TRUE,
    committedAlgorithm  AlgorithmIdentifier,
    committedKeyHash    DigestInfo,
    commitmentNotAfter  GeneralizedTime,
    policyURI           IA5String OPTIONAL }

END
]]></artwork>
      <t>Implementation notes: <tt>AlgorithmIdentifier</tt> for ML-DSA, ML-KEM, and SLH-DSA
MUST carry a non-null <tt>algorithm</tt> OID with the <tt>parameters</tt> field absent, consistent
with <xref target="RFC9881"/>, <xref target="RFC9935"/>, and <xref target="RFC9909"/>. <tt>GeneralizedTime</tt>
is used rather than <tt>UTCTime</tt> to support dates beyond 2049, consistent with
<xref target="RFC5280"/> Section 4.1.2.5.2.</t>
    </section>
    <section anchor="processing-rules"><name>Processing Rules</name>
      <t>When a subsequently issued certificate for the same subject presents a
post-quantum key, the following verification procedure applies:</t>
      <artwork name="" type="pseudocode"><![CDATA[
function VerifyPQCHCCommitment(committingCert, candidatePQCert):
  ext = committingCert.findExtension(id-ce-pqchc)
  if ext is absent: return NOT_COMMITTED
  commitment = DER_DECODE(ext.extnValue, PQCHCommitment)
  if commitment.commitmentValid == FALSE: return COMMITMENT_INVALIDATED
  if candidatePQCert.subjectPublicKeyInfo.algorithm
       != commitment.committedAlgorithm: return ALGORITHM_MISMATCH
  spkiBytes = DER_ENCODE(candidatePQCert.subjectPublicKeyInfo)
  hashAlg   = commitment.committedKeyHash.digestAlgorithm
  computed  = HASH(hashAlg, spkiBytes)
  if computed != commitment.committedKeyHash.digest:
      return HASH_MISMATCH
  if candidatePQCert.validity.notBefore > commitment.commitmentNotAfter:
      return COMMITMENT_EXPIRED
  return COMMITMENT_HONORED
]]></artwork>
      <t>A relying party MUST NOT treat a PQCHC commitment as a reason to accept a
certificate it would otherwise reject. The commitment is advisory.</t>
    </section>
  </section>

  <section anchor="composite"><name>Interaction with Composite Certificates</name>
    <t>When a composite certificate also carries a PQCHC extension, the
<tt>committedAlgorithm</tt> field MUST use the composite algorithm OID as defined in
<xref target="COMPOSITESIGS"/>, and <tt>committedKeyHash</tt> MUST be over the DER-encoded
composite <tt>subjectPublicKeyInfo</tt>.</t>
    <artwork name="" type="ascii-art"><![CDATA[
Migration Phase           Mechanism
------------------------- ----------------------------------------
Pre-migration             PQCHC: forward-key-hash commitment
(classical cert)          to specific PQC algorithm and time
Transition                Composite ML-DSA: simultaneous
(composite cert)          classical AND PQ in one certificate
Post-migration            Pure PQ cert satisfies prior PQCHC
(pure PQ cert)            commitment; neither mechanism needed
]]></artwork>
  </section>

  <section anchor="acme-ari"><name>Interaction with ACME-ARI</name>
    <t>An ACME CA that wishes to honor PQCHC commitments SHOULD constrain the
ARI scheduling window so that <tt>suggestedWindow.end</tt> is at or before
<tt>min(certificate.notAfter, commitment.commitmentNotAfter)</tt>.
When the ACME server receives an order with a <tt>replaces</tt> field referencing
a PQCHC-bearing certificate, it SHOULD verify that the CSR's
<tt>subjectPublicKeyInfo</tt> hashes to <tt>committedKeyHash.digest</tt>. An order that
fails this check SHOULD be rejected with an <tt>orderNotReady</tt> error.</t>
  </section>

  <section anchor="security"><name>Security Considerations</name>
    <t>The commitment is advisory and MUST NOT be treated as authentication of
the committed post-quantum key. A commitment MUST NOT downgrade the
validation of the certificate in which it appears.</t>
    <section anchor="downgrade"><name>Downgrade Resistance</name>
      <t>A man-in-the-middle adversary can attempt forced-classical-reissuance during
the PQC transition window. Lifecycle automation SHOULD verify that the renewed
certificate's SPKI hash matches <tt>committedKeyHash</tt>. Operators participating in
Certificate Transparency can detect classical re-issuance by scanning CT logs for
conflicting subject/SPKI combinations after the <tt>commitmentNotAfter</tt> deadline.</t>
    </section>
    <section anchor="commitment-substitution"><name>Commitment-Substitution Attacks</name>
      <t>A commitment-substitution adversary attempts to find a second preimage of the
committed SPKI under the digest algorithm. Second-preimage attacks are mitigated
by the digest-algorithm requirements in <xref target="hash-agility"/>. The CA re-issuance
path is a CA-compromise scenario; Certificate Transparency provides audit-trail
mitigation.</t>
    </section>
    <section anchor="preimage"><name>Pre-Image Attack Surface on committedKeyHash</name>
      <t>Under Grover's algorithm, a quantum adversary can find a preimage of an
n-bit hash in approximately 2^(n/2) quantum queries. For SHA-256, quantum preimage
cost is approximately 2^128, which remains computationally infeasible.
Implementations MUST NOT use MD5, SHA-1, or SHA-224 for <tt>committedKeyHash</tt>.</t>
    </section>
    <section anchor="hash-agility"><name>Hash Algorithm Agility</name>
      <t>The <tt>committedKeyHash</tt> field uses <tt>DigestInfo</tt>, which carries both the hash
algorithm OID and the hash value, enabling digest algorithm upgrades without
changing the ASN.1 structure. The digest algorithm MUST provide at least 128 bits
of second-preimage resistance against a quantum adversary. SHA-256, SHA-384,
SHA-512, and SHA-3 variants with 256-bit or greater output are acceptable.</t>
      <t>Operators SHOULD set <tt>commitmentNotAfter</tt> at or before the NIST IR 8547
<xref target="IR8547"/> deprecation date of the algorithm used to sign the committing
certificate. CA key-generation practices SHOULD require constant-time
implementations of the committed algorithm (see <xref target="KyberSlash"/>,
<xref target="NTTSIS"/>, <xref target="ILPFAULT"/>).</t>
    </section>
  </section>

  <section anchor="implementation-status"><name>Implementation Status</name>
    <t>This section is included per <xref target="RFC7942"/>.</t>
    <t>Organization: Sanctum SecOps LLC. An experimental Go implementation covers
encoding/decoding of PQCHCommitment structures, DigestInfo computation, and
commitment verification per <xref target="processing-rules"/>. Located at <tt>poc/pqchc/</tt>
in the companion repository at https://github.com/Sanc-Admin/sanctum-ietf
(private until counsel hand-off). Maturity: Experimental. MUST NOT be deployed
in production without qualified security and legal review.</t>
  </section>

  <section anchor="iana"><name>IANA Considerations</name>
    <section anchor="iana-oid"><name>X.509 Certificate Extension OID</name>
      <t>IANA is requested to assign an object identifier for the PQCHC certificate
extension from the id-ce arc:</t>
      <artwork><![CDATA[id-ce-pqchc OBJECT IDENTIFIER ::= { id-ce TBD1 }]]></artwork>
      <t>For early interoperability testing, the experimental OID
<tt>1.3.6.1.4.1.65953.1.1</tt> under the Sanctum SecOps PEN arc MAY be used.
Deployments MUST transition to the IANA-assigned TBD1 value upon RFC publication.</t>
    </section>
    <section anchor="iana-hash"><name>Digest Algorithms for committedKeyHash</name>
      <t>Acceptable OIDs for <tt>committedKeyHash</tt>: id-sha256, id-sha384, id-sha512,
id-sha3-256, id-sha3-384, id-sha3-512. The following MUST NOT be used:
id-md5, id-sha1.</t>
    </section>
  </section>
</middle>

<back>
  <references><name>Normative References</name>
    <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
    <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5280.xml"/>
    <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7942.xml"/>
    <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
    <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9773.xml"/>
    <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9794.xml"/>
    <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9881.xml"/>
    <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9909.xml"/>
    <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9935.xml"/>
  </references>
  <references><name>Informative References</name>
    <reference anchor="FIPS203" target="https://csrc.nist.gov/pubs/fips/203/final">
      <front><title>Module-Lattice-Based Key-Encapsulation Mechanism Standard</title>
        <author><organization>NIST</organization></author>
        <date year="2024" month="August"/></front></reference>
    <reference anchor="FIPS204" target="https://csrc.nist.gov/pubs/fips/204/final">
      <front><title>Module-Lattice-Based Digital Signature Standard</title>
        <author><organization>NIST</organization></author>
        <date year="2024" month="August"/></front></reference>
    <reference anchor="FIPS205" target="https://csrc.nist.gov/pubs/fips/205/final">
      <front><title>Stateless Hash-Based Digital Signature Standard</title>
        <author><organization>NIST</organization></author>
        <date year="2024" month="August"/></front></reference>
    <reference anchor="IR8547" target="https://csrc.nist.gov/pubs/ir/8547/ipd">
      <front><title>Transition to Post-Quantum Cryptography Standards (NIST IR 8547)</title>
        <author><organization>NIST</organization></author>
        <date year="2024" month="November"/></front></reference>
    <reference anchor="COMPOSITESIGS" target="https://datatracker.ietf.org/doc/draft-ietf-lamps-pq-composite-sigs/">
      <front><title>Composite ML-DSA for use in X.509 Public Key Infrastructure</title>
        <author initials="M." surname="Ounsworth"/>
        <author initials="J." surname="Gray"/>
        <author initials="M." surname="Pala"/>
        <date year="2024"/></front></reference>
    <reference anchor="REDDYPQCOMMIT" target="https://datatracker.ietf.org/doc/draft-reddy-lamps-x509-pq-commit/">
      <front><title>X.509 Extensions for PQC or Composite Certificate Hosting Continuity</title>
        <author initials="T." surname="Reddy"/>
        <author initials="D." surname="Wing"/>
        <author initials="R." surname="Droms"/>
        <date year="2024"/></front></reference>
    <reference anchor="CNSA2" target="https://www.nsa.gov/Press-Room/News-Highlights/Article/Article/3148990/">
      <front><title>Commercial National Security Algorithm Suite 2.0</title>
        <author><organization>NSA</organization></author>
        <date year="2022" month="September"/></front></reference>
    <reference anchor="KyberSlash" target="https://kannwischer.eu/papers/2024_kyberslash.pdf">
      <front><title>Exploiting secret-dependent division timings in Kyber implementations</title>
        <author initials="D.J." surname="Bernstein"/>
        <author initials="L." surname="Ducas"/>
        <author initials="E." surname="Landgraf"/>
        <author initials="N." surname="Mulder"/>
        <date year="2025"/></front></reference>
    <reference anchor="NTTSIS" target="https://eprint.iacr.org/2023/1866">
      <front><title>Side-Channel-Assisted Cryptanalysis on Post-Quantum Algorithms</title>
        <author><organization>NTT</organization></author>
        <date year="2024"/></front></reference>
    <reference anchor="ILPFAULT" target="https://www.intel.com/content/www/us/en/security/security-practices/blogs/fault-injection-attacks.html">
      <front><title>ILP Fault Recovery on Dilithium / ML-DSA</title>
        <author><organization>Intel</organization></author>
        <date year="2025"/></front></reference>
  </references>

  <section anchor="example" numbered="false"><name>Worked Example: ML-DSA-65 Commitment</name>
    <t>All values are synthetic test data. Scenario: a server certificate issued with
an ECDSA-P256 key commits to migrating to ML-DSA-65 (<xref target="RFC9881"/>) by
2030-01-01T00:00:00Z.</t>
    <artwork><![CDATA[
committedAlgorithm OID for id-ml-dsa-65: 2.16.840.1.101.3.4.3.18

committedKeyHash (SHA-256 over synthetic future ML-DSA-65 SPKI):
a3 f8 2d 11 cc 4e 9b 7f  e1 05 3a 88 d2 60 b9 4c
7d 19 e2 aa 55 fc 3b 0e  84 c7 21 63 09 f4 1b 8e
(Synthetic value -- not derived from any real key.)

commitmentNotAfter: 20300101000000Z

ASN.1 DER encoding of PQCHCommitment (hex):
30 56                        -- SEQUENCE (86 bytes)
  01 01 ff                   -- BOOLEAN TRUE (commitmentValid)
  30 0b                      -- AlgorithmIdentifier SEQUENCE
    06 09                    -- OID id-ml-dsa-65
      60 86 48 01 86 3a 04 03 12
  30 27                      -- DigestInfo SEQUENCE
    30 0d                    -- digestAlgorithm
      06 09 60 86 48 01 65 03 04 02 01  -- id-sha256
      05 00
    04 20                    -- OCTET STRING (32 bytes)
      a3 f8 2d 11 cc 4e 9b 7f e1 05 3a 88 d2 60 b9 4c
      7d 19 e2 aa 55 fc 3b 0e 84 c7 21 63 09 f4 1b 8e
  18 0f 32 30 33 30 30 31 30 31 30 30 30 30 30 30 5a
]]></artwork>
  </section>

  <section anchor="timeline" numbered="false"><name>NIST IR 8547 and CNSA 2.0 Migration Timeline</name>
    <artwork><![CDATA[
+------+---------------------------------------+---------------------+
| Year | Event                                 | PQCHC implication   |
+------+---------------------------------------+---------------------+
| 2030 | NIST: deprecation of 112-bit classical | commitmentNotAfter  |
|      | asymmetric algorithms                 | SHOULD precede this |
+------+---------------------------------------+---------------------+
| 2031 | CNSA 2.0: full enforcement for NSS    | MUST complete PQC   |
|      | National Security Systems             | migration by 2031.  |
+------+---------------------------------------+---------------------+
| 2035 | NIST: disallowment of new protection  | commitmentNotAfter  |
|      | using quantum-vulnerable algorithms   | MUST NOT exceed.    |
+------+---------------------------------------+---------------------+
]]></artwork>
  </section>

  <section anchor="acknowledgments" numbered="false"><name>Acknowledgments</name>
    <t>The author thanks the LAMPS Working Group for the foundational
post-quantum X.509 work on which this extension builds.</t>
  </section>
</back>

</rfc>
