<?xml version="1.0" encoding="utf-8"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     category="std"
     docName="draft-ruvalcaba-nhe-identity-00"
     ipr="trust200902"
     submissionType="IETF"
     consensus="true"
     xml:lang="en"
     tocInclude="true" tocDepth="3" symRefs="true" sortRefs="true" version="3">

  <front>
    <title abbrev="NHE Identity">NHE Identity: A Verifiable Key-Committed Identity and Genesis-Attestation Format for Autonomous Agents</title>
    <seriesInfo name="Internet-Draft" value="draft-ruvalcaba-nhe-identity-00"/>
    <author fullname="Cristian Xavier Ruvalcaba" initials="C.X." surname="Ruvalcaba">
      <organization>Saluca LLC</organization>
      <address><email>cristian@saluca.com</email></address>
    </author>
    <date year="2026" month="August" day="11"/>
    <area>Security</area>
    <workgroup>Individual Submission</workgroup>
    <keyword>agent identity</keyword>
    <keyword>attestation</keyword>
    <keyword>hash chain</keyword>
    <keyword>post-quantum</keyword>
    <keyword>autonomous agent</keyword>

    <abstract>
      <t>This document specifies how a Non-Human Entity (NHE) is identified and how
      one party verifies another's identity. An NHE identity is a verifiable
      cryptographic commitment: control of an identity key, bound by an
      append-only hash chain to the entity's genesis and to the lineage of its
      configuration, rather than a mere name. The document defines the identity
      chain data model (record structure, genesis sentinel, linkage rule, and the
      no-fork property), a proof-of-control challenge/response, an optional
      capability attestation that reveals a specific capability without revealing
      the rest of the configuration, and an optional hardware-rooted
      genesis-attestation profile. The data model is specified here; the concrete
      on-the-wire encoding is deferred to the next revision.</t>
    </abstract>
  </front>

  <middle>

    <section numbered="true"><name>Introduction</name>
      <t>Every other interface of the NHE reference architecture
      <xref target="I-D.ruvalcaba-nhe-arch"/> is scoped to identity: continuity,
      memory, inter-entity messaging, audit, and authority are all bound to "which
      entity." An identity that is only a name is forgeable and therefore useless
      as that anchor. This document specifies identity as a verifiable commitment:
      an entity is identified by control of an identity key, and that key is bound
      by an append-only, independently verifiable hash chain to the entity's
      genesis and to the succession of configurations it has held.</t>
      <t>The construction is deliberately simple and self-contained: a relying
      party --- a peer entity, an operator, or any verifier --- can confirm an
      identity from the chain alone plus a signature, with no registration
      authority in the base case. An optional profile adds hardware-rooted genesis
      attestation for deployments that require it.</t>
    </section>

    <section numbered="true"><name>Relationship to the NHE Architecture</name>
      <t>This document specifies the Identity interface of
      <xref target="I-D.ruvalcaba-nhe-arch"/> and inherits its scope framing. An
      NHE identity is a functional construct --- a key commitment and a
      configuration lineage --- and asserts nothing about the entity being alive,
      sentient, or a person. The identity mechanism is precisely what makes the
      architecture's invariants enforceable: <strong>inspectability</strong>, because
      the chain is an independently verifiable audit of identity and configuration
      lineage; <strong>operator control</strong>, because identity keys and chain
      progression are subject to operator-held revocation (<xref target="revocation"/>);
      and <strong>bounded authority</strong>, because authority grants elsewhere in
      the suite name this identity as their subject.</t>
    </section>

    <section numbered="true"><name>Terminology</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHOULD", "MAY", and
      "OPTIONAL" are to be interpreted as described in BCP 14
      <xref target="RFC2119"/> <xref target="RFC8174"/>.</t>
      <dl>
        <dt>Identity key:</dt><dd>The long-term key pair whose control defines the
        entity. May be a hybrid of a classical and a post-quantum signature key
        (<xref target="crypto"/>).</dd>
        <dt>Identity key hash:</dt><dd>A cryptographic digest of the identity
        public key; the stable identifier for the entity.</dd>
        <dt>Configuration profile:</dt><dd>The structured description of the
        entity's capabilities and constraints at a point in time; committed to the
        chain by its digest, not by value.</dd>
        <dt>Identity chain:</dt><dd>The append-only hash chain of identity records
        binding the identity key to its genesis and configuration lineage.</dd>
        <dt>Genesis record:</dt><dd>The first record of an identity chain.</dd>
        <dt>Relying party:</dt><dd>Any party that verifies an entity's identity ---
        a peer, an operator, or a third-party verifier.</dd>
      </dl>
    </section>

    <section anchor="model" numbered="true"><name>Identity Chain Model</name>
      <t>An identity is a chain of records. Each record commits, in order, to the
      identity key hash, the current configuration profile digest, a pointer to the
      preceding record, a timestamp, and a signature by the identity key.</t>

      <section numbered="true"><name>Record Structure</name>
        <t>An identity record is the ordered tuple:</t>
        <artwork type="ascii-art"><![CDATA[
  record = {
    identity_key_hash : digest of the identity public key
    profile_hash      : digest of the configuration profile
    prior_record_hash : link to the immediate predecessor
    timestamp         : RFC 3339, sub-second precision
    signature         : identity-key signature over the above
  }
]]></artwork>
        <t>The canonical serialization of a record, used both for the
        prior_record_hash computation and for transport, is the canonical form of
        the ordered tuple {identity_key_hash, profile_hash, prior_record_hash,
        timestamp, signature}, with binary fields encoded as lowercase hexadecimal
        and object members in the fixed order shown. Canonicalization MUST be
        deterministic so that any verifier recomputes byte-identical input.</t>
      </section>

      <section numbered="true"><name>Genesis and Linkage</name>
        <t>The prior_record_hash of the genesis record is a sentinel of 32 zero
        octets (0x00 repeated 32 times). For every non-genesis record, the
        prior_record_hash MUST equal the SHA3-256 digest of the canonical
        serialization of its immediate predecessor for the same identity key hash.</t>
        <artwork type="ascii-art"><![CDATA[
  [ genesis ]        [ record 1 ]        [ record 2 ]
  prior = 0x00*32 <- prior = H(genesis) <- prior = H(record 1)
  sig(key)           sig(key)             sig(key)
]]></artwork>
        <t>The chain has the <strong>no-fork</strong> property: at most one record
        exists for each (identity_key_hash, prior_record_hash) pair, so no two
        records may claim the same predecessor. A configuration change is recorded
        by appending a new record with a new profile_hash; the identity key is
        continuous across the change, which is how an entity's configuration lineage
        is bound to a single identity.</t>
      </section>

      <section anchor="verify" numbered="true"><name>Verification</name>
        <t>A relying party verifies an identity chain by, for each record in
        insertion order: (a) verifying the record signature against the identity
        public key; (b) for each non-genesis record, recomputing the SHA3-256
        digest of the canonical serialization of its immediate predecessor and
        confirming it equals the record's prior_record_hash; and (c) confirming the
        no-fork property. Signature verification and per-record hash recomputation
        are each O(1); full-chain verification is O(n) in chain length. A relying
        party that only needs the current identity MAY verify from a trusted
        checkpoint rather than from genesis.</t>
      </section>
    </section>

    <section anchor="control" numbered="true"><name>Proof of Control</name>
      <t>Presenting a chain proves the chain is well-formed; it does not prove the
      presenter controls the identity key. To prove control, a verifier issues a
      challenge comprising a fresh nonce and a freshness counter, and the entity
      returns a signature by its identity key over the challenge together with its
      current record's prior_record_hash. The verifier accepts only if the
      signature verifies against the identity public key committed in the presented
      chain and the freshness counter has not been seen before. This binds the
      live proof to the specific identity and defeats replay.</t>
    </section>

    <section anchor="capability" numbered="true"><name>Capability Attestation (Optional)</name>
      <t>An entity MAY prove that a specific capability is present in its
      configuration profile without revealing the remainder of the profile, by
      producing a proof that is verifiable against the identity public key and that
      attests to the presence of the named capability in the profile committed by
      profile_hash. This lets a relying party confirm "this entity is authorized
      for capability X" without learning the entity's full configuration. The proof
      system is negotiable; the requirement is only that the proof be verifiable
      against the committed identity and profile digest.</t>
    </section>

    <section anchor="genesis-profile" numbered="true"><name>Hardware-Rooted Genesis-Attestation Profile (Optional)</name>
      <t>Deployments that require identity rooted in hardware MAY use this profile.
      At provisioning, a genesis hash is computed as a digest over a canonical,
      fixed-order, length-prefixed serialization of the entity's provisioning
      inputs (its initial configuration commitments), and a genesis record
      containing the genesis hash and a manufacturer signature over it is published
      to a content-addressable registry. The device holds a device-root-bound
      identity private key inside a secure boundary; only the corresponding public
      key is exported.</t>
      <t>Attestation proceeds as a challenge/response: the verifier sends a nonce
      and freshness counter; the device signs an attestation tuple (the challenge,
      a device serial, and a commitment to its current configuration-version
      counter) with the device-rooted key; the verifier fetches the genesis record
      from the registry keyed by a digest of the device serial and verifies a
      signature chain from a manufacturer certificate, through the device public
      key, to the attestation tuple, and that the committed configuration version is
      consistent with the authorized version. Keys used for confidentiality MUST be
      derived from a high-entropy device root secret; published identity values
      (the genesis hash, serial) MUST appear only as non-secret domain-separation
      inputs, never as keying material.</t>
    </section>

    <section anchor="crypto" numbered="true"><name>Cryptographic Agility</name>
      <t>Identity signatures SHOULD be hybrid: a classical signature (for example
      Ed25519 <xref target="RFC8032"/>) composed with a post-quantum signature (for
      example ML-DSA), so that identity survives the compromise of either
      primitive alone. The chain-linkage hash in this document is SHA3-256. The
      set of permitted signature suites and hash functions is registry-controlled
      (<xref target="iana"/>) so the format can migrate without a new protocol
      version; a verifier MUST reject records using a suite it does not implement.</t>
    </section>

    <section anchor="revocation" numbered="true"><name>Revocation and Operator Control</name>
      <t>An operator MUST be able to revoke an identity or a key. Revocation is
      itself expressible as a chain event (a terminal record marking the identity
      or a key as revoked, signed under operator-held authority) and/or as a
      registry status in the hardware-rooted profile. A relying party MUST treat a
      revoked identity as invalid regardless of otherwise well-formed chain and
      proof of control. This is the mechanism by which the architecture's
      operator-control invariant is realized at the identity layer: a continuous
      identity is never continuous against its operator.</t>
    </section>

    <section anchor="wire" numbered="true"><name>Wire Format (to be specified in -01)</name>
      <t>The data model above --- record tuple, genesis sentinel, linkage rule,
      no-fork property, and verification procedure --- is fixed by this revision.
      The concrete encoding of records and messages on the wire (field encodings,
      the challenge/response and attestation message layouts, and the registry
      interaction for the hardware-rooted profile) is deferred to the next
      revision, following the compact-binary approach of HCTP
      <xref target="I-D.ruvalcaba-hctp"/>.</t>
    </section>

    <section anchor="security" numbered="true"><name>Security Considerations</name>
      <t>Identity is the root of all scoping in the NHE suite; compromise of an
      identity key compromises the guarantees of every interface bound to that
      identity. Identity key protection is therefore the highest-value control, and
      the hybrid-signature requirement (<xref target="crypto"/>) exists to keep the
      root secure across cryptographic transitions.</t>
      <t>The chain provides tamper-evidence and lineage, not confidentiality: it
      reveals the sequence and timing of configuration changes and the profile
      digests. Where that metadata is sensitive it MUST be protected by the
      transport. The no-fork check is essential --- without it an entity could
      maintain divergent identities from a shared predecessor; verifiers MUST
      enforce it. Proof of control MUST use unpredictable nonces and monotonic
      freshness to defeat replay. In the hardware-rooted profile, deriving any
      confidentiality key from published or low-entropy identity values is
      cryptographically broken and MUST NOT be done; keys come from the device root
      secret, with published values used only as domain separation. Finally,
      revocation (<xref target="revocation"/>) is a security-critical path: a
      verifier that cannot learn revocation status MUST treat the identity as
      untrusted for high-value actions rather than assume validity.</t>
    </section>

    <section anchor="iana" numbered="true"><name>IANA Considerations</name>
      <t>A future revision will request two registries: "NHE Identity Signature
      Suites" (classical, post-quantum, and hybrid combinations) and "NHE Identity
      Hash Functions" (chain-linkage digests), each under a Specification Required
      policy <xref target="RFC8126"/>. No IANA action is requested by this skeleton
      revision.</t>
    </section>
  </middle>

  <back>
    <references><name>Normative References</name>
      <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 initials="S." surname="Bradner"/><date year="1997" month="March"/></front>
        <seriesInfo name="BCP" value="14"/><seriesInfo name="RFC" value="2119"/></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 initials="B." surname="Leiba"/><date year="2017" month="May"/></front>
        <seriesInfo name="BCP" value="14"/><seriesInfo name="RFC" value="8174"/></reference>
    </references>
    <references><name>Informative References</name>
      <reference anchor="I-D.ruvalcaba-nhe-arch">
        <front><title>An Architecture for Non-Human Entities (NHE)</title>
        <author initials="C.X." surname="Ruvalcaba"/><date year="2026" month="August"/></front>
        <seriesInfo name="Internet-Draft" value="draft-ruvalcaba-nhe-arch-00"/></reference>
      <reference anchor="I-D.ruvalcaba-hctp">
        <front><title>The Hash-Chain Context Transfer Protocol (HCTP)</title>
        <author initials="C.X." surname="Ruvalcaba"/><date year="2026" month="August"/></front>
        <seriesInfo name="Internet-Draft" value="draft-ruvalcaba-hctp-00"/></reference>
      <reference anchor="RFC8032" target="https://www.rfc-editor.org/info/rfc8032">
        <front><title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
        <author initials="S." surname="Josefsson"/><author initials="I." surname="Liusvaara"/>
        <date year="2017" month="January"/></front>
        <seriesInfo name="RFC" value="8032"/></reference>
      <reference anchor="RFC9334" target="https://www.rfc-editor.org/info/rfc9334">
        <front><title>Remote ATtestation procedureS (RATS) Architecture</title>
        <author initials="H." surname="Birkholz"/><author initials="D." surname="Thaler"/>
        <author initials="M." surname="Richardson"/><author initials="N." surname="Smith"/>
        <author initials="W." surname="Pan"/><date year="2023" month="January"/></front>
        <seriesInfo name="RFC" value="9334"/></reference>
      <reference anchor="RFC8126" target="https://www.rfc-editor.org/info/rfc8126">
        <front><title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
        <author initials="M." surname="Cotton"/><author initials="B." surname="Leiba"/>
        <author initials="T." surname="Narten"/><date year="2017" month="June"/></front>
        <seriesInfo name="BCP" value="26"/><seriesInfo name="RFC" value="8126"/></reference>
    </references>
  </back>
</rfc>
