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

  <front>
    <title abbrev="Bearer Handover">Identity-Anchored Bearer Handover for Real-Time Media Sessions</title>

    <seriesInfo name="Internet-Draft" value="draft-vandemeent-bearer-handover-01"/>

    <author fullname="Jasper van de Meent" initials="J." surname="van de Meent">
      <organization>Humotica</organization>
      <address>
        <postal><country>Netherlands</country></postal>
        <email>jasper@humotica.com</email>
        <uri>https://humotica.com</uri>
      </address>
    </author>

    <author fullname="Root AI" surname="Root AI">
      <organization>Humotica</organization>
      <address>
        <email>root_ai@humotica.nl</email>
        <uri>https://humotica.com</uri>
      </address>
    </author>

    <date year="2026" month="June" day="21"/>

    <area>Security</area>
    <workgroup>Internet Engineering Task Force</workgroup>

    <keyword>mobility</keyword>
    <keyword>handover</keyword>
    <keyword>real-time</keyword>
    <keyword>SRTP</keyword>
    <keyword>identity</keyword>

    <abstract>
      <t>This document describes identity-anchored bearer handover: a method for
      keeping a live, authenticated real-time media session (such as a voice
      call) running uninterrupted while the underlying network bearer changes -
      for example a device moving from Wi-Fi to cellular. The session is bound
      to a cryptographic identity and a media-encryption key, never to an IP
      address. When the bearer changes, the endpoint detects the new local
      address and emits an authenticated re-anchor over a stable control channel;
      the media path is re-established to the same cryptographic context, so the
      far end can relearn the new transport source without exposing the session
      to source-substitution (latching) attacks. No central media relay is
      required: a default-routed media anchor plus an authenticated re-anchor is
      sufficient. Each handover MAY emit a signed transport-rebind event for an
      auditable trail. Human-facing names, dial strings, or aliases may select a
      policy surface, but they are not the cryptographic anchor and not the
      transport binding. This protocol is transport-agnostic and complements JIS
      <xref target="JIS"/>, the MUX Status Frame <xref target="MUX"/>, the
      Semantic Surface Manifest <xref target="SSM"/>, and TIBET provenance
      <xref target="TIBET"/>.</t>
    </abstract>
  </front>

  <middle>
    <section><name>Introduction</name>
      <t>Real-time media sessions break when the network bearer underneath them
      changes. A device that places a call on Wi-Fi and then leaves the
      coverage area moves to cellular; its IP address changes; the media stream,
      addressed to the old transport, stops. The signalling dialog may survive
      (if it rides a stable, address-independent control channel), yet audio is
      dead in one or both directions, and an in-dialog teardown sent over the
      now-defunct transport never arrives.</t>
      <t>The common mitigation is a central media relay (for example TURN
      <xref target="RFC8656"/>): both endpoints send media to a fixed
      rendezvous, so a change of local address is absorbed by the relay. This
      works, but it reintroduces a central dependency in the media path - a
      single operator-run waypoint that sees, and can interrupt, every call. For
      a decentralized, identity-first system that is precisely the property to
      avoid.</t>
      <t>This document takes a different anchor. The session is bound to a
      cryptographic identity and to the media-encryption key, not to the
      transport address. The transport is free to change; the key is the
      constant. On a bearer change the endpoint re-anchors the existing session
      onto the fresh transport over a stable control channel, and the encrypted
      media context continues. The maxim is: <em>identity anchors, transport
      hops, name masks</em>.</t>

      <section><name>Problem Statement</name>
        <t>A correct handover mechanism must achieve all of the following at
        once:</t>
        <ul>
          <li>Continuity: a live session survives a change of local transport
          address with at most a brief, bounded interruption.</li>
          <li>No central media relay as a precondition: continuity MUST NOT
          require a third party in the media path.</li>
          <li>No source-substitution attack: permitting the far end to relearn
          a media source MUST NOT let an off-path or on-path attacker hijack the
          stream by injecting from a new address.</li>
          <li>Accountable transition: a handover SHOULD be expressible as an
          authenticated, auditable event rather than an unauthenticated "trust
          this new address".</li>
        </ul>
      </section>
    </section>

    <section><name>Terminology</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
      "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
      document are to be interpreted as described in BCP&nbsp;14
      <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when,
      they appear in all capitals, as shown here.</t>
      <dl>
        <dt>Identity anchor</dt>
        <dd>The hardware-bound cryptographic identity (e.g. a JIS
        <xref target="JIS"/> .aint with an Ed25519 key) to which a session is
        bound, independent of any transport address.</dd>
        <dt>Bearer</dt>
        <dd>The underlying network access path (Wi-Fi, cellular, Ethernet,
        tethered, etc.) over which transport packets travel.</dd>
        <dt>Transport endpoint</dt>
        <dd>The address/port currently used to carry signalling or media. An
        implementation detail, expected to change.</dd>
        <dt>Control channel</dt>
        <dd>A stable, address-independent, authenticated channel over which
        signalling and re-anchor requests travel; it survives a bearer change
        (for example an overlay that is reachable by name rather than by IP).</dd>
        <dt>Media anchor</dt>
        <dd>The media endpoint that is already authorised for the session and to
        which the moving endpoint re-points its media. In a typical deployment
        this is the calling system's own default-routed media engine or session
        peer. It is not a mandatory neutral third-party relay such as a TURN
        server.</dd>
        <dt>Re-anchor</dt>
        <dd>The authenticated act of re-establishing an existing session's media
        path onto a fresh transport after a bearer change.</dd>
        <dt>Name surface</dt>
        <dd>A human-facing alias, private dial string, role name, or other
        semantic label used to select policy or intent. A name surface is not a
        transport endpoint and not a cryptographic identity proof.</dd>
      </dl>
    </section>

    <section><name>Model</name>
      <t>An identity-anchored session is described by three independent
      planes:</t>
      <ul>
        <li>Identity plane: who the parties are. Proven per the identity system;
        the constant across the session.</li>
        <li>Control plane: signalling and re-anchor requests, carried on the
        stable control channel; authenticated, address-independent.</li>
        <li>Media plane: the real-time encrypted stream; its transport address
        is expendable and expected to change.</li>
      </ul>
      <t>Continuity is the property that the identity and control planes persist
      across a media-plane transport change. The session key is shared in the
      identity/control plane and is not renegotiated on a mere transport change;
      only the transport binding is refreshed.</t>
      <section><name>Scope Relative to JIS and MUX</name>
        <t>This document specifies handover after a session has already been
        authorised. It does not define initial actor proof, bilateral
        relationship policy, or route authorisation. Those functions are
        provided by the identity and reachability layers, such as JIS
        <xref target="JIS"/> and the MUX Status Frame <xref target="MUX"/>.</t>
        <t>In that broader model, a route is materialised only after actor proof
        and relationship policy succeed. In other words, the route is an output
        of attestation and policy, not an input to them. This draft begins once
        such an authorised session exists and describes how its media transport
        binding can change without changing the identity anchor.</t>
        <t>Name surfaces, including private numbers, role names, or .aint names,
        may help select the policy to be evaluated. They do not replace the
        identity proof, do not imply a relationship grant, and do not bind the
        media transport.</t>
      </section>
    </section>

    <section><name>Handover Procedure</name>
      <t>When an endpoint in an active session detects that its default bearer
      or local transport address has changed, it performs the following:</t>
      <ol>
        <li>Detect: the endpoint observes a new default network / local address
        (for example via an OS connectivity callback). Transient flaps SHOULD be
        debounced so a single switch yields a single re-anchor.</li>
        <li>Re-anchor request: over the stable control channel, the endpoint
        sends an authenticated request to refresh the transport of the existing
        session (equivalent to a re-offer / ICE restart). The request is bound
        to the identity anchor, not to either transport address.</li>
        <li>Transport refresh: the media anchor accepts the refreshed transport
        for the existing session and prepares to relearn the media source.</li>
        <li>Resume: encrypted media flows over the new transport using the
        existing key context. The interruption SHOULD be bounded (an
        implementation target on the order of a few hundred milliseconds).</li>
      </ol>
      <t>Because the dialog's transport is refreshed (not just a parallel
      re-registration), an in-dialog teardown after the change travels over the
      live transport and reaches the far end, avoiding stuck sessions.</t>
    </section>

    <section><name>Cryptographic Anchoring of Media</name>
      <t>Permitting the far end to relearn the media source from a new address
      (symmetric source latching) is unsafe over unauthenticated media: an
      attacker who can send packets from a new address could capture the stream.
      This document REQUIRES that media be encrypted and authenticated
      (for example SRTP <xref target="RFC3711"/> or an equivalent AEAD media
      profile) for source relearning to be enabled.</t>
      <t>With authenticated media, source relearning is safe: a substituted or
      injected stream fails the media authentication and is discarded, while the
      legitimate endpoint - which holds the session key - continues to verify.
      The key, not the address, is therefore the anchor. The session
      key-exchange material travels in the control plane (carried inside the
      authenticated, address-independent control channel), so a bearer change
      does not require a new key exchange.</t>
    </section>

    <section><name>Signed Transport-Rebind Event</name>
      <t>A handover MAY be recorded as a signed control event so that the set of
      transport transitions for a session is auditable: who moved, between which
      bearer classes, at what point in the media sequence, signed by the moving
      device's identity key. Such events MAY expose a Semantic Surface Manifest
      <xref target="SSM"/>-compatible outward surface for dispatch, while the
      full event is sealed into a provenance trail such as TIBET
      <xref target="TIBET"/>. A non-normative shape:</t>
      <sourcecode type="json"><![CDATA[
{
  "type": "transport.rebind",
  "session_id": "...",
  "reason": "wifi_to_cellular",
  "old_path": { "bearer": "wifi" },
  "new_path": { "bearer": "cellular" },
  "media_window": { "last_seq": 19420, "resume_seq": 19421 },
  "auth": { "device": "jis:device:...", "signed_at": "..." }
}
]]></sourcecode>
      <t>The signed event is a proof-plane artifact; it MUST NOT be required to
      carry media and MUST NOT gate the media handover itself. A failure to
      record the event MUST NOT interrupt the live session.</t>
    </section>

    <section><name>Deliberate Re-Anchor (Moving Target)</name>
      <t>The same authenticated re-anchor MAY be invoked deliberately rather than
      only in response to a bearer change. Because the key is the anchor,
      rotating the media transport mid-session presents a moving target: an
      observer has no fixed transport binding to lock onto. Each deliberate
      re-anchor incurs the same brief media interruption as a bearer-driven one;
      this is a defensive option, not a default behaviour, and its cadence is
      an implementation and policy choice.</t>
    </section>

    <section><name>Security Considerations</name>
      <t>Source-substitution (latching): as stated in
      <xref target="RFC3711"/>-protected operation above, source relearning
      MUST be enabled only for authenticated media. Without media
      authentication, an endpoint MUST NOT relearn the media source from a new
      address mid-session.</t>
      <t>Re-anchor authentication: a re-anchor request MUST be authenticated to
      the session's identity anchor over the control channel; an unauthenticated
      "move my media to address X" is an obvious hijack primitive and MUST be
      rejected. A failed authentication SHOULD be treated as an offence, not as
      a retriable transient, so the mechanism cannot be abused as a denial of
      service.</t>
      <t>Privacy of transition metadata: a signed transport-rebind event reveals
      coarse bearer-class transitions (for example Wi-Fi to cellular). Such
      events SHOULD carry only bearer-class hints in any outward-visible surface
      and keep finer detail in the sealed manifest, consistent with
      <xref target="SSM"/>.</t>
      <t>Relay avoidance: by not mandating a central media relay, this method
      removes a single interception/interruption point from the media path. When
      a relay is unavoidable (for example endpoints behind symmetric NAT with no
      reachable anchor), it is a last-resort fallback and SHOULD be authenticated
      to the same identity anchor.</t>
      <t>Name surfaces and privacy: a human-facing alias or private dial string
      can reveal user intent or relationship context if exposed too broadly.
      Implementations SHOULD treat such names as policy surfaces, not as
      credentials, and SHOULD avoid including richer name data in outward-visible
      handover metadata. Coarse bearer information MAY be visible; finer
      identity, relationship, and route details SHOULD remain in the sealed
      provenance event.</t>
    </section>

    <section><name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>

  <back>
    <references>
      <name>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 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" fullname="Barry Leiba"/>
          <date year="2017" month="May"/>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
      </reference>
      <reference anchor="RFC3711" target="https://www.rfc-editor.org/info/rfc3711">
        <front>
          <title>The Secure Real-time Transport Protocol (SRTP)</title>
          <author initials="M." surname="Baugher"/>
          <author initials="D." surname="McGrew"/>
          <author initials="M." surname="Naslund"/>
          <author initials="E." surname="Carrara"/>
          <author initials="K." surname="Norrman"/>
          <date year="2004" month="March"/>
        </front>
        <seriesInfo name="RFC" value="3711"/>
      </reference>
      <reference anchor="RFC8656" target="https://www.rfc-editor.org/info/rfc8656">
        <front>
          <title>Traversal Using Relays around NAT (TURN)</title>
          <author initials="T." surname="Reddy"/>
          <author initials="A." surname="Johnston"/>
          <author initials="P." surname="Matthews"/>
          <author initials="J." surname="Rosenberg"/>
          <date year="2020" month="February"/>
        </front>
        <seriesInfo name="RFC" value="8656"/>
      </reference>
      <reference anchor="JIS" target="https://datatracker.ietf.org/doc/html/draft-vandemeent-jis-identity">
        <front>
          <title>JIS: JTel Identity System</title>
          <author initials="J." surname="van de Meent"/>
          <date year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-vandemeent-jis-identity"/>
      </reference>
      <reference anchor="MUX" target="https://datatracker.ietf.org/doc/html/draft-vandemeent-mux-status-frame">
        <front>
          <title>MUX Status Frame: Two-Way Reachability Signalling without an Enumeration Oracle</title>
          <author initials="J." surname="van de Meent"/>
          <date year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-vandemeent-mux-status-frame"/>
      </reference>
      <reference anchor="SSM" target="https://datatracker.ietf.org/doc/html/draft-vandemeent-tibet-semantic-surface-manifest">
        <front>
          <title>TIBET Semantic Surface Manifest</title>
          <author initials="J." surname="van de Meent"/>
          <date year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-vandemeent-tibet-semantic-surface-manifest"/>
      </reference>
      <reference anchor="TIBET" target="https://datatracker.ietf.org/doc/html/draft-vandemeent-tibet-provenance">
        <front>
          <title>TIBET Provenance</title>
          <author initials="J." surname="van de Meent"/>
          <date year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-vandemeent-tibet-provenance"/>
      </reference>
    </references>
  </back>
</rfc>
