<?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-00"
     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-00"/>

    <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. 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</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 default-routed party (typically the calling system's own media
        engine) that the moving endpoint re-points its media to; it is not a
        neutral third-party relay.</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>
      </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>

    <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 are an instance of a semantic surface
      manifest <xref target="SSM"/> and MAY be sealed into a provenance trail
      <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>
    </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">
        <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">
        <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">
        <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">
        <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>
