<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rfc [
  <!ENTITY nbsp "&#160;">
  <!ENTITY zwsp "&#8203;">
  <!ENTITY nbhy "&#8209;">
  <!ENTITY wj "&#8288;">
]>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     category="std"
     docName="draft-vandemeent-iddrop-01"
     ipr="trust200902"
     submissionType="IETF"
     consensus="true"
     version="3">

  <front>
    <title abbrev="IDDrop">IDDrop: Identity Drop and Acceptance Protocol</title>
    <seriesInfo name="Internet-Draft"
                value="draft-vandemeent-iddrop-01"/>

    <author fullname="Jasper van de Meent" initials="J."
            surname="van de Meent">
      <organization>Humotica</organization>
      <address>
        <postal><country>Netherlands</country></postal>
        <email>info@humotica.com</email>
        <uri>https://humotica.com/</uri>
      </address>
    </author>
    <date year="2026" month="October" day="29"/>
    <area>Security</area>
    <workgroup>Internet Engineering Task Force</workgroup>

    <keyword>identity transfer</keyword>
    <keyword>iddrop</keyword>
    <keyword>ains</keyword>
    <keyword>jis</keyword>
    <keyword>causal binding</keyword>
    <keyword>receiver-bound carrier</keyword>
    <keyword>key change</keyword>

    <abstract>
      <t>This document specifies IDDrop, an identity-transfer protocol
      for moving identity claims, actor claims, and receiver-bound claim
      bundles across human-facing and machine-facing environments.</t>
      <t>IDDrop defines two complementary operating modes: offer-first,
      intended for proximity and human-in-the-loop workflows, and
      request-first, intended for autonomous systems, daemon-to-daemon
      exchange, and policy-driven machine identity transfer.</t>
      <t>IDDrop does not treat filenames or user-visible extensions as
      identity truth. Instead, it binds identity transfer to sealed
      carrier truth, semantic classification, actor provenance,
      receiver targeting, and causal validation. It further requires
      that a change of the key bound to a known identity is never
      accepted as a side effect of a transfer, but only through an
      explicit, recorded decision. This document profiles the generic
      TIBET TAT handoff model for trustworthy identity transfer.</t>
    </abstract>
  </front>

  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>Identity transfer in distributed systems is frequently
      underspecified. Systems often know how to transport bytes, but not
      how to safely transfer the meaning of an identity claim.</t>
      <t>Existing encrypted transport systems provide confidentiality
      and integrity for byte carriage, but they do not by themselves
      answer whether the transferred object is an identity claim at all,
      whether the claim was expected or solicited, whether the visible
      name matches sealed semantics, whether the claim is bound to a
      known actor registry, or whether the response belongs to a known
      causal request chain.</t>
      <t>A further question is easy to overlook: when a claim arrives
      for a name the receiver already knows, but bound to a different
      key, is this the same party on a new key, or a different party
      using the same name? No signature carried by the transfer itself
      can answer that question, because every such signature is made by
      the key being introduced. IDDrop therefore separates the act of
      transferring an identity from the act of changing what a receiver
      has anchored for that identity (<xref target="anchors"/>).</t>
      <t>IDDrop fills these gaps by defining a protocol for identity
      drop, acceptance, and validation across both human and system
      lanes.</t>
      <t>This document is intended as an identity-transfer profile over
      the more general TIBET TAT transfer substrate <xref target="TAT"/>
      and within the broader Continuity Envelope Protocol (CEP) model
      <xref target="CEP"/>.</t>
      <t>The key design principle is simple: identity MUST NOT arrive as
      a surprise commitment.</t>
    </section>

    <section anchor="terminology">
      <name>Terminology</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, as shown here.</t>
      <dl>
        <dt>IDDrop</dt>
        <dd>The protocol specified in this document for identity offer,
        request, response, validation, and acceptance.</dd>
        <dt>Offer</dt>
        <dd>A temporary, visible, non-binding identity availability
        signal.</dd>
        <dt>Request</dt>
        <dd>An explicit solicitation by a receiver for a specific claim
        or identity response.</dd>
        <dt>Response</dt>
        <dd>A sealed and receiver-bound identity-carrying answer to
        either an accepted offer or a request.</dd>
        <dt>Acceptance</dt>
        <dd>An explicit receiver-side act indicating consent to proceed
        from discovery into sealed identity transfer.</dd>
        <dt>Materialization</dt>
        <dd>The act of committing a validated identity claim into a
        receiver runtime, registry, or operator-visible state.</dd>
        <dt>Carrier Truth</dt>
        <dd>The byte-level truth established by sealed carrier
        properties such as magic bytes, authenticated encryption,
        signatures, and receiver binding.</dd>
        <dt>Semantic Class</dt>
        <dd>The declared object class of a transfer unit, such as
        identity, code, document, command, or receipt.</dd>
        <dt>Causal Binding</dt>
        <dd>The linkage between a request, offer acceptance, and later
        response, such that the receiver can verify that the identity
        answer belongs to a known prior step.</dd>
        <dt>Identity Card</dt>
        <dd>A self-signed record that binds a claimed name to a
        verification (signing) public key and, where used, a
        key-agreement (sealing) public key. It carries public key
        material only.</dd>
        <dt>Anchor</dt>
        <dd>A receiver-local binding of a claimed name to the key
        material the receiver has deliberately accepted for that name.
        The set of anchors held by a receiver is its Anchor Store.</dd>
        <dt>Party Key</dt>
        <dd>The long-lived key that identifies a party (a person,
        organization, agent, or device identity) as opposed to a
        Runtime Key.</dd>
        <dt>Runtime Key</dt>
        <dd>A key held by a particular execution instance acting for a
        party. Runtime keys may be replaced without the party
        changing.</dd>
        <dt>Key Change</dt>
        <dd>The situation in which material for a claimed name names a
        Party Key different from the one the receiver has anchored for
        that name.</dd>
        <dt>Supersession Decision</dt>
        <dd>An explicit, recorded act by an authorized principal that
        replaces an existing Anchor with different key material
        (<xref target="supersession"/>).</dd>
      </dl>
    </section>

    <section anchor="overview">
      <name>Protocol Overview</name>
      <section anchor="planes">
        <name>Identity Transfer Planes</name>
        <t>IDDrop operates across three conceptual planes:</t>
        <dl>
          <dt>Discovery Plane:</dt>
          <dd>Visible availability and preliminary metadata.</dd>
          <dt>Sealed Transfer Plane:</dt>
          <dd>Confidential and receiver-bound identity carriage.</dd>
          <dt>Commitment Plane:</dt>
          <dd>Validation, acceptance, and materialization into runtime or
          operator state, including any change to the receiver's Anchor
          Store.</dd>
        </dl>
        <t>Systems implementing IDDrop MUST NOT collapse these planes into
        a single implicit step. In particular, the arrival of an object in
        a receiver's inbox is a Discovery or Sealed Transfer Plane event;
        it is not materialization.</t>
      </section>
      <section anchor="lanes">
        <name>Human and System Lanes</name>
        <t>IDDrop defines two operating modes:</t>
        <ul>
          <li>offer-first, for human, proximity, NFC, QR, and local
          discovery workflows</li>
          <li>request-first, for daemon, automation, cap-bus, and
          machine-to-machine workflows</li>
        </ul>
        <t>Human, proximity, and NFC workflows SHOULD use offer-first mode.
        Autonomous, daemon, and command-fabric workflows SHOULD use
        request-first mode. Both modes share the same validation rules
        (<xref target="validation"/>) and the same anchor discipline
        (<xref target="anchors"/>).</t>
      </section>
    </section>

    <section anchor="offer-first">
      <name>Offer-First Mode</name>
      <t>Offer-first mode is intended for NFC handoff, QR handoff,
      local discovery, AirDrop-like experiences, and home-agent or
      human-supervised device exchange.</t>
      <t>The offer-first flow is:</t>
      <ol>
        <li>sender enables a temporary offer</li>
        <li>receiver discovers offer metadata</li>
        <li>receiver chooses accept, challenge, or reject</li>
        <li>if accepted, sender performs sealed transfer to receiver</li>
        <li>receiver validates the claim</li>
        <li>receiver MAY materialize the claim</li>
      </ol>
      <t>An offer SHOULD contain at least <tt>offer_id</tt>,
      <tt>expires_at</tt>, <tt>sender_pubkey</tt>,
      <tt>claimed_aint</tt>, <tt>claim_class</tt>,
      <tt>semantic_type</tt>, <tt>display_name</tt>,
      <tt>preview_hash</tt>, and <tt>ssm_class</tt>.</t>
      <t>Offer metadata MUST NOT be treated as commitment truth.</t>

      <section anchor="offer-header">
        <name>Discovery Header and Sealed Body</name>
        <t>When an offer is carried as a file or other storable object
        rather than as a live proximity exchange, it SHOULD be split into
        a plaintext discovery header and a sealed body. The discovery
        header carries only what a receiver needs to recognize that an
        offer exists and for whom it is intended (for example sender
        name, sender verification key, intended receiver name, expiry,
        and an ephemeral key-agreement public key). The terms of the
        offer travel in the sealed body, encrypted to the intended
        receiver's key-agreement key.</t>
        <t>If a discovery header is used, it SHOULD be signed by the
        sender's verification key and SHOULD carry a hash of the sealed
        body, so that header and body cannot be recombined from different
        offers. A receiver MUST NOT rely on any header field for Rule 4
        (<xref target="validation"/>) unless that field is covered by a
        signature it has verified.</t>
      </section>

      <section anchor="offer-lifecycle">
        <name>Offer Lifecycle</name>
        <t>An offer that has been presented is not an offer that has been
        accepted. Implementations SHOULD distinguish at least the
        following states when reporting on an offer:</t>
        <dl>
          <dt>waiting:</dt>
          <dd>an offer is open and no answer has arrived</dd>
          <dt>accepted:</dt>
          <dd>an answer has arrived and validated</dd>
          <dt>refused:</dt>
          <dd>an answer has arrived and was a rejection, or failed
          validation</dd>
          <dt>none:</dt>
          <dd>no offer is open and no outcome is recorded</dd>
        </dl>
        <t>"waiting" and "none" MUST NOT be reported as the same state: one
        is an open question, the other a question that was never asked.</t>
        <t>A sender SHOULD NOT present an offer (for example, display a QR
        code) unless it is able to receive the answer to that offer for
        the duration of the offer window. A sender SHOULD hold at most one
        open offer for the same question; presenting a second offer for
        the same question while the first is open can invalidate an offer
        that a receiver is in the process of answering.</t>
        <t>Offers MAY be encoded for visual transfer, for example as a URI
        suitable for a QR code. Such an encoding is a Discovery Plane
        artifact only and confers no authority.</t>
      </section>
    </section>

    <section anchor="request-first">
      <name>Request-First Mode</name>
      <t>Request-first mode is intended for daemon-to-daemon exchange,
      cap-bus identity requests, relay and automation lanes, and
      policy-driven system exchange.</t>
      <t>The request-first flow is:</t>
      <ol>
        <li>receiver emits a request</li>
        <li>request carries <tt>request_id</tt> and
        <tt>challenge_nonce</tt></li>
        <li>sender creates a receiver-bound response</li>
        <li>receiver validates request/response linkage</li>
        <li>receiver MAY materialize the claim</li>
      </ol>
      <t>A request SHOULD contain at least <tt>request_id</tt>,
      <tt>challenge_nonce</tt>, <tt>requested_claim_type</tt>,
      <tt>receiver_pubkey</tt>, <tt>requested_aint</tt>,
      <tt>causal_parent</tt>, and <tt>expires_at</tt>.</t>
      <t>The <tt>challenge_nonce</tt> is issued by the receiver and is
      single-use. It SHOULD contain at least 128 bits of
      cryptographically random data.</t>
    </section>

    <section anchor="validation">
      <name>Validation Rules</name>
      <t>The following six validation rules are REQUIRED. A receiver MUST
      evaluate them in order and MUST stop at the first rule that
      fails.</t>
      <ol>
        <li>
          <t><strong>Carrier Truth</strong>: the receiver MUST verify carrier
          truth before trusting object bytes. If a sealed carrier format
          is used, the receiver MUST validate its authenticated encryption
          and signature properties. Where a carrier format defines an
          authorship signature, a carrier that lacks it MUST be treated as
          failing this rule, not as an acceptable unsigned variant.</t>
        </li>
        <li>
          <t><strong>Semantic Class</strong>: the receiver MUST determine the
          semantic class of the object before commitment. Byte validity
          alone is insufficient. An identity claim MUST be explicitly
          classed as an identity object.</t>
        </li>
        <li>
          <t><strong>Receiver Binding</strong>: the receiver MUST verify that the
          response is bound to the intended receiver. A response not
          addressed to the receiver MUST be rejected.</t>
        </li>
        <li>
          <t><strong>Claim Provenance</strong>: the receiver MUST validate the
          claim against a provenance source such as AINS
          <xref target="AINS"/>, JIS <xref target="JIS"/>, an equivalent
          actor registry, or its local Anchor Store
          (<xref target="anchors"/>). The outcome of this check is one of
          "match" (the sender key equals the anchored key), "unknown" (no
          anchor or registry record exists for the claimed name), or
          "mismatch" (a record exists for the claimed name with a
          different key). Only "match" satisfies this rule.
          Implementations SHOULD report "unknown" and "mismatch" as
          distinct outcomes, since they call for different actions. A
          "mismatch" MUST NOT be resolved by updating the anchor as a side
          effect of validation; <xref target="supersession"/> defines the
          only path by which an anchor changes. The sender key checked
          here MUST be one whose control the sender has demonstrated in
          this exchange, for example by a verified signature over the
          response or over the discovery header.</t>
        </li>
        <li>
          <t><strong>Causal Binding</strong>: in request-first mode, the receiver
          MUST validate that the response belongs to the prior request
          by checking <tt>request_id</tt>, <tt>challenge_nonce</tt>, and
          any causal parent references. In offer-first mode, the receiver
          MUST validate that acceptance and later transfer belong to the
          same offer session. A nonce or offer session MUST be consumed on
          its first successful use; a later object bound to the same nonce
          or offer session MUST be rejected as a replay.</t>
        </li>
        <li>
          <t><strong>Commitment Discipline</strong>: the receiver MUST NOT
          materialize or register an identity claim before Rules 1
          through 5 have succeeded, and MUST NOT materialize a claim
          whose validity window has elapsed.</t>
        </li>
      </ol>
      <t>An implementation that accepts objects through more than one
      path (for example a sealed path and an older unsealed path) MUST
      apply Rules 3 through 6 identically on every path. A path that
      omits a rule is a downgrade path and defeats the rule on all
      paths.</t>
    </section>

    <section anchor="anchors">
      <name>Anchors and Key Change</name>
      <t>This section specifies how a receiver's Anchor Store changes. It
      applies to both operating modes and to any other mechanism by which
      an implementation binds a claimed name to key material.</t>

      <section anchor="anchor-store">
        <name>Anchor Store</name>
        <t>A receiver maintains an Anchor Store that maps each claimed
        name to the key material the receiver has deliberately accepted
        for it: a verification key and, where used, a key-agreement key.
        Anchors are created by an explicit act, such as importing an
        Identity Card received out of band, or resolving the name through
        a registry such as AINS.</t>
        <t>Names locate an anchor; key fingerprints decide whether two
        records describe the same key. Implementations SHOULD display a
        key fingerprint wherever they display a claimed name in a context
        where a key decision is made.</t>
      </section>

      <section anchor="identity-card">
        <name>Identity Cards and Self-Signatures</name>
        <t>An Identity Card is signed by the verification key it
        introduces. A receiver MUST verify that self-signature before
        creating an anchor from a card.</t>
        <t>A valid self-signature proves only that the card is internally
        consistent. It does not prove that the holder of the card is the
        same party as any earlier holder of the same name, because the
        signature is made by the very key being introduced.
        Implementations MUST NOT treat a valid self-signature as evidence
        of party continuity.</t>
      </section>

      <section anchor="import-outcomes">
        <name>Import Outcomes</name>
        <t>When a receiver is asked to anchor key material for a claimed
        name, exactly one of the following outcomes applies:</t>
        <dl>
          <dt>first anchor:</dt>
          <dd>No anchor exists for the name. The receiver MAY create one
          as the result of the explicit act that requested it.</dd>
          <dt>identical:</dt>
          <dd>An anchor exists with the same key material. The operation
          MUST be idempotent and SHOULD NOT create a history entry.</dd>
          <dt>key change:</dt>
          <dd>An anchor exists with different key material. The receiver
          MUST NOT replace the anchor. It MUST refuse the operation, and
          the refusal SHOULD identify the anchored and offered key
          fingerprints and the explicit decision path described in
          <xref target="supersession"/>.</dd>
        </dl>
        <t>When a receiver resolves a name through a registry and already
        holds an anchor for that name, it MUST compare the registry key
        with the anchored key. On a difference it MUST NOT overwrite the
        anchor and SHOULD report the mismatch.</t>
      </section>

      <section anchor="supersession">
        <name>Supersession Decision</name>
        <t>An existing anchor MAY be replaced only by a Supersession
        Decision: an explicit act by a principal authorized to administer
        the receiver's Anchor Store. A Supersession Decision MUST
        produce a record that:</t>
        <ul>
          <li>identifies the claimed name;</li>
          <li>records the previous and the new key material;</li>
          <li>identifies the decider;</li>
          <li>records when the decision was made; and</li>
          <li>references the previous anchor, which MUST be retained as
          history and MUST NOT be deleted.</li>
        </ul>
        <t>The record SHOULD state that it is an assertion by the decider
        rather than a cryptographic measurement. No signature available
        at that point can establish continuity: the new card is signed by
        the new key, and the old key may be unavailable and unable to
        object.</t>
        <t>A Supersession Decision changes the anchor only. It MUST NOT by
        itself transfer relations, capabilities, consents, or other
        authority that were bound to the previous key.</t>
      </section>

      <section anchor="every-path">
        <name>One Rule for Every Path</name>
        <t>Every path by which an implementation can bind a claimed name
        to key material MUST apply <xref target="import-outcomes"/> and
        <xref target="supersession"/>. This includes at least:</t>
        <ul>
          <li>intake of an offer, request, or response (Rule 4);</li>
          <li>completion of a handshake or relation succession in which
          the peer's key is taken from the peer's own message
          (<xref target="succession"/>);</li>
          <li>import of an Identity Card; and</li>
          <li>registry resolution when an anchor already exists.</li>
        </ul>
        <t>A guarded intake path combined with an unguarded alternate path
        is not a partial defense. It makes substitution through the
        alternate path more credible, because the result appears to have
        passed the guarded path.</t>
      </section>

      <section anchor="own-identity">
        <name>Own Identity and First Contact</name>
        <t>A receiver does not anchor its own identity. When it evaluates
        a key change for a name whose private key it holds, it MAY treat
        possession of that private key as grounds for accepting the key.
        Implementations SHOULD report this as a distinct standing (held
        by possession) and MUST NOT record it as an anchor decision.</t>
        <t>Absence of an anchor is not permission. For a first contact
        with no prior relation, an implementation MAY accept a key on
        first use through an explicit import or acceptance act. Within
        the succession of an existing relation, a changed key for which
        no anchor exists MUST be treated as a mismatch.</t>
      </section>
    </section>

    <section anchor="succession">
      <name>Handshake Completion and Succession</name>
      <t>An accepted identity transfer often results in a durable mutual
      relation between two parties. Implementations that create such a
      relation SHOULD complete it in three steps:</t>
      <ol>
        <li>offer: the initiator signs the proposed terms;</li>
        <li>accept: the responder verifies the initiator's signature,
        checks that the offer has not been consumed before, and signs its
        half of the relation;</li>
        <li>confirm: the initiator verifies that the accept echoes its own
        signed offer unaltered and that the responder's half verifies,
        adds its own half, and returns the completed, mutually signed
        relation so that both sides hold the same object.</li>
      </ol>
      <t>The signed relation body SHOULD describe the target state of the
      relation only. Handshake progress SHOULD NOT be part of the signed
      body, since a field that changes between accept and confirm
      invalidates the signature made at accept.</t>
      <t>When a new relation replaces an earlier relation between the same
      parties, the new body SHOULD reference its predecessor, for example
      by a hash of the predecessor body, inside the signed content, so
      that the supersession claim is covered by both signatures. A
      co-signer MUST refuse to sign a supersession claim that does not
      match the predecessor it holds as current, or that it is unable to
      evaluate. An implementation that cannot determine whether a
      predecessor exists MUST NOT present the new relation as a first
      agreement.</t>
      <t>A succession MUST NOT introduce a changed Party Key for either
      party unless that key has been anchored through
      <xref target="supersession"/> or is held by the evaluating party
      itself (<xref target="own-identity"/>). The check MUST be made
      before the evaluating party adds its own signature.</t>
      <t>Runtime Keys MAY change while a relation persists; a party MAY
      re-attest a new Runtime Key under its unchanged Party Key without
      a new handshake. A change of Party Key is different in kind: it is
      a fork of the identity, not a delayed observation of it, and no
      fresher observation can repair it. It MUST be handled through
      <xref target="anchors"/>.</t>
    </section>

    <section anchor="migration">
      <name>Identity Migration and Key Material</name>
      <t>Moving an identity to a new device or installation of the same
      party is an identity transfer in which sender and receiver are the
      same party. In addition to the rules above, the following
      apply:</t>
      <ul>
        <li>Private key material MUST NOT be carried in cleartext. It
        MUST be sealed to a key that the destination can derive or hold
        only as the same party, for example a key derived from that
        party's root key.</li>
        <li>A destination that does not hold the same party's root MAY
        receive public material, but MUST NOT be able to recover the
        private key material from the transfer.</li>
        <li>Presence, liveness, and freshness evidence MUST NOT be
        transferred. The destination MUST establish such evidence anew.</li>
        <li>Revocations MUST travel with the identity and MUST be merged
        monotonically. A migration MUST NOT re-admit a device or key that
        either side has revoked.</li>
        <li>Devices restored by a migration SHOULD re-establish trust on
        their next use rather than inherit a prior verification
        state.</li>
      </ul>
    </section>

    <section anchor="semantic-classification">
      <name>Semantic Classification</name>
      <t>Implementations SHOULD distinguish at least the following
      semantic classes: identity, code, document, command, and
      receipt.</t>
      <t>Implementations MAY refine the identity class. Refinements in use
      include identity (a full identity assertion), sub-identity (a
      parent granting a sub-handle), capability (a scoped grant), and
      credential (an attestation about a subject). A refinement MUST NOT
      be used to move an object out of the identity class for the
      purposes of <xref target="validation"/>.</t>
      <t>Offers and claims MAY additionally carry an entity class that
      describes what kind of subject is behind the claimed name, for
      example human, AI agent, IoT device, or autonomous agent endpoint,
      aligned with the entity types of <xref target="AINS"/>. Entity class
      is descriptive metadata and MUST NOT be used as provenance.</t>
      <t>The semantic class MAY be carried through a semantic routing
      field or surface-manifest layer <xref target="SSM"/>.
      Implementations MUST NOT use filename extension alone as semantic
      truth.</t>
    </section>

    <section anchor="transport">
      <name>Transport and Carrier Bindings</name>
      <t>IDDrop is transport-agnostic. It MAY be carried over NFC,
      QR-assisted local handoff, local network discovery, message
      relay, and cap-bus or command-substrate lanes.</t>
      <t>When a sealed carrier is used, implementations SHOULD use a
      receiver-bound confidential carrier format rather than raw opaque
      payload carriage.</t>
      <t>One binding in use seals the offer body from an ephemeral X25519
      key <xref target="RFC7748"/> to the receiver's static X25519
      key-agreement key, derives the content key with HKDF-SHA256
      <xref target="RFC5869"/>, encrypts with AES-256-GCM, and signs the
      plaintext discovery header, including a SHA-256 hash of the sealed
      body, with the sender's Ed25519 key <xref target="RFC8032"/>. Because
      the receiver's key is static, the offer can be prepared while the
      receiver is offline. This binding is informative; other carrier
      formats meeting Rule 1 are equally acceptable.</t>
      <section anchor="relationship-to-cep-and-tat">
        <name>Relationship to CEP and TAT</name>
        <t>IDDrop is not intended to redefine generic handoff
        mechanics.</t>
        <t>CEP defines the umbrella continuity messaging model, TAT
        defines the generic consent-bound handoff and transfer flow,
        and IDDrop defines the identity-transfer profile over that
        flow.</t>
        <t>When a TAT implementation is available, IDDrop SHOULD use it
        as the preferred transfer and anchoring substrate.</t>
      </section>
    </section>

    <section anchor="examples">
      <name>Examples</name>
      <section anchor="human-nfc-offer">
        <name>Human NFC Offer</name>
        <t>A user enables identity offer mode for 60 seconds on a
        device. Another device taps via NFC, sees the claim metadata
        and sender fingerprint, and explicitly accepts. The sender then
        transfers a receiver-bound sealed response, which the receiver
        validates against AINS/JIS before materialization.</t>
      </section>
      <section anchor="system-request">
        <name>System Request</name>
        <t>A daemon requests an identity claim for a specific actor and
        embeds a nonce and request identifier. The sender responds with
        a sealed, receiver-bound response referencing the original
        request. The receiver validates the request linkage and
        provenance before continuing the workflow.</t>
      </section>
      <section anchor="key-change-example">
        <name>Key Change Refused, Then Decided</name>
        <t>A receiver holds an anchor for <tt>alice.aint</tt>. It receives
        a new Identity Card for <tt>alice.aint</tt> whose self-signature
        verifies but whose verification key differs from the anchored
        one. The import is refused; the refusal shows both fingerprints
        and states that only an explicit decision can replace the anchor.
        A sealed offer from <tt>alice.aint</tt> under the new key is also
        refused under Rule 4 with outcome "mismatch".</t>
        <t>The operator confirms out of band that Alice has moved to a new
        key and records a Supersession Decision. The previous card is kept
        as history; the record names the operator as decider and states
        that the decision is an assertion. Offers under the new key now
        satisfy Rule 4. Relations formed under the old key are not carried
        over by the decision; they are renewed through a new handshake,
        whose succession check (<xref target="succession"/>) now finds the
        new key anchored.</t>
      </section>
    </section>

    <section anchor="implementation-status" removeInRFC="true">
      <name>Implementation Status</name>
      <t>This section records the status of known implementations of the
      protocol defined by this specification at the time of posting of
      this Internet-Draft, and is based on a proposal described in
      <xref target="RFC7942"/>. The description of implementations in this
      section is intended to assist the IETF in its decision processes in
      progressing drafts to RFCs. Please note that the listing of any
      individual implementation here does not imply endorsement by the
      IETF. Furthermore, no effort has been spent to verify the
      information presented here that was supplied by IETF contributors.
      This is not intended as, and must not be construed to be, a catalog
      of available implementations or their features. Readers are advised
      to note that other implementations may exist.</t>
      <t>According to <xref target="RFC7942"/>, "this will allow reviewers
      and working groups to assign due consideration to documents that
      have the benefit of running code, which may serve as evidence of
      valuable experimentation and feedback that have made the
      implemented protocols more mature. It is up to the individual
      working groups to use this information as they see fit".</t>

      <section anchor="impl-tibet-iddrop">
        <name>tibet-iddrop</name>
        <dl>
          <dt>Organization:</dt>
          <dd>Humotica</dd>
          <dt>Description:</dt>
          <dd>A Rust library and command-line tool implementing the offer,
          request, and claim objects of this document and a validator that
          evaluates the six rules of <xref target="validation"/> in order,
          stopping at the first failure. It includes a registry resolver
          interface with an HTTP resolver for AINS, a receiver-issued
          128-bit challenge nonce, and an encoding of offers as an
          <tt>iddrop://</tt> URI for QR transfer.</dd>
          <dt>Maturity:</dt>
          <dd>Experimental. Version 0.3.1 is published on crates.io.</dd>
          <dt>Coverage:</dt>
          <dd>Offer-first and request-first objects and validation. The
          caller asserts the Carrier Truth result, and the caller keeps the
          lists of outstanding requests and offers, so single-use
          consumption is the caller's responsibility. Rule 4 compares the
          sender key with the registry key and refuses on difference or
          absence, without the distinct outcomes now recommended in
          <xref target="validation"/>. The validator checks the claim
          validity window as part of Rule 6. Identity-class refinements and
          entity classes (<xref target="semantic-classification"/>) are
          implemented. The Anchor Store and Supersession Decision of
          <xref target="anchors"/> are not implemented in this
          library.</dd>
          <dt>Licensing:</dt>
          <dd>MIT or Apache-2.0</dd>
          <dt>Contact:</dt>
          <dd>info@humotica.com</dd>
        </dl>
      </section>

      <section anchor="impl-iab">
        <name>AInternet-in-a-Box Reference Implementation</name>
        <dl>
          <dt>Organization:</dt>
          <dd>Humotica</dd>
          <dt>Description:</dt>
          <dd><t>A node implementation in which identity transfer is one
          of several ceremonies. Elements relevant to this document:</t>
          <ul>
            <li>Identity Cards carrying name, Ed25519 verification key and
            X25519 key-agreement key, self-signed, and exported under a
            file name that carries the card's subject.</li>
            <li>A card import operation implementing the three outcomes of
            <xref target="import-outcomes"/>: a key change is refused by
            default; an explicit supersede option keeps the previous card
            as history and appends a record naming the decider, the
            previous and new keys, a statement that the decision is an
            assertion and not a measurement, and a flag that it grants
            nothing further.</li>
            <li>Registry resolution that, when a card is already held,
            compares it with the registry key and refuses on
            difference instead of overwriting.</li>
            <li>Offers sealed as described in <xref target="transport"/>,
            followed on receipt by a provenance check of the header's
            sender key against the Anchor Store with distinct "unknown"
            and "mismatch" refusals, and a refusal when the sender is
            recorded as revoked.</li>
            <li>A three-step offer, accept, and confirm handshake with a
            single-use offer nonce, and an account-level relation whose
            signed body carries the target state only. Successions
            reference their predecessor by hash; the co-signer refuses a
            supersession claim it cannot stand behind; and the confirming
            party checks, before signing, that the succession introduces
            no unanchored Party Key, distinguishing "unchanged",
            "changed and anchored", "changed and held by possession", and
            "changed and unanchored".</li>
            <li>Re-attestation of new Runtime Keys under an unchanged
            account relation after a runtime is replaced, without a new
            handshake.</li>
            <li>A migration carrier for a device-pairing identity whose
            private CA key is sealed under a key derived from the party's
            root key, which merges revocations monotonically, and which
            does not carry presence evidence.</li>
            <li>A non-blocking QR offer with a separate collect step that
            reports "approved", "refused", "waiting", or "none". This is
            used for owner-presence approval rather than identity transfer
            and is listed for its offer-lifecycle behavior only.</li>
          </ul></dd>
          <dt>Maturity:</dt>
          <dd>Prototype. Test vectors for the anchor and succession rules
          (nine cases, covering refusal, explicit supersession with
          history, idempotent re-import, the possession standing, and the
          ordering of the succession check before signing) pass. Project
          records report the account-level relation and its
          re-attestation working between two independently enrolled test
          nodes in August 2026, and a sealed-offer provenance refusal
          ("mismatch") observed between two test nodes in September 2026,
          which prompted the rules of <xref target="every-path"/>.</dd>
          <dt>Coverage and known deviations:</dt>
          <dd><t>The identity handshake follows the offer-first pattern;
          request-first mode is not implemented in this code base. The
          following deviations from this revision are known:</t>
          <ul>
            <li>On some optional-signature and legacy offer paths the
            implementation does not yet apply every validation rule of
            this revision. These paths are being brought into line with
            <xref target="validation"/>; until then they are not
            conformant to this document.</li>
            <li>An inbox reader for drop envelopes (including an example
            descriptor of type <tt>iddrop</tt>) checks envelope shape and
            records arrival only; it does not open payloads, so no
            materialization occurs.</li>
          </ul></dd>
          <dt>Licensing:</dt>
          <dd>AGPL-3.0-or-later.</dd>
          <dt>Contact:</dt>
          <dd>info@humotica.com</dd>
        </dl>
      </section>
    </section>

    <section anchor="security">
      <name>Security Considerations</name>
      <section anchor="sec-surprise">
        <name>Surprise Identity Is Forbidden</name>
        <t>Identity transfer MUST NOT become binding merely because a
        sealed object was received. Offer-first mode is safe only if
        offers remain temporary and non-binding until explicit acceptance
        and later validation. Request-first mode establishes intent and
        causal context, but the receiver MUST still validate the response
        and its provenance.</t>
      </section>
      <section anchor="sec-names">
        <name>Names, Extensions, and Look-Alike Claims</name>
        <t>Implementations MUST treat user-visible names and extensions as
        advisory surfaces only. A man-in-the-middle or misleading sender
        MAY present a visually similar claim name. Provenance validation
        and receiver binding are REQUIRED to defeat such confusion.</t>
        <t>Two independent parties can legitimately present the same name.
        Storing anchors keyed by name alone, and overwriting on import, lets
        the later party silently replace the earlier one; everything that
        is subsequently sealed to that name then reaches the later party.
        <xref target="import-outcomes"/> exists to prevent this.</t>
      </section>
      <section anchor="sec-key-change">
        <name>Key Difference Is More Dangerous Than Key Absence</name>
        <t>A party with no key fails visibly at its first signature. A
        party with a different key under a known name signs successfully;
        every local signature check passes, and the substitution is
        detected only by a peer that still holds the earlier anchor. For
        this reason a "mismatch" outcome MUST be treated as at least as
        serious as "unknown", and refusals SHOULD be retained as evidence
        rather than discarded or overwritten, since a peer that stops
        verifying conveys information that no local check can.</t>
      </section>
      <section anchor="sec-circular">
        <name>Circular Evidence</name>
        <t>A self-signed card, a signed key-change notice, or a relation
        body signed by a newly introduced key all prove only that the
        new key signed them. Treating such evidence as proof of continuity
        is circular. Continuity of a party across a key change can only be
        asserted by a principal, which is why
        <xref target="supersession"/> records a decider rather than a
        verification result.</t>
        <t>Similarly, several local records that agree with each other
        but all predate the same event share one age; they do not
        independently confirm the current state.</t>
      </section>
      <section anchor="sec-paths">
        <name>Alternate Paths and Downgrade</name>
        <t>Implementations SHOULD enumerate every operation that can write
        a name-to-key binding and every path by which an identity object
        can be accepted, and apply the same rules to each
        (<xref target="every-path"/>, <xref target="validation"/>). An
        unsigned discovery header that names a sender key MUST NOT be
        accepted as proof of that key, since any party can write a
        victim's public key into an unsigned field.</t>
      </section>
      <section anchor="sec-replay">
        <name>Replay and Expiry</name>
        <t>Offers and requests SHOULD carry expiries. Responses SHOULD be
        bound to active requests or active acceptances to limit replay.
        Single-use consumption of nonces and offer sessions
        (<xref target="validation"/>, Rule 5) is the primary replay
        defense; expiry times are a secondary bound and SHOULD NOT be the
        only defense, since they depend on loosely synchronized
        clocks.</t>
      </section>
      <section anchor="sec-migration">
        <name>Migration</name>
        <t>A migration carrier that contains sealed private key material
        is a high-value object even when sealed. It SHOULD be stored
        outside the device it was exported from and handled as a secret.
        Merging revocations monotonically prevents an older carrier from
        resurrecting revoked devices.</t>
      </section>
    </section>

    <section anchor="privacy">
      <name>Privacy Considerations</name>
      <t>A plaintext discovery header necessarily reveals that an offer
      exists, and typically reveals the sender and intended receiver
      names. Implementations SHOULD keep the discovery header to the
      minimum needed for recognition and SHOULD place all offer terms in
      the sealed body.</t>
      <t>Registry resolution reveals to the registry which names a
      receiver is interested in. Implementations SHOULD allow anchors to
      be established out of band, through Identity Cards, without
      contacting a registry.</t>
    </section>

    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>

  <back>
    <references>
      <name>References</name>
      <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" fullname="Scott Bradner"/>
            <date month="March" year="1997"/>
          </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 initials="B." surname="Leiba" fullname="Barry Leiba"/>
            <date month="May" year="2017"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>

      <references>
        <name>Informative References</name>
        <reference anchor="AINS" target="https://datatracker.ietf.org/doc/draft-vandemeent-ains-discovery/">
          <front>
            <title>AINS Discovery</title>
            <author initials="J." surname="van de Meent" fullname="Jasper van de Meent"/>
            <date year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-vandemeent-ains-discovery-02"/>
        </reference>
        <reference anchor="JIS" target="https://datatracker.ietf.org/doc/draft-vandemeent-jis-identity/">
          <front>
            <title>JIS Identity</title>
            <author initials="J." surname="van de Meent" fullname="Jasper van de Meent"/>
            <date year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-vandemeent-jis-identity-02"/>
        </reference>
        <reference anchor="SSM" target="https://datatracker.ietf.org/doc/draft-vandemeent-tibet-semantic-surface-manifest/">
          <front>
            <title>TIBET Semantic Surface Manifest</title>
            <author initials="J." surname="van de Meent" fullname="Jasper van de Meent"/>
            <date year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-vandemeent-tibet-semantic-surface-manifest-02"/>
        </reference>
        <reference anchor="CEP" target="https://datatracker.ietf.org/doc/draft-vandemeent-continuity-envelope/">
          <front>
            <title>Continuity Envelope Protocol</title>
            <author initials="J." surname="van de Meent" fullname="Jasper van de Meent"/>
            <date year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-vandemeent-continuity-envelope-00"/>
        </reference>
        <reference anchor="TAT" target="https://datatracker.ietf.org/doc/draft-vandemeent-tibet-tat/">
          <front>
            <title>TIBET TAT: Touch-and-Transfer Protocol</title>
            <author initials="J." surname="van de Meent" fullname="Jasper van de Meent"/>
            <date year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-vandemeent-tibet-tat-00"/>
        </reference>
        <reference anchor="RFC7942" target="https://www.rfc-editor.org/info/rfc7942">
          <front>
            <title>Improving Awareness of Running Code: The Implementation Status Section</title>
            <author initials="Y." surname="Sheffer" fullname="Yaron Sheffer"/>
            <author initials="A." surname="Farrel" fullname="Adrian Farrel"/>
            <date month="July" year="2016"/>
          </front>
          <seriesInfo name="BCP" value="205"/>
          <seriesInfo name="RFC" value="7942"/>
          <seriesInfo name="DOI" value="10.17487/RFC7942"/>
        </reference>
        <reference anchor="RFC7748" target="https://www.rfc-editor.org/info/rfc7748">
          <front>
            <title>Elliptic Curves for Security</title>
            <author initials="A." surname="Langley" fullname="Adam Langley"/>
            <author initials="M." surname="Hamburg" fullname="Mike Hamburg"/>
            <author initials="S." surname="Turner" fullname="Sean Turner"/>
            <date month="January" year="2016"/>
          </front>
          <seriesInfo name="RFC" value="7748"/>
          <seriesInfo name="DOI" value="10.17487/RFC7748"/>
        </reference>
        <reference anchor="RFC5869" target="https://www.rfc-editor.org/info/rfc5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author initials="H." surname="Krawczyk" fullname="Hugo Krawczyk"/>
            <author initials="P." surname="Eronen" fullname="Pasi Eronen"/>
            <date month="May" year="2010"/>
          </front>
          <seriesInfo name="RFC" value="5869"/>
          <seriesInfo name="DOI" value="10.17487/RFC5869"/>
        </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" fullname="Simon Josefsson"/>
            <author initials="I." surname="Liusvaara" fullname="Ilari Liusvaara"/>
            <date month="January" year="2017"/>
          </front>
          <seriesInfo name="RFC" value="8032"/>
          <seriesInfo name="DOI" value="10.17487/RFC8032"/>
        </reference>
      </references>
    </references>

    <section anchor="appendix-json">
      <name>Minimal JSON Shapes</name>
      <t>The shapes below are illustrative. Field names for offers,
      requests, and responses follow <xref target="offer-first"/> and
      <xref target="request-first"/>.</t>
      <sourcecode type="json"><![CDATA[
{
  "offer": {
    "offer_id": "offer-123",
    "expires_at": "2026-05-17T10:00:00Z",
    "sender_pubkey": "hex...",
    "claimed_aint": "jasper.aint",
    "semantic_type": "identity"
  },
  "request": {
    "request_id": "req-456",
    "challenge_nonce": "nonce-789",
    "receiver_pubkey": "hex...",
    "requested_claim_type": "identity"
  },
  "response": {
    "request_id": "req-456",
    "sender_pubkey": "hex...",
    "receiver_pubkey": "hex...",
    "claimed_aint": "jasper.aint",
    "semantic_type": "identity",
    "provenance_ref": "ains:..."
  }
}
]]></sourcecode>
      <t>An Identity Card and a Supersession Decision record, as used by
      the reference implementation in
      <xref target="impl-iab"/>, look as follows. The card's signature is
      computed over the canonical JSON of all other fields.</t>
      <sourcecode type="json"><![CDATA[
{
  "card": {
    "kind": "org.ainternet.identity.card.v1",
    "aint": "alice.aint",
    "verify_pubkey": "hex (Ed25519)...",
    "seal_pubkey": "hex (X25519)...",
    "sig": "ed25519:hex..."
  },
  "supersession": {
    "kind": "org.ainternet.identity.anchor-supersede.v1",
    "aint": "alice.aint",
    "at": 1789000000,
    "decided_by": "onbox:operator",
    "was_verify": "hex...", "now_verify": "hex...",
    "was_seal": "hex...",   "now_seal": "hex...",
    "kept_as": "alice.aint.superseded.<fp>.card.json",
    "assertion": "a human at this box declares these keys
                  to be the SAME PARTY",
    "not_measured": "no signature can prove this",
    "grants_nothing": true
  }
}
]]></sourcecode>
    </section>

    <section anchor="changes" removeInRFC="true">
      <name>Changes from -00</name>
      <ul>
        <li>Added <xref target="anchors"/> (Anchors and Key Change):
        Anchor Store, the limits of self-signatures, the three import
        outcomes (first anchor, identical, key change), the Supersession
        Decision record, the requirement that every name-to-key path
        applies the same rule, and the possession standing for a
        receiver's own identity.</li>
        <li>Added <xref target="succession"/> (Handshake Completion and
        Succession): three-step completion, signed body without progress
        state, predecessor reference inside the signed body, refusal to
        co-sign an unverifiable supersession claim, no unanchored Party
        Key in a succession, and Runtime Key versus Party Key.</li>
        <li>Added <xref target="migration"/> (Identity Migration and Key
        Material).</li>
        <li>Offer-first mode: added the discovery header and sealed body
        split and the offer lifecycle states.</li>
        <li>Request-first mode: <tt>challenge_nonce</tt> is single-use and
        at least 128 bits.</li>
        <li>Validation rules: Rule 1 treats a missing authorship signature
        as failure; Rule 4 defines "match", "unknown", and "mismatch",
        forbids anchor updates as a side effect, and requires the sender
        key to be exercised; Rule 5 requires single-use consumption; Rule 6
        adds the validity window; added the downgrade-path
        requirement.</li>
        <li>Semantic classification: identity-class refinements and entity
        class.</li>
        <li>Transport: described the sealed-offer binding used by the
        reference implementation as an informative example.</li>
        <li>Protocol Overview: restored the descriptions of the three planes
        and the lane recommendations; stated that arrival is not
        materialization.</li>
        <li>Added a key-change example.</li>
        <li>Added Implementation Status (<xref target="RFC7942"/>), Privacy
        Considerations, IANA Considerations, and Acknowledgments.</li>
        <li>Expanded Security Considerations into subsections.</li>
        <li>References: companion drafts now carry Internet-Draft series
        information; removed the uncited UPIP reference; added RFC 7942,
        RFC 7748, RFC 5869, and RFC 8032.</li>
        <li>Editorial: field names are marked as code instead of with
        literal backquotes.</li>
      </ul>
    </section>

    <section anchor="acknowledgments" numbered="false">
      <name>Acknowledgments</name>
      <t>The author thanks Root AI (Claude, Anthropic) for implementation
      work and drafting assistance on this revision, and Codex for
      analysis and review during the design of the relation continuity
      mechanisms reported here.</t>
    </section>
  </back>
</rfc>
