<?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" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.36 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-sframe-enc-02" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.4 -->
  <front>
    <title abbrev="SFrame">Secure Frame (SFrame)</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-sframe-enc-02"/>
    <author initials="E." surname="Omara" fullname="Emad Omara">
      <organization>Apple</organization>
      <address>
        <email>eomara@apple.com</email>
      </address>
    </author>
    <author initials="J." surname="Uberti" fullname="Justin Uberti">
      <organization>Google</organization>
      <address>
        <email>juberti@google.com</email>
      </address>
    </author>
    <author initials="S." surname="Murillo" fullname="Sergio Garcia Murillo">
      <organization>CoSMo Software</organization>
      <address>
        <email>sergio.garcia.murillo@cosmosoftware.io</email>
      </address>
    </author>
    <author initials="R. L." surname="Barnes" fullname="Richard L. Barnes" role="editor">
      <organization>Cisco</organization>
      <address>
        <email>rlb@ipv.sx</email>
      </address>
    </author>
    <author initials="Y." surname="Fablet" fullname="Youenn Fablet">
      <organization>Apple</organization>
      <address>
        <email>youenn@apple.com</email>
      </address>
    </author>
    <date year="2023" month="July" day="10"/>
    <area>Applications and Real-Time</area>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 55?>

<t>This document describes the Secure Frame (SFrame) end-to-end encryption and
authentication mechanism for media frames in a multiparty conference call, in
which central media servers (selective forwarding units or SFUs) can access the
media metadata needed to make forwarding decisions without having access to the
actual media.</t>
      <t>The proposed mechanism differs from the Secure Real-Time Protocol (SRTP) in that
it is independent of RTP (thus compatible with non-RTP media transport) and can
be applied to whole media frames in order to be more bandwidth efficient.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://sframe-wg.github.io/sframe/draft-ietf-sframe-enc.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-sframe-enc/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Secure Media Frames Working Group mailing list (<eref target="mailto:sframe@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/sframe/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/sframe/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/sframe-wg/sframe"/>.</t>
    </note>
  </front>
  <middle>
    <?line 67?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Modern multi-party video call systems use Selective Forwarding Unit (SFU)
servers to efficiently route media streams to call endpoints based on factors such
as available bandwidth, desired video size, codec support, and other factors. An
SFU typically does not need access to the media content of the conference,
allowing for the media to be "end-to-end" encrypted so that it cannot be
decrypted by the SFU. In order for the SFU to work properly, though, it usually
needs to be able to access RTP metadata and RTCP feedback messages, which is not
possible if all RTP/RTCP traffic is end-to-end encrypted.</t>
      <t>As such, two layers of encryptions and authentication are required:</t>
      <ol spacing="normal" type="1"><li>Hop-by-hop (HBH) encryption of media, metadata, and feedback messages
between the the endpoints and SFU</li>
        <li>End-to-end (E2E) encryption of media between the endpoints</li>
      </ol>
      <t>The Secure Real-Time Protocol (SRTP) is already widely used for HBH encryption
<xref target="RFC3711"/>. The SRTP "double encryption" scheme defines a way to do E2E
encryption in SRTP <xref target="RFC8723"/>. Unfortunately, this scheme has poor efficiency
and high complexity, and its entanglement with RTP makes it unworkable in
several realistic SFU scenarios.</t>
      <t>This document proposes a new end-to-end encryption mechanism known as SFrame,
specifically designed to work in group conference calls with SFUs. SFrame is a
general encryption framing that can be used to protect media payloads, agnostic
of transport.</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>IV:</dt>
        <dd>
          <t>Initialization Vector</t>
        </dd>
        <dt>MAC:</dt>
        <dd>
          <t>Message Authentication Code</t>
        </dd>
        <dt>E2EE:</dt>
        <dd>
          <t>End to End Encryption</t>
        </dd>
        <dt>HBH:</dt>
        <dd>
          <t>Hop By Hop</t>
        </dd>
      </dl>
      <t>We use "Selective Forwarding Unit (SFU)" and "media stream" in a less formal sense
than in <xref target="RFC7656"/>.  An SFU is a selective switching function for media
payloads, and a media stream a sequence of media payloads, in both cases
regardless of whether those media payloads are transported over RTP or some
other protocol.</t>
    </section>
    <section anchor="goals">
      <name>Goals</name>
      <t>SFrame is designed to be a suitable E2EE protection scheme for conference call
media in a broad range of scenarios, as outlined by the following goals:</t>
      <ol spacing="normal" type="1"><li>Provide an secure E2EE mechanism for audio and video in conference calls
that can be used with arbitrary SFU servers.</li>
        <li>Decouple media encryption from key management to allow SFrame to be used
with an arbitrary key management system.</li>
        <li>Minimize packet expansion to allow successful conferencing in as many
network conditions as possible.</li>
        <li>Independence from the underlying transport, including use in non-RTP
transports, e.g., WebTransport <xref target="I-D.ietf-webtrans-overview"/>.</li>
        <li>When used with RTP and its associated error resilience mechanisms, i.e., RTX
and FEC, require no special handling for RTX and FEC packets.</li>
        <li>Minimize the changes needed in SFU servers.</li>
        <li>Minimize the changes needed in endpoints.</li>
        <li>Work with the most popular audio and video codecs used in conferencing
scenarios.</li>
      </ol>
    </section>
    <section anchor="sframe">
      <name>SFrame</name>
      <t>This document defines an encryption mechanism that provides effective end-to-end
encryption, is simple to implement, has no dependencies on RTP, and minimizes
encryption bandwidth overhead. Because SFrame can encrypt a full frame, rather
than individual packets, bandwidth overhead can be reduced by adding encryption
overhead only once per media frame, instead of once per packet.</t>
      <section anchor="application-context">
        <name>Application Context</name>
        <t>SFrame is a general encryption framing, intended to be used as an E2E encryption
layer over an underlying HBH-encrypted transport such as SRTP or QUIC
<xref target="RFC3711"/><xref target="I-D.ietf-moq-transport"/>.</t>
        <t>The scale at which SFrame encryption is applied to media determines the overall
amount of overhead that SFrame adds to the media stream, as well as the
engineering complexity involved in integrating SFrame into a particular
environment. Two patterns are common: Either using SFrame to encrypt whole
media frames (per-frame) or individual transport-level media payloads
(per-packet).</t>
        <t>For example, <xref target="media-stack"/> shows a typical media sender stack that takes media
in from some source, encodes it into frames, divides those frames into media
packets, and then sends those payloads in SRTP packets. The receiver stack
performs the reverse operations, reassembling frames from SRTP packets and
decoding.  Arrows indicate two different ways that SFrame protection could be
integrated into this media stack, to encrypt whole frames or individual media
packets.</t>
        <t>Applying SFrame per-frame in this system offers higher efficiency, but may
require a more complex integration in environments where depacketization relies
on the content of media packets. Applying SFrame per-packet avoids this
complexity, at the cost of higher bandwidth consumption.  Some quantitative
discussion of these trade-offs is provided in <xref target="overhead-analysis"/>.</t>
        <t>As noted above, however, SFrame is a general media encapsulation, and can be
applied in other scenarios.  The important thing is that the sender and
receivers of an SFrame-encrypted object agree on that object's semantics.
SFrame does not provide this agreement; it must be arranged by the application.</t>
        <figure anchor="media-stack">
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="576" width="632" viewBox="0 0 632 576" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 24,112 L 24,144" fill="none" stroke="black"/>
                <path d="M 24,432 L 24,464" fill="none" stroke="black"/>
                <path d="M 56,32 L 56,240" fill="none" stroke="black"/>
                <path d="M 56,352 L 56,560" fill="none" stroke="black"/>
                <path d="M 80,64 L 80,128" fill="none" stroke="black"/>
                <path d="M 80,464 L 80,528" fill="none" stroke="black"/>
                <path d="M 168,64 L 168,128" fill="none" stroke="black"/>
                <path d="M 168,464 L 168,528" fill="none" stroke="black"/>
                <path d="M 200,104 L 200,144" fill="none" stroke="black"/>
                <path d="M 200,208 L 200,384" fill="none" stroke="black"/>
                <path d="M 200,448 L 200,488" fill="none" stroke="black"/>
                <path d="M 224,64 L 224,128" fill="none" stroke="black"/>
                <path d="M 224,464 L 224,528" fill="none" stroke="black"/>
                <path d="M 336,64 L 336,128" fill="none" stroke="black"/>
                <path d="M 336,464 L 336,528" fill="none" stroke="black"/>
                <path d="M 360,104 L 360,144" fill="none" stroke="black"/>
                <path d="M 360,208 L 360,384" fill="none" stroke="black"/>
                <path d="M 368,448 L 368,488" fill="none" stroke="black"/>
                <path d="M 392,64 L 392,128" fill="none" stroke="black"/>
                <path d="M 392,464 L 392,528" fill="none" stroke="black"/>
                <path d="M 440,136 L 440,456" fill="none" stroke="black"/>
                <path d="M 488,64 L 488,128" fill="none" stroke="black"/>
                <path d="M 488,464 L 488,528" fill="none" stroke="black"/>
                <path d="M 512,32 L 512,88" fill="none" stroke="black"/>
                <path d="M 512,104 L 512,240" fill="none" stroke="black"/>
                <path d="M 512,352 L 512,488" fill="none" stroke="black"/>
                <path d="M 512,504 L 512,560" fill="none" stroke="black"/>
                <path d="M 552,272 L 552,320" fill="none" stroke="black"/>
                <path d="M 584,96 L 584,264" fill="none" stroke="black"/>
                <path d="M 584,320 L 584,496" fill="none" stroke="black"/>
                <path d="M 624,272 L 624,320" fill="none" stroke="black"/>
                <path d="M 56,32 L 512,32" fill="none" stroke="black"/>
                <path d="M 80,64 L 168,64" fill="none" stroke="black"/>
                <path d="M 224,64 L 336,64" fill="none" stroke="black"/>
                <path d="M 392,64 L 488,64" fill="none" stroke="black"/>
                <path d="M 176,96 L 216,96" fill="none" stroke="black"/>
                <path d="M 344,96 L 384,96" fill="none" stroke="black"/>
                <path d="M 496,96 L 584,96" fill="none" stroke="black"/>
                <path d="M 80,128 L 168,128" fill="none" stroke="black"/>
                <path d="M 224,128 L 336,128" fill="none" stroke="black"/>
                <path d="M 392,128 L 488,128" fill="none" stroke="black"/>
                <path d="M 56,240 L 192,240" fill="none" stroke="black"/>
                <path d="M 208,240 L 352,240" fill="none" stroke="black"/>
                <path d="M 368,240 L 432,240" fill="none" stroke="black"/>
                <path d="M 448,240 L 512,240" fill="none" stroke="black"/>
                <path d="M 552,272 L 624,272" fill="none" stroke="black"/>
                <path d="M 200,304 L 232,304" fill="none" stroke="black"/>
                <path d="M 336,304 L 360,304" fill="none" stroke="black"/>
                <path d="M 552,320 L 624,320" fill="none" stroke="black"/>
                <path d="M 56,352 L 192,352" fill="none" stroke="black"/>
                <path d="M 208,352 L 352,352" fill="none" stroke="black"/>
                <path d="M 368,352 L 432,352" fill="none" stroke="black"/>
                <path d="M 448,352 L 512,352" fill="none" stroke="black"/>
                <path d="M 80,464 L 168,464" fill="none" stroke="black"/>
                <path d="M 224,464 L 336,464" fill="none" stroke="black"/>
                <path d="M 392,464 L 488,464" fill="none" stroke="black"/>
                <path d="M 176,496 L 216,496" fill="none" stroke="black"/>
                <path d="M 344,496 L 384,496" fill="none" stroke="black"/>
                <path d="M 496,496 L 584,496" fill="none" stroke="black"/>
                <path d="M 80,528 L 168,528" fill="none" stroke="black"/>
                <path d="M 224,528 L 336,528" fill="none" stroke="black"/>
                <path d="M 392,528 L 488,528" fill="none" stroke="black"/>
                <path d="M 56,560 L 512,560" fill="none" stroke="black"/>
                <path d="M 24,464 L 40,496" fill="none" stroke="black"/>
                <path d="M 24,432 L 40,464" fill="none" stroke="black"/>
                <path d="M 24,144 L 40,176" fill="none" stroke="black"/>
                <path d="M 24,112 L 40,144" fill="none" stroke="black"/>
                <path d="M 8,144 L 24,112" fill="none" stroke="black"/>
                <path d="M 8,176 L 24,144" fill="none" stroke="black"/>
                <path d="M 8,464 L 24,432" fill="none" stroke="black"/>
                <path d="M 8,496 L 24,464" fill="none" stroke="black"/>
                <path d="M 24,80 C 15.16936,80 8,87.16936 8,96" fill="none" stroke="black"/>
                <path d="M 24,80 C 32.83064,80 40,87.16936 40,96" fill="none" stroke="black"/>
                <path d="M 24,112 C 15.16936,112 8,104.83064 8,96" fill="none" stroke="black"/>
                <path d="M 24,112 C 32.83064,112 40,104.83064 40,96" fill="none" stroke="black"/>
                <path d="M 24,400 C 15.16936,400 8,407.16936 8,416" fill="none" stroke="black"/>
                <path d="M 24,400 C 32.83064,400 40,407.16936 40,416" fill="none" stroke="black"/>
                <path d="M 24,432 C 15.16936,432 8,424.83064 8,416" fill="none" stroke="black"/>
                <path d="M 24,432 C 32.83064,432 40,424.83064 40,416" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="592,264 580,258.4 580,269.6" fill="black" transform="rotate(90,584,264)"/>
                <polygon class="arrowhead" points="504,496 492,490.4 492,501.6" fill="black" transform="rotate(180,496,496)"/>
                <polygon class="arrowhead" points="448,456 436,450.4 436,461.6" fill="black" transform="rotate(90,440,456)"/>
                <polygon class="arrowhead" points="448,136 436,130.4 436,141.6" fill="black" transform="rotate(270,440,136)"/>
                <polygon class="arrowhead" points="392,96 380,90.4 380,101.6" fill="black" transform="rotate(0,384,96)"/>
                <polygon class="arrowhead" points="376,488 364,482.4 364,493.6" fill="black" transform="rotate(90,368,488)"/>
                <polygon class="arrowhead" points="368,384 356,378.4 356,389.6" fill="black" transform="rotate(90,360,384)"/>
                <polygon class="arrowhead" points="368,208 356,202.4 356,213.6" fill="black" transform="rotate(270,360,208)"/>
                <polygon class="arrowhead" points="368,104 356,98.4 356,109.6" fill="black" transform="rotate(270,360,104)"/>
                <polygon class="arrowhead" points="352,496 340,490.4 340,501.6" fill="black" transform="rotate(180,344,496)"/>
                <polygon class="arrowhead" points="224,96 212,90.4 212,101.6" fill="black" transform="rotate(0,216,96)"/>
                <polygon class="arrowhead" points="208,488 196,482.4 196,493.6" fill="black" transform="rotate(90,200,488)"/>
                <polygon class="arrowhead" points="208,384 196,378.4 196,389.6" fill="black" transform="rotate(90,200,384)"/>
                <polygon class="arrowhead" points="208,208 196,202.4 196,213.6" fill="black" transform="rotate(270,200,208)"/>
                <polygon class="arrowhead" points="208,104 196,98.4 196,109.6" fill="black" transform="rotate(270,200,104)"/>
                <polygon class="arrowhead" points="184,496 172,490.4 172,501.6" fill="black" transform="rotate(180,176,496)"/>
                <g class="text">
                  <text x="440" y="84">HBH</text>
                  <text x="124" y="100">Encode</text>
                  <text x="280" y="100">Packetize</text>
                  <text x="440" y="100">Protect</text>
                  <text x="196" y="164">SFrame</text>
                  <text x="356" y="164">SFrame</text>
                  <text x="200" y="180">Protect</text>
                  <text x="360" y="180">Protect</text>
                  <text x="24" y="196">Alice</text>
                  <text x="200" y="196">(per-frame)</text>
                  <text x="364" y="196">(per-packet)</text>
                  <text x="264" y="292">E2E</text>
                  <text x="296" y="292">Key</text>
                  <text x="464" y="292">HBH</text>
                  <text x="496" y="292">Key</text>
                  <text x="584" y="292">Media</text>
                  <text x="284" y="308">Management</text>
                  <text x="492" y="308">Management</text>
                  <text x="588" y="308">Server</text>
                  <text x="196" y="404">SFrame</text>
                  <text x="364" y="404">SFrame</text>
                  <text x="200" y="420">Unprotect</text>
                  <text x="368" y="420">Unprotect</text>
                  <text x="200" y="436">(per-frame)</text>
                  <text x="372" y="436">(per-packet)</text>
                  <text x="440" y="484">HBH</text>
                  <text x="124" y="500">Decode</text>
                  <text x="280" y="500">Depacketize</text>
                  <text x="440" y="500">Unprotect</text>
                  <text x="24" y="516">Bob</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
      +--------------------------------------------------------+
      |                                                        |
      |  +----------+      +-------------+      +-----------+  |
 .-.  |  |          |      |             |      |    HBH    |  |
|   | |  |  Encode  |----->|  Packetize  |----->|  Protect  |-----------+
 '+'  |  |          |   ^  |             |  ^   |           |  |        |
 /|\  |  +----------+   |  +-------------+  |   +-----------+  |        |
/ + \ |                 |                   |         ^        |        |
 / \  |              SFrame              SFrame       |        |        |
/   \ |              Protect             Protect      |        |        |
Alice |            (per-frame)         (per-packet)   |        |        |
      |                 ^                   ^         |        |        |
      |                 |                   |         |        |        |
      +-----------------|-------------------|---------|--------+        |
                        |                   |         |                 v
                        |                   |         |             +---+----+
                        |      E2E Key      |         | HBH Key     | Media  |
                        +---- Management ---+         | Management  | Server |
                        |                   |         |             +---+----+
                        |                   |         |                 |
      +-----------------|-------------------|---------|--------+        |
      |                 |                   |         |        |        |
      |                 V                   V         |        |        |
 .-.  |              SFrame               SFrame      |        |        |
|   | |             Unprotect            Unprotect    |        |        |
 '+'  |            (per-frame)          (per-packet)  |        |        |
 /|\  |                 |                    |        V        |        |
/ + \ |  +----------+   |  +-------------+   |  +-----------+  |        |
 / \  |  |          |   V  |             |   V  |    HBH    |  |        |
/   \ |  |  Decode  |<-----| Depacketize |<-----| Unprotect |<----------+
 Bob  |  |          |      |             |      |           |  |
      |  +----------+      +-------------+      +-----------+  |
      |                                                        |
      +--------------------------------------------------------+
]]></artwork>
          </artset>
        </figure>
        <t>Like SRTP, SFrame does not define how the keys used for SFrame are exchanged by
the parties in the conference.  Keys for SFrame might be distributed over an
existing E2E-secure channel (see <xref target="sender-keys"/>), or derived from an E2E-secure
shared secret (see <xref target="mls"/>).  The key management system MUST ensure that each
key used for encrypting media is used by exactly one media sender, in order to
avoid reuse of IVs.</t>
      </section>
      <section anchor="sframe-ciphertext">
        <name>SFrame Ciphertext</name>
        <t>An SFrame ciphertext comprises an SFrame header followed by the output of an
AEAD encryption of the plaintext <xref target="RFC5116"/>, with the header provided as additional
authenticated data (AAD).</t>
        <t>The SFrame header is a variable-length structure described in detail in
<xref target="sframe-header"/>.  The structure of the encrypted data and authentication tag
are determined by the AEAD algorithm in use.</t>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="320" width="512" viewBox="0 0 512 320" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,64 L 8,304" fill="none" stroke="black"/>
              <path d="M 32,32 L 32,256" fill="none" stroke="black"/>
              <path d="M 48,32 L 48,64" fill="none" stroke="black"/>
              <path d="M 80,32 L 80,64" fill="none" stroke="black"/>
              <path d="M 96,32 L 96,64" fill="none" stroke="black"/>
              <path d="M 136,32 L 136,64" fill="none" stroke="black"/>
              <path d="M 304,32 L 304,64" fill="none" stroke="black"/>
              <path d="M 480,32 L 480,256" fill="none" stroke="black"/>
              <path d="M 504,32 L 504,304" fill="none" stroke="black"/>
              <path d="M 32,32 L 504,32" fill="none" stroke="black"/>
              <path d="M 8,64 L 480,64" fill="none" stroke="black"/>
              <path d="M 8,224 L 504,224" fill="none" stroke="black"/>
              <path d="M 32,256 L 480,256" fill="none" stroke="black"/>
              <path d="M 8,304 L 32,304" fill="none" stroke="black"/>
              <path d="M 480,304 L 504,304" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="496,224 484,218.4 484,229.6" fill="black" transform="rotate(180,488,224)"/>
              <polygon class="arrowhead" points="496,32 484,26.4 484,37.6" fill="black" transform="rotate(180,488,32)"/>
              <polygon class="arrowhead" points="32,224 20,218.4 20,229.6" fill="black" transform="rotate(0,24,224)"/>
              <polygon class="arrowhead" points="32,64 20,58.4 20,69.6" fill="black" transform="rotate(0,24,64)"/>
              <g class="text">
                <text x="40" y="52">R</text>
                <text x="64" y="52">LEN</text>
                <text x="88" y="52">X</text>
                <text x="116" y="52">KLEN</text>
                <text x="208" y="52">Key</text>
                <text x="236" y="52">ID</text>
                <text x="392" y="52">Counter</text>
                <text x="224" y="148">Encrypted</text>
                <text x="284" y="148">Data</text>
                <text x="228" y="244">Authentication</text>
                <text x="304" y="244">Tag</text>
                <text x="80" y="308">Encrypted</text>
                <text x="152" y="308">Portion</text>
                <text x="352" y="308">Authenticated</text>
                <text x="440" y="308">Portion</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
   +-+---+-+----+--------------------+---------------------+<-+
   |R|LEN|X|KLEN|       Key ID       |       Counter       |  |
+->+-+---+-+----+--------------------+---------------------+  |
|  |                                                       |  |
|  |                                                       |  |
|  |                                                       |  |
|  |                                                       |  |
|  |                   Encrypted Data                      |  |
|  |                                                       |  |
|  |                                                       |  |
|  |                                                       |  |
|  |                                                       |  |
+->+-------------------------------------------------------+<-+
|  |                 Authentication Tag                    |  |
|  +-------------------------------------------------------+  |
|                                                             |
|                                                             |
+--- Encrypted Portion               Authenticated Portion ---+
]]></artwork>
        </artset>
        <t>When SFrame is applied per-packet, the payload of each packet will be an SFrame
ciphertext.  When SFrame is applied per-frame, the SFrame ciphertext
representing an encrypted frame will span several packets, with the header
appearing in the first packet and the authentication tag in the last packet.</t>
      </section>
      <section anchor="sframe-header">
        <name>SFrame Header</name>
        <t>The SFrame header specifies two values from which encryption parameters are
derived:</t>
        <ul spacing="normal">
          <li>A Key ID (KID) that determines which encryption key should be used</li>
          <li>A counter (CTR) that is used to construct the IV for the encryption</li>
        </ul>
        <t>Applications MUST ensure that each (KID, CTR) combination is used for exactly
one encryption operation. A typical approach to achieving this gaurantee is
outlined in <xref target="header-value-uniqueness"/>.</t>
        <t>Both the counter and the key id are encoded as integers in network (big-endian)
byte order, in a variable length format to decrease the overhead.  The length of
each field is up to 8 bytes and is represented in 3 bits in the SFrame header:
000 represents a length of 1, 001 a length of 2, etc.</t>
        <t>The first byte in the SFrame header has a fixed format and contains the header
metadata:</t>
        <figure>
          <name>SFrame header metadata</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="96" width="144" viewBox="0 0 144 96" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,80" fill="none" stroke="black"/>
                <path d="M 24,48 L 24,80" fill="none" stroke="black"/>
                <path d="M 72,48 L 72,80" fill="none" stroke="black"/>
                <path d="M 88,48 L 88,80" fill="none" stroke="black"/>
                <path d="M 136,48 L 136,80" fill="none" stroke="black"/>
                <path d="M 8,48 L 136,48" fill="none" stroke="black"/>
                <path d="M 8,80 L 136,80" fill="none" stroke="black"/>
                <g class="text">
                  <text x="16" y="36">0</text>
                  <text x="32" y="36">1</text>
                  <text x="48" y="36">2</text>
                  <text x="64" y="36">3</text>
                  <text x="80" y="36">4</text>
                  <text x="96" y="36">5</text>
                  <text x="112" y="36">6</text>
                  <text x="128" y="36">7</text>
                  <text x="16" y="68">R</text>
                  <text x="48" y="68">LEN</text>
                  <text x="80" y="68">X</text>
                  <text x="112" y="68">K</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
 0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
|R| LEN |X|  K  |
+-+-+-+-+-+-+-+-+
]]></artwork>
          </artset>
        </figure>
        <dl>
          <dt>Reserved (R, 1 bit):</dt>
          <dd>
            <t>This field MUST be set to zero on sending, and MUST be ignored by receivers.</t>
          </dd>
          <dt>Counter Length (LEN, 3 bits):</dt>
          <dd>
            <t>This field indicates the length of the CTR field in bytes, minus one (the
range of possible values is thus 1-8).</t>
          </dd>
          <dt>Extended Key Id Flag (X, 1 bit):</dt>
          <dd>
            <t>Indicates if the key field contains the key id or the key length.</t>
          </dd>
          <dt>Key or Key Length (K, 3 bits):</dt>
          <dd>
            <t>This field contains the key id (KID) if the X flag is set to 0, or the key
length (KLEN) if set to 1.</t>
          </dd>
        </dl>
        <t>If X flag is 0, then the KID is in the range of 0-7 and the counter (CTR) is
found in the next LEN bytes:</t>
        <figure>
          <name>SFrame header with short KID</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="96" width="416" viewBox="0 0 416 96" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,80" fill="none" stroke="black"/>
                <path d="M 24,48 L 24,80" fill="none" stroke="black"/>
                <path d="M 72,48 L 72,80" fill="none" stroke="black"/>
                <path d="M 88,48 L 88,80" fill="none" stroke="black"/>
                <path d="M 136,48 L 136,80" fill="none" stroke="black"/>
                <path d="M 408,48 L 408,80" fill="none" stroke="black"/>
                <path d="M 8,48 L 408,48" fill="none" stroke="black"/>
                <path d="M 8,80 L 408,80" fill="none" stroke="black"/>
                <g class="text">
                  <text x="16" y="36">0</text>
                  <text x="32" y="36">1</text>
                  <text x="48" y="36">2</text>
                  <text x="64" y="36">3</text>
                  <text x="80" y="36">4</text>
                  <text x="96" y="36">5</text>
                  <text x="112" y="36">6</text>
                  <text x="128" y="36">7</text>
                  <text x="16" y="68">R</text>
                  <text x="40" y="68">LEN</text>
                  <text x="80" y="68">0</text>
                  <text x="112" y="68">KID</text>
                  <text x="196" y="68">CTR...</text>
                  <text x="276" y="68">(length=LEN)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
 0 1 2 3 4 5 6 7
+-+-----+-+-----+---------------------------------+
|R|LEN  |0| KID |    CTR... (length=LEN)          |
+-+-----+-+-----+---------------------------------+
]]></artwork>
          </artset>
        </figure>
        <t>If X flag is 1 then KLEN is the length of the key (KID) in bytes, minus one
(the range of possible lengths is thus 1-8). The KID is encoded in
the KLEN bytes following the metadata byte, and the counter (CTR) is encoded
in the next LEN bytes:</t>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="96" width="592" viewBox="0 0 592 96" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,48 L 8,80" fill="none" stroke="black"/>
              <path d="M 24,48 L 24,80" fill="none" stroke="black"/>
              <path d="M 72,48 L 72,80" fill="none" stroke="black"/>
              <path d="M 88,48 L 88,80" fill="none" stroke="black"/>
              <path d="M 136,48 L 136,80" fill="none" stroke="black"/>
              <path d="M 360,48 L 360,80" fill="none" stroke="black"/>
              <path d="M 584,48 L 584,80" fill="none" stroke="black"/>
              <path d="M 8,48 L 584,48" fill="none" stroke="black"/>
              <path d="M 8,80 L 584,80" fill="none" stroke="black"/>
              <g class="text">
                <text x="16" y="36">0</text>
                <text x="32" y="36">1</text>
                <text x="48" y="36">2</text>
                <text x="64" y="36">3</text>
                <text x="80" y="36">4</text>
                <text x="96" y="36">5</text>
                <text x="112" y="36">6</text>
                <text x="128" y="36">7</text>
                <text x="16" y="68">R</text>
                <text x="40" y="68">LEN</text>
                <text x="80" y="68">1</text>
                <text x="108" y="68">KLEN</text>
                <text x="188" y="68">KID...</text>
                <text x="272" y="68">(length=KLEN)</text>
                <text x="420" y="68">CTR...</text>
                <text x="500" y="68">(length=LEN)</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
 0 1 2 3 4 5 6 7
+-+-----+-+-----+---------------------------+---------------------------+
|R|LEN  |1|KLEN |   KID... (length=KLEN)    |    CTR... (length=LEN)    |
+-+-----+-+-----+---------------------------+---------------------------+
]]></artwork>
        </artset>
      </section>
      <section anchor="encryption-schema">
        <name>Encryption Schema</name>
        <t>SFrame encryption uses an AEAD encryption algorithm and hash function defined by
the cipher suite in use (see <xref target="cipher-suites"/>).  We will refer to the following
aspects of the AEAD algorithm below:</t>
        <ul spacing="normal">
          <li>
            <tt>AEAD.Encrypt</tt> and <tt>AEAD.Decrypt</tt> - The encryption and decryption functions
for the AEAD.  We follow the convention of RFC 5116 <xref target="RFC5116"/> and consider
the authentication tag part of the ciphertext produced by <tt>AEAD.Encrypt</tt> (as
opposed to a separate field as in SRTP <xref target="RFC3711"/>).</li>
          <li>
            <tt>AEAD.Nk</tt> - The size in bytes of a key for the encryption algorithm</li>
          <li>
            <tt>AEAD.Nn</tt> - The size in bytes of a nonce for the encryption algorithm</li>
          <li>
            <tt>AEAD.Nt</tt> - The overhead in bytes of the encryption algorithm (typically the
size of a "tag" that is added to the plaintext)</li>
        </ul>
        <section anchor="key-selection">
          <name>Key Selection</name>
          <t>Each SFrame encryption or decryption operation is premised on a single secret
<tt>base_key</tt>, which is labeled with an integer KID value signaled in the SFrame
header.</t>
          <t>The sender and receivers need to agree on which key should be used for a given
KID.  The process for provisioning keys and their KID values is beyond the scope
of this specification, but its security properties will bound the assurances
that SFrame provides.  For example, if SFrame is used to provide E2E security
against intermediary media nodes, then SFrame keys need to be negotiated in a
way that does not make them accessible to these intermediaries.</t>
          <t>For each known KID value, the client stores the corresponding symmetric key
<tt>base_key</tt>.  For keys that can be used for encryption, the client also stores
the next counter value CTR to be used when encrypting (initially 0).</t>
          <t>When encrypting a plaintext, the application specifies which KID is to be used,
and the counter is incremented after successful encryption.  When decrypting,
the <tt>base_key</tt> for decryption is selected from the available keys using the KID
value in the SFrame Header.</t>
          <t>A given key MUST NOT be used for encryption by multiple senders.  Such reuse
would result in multiple encrypted frames being generated with the same (key,
nonce) pair, which harms the protections provided by many AEAD algorithms.
Implementations SHOULD mark each key as usable for encryption or decryption,
never both.</t>
          <t>Note that the set of available keys might change over the lifetime of a
real-time session.  In such cases, the client will need to manage key usage to
avoid media loss due to a key being used to encrypt before all receivers are
able to use it to decrypt.  For example, an application may make decryption-only
keys available immediately, but delay the use of keys for encryption until (a)
all receivers have acknowledged receipt of the new key or (b) a timeout expires.</t>
        </section>
        <section anchor="key-derivation">
          <name>Key Derivation</name>
          <t>SFrame encrytion and decryption use a key and salt derived from the <tt>base_key</tt>
associated to a KID.  Given a <tt>base_key</tt> value, the key and salt are derived
using HKDF <xref target="RFC5869"/> as follows:</t>
          <artwork><![CDATA[
def derive_key_salt(KID, base_key):
  sframe_secret = HKDF-Extract("SFrame 1.0 Secret " + KID, base_key)
  sframe_key = HKDF-Expand(sframe_secret, "key", AEAD.Nk)
  sframe_salt = HKDF-Expand(sframe_secret, "salt", AEAD.Nn)
  return sframe_key, sframe_salt
]]></artwork>
          <t>In the derivation of <tt>sframe_secret</tt>, the <tt>+</tt> operator represents concatenation
of octet strings and the KID value is encoded as an 8-byte big-endian integer
(not the compressed form used in the SFrame header).</t>
          <t>The hash function used for HKDF is determined by the cipher suite in use.</t>
        </section>
        <section anchor="encryption">
          <name>Encryption</name>
          <t>SFrame encryption uses the AEAD encryption algorithm for the cipher suite in use.
The key for the encryption is the <tt>sframe_key</tt> and the nonce is formed by XORing
the <tt>sframe_salt</tt> with the current counter, encoded as a big-endian integer of
length <tt>AEAD.Nn</tt>.</t>
          <t>The encryptor forms an SFrame header using the CTR, and KID values provided.
The encoded header is provided as AAD to the AEAD encryption operation, together
with application-provided metadata about the encrypted media (see <xref target="metadata"/>).</t>
          <artwork><![CDATA[
def encrypt(CTR, KID, metadata, plaintext):
  sframe_key, sframe_salt = key_store[KID]

  ctr = encode_big_endian(CTR, AEAD.Nn)
  nonce = xor(sframe_salt, CTR)

  header = encode_sframe_header(CTR, KID)
  aad = header + metadata

  ciphertext = AEAD.Encrypt(sframe_key, nonce, aad, plaintext)
  return header + ciphertext
]]></artwork>
          <t>For example, the metadata input to encryption allows for frame metadata to be
authenticated when SFrame is applied per-frame.  After encoding the frame and
before packetizing it, the necessary media metadata will be moved out of the
encoded frame buffer, to be sent in some channel visible to the SFU (e.g., an
RTP header extension).</t>
          <figure>
            <name>Encryption flow</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="528" width="328" viewBox="0 0 328 528" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                  <path d="M 8,176 L 8,336" fill="none" stroke="black"/>
                  <path d="M 32,32 L 32,64" fill="none" stroke="black"/>
                  <path d="M 32,344 L 32,400" fill="none" stroke="black"/>
                  <path d="M 56,176 L 56,336" fill="none" stroke="black"/>
                  <path d="M 80,224 L 80,256" fill="none" stroke="black"/>
                  <path d="M 80,384 L 80,512" fill="none" stroke="black"/>
                  <path d="M 96,64 L 96,160" fill="none" stroke="black"/>
                  <path d="M 168,32 L 168,64" fill="none" stroke="black"/>
                  <path d="M 192,32 L 192,128" fill="none" stroke="black"/>
                  <path d="M 208,384 L 208,512" fill="none" stroke="black"/>
                  <path d="M 232,256 L 232,288" fill="none" stroke="black"/>
                  <path d="M 256,128 L 256,448" fill="none" stroke="black"/>
                  <path d="M 320,32 L 320,128" fill="none" stroke="black"/>
                  <path d="M 32,32 L 168,32" fill="none" stroke="black"/>
                  <path d="M 192,32 L 320,32" fill="none" stroke="black"/>
                  <path d="M 32,64 L 168,64" fill="none" stroke="black"/>
                  <path d="M 192,128 L 320,128" fill="none" stroke="black"/>
                  <path d="M 64,160 L 248,160" fill="none" stroke="black"/>
                  <path d="M 8,176 L 56,176" fill="none" stroke="black"/>
                  <path d="M 8,208 L 56,208" fill="none" stroke="black"/>
                  <path d="M 56,224 L 104,224" fill="none" stroke="black"/>
                  <path d="M 208,224 L 248,224" fill="none" stroke="black"/>
                  <path d="M 80,256 L 104,256" fill="none" stroke="black"/>
                  <path d="M 216,256 L 232,256" fill="none" stroke="black"/>
                  <path d="M 8,272 L 56,272" fill="none" stroke="black"/>
                  <path d="M 56,288 L 248,288" fill="none" stroke="black"/>
                  <path d="M 8,336 L 56,336" fill="none" stroke="black"/>
                  <path d="M 80,384 L 208,384" fill="none" stroke="black"/>
                  <path d="M 32,400 L 72,400" fill="none" stroke="black"/>
                  <path d="M 80,416 L 208,416" fill="none" stroke="black"/>
                  <path d="M 216,448 L 256,448" fill="none" stroke="black"/>
                  <path d="M 80,512 L 208,512" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="256,288 244,282.4 244,293.6" fill="black" transform="rotate(0,248,288)"/>
                  <polygon class="arrowhead" points="256,224 244,218.4 244,229.6" fill="black" transform="rotate(0,248,224)"/>
                  <polygon class="arrowhead" points="256,160 244,154.4 244,165.6" fill="black" transform="rotate(0,248,160)"/>
                  <polygon class="arrowhead" points="224,448 212,442.4 212,453.6" fill="black" transform="rotate(180,216,448)"/>
                  <polygon class="arrowhead" points="112,256 100,250.4 100,261.6" fill="black" transform="rotate(0,104,256)"/>
                  <polygon class="arrowhead" points="112,224 100,218.4 100,229.6" fill="black" transform="rotate(0,104,224)"/>
                  <polygon class="arrowhead" points="80,400 68,394.4 68,405.6" fill="black" transform="rotate(0,72,400)"/>
                  <g class="text">
                    <text x="100" y="52">metadata</text>
                    <text x="256" y="84">plaintext</text>
                    <text x="28" y="164">header</text>
                    <text x="280" y="164">AAD</text>
                    <text x="32" y="196">S</text>
                    <text x="32" y="228">KID</text>
                    <text x="156" y="228">sframe_key</text>
                    <text x="280" y="228">Key</text>
                    <text x="160" y="260">sframe_salt</text>
                    <text x="32" y="292">CTR</text>
                    <text x="288" y="292">Nonce</text>
                    <text x="236" y="356">AEAD</text>
                    <text x="288" y="356">Encrypt</text>
                    <text x="116" y="404">SFrame</text>
                    <text x="172" y="404">Header</text>
                    <text x="148" y="468">ciphertext</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
   +----------------+  +---------------+
   |    metadata    |  |               |
   +-------+--------+  |               |
           |           |   plaintext   |
           |           |               |
           |           |               |
           |           +-------+-------+
           |                   |
header ----+------------------>| AAD
+-----+                        |
|  S  |                        |
+-----+                        |
| KID +--+--> sframe_key ----->| Key
|     |  |                     |
|     |  +--> sframe_salt --+  |
+-----+                     |  |
| CTR +---------------------+->| Nonce
|     |                        |
|     |                        |
+-----+                        |
   |                       AEAD.Encrypt
   |                           |
   |     +---------------+     |
   +---->| SFrame Header |     |
         +---------------+     |
         |               |     |
         |               |<----+
         |   ciphertext  |
         |               |
         |               |
         +---------------+
]]></artwork>
            </artset>
          </figure>
        </section>
        <section anchor="decryption">
          <name>Decryption</name>
          <t>Before decrypting, a client needs to assemble a full SFrame ciphertext. When
an SFrame ciphertext may be fragmented into multiple parts for transport (e.g.,
a whole encrypted frame sent in multiple SRTP packets), the receiving client
collects all the fragments of the ciphertext, using an appropriate sequencing
and start/end markers in the transport. Once all of the required fragments are
available, the client reassembles them into the SFrame ciphertext, then passes
the ciphertext to SFrame for decryption.</t>
          <t>The KID field in the SFrame header is used to find the right key and salt for
the encrypted frame, and the CTR field is used to construct the nonce.</t>
          <artwork><![CDATA[
def decrypt(metadata, sframe_ciphertext):
  KID, CTR, ciphertext = parse_ciphertext(sframe_ciphertext)

  sframe_key, sframe_salt = key_store[KID]

  ctr = encode_big_endian(CTR, AEAD.Nn)
  nonce = xor(sframe_salt, ctr)
  aad = header + metadata

  return AEAD.Decrypt(sframe_key, nonce, aad, ciphertext)
]]></artwork>
          <t>If a ciphertext fails to decrypt because there is no key available for the KID
in the SFrame header, the client MAY buffer the ciphertext and retry decryption
once a key with that KID is received.</t>
        </section>
      </section>
      <section anchor="cipher-suites">
        <name>Cipher Suites</name>
        <t>Each SFrame session uses a single cipher suite that specifies the following
primitives:</t>
        <ul spacing="normal">
          <li>A hash function used for key derivation</li>
          <li>An AEAD encryption algorithm <xref target="RFC5116"/> used for frame encryption, optionally
with a truncated authentication tag</li>
        </ul>
        <t>This document defines the following cipher suites, with the constants defined in
<xref target="encryption-schema"/>:</t>
        <table anchor="cipher-suite-constants">
          <name>SFrame cipher suite constants</name>
          <thead>
            <tr>
              <th align="left">Name</th>
              <th align="left">Nh</th>
              <th align="left">Nk</th>
              <th align="left">Nn</th>
              <th align="left">Nt</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>AES_128_CTR_HMAC_SHA256_80</tt></td>
              <td align="left">32</td>
              <td align="left">16</td>
              <td align="left">12</td>
              <td align="left">10</td>
            </tr>
            <tr>
              <td align="left">
                <tt>AES_128_CTR_HMAC_SHA256_64</tt></td>
              <td align="left">32</td>
              <td align="left">16</td>
              <td align="left">12</td>
              <td align="left">8</td>
            </tr>
            <tr>
              <td align="left">
                <tt>AES_128_CTR_HMAC_SHA256_32</tt></td>
              <td align="left">32</td>
              <td align="left">16</td>
              <td align="left">12</td>
              <td align="left">4</td>
            </tr>
            <tr>
              <td align="left">
                <tt>AES_128_GCM_SHA256_128</tt></td>
              <td align="left">32</td>
              <td align="left">16</td>
              <td align="left">12</td>
              <td align="left">16</td>
            </tr>
            <tr>
              <td align="left">
                <tt>AES_256_GCM_SHA512_128</tt></td>
              <td align="left">64</td>
              <td align="left">32</td>
              <td align="left">12</td>
              <td align="left">16</td>
            </tr>
          </tbody>
        </table>
        <t>Numeric identifiers for these cipher suites are defined in the IANA registry
created in <xref target="sframe-cipher-suites"/>.</t>
        <t>In the suite names, the length of the authentication tag is indicated by
the last value: "_128" indicates a hundred-twenty-eight-bit tag, "_80" indicates
a eighty-bit tag, "_64" indicates a sixty-four-bit tag and "_32" indicates a
thirty-two-bit tag.</t>
        <t>In a session that uses multiple media streams, different cipher suites might be
configured for different media streams.  For example, in order to conserve
bandwidth, a session might use a cipher suite with eighty-bit tags for video frames
and another cipher suite with thirty-two-bit tags for audio frames.</t>
        <section anchor="aes-ctr-with-sha2">
          <name>AES-CTR with SHA2</name>
          <t>In order to allow very short tag sizes, we define a synthetic AEAD function
using the authenticated counter mode of AES together with HMAC for
authentication.  We use an encrypt-then-MAC approach, as in SRTP <xref target="RFC3711"/>.</t>
          <t>Before encryption or decryption, encryption and authentication subkeys are
derived from the single AEAD key using HKDF.  The subkeys are derived as
follows, where <tt>Nk</tt> represents the key size for the AES block cipher in use,
<tt>Nh</tt> represents the output size of the hash function, and <tt>Nt</tt> represents the
size of a tag for the cipher in bytes (as in <xref target="iana-cipher-suites"/>):</t>
          <artwork><![CDATA[
def derive_subkeys(sframe_key):
  tag_len = encode_big_endian(Nt, 8)
  aead_label = "SFrame 1.0 AES CTR AEAD " + tag_len
  aead_secret = HKDF-Extract(aead_label, sframe_key)
  enc_key = HKDF-Expand(aead_secret, "enc", Nk)
  auth_key = HKDF-Expand(aead_secret, "auth", Nh)
  return enc_key, auth_key
]]></artwork>
          <t>The AEAD encryption and decryption functions are then composed of individual
calls to the CTR encrypt function and HMAC.  The resulting MAC value is truncated
to a number of bytes <tt>Nt</tt> fixed by the cipher suite.</t>
          <artwork><![CDATA[
def compute_tag(auth_key, nonce, aad, ct):
  aad_len = encode_big_endian(len(aad), 8)
  ct_len = encode_big_endian(len(ct), 8)
  tag_len = encode_big_endian(Nt, 8)
  auth_data = aad_len + ct_len + tag_len + nonce + aad + ct
  tag = HMAC(auth_key, auth_data)
  return truncate(tag, Nt)

def AEAD.Encrypt(key, nonce, aad, pt):
  enc_key, auth_key = derive_subkeys(key)
  ct = AES-CTR.Encrypt(enc_key, nonce, pt)
  tag = compute_tag(auth_key, nonce, aad, ct)
  return ct + tag

def AEAD.Decrypt(key, nonce, aad, ct):
  inner_ct, tag = split_ct(ct, tag_len)

  enc_key, auth_key = derive_subkeys(key)
  candidate_tag = compute_tag(auth_key, nonce, aad, inner_ct)
  if !constant_time_equal(tag, candidate_tag):
    raise Exception("Authentication Failure")

  return AES-CTR.Decrypt(enc_key, nonce, inner_ct)
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="key-management">
      <name>Key Management</name>
      <t>SFrame must be integrated with an E2E key management framework to exchange and
rotate the keys used for SFrame encryption. The key management
framework provides the following functions:</t>
      <ul spacing="normal">
        <li>Provisioning KID / <tt>base_key</tt> mappings to participating clients</li>
        <li>Updating the above data as clients join or leave</li>
      </ul>
      <t>It is the responsibility of the application to provide the key management
framework, as described in <xref target="key-management-framework"/>.</t>
      <section anchor="sender-keys">
        <name>Sender Keys</name>
        <t>If the participants in a call have a pre-existing E2E-secure channel, they can
use it to distribute SFrame keys.  Each client participating in a call generates
a fresh encryption key. The client then uses
the E2E-secure channel to send their encryption key to
the other participants.</t>
        <t>In this scheme, it is assumed that receivers have a signal outside of SFrame for
which client has sent a given frame (e.g., an RTP SSRC).  SFrame KID
values are then used to distinguish between versions of the sender's key.</t>
        <t>Key IDs in this scheme have two parts, a "key generation" and a "ratchet step".
Both are unsigned integers that begin at zero.  The key generation increments
each time the sender distributes a new key to receivers.  The "ratchet step" is
incremented each time the sender ratchets their key forward for forward secrecy:</t>
        <sourcecode type="pseudocode"><![CDATA[
sender_base_key[i+1] = HKDF-Expand(
                         HKDF-Extract("SFrame 1.0 Ratchet", sender_base_key[i]),
                         "", CipherSuite.Nh)
]]></sourcecode>
        <t>For compactness, we do not send the whole ratchet step.  Instead, we send only
its low-order <tt>R</tt> bits, where <tt>R</tt> is a value set by the application.  Different
senders may use different values of <tt>R</tt>, but each receiver of a given sender
needs to know what value of <tt>R</tt> is used by the sender so that they can recognize
when they need to ratchet (vs. expecting a new key).  <tt>R</tt> effectively defines a
re-ordering window, since no more than 2<sup><tt>R</tt></sup> ratchet steps can be
active at a given time.  The key generation is sent in the remaining <tt>64 - R</tt>
bits of the key ID.</t>
        <sourcecode type="pseudocode"><![CDATA[
KID = (key_generation << R) + (ratchet_step % (1 << R))
]]></sourcecode>
        <figure anchor="sender-keys-kid">
          <name>Structure of a KID in the Sender Keys scheme</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="112" width="280" viewBox="0 0 280 112" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,64 L 8,96" fill="none" stroke="black"/>
                <path d="M 152,64 L 152,96" fill="none" stroke="black"/>
                <path d="M 272,64 L 272,96" fill="none" stroke="black"/>
                <path d="M 16,48 L 144,48" fill="none" stroke="black"/>
                <path d="M 160,48 L 264,48" fill="none" stroke="black"/>
                <path d="M 8,64 L 272,64" fill="none" stroke="black"/>
                <path d="M 8,96 L 272,96" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="272,48 260,42.4 260,53.6" fill="black" transform="rotate(0,264,48)"/>
                <polygon class="arrowhead" points="168,48 156,42.4 156,53.6" fill="black" transform="rotate(180,160,48)"/>
                <polygon class="arrowhead" points="152,48 140,42.4 140,53.6" fill="black" transform="rotate(0,144,48)"/>
                <polygon class="arrowhead" points="24,48 12,42.4 12,53.6" fill="black" transform="rotate(180,16,48)"/>
                <g class="text">
                  <text x="60" y="36">64-R</text>
                  <text x="100" y="36">bits</text>
                  <text x="192" y="36">R</text>
                  <text x="220" y="36">bits</text>
                  <text x="32" y="84">Key</text>
                  <text x="92" y="84">Generation</text>
                  <text x="192" y="84">Ratchet</text>
                  <text x="244" y="84">Step</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
     64-R bits         R bits
 <---------------> <------------>
+-----------------+--------------+
| Key Generation  | Ratchet Step |
+-----------------+--------------+
]]></artwork>
          </artset>
        </figure>
        <t>The sender signals such a ratchet step update by sending with a KID value in
which the ratchet step has been incremented.  A receiver who receives from a
sender with a new KID computes the new key as above.  The old key may be kept
for some time to allow for out-of-order delivery, but should be deleted
promptly.</t>
        <t>If a new participant joins mid-call, they will need to receive from each sender
(a) the current sender key for that sender and (b) the current KID value for the
sender. Evicting a participant requires each sender to send a fresh sender key
to all receivers.</t>
      </section>
      <section anchor="mls">
        <name>MLS</name>
        <t>The Messaging Layer Security (MLS) protocol provides group authenticated key
exchange <xref target="I-D.ietf-mls-architecture"/> <xref target="I-D.ietf-mls-protocol"/>.  In
principle, it could be used to instantiate the sender key scheme above, but it
can also be used more efficiently directly.</t>
        <t>MLS creates a linear sequence of keys, each of which is shared among the members
of a group at a given point in time.  When a member joins or leaves the group, a
new key is produced that is known only to the augmented or reduced group.  Each
step in the lifetime of the group is know as an "epoch", and each member of the
group is assigned an "index" that is constant for the time they are in the
group.</t>
        <t>To generate keys and nonces for SFrame, we use the MLS exporter function to
generate a <tt>base_key</tt> value for each MLS epoch.  Each member of the group is
assigned a set of KID values, so that each member has a unique <tt>sframe_key</tt> and
<tt>sframe_salt</tt> that it uses to encrypt with.  Senders may choose any KID value
within their assigned set of KID values, e.g., to allow a single sender to send
multiple uncoordinated outbound media streams.</t>
        <sourcecode type="pseudocode"><![CDATA[
base_key = MLS-Exporter("SFrame 1.0 Base Key", "", AEAD.Nk)
]]></sourcecode>
        <t>For compactness, we do not send the whole epoch number.  Instead, we send only
its low-order <tt>E</tt> bits, where <tt>E</tt> is a value set by the application.  <tt>E</tt>
effectively defines a re-ordering window, since no more than 2<sup><tt>E</tt></sup>
epochs can be active at a given time.  Receivers MUST be prepared for the epoch
counter to roll over, removing an old epoch when a new epoch with the same E
lower bits is introduced.</t>
        <t>Let <tt>S</tt> be the number of bits required to encode a member index in the group,
i.e., the smallest value such that <tt>group_size</tt> &lt; (1 &lt;&lt; S)<tt>.  The sender index
is encoded in the </tt>S<tt> bits above the epoch.  The remaining </tt>64 - S - E<tt> bits of
the KID value are a </tt>context<tt> value chosen by the sender (context value </tt>0` will
produce the shortest encoded KID).</t>
        <sourcecode type="pseudocode"><![CDATA[
KID = (context << (S + E)) + (sender_index << E) + (epoch % (1 << E))
]]></sourcecode>
        <figure anchor="mls-kid">
          <name>Structure of a KID for an MLS Sender</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="112" width="264" viewBox="0 0 264 112" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,64 L 8,96" fill="none" stroke="black"/>
                <path d="M 120,64 L 120,96" fill="none" stroke="black"/>
                <path d="M 192,64 L 192,96" fill="none" stroke="black"/>
                <path d="M 256,64 L 256,96" fill="none" stroke="black"/>
                <path d="M 16,48 L 112,48" fill="none" stroke="black"/>
                <path d="M 128,48 L 184,48" fill="none" stroke="black"/>
                <path d="M 200,48 L 256,48" fill="none" stroke="black"/>
                <path d="M 8,64 L 256,64" fill="none" stroke="black"/>
                <path d="M 8,96 L 256,96" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="264,48 252,42.4 252,53.6" fill="black" transform="rotate(0,256,48)"/>
                <polygon class="arrowhead" points="208,48 196,42.4 196,53.6" fill="black" transform="rotate(180,200,48)"/>
                <polygon class="arrowhead" points="192,48 180,42.4 180,53.6" fill="black" transform="rotate(0,184,48)"/>
                <polygon class="arrowhead" points="136,48 124,42.4 124,53.6" fill="black" transform="rotate(180,128,48)"/>
                <polygon class="arrowhead" points="120,48 108,42.4 108,53.6" fill="black" transform="rotate(0,112,48)"/>
                <polygon class="arrowhead" points="24,48 12,42.4 12,53.6" fill="black" transform="rotate(180,16,48)"/>
                <g class="text">
                  <text x="44" y="36">64-S-E</text>
                  <text x="92" y="36">bits</text>
                  <text x="136" y="36">S</text>
                  <text x="164" y="36">bits</text>
                  <text x="208" y="36">E</text>
                  <text x="236" y="36">bits</text>
                  <text x="48" y="84">Context</text>
                  <text x="92" y="84">ID</text>
                  <text x="152" y="84">Index</text>
                  <text x="224" y="84">Epoch</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
  64-S-E bits   S bits   E bits
 <-----------> <------> <------>
+-------------+--------+-------+
| Context ID  | Index  | Epoch |
+-------------+--------+-------+
]]></artwork>
          </artset>
        </figure>
        <t>Once an SFrame stack has been provisioned with the <tt>sframe_epoch_secret</tt> for an
epoch, it can compute the required KIDs and <tt>sender_base_key</tt> values on demand,
as it needs to encrypt/decrypt for a given member.</t>
        <figure anchor="mls-evolution">
          <name>An example sequence of KIDs for an MLS-based SFrame session.  We assume that the group has 64 members, S=6.</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="448" width="472" viewBox="0 0 472 448" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 80,48 L 80,416" fill="none" stroke="black"/>
                <path d="M 104,80 L 104,144" fill="none" stroke="black"/>
                <path d="M 104,192 L 104,224" fill="none" stroke="black"/>
                <path d="M 104,352 L 104,384" fill="none" stroke="black"/>
                <path d="M 216,272 L 216,304" fill="none" stroke="black"/>
                <path d="M 80,80 L 120,80" fill="none" stroke="black"/>
                <path d="M 200,80 L 224,80" fill="none" stroke="black"/>
                <path d="M 104,112 L 120,112" fill="none" stroke="black"/>
                <path d="M 200,112 L 224,112" fill="none" stroke="black"/>
                <path d="M 104,144 L 120,144" fill="none" stroke="black"/>
                <path d="M 208,144 L 224,144" fill="none" stroke="black"/>
                <path d="M 80,192 L 120,192" fill="none" stroke="black"/>
                <path d="M 200,192 L 224,192" fill="none" stroke="black"/>
                <path d="M 104,224 L 120,224" fill="none" stroke="black"/>
                <path d="M 200,224 L 224,224" fill="none" stroke="black"/>
                <path d="M 80,272 L 120,272" fill="none" stroke="black"/>
                <path d="M 200,272 L 240,272" fill="none" stroke="black"/>
                <path d="M 352,272 L 368,272" fill="none" stroke="black"/>
                <path d="M 216,304 L 240,304" fill="none" stroke="black"/>
                <path d="M 352,304 L 368,304" fill="none" stroke="black"/>
                <path d="M 80,352 L 120,352" fill="none" stroke="black"/>
                <path d="M 208,352 L 224,352" fill="none" stroke="black"/>
                <path d="M 104,384 L 120,384" fill="none" stroke="black"/>
                <path d="M 208,384 L 224,384" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="376,304 364,298.4 364,309.6" fill="black" transform="rotate(0,368,304)"/>
                <polygon class="arrowhead" points="376,272 364,266.4 364,277.6" fill="black" transform="rotate(0,368,272)"/>
                <polygon class="arrowhead" points="248,304 236,298.4 236,309.6" fill="black" transform="rotate(0,240,304)"/>
                <polygon class="arrowhead" points="248,272 236,266.4 236,277.6" fill="black" transform="rotate(0,240,272)"/>
                <polygon class="arrowhead" points="232,384 220,378.4 220,389.6" fill="black" transform="rotate(0,224,384)"/>
                <polygon class="arrowhead" points="232,352 220,346.4 220,357.6" fill="black" transform="rotate(0,224,352)"/>
                <polygon class="arrowhead" points="232,224 220,218.4 220,229.6" fill="black" transform="rotate(0,224,224)"/>
                <polygon class="arrowhead" points="232,192 220,186.4 220,197.6" fill="black" transform="rotate(0,224,192)"/>
                <polygon class="arrowhead" points="232,144 220,138.4 220,149.6" fill="black" transform="rotate(0,224,144)"/>
                <polygon class="arrowhead" points="232,112 220,106.4 220,117.6" fill="black" transform="rotate(0,224,112)"/>
                <polygon class="arrowhead" points="232,80 220,74.4 220,85.6" fill="black" transform="rotate(0,224,80)"/>
                <g class="text">
                  <text x="32" y="36">...</text>
                  <text x="24" y="84">Epoch</text>
                  <text x="60" y="84">14</text>
                  <text x="160" y="84">index=3</text>
                  <text x="248" y="84">KID</text>
                  <text x="272" y="84">=</text>
                  <text x="300" y="84">0x3e</text>
                  <text x="160" y="116">index=7</text>
                  <text x="248" y="116">KID</text>
                  <text x="272" y="116">=</text>
                  <text x="300" y="116">0x7e</text>
                  <text x="164" y="148">index=20</text>
                  <text x="248" y="148">KID</text>
                  <text x="272" y="148">=</text>
                  <text x="304" y="148">0x14e</text>
                  <text x="24" y="196">Epoch</text>
                  <text x="60" y="196">15</text>
                  <text x="160" y="196">index=3</text>
                  <text x="248" y="196">KID</text>
                  <text x="272" y="196">=</text>
                  <text x="300" y="196">0x3f</text>
                  <text x="160" y="228">index=5</text>
                  <text x="248" y="228">KID</text>
                  <text x="272" y="228">=</text>
                  <text x="300" y="228">0x5f</text>
                  <text x="24" y="276">Epoch</text>
                  <text x="60" y="276">16</text>
                  <text x="160" y="276">index=2</text>
                  <text x="280" y="276">context</text>
                  <text x="320" y="276">=</text>
                  <text x="336" y="276">2</text>
                  <text x="392" y="276">KID</text>
                  <text x="416" y="276">=</text>
                  <text x="448" y="276">0x820</text>
                  <text x="280" y="308">context</text>
                  <text x="320" y="308">=</text>
                  <text x="336" y="308">3</text>
                  <text x="392" y="308">KID</text>
                  <text x="416" y="308">=</text>
                  <text x="448" y="308">0xc20</text>
                  <text x="24" y="356">Epoch</text>
                  <text x="60" y="356">17</text>
                  <text x="164" y="356">index=33</text>
                  <text x="248" y="356">KID</text>
                  <text x="272" y="356">=</text>
                  <text x="304" y="356">0x211</text>
                  <text x="164" y="388">index=51</text>
                  <text x="248" y="388">KID</text>
                  <text x="272" y="388">=</text>
                  <text x="304" y="388">0x331</text>
                  <text x="32" y="436">...</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
  ...
         |
         |
Epoch 14 +--+-- index=3 ---> KID = 0x3e
         |  |
         |  +-- index=7 ---> KID = 0x7e
         |  |
         |  +-- index=20 --> KID = 0x14e
         |
         |
Epoch 15 +--+-- index=3 ---> KID = 0x3f
         |  |
         |  +-- index=5 ---> KID = 0x5f
         |
         |
Epoch 16 +----- index=2 --+--> context = 2 --> KID = 0x820
         |                |
         |                +--> context = 3 --> KID = 0xc20
         |
         |
Epoch 17 +--+-- index=33 --> KID = 0x211
         |  |
         |  +-- index=51 --> KID = 0x331
         |
         |
  ...
]]></artwork>
          </artset>
        </figure>
      </section>
    </section>
    <section anchor="media-considerations">
      <name>Media Considerations</name>
      <section anchor="selective-forwarding-units">
        <name>Selective Forwarding Units</name>
        <t>Selective Forwarding Units (SFUs) (e.g., those described in <xref section="3.7" sectionFormat="of" target="RFC7667"/>)
receive the media streams from each participant and select which ones should be
forwarded to each of the other participants.  There are several approaches about
how to do this stream selection but in general, in order to do so, the SFU needs
to access metadata associated to each frame and modify the RTP information of
the incoming packets when they are transmitted to the received participants.</t>
        <t>This section describes how this normal SFU modes of operation interacts with the
E2EE provided by SFrame</t>
        <section anchor="lastn-and-rtp-stream-reuse">
          <name>LastN and RTP stream reuse</name>
          <t>The SFU may choose to send only a certain number of streams based on the voice
activity of the participants. To avoid the overhead involved in establishing new
transport streams, the SFU may decide to reuse previously existing streams or
even pre-allocate a predefined number of streams and choose in each moment in
time which participant media will be sent through it.</t>
          <t>This means that in the same transport-level stream (e.g., an RTP stream defined
by either SSRC or MID) may carry media from different streams of different
participants. As different keys are used by each participant for encoding their
media, the receiver will be able to verify which is the sender of the media
coming within the RTP stream at any given point in time, preventing the SFU
trying to impersonate any of the participants with another participant's media.</t>
          <t>Note that in order to prevent impersonation by a malicious participant (not the
SFU), a mechanism based on digital signature would be required. SFrame does not
protect against such attacks.</t>
        </section>
        <section anchor="simulcast">
          <name>Simulcast</name>
          <t>When using simulcast, the same input image will produce N different encoded
frames (one per simulcast layer) which would be processed independently by the
frame encryptor and assigned an unique counter for each.</t>
        </section>
        <section anchor="svc">
          <name>SVC</name>
          <t>In both temporal and spatial scalability, the SFU may choose to drop layers in
order to match a certain bitrate or forward specific media sizes or frames per
second. In order to support it, the sender MUST encode each spatial layer of a
given picture in a different frame. That is, an RTP frame may contain more than
one SFrame encrypted frame with an incrementing frame counter.</t>
        </section>
      </section>
      <section anchor="video-key-frames">
        <name>Video Key Frames</name>
        <t>Forward and Post-Compromise Security requires that the e2ee keys are updated
anytime a participant joins/leave the call.</t>
        <t>The key exchange happens asynchronously and on a different path than the SFU signaling
and media. So it may happen that when a new participant joins the call and the
SFU side requests a key frame, the sender generates the e2ee encrypted frame
with a key not known by the receiver, so it will be discarded. When the sender
updates his sending key with the new key, it will send it in a non-key frame, so
the receiver will be able to decrypt it, but not decode it.</t>
        <t>Receiver will re-request an key frame then, but due to sender and SFU policies,
that new key frame could take some time to be generated.</t>
        <t>If the sender sends a key frame when the new e2ee key is in use, the time
required for the new participant to display the video is minimized.</t>
      </section>
      <section anchor="partial-decoding">
        <name>Partial Decoding</name>
        <t>Some codes support partial decoding, where it can decrypt individual packets
without waiting for the full frame to arrive, with SFrame this won't be possible
because the decoder will not access the packets until the entire frame has
arrived and was decrypted.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="no-per-sender-authentication">
        <name>No Per-Sender Authentication</name>
        <t>SFrame does not provide per-sender authentication of media data.  Any sender in
a session can send media that will be associated with any other sender.  This is
because SFrame uses symmetric encryption to protect media data, so that any
receiver also has the keys required to encrypt packets for the sender.</t>
      </section>
      <section anchor="key-management-1">
        <name>Key Management</name>
        <t>Key exchange mechanism is out of scope of this document, however every client
SHOULD change their keys when new clients joins or leaves the call for "Forward
Secrecy" and "Post Compromise Security".</t>
      </section>
      <section anchor="authentication-tag-length">
        <name>Authentication tag length</name>
        <t>The cipher suites defined in this draft use short authentication tags for
encryption, however it can easily support other ciphers with full authentication
tag if the short ones are proved insecure.</t>
      </section>
      <section anchor="replay">
        <name>Replay</name>
        <t>The handling of replay is out of the scope of this document. However, senders
MUST reject requests to encrypt multiple times with the same key and nonce,
since several AEAD algorithms fail badly in such cases (see, e.g., <xref section="5.1.1" sectionFormat="of" target="RFC5116"/>).</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document requests the creation of the following new IANA registries:</t>
      <ul spacing="normal">
        <li>SFrame Cipher Suites (<xref target="sframe-cipher-suites"/>)</li>
      </ul>
      <t>This registries should be under a heading of "SFrame",
and assignments are made via the Specification Required policy <xref target="RFC8126"/>.</t>
      <t>RFC EDITOR: Please replace XXXX throughout with the RFC number assigned to
this document</t>
      <section anchor="sframe-cipher-suites">
        <name>SFrame Cipher Suites</name>
        <t>This registry lists identifiers for SFrame cipher suites, as defined in
<xref target="cipher-suites"/>.  The cipher suite field is two bytes wide, so the valid cipher
suites are in the range 0x0000 to 0xFFFF.</t>
        <t>Template:</t>
        <ul spacing="normal">
          <li>Value: The numeric value of the cipher suite</li>
          <li>Name: The name of the cipher suite</li>
          <li>Reference: The document where this wire format is defined</li>
        </ul>
        <t>Initial contents:</t>
        <table anchor="iana-cipher-suites">
          <name>SFrame cipher suites</name>
          <thead>
            <tr>
              <th align="left">Value</th>
              <th align="left">Name</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x0001</td>
              <td align="left">
                <tt>AES_128_CTR_HMAC_SHA256_80</tt></td>
              <td align="left">RFC XXXX</td>
            </tr>
            <tr>
              <td align="left">0x0002</td>
              <td align="left">
                <tt>AES_128_CTR_HMAC_SHA256_64</tt></td>
              <td align="left">RFC XXXX</td>
            </tr>
            <tr>
              <td align="left">0x0003</td>
              <td align="left">
                <tt>AES_128_CTR_HMAC_SHA256_32</tt></td>
              <td align="left">RFC XXXX</td>
            </tr>
            <tr>
              <td align="left">0x0004</td>
              <td align="left">
                <tt>AES_128_GCM_SHA256_128</tt></td>
              <td align="left">RFC XXXX</td>
            </tr>
            <tr>
              <td align="left">0x0005</td>
              <td align="left">
                <tt>AES_256_GCM_SHA512_128</tt></td>
              <td align="left">RFC XXXX</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="application-responsibilities">
      <name>Application Responsibilities</name>
      <t>To use SFrame, an application needs to define the inputs to the SFrame
encryption and decryption operations, and how SFrame ciphertexts are delivered
from sender to receiver (including any fragmentation and reassembly).  In this
section, we lay out additional requirements that an integration must meet in
order for SFrame to operate securely.</t>
      <section anchor="header-value-uniqueness">
        <name>Header Value Uniqueness</name>
        <t>Applications MUST ensure that each (KID, CTR) combination is used for exactly
one encryption operation. Typically this is done by assigning each sender a KID
or set of KIDs, then having each sender use the CTR field as a monotonic counter,
incrementing for each plaintext that is encrypted. Note that in addition to its
simplicity, this scheme minimizes overhead by keeping CTR values as small as
possible.</t>
      </section>
      <section anchor="key-management-framework">
        <name>Key Management Framework</name>
        <t>It is up to the application to provision SFrame with a mapping of KID values to
<tt>base_key</tt> values and the resulting keys and salts.  More importantly, the
application specifies which KID values are used for which purposes (e.g., by
which senders).  An applications KID assignment strategy MUST be structured to
assure the non-reuse properties discussed above.</t>
        <t>It is also up to the application to define a rotation schedule for keys.  For
example, one application might have an ephemeral group for every call and keep
rotating keys when end points join or leave the call, while another application
could have a persistent group that can be used for multiple calls and simply
derives ephemeral symmetric keys for a specific call.</t>
        <t>It should be noted that KID values are not encrypted by SFrame, and are thus
visible to any application-layer intermediaries that might handle an SFrame
ciphertext.  If there are application semantics included in KID values, then
this information would be exposed to intermediaries.  For example, in the scheme
of <xref target="sender-keys"/>, the number of ratchet steps per sender is exposed, and in
the scheme of <xref target="mls"/>, the number of epochs and the MLS sender ID of the SFrame
sender are exposed.</t>
      </section>
      <section anchor="anti-replay">
        <name>Anti-Replay</name>
        <t>It is the responsibility of the application to handle anti-replay. Replay by network
attackers is assumed to be prevented by network-layer facilities (e.g., TLS, SRTP).
As mentioned in <xref target="replay"/>, senders MUST reject requests to encrypt multiple times
with the same key and nonce.</t>
        <t>It is not mandatory to implement anti-replay on the receiver side. Receivers MAY
apply time or counter based anti-replay mitigations.</t>
      </section>
      <section anchor="metadata">
        <name>Metadata</name>
        <t>The <tt>metadata</tt> input to SFrame operations is pure application-specified data. As
such, it is up to the application to define what information should go in the
<tt>metadata</tt> input and ensure that it is provided to the encryption and decryption
functions at the appropriate points.  A receiver SHOULD NOT use SFrame-authenticated
metadata until after the SFrame decrypt function has authenticated it.</t>
        <t>Note: The <tt>metadata</tt> input is a feature at risk, and needs more confirmation that it
is useful and/or needed.</t>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC5116">
          <front>
            <title>An Interface and Algorithms for Authenticated Encryption</title>
            <author fullname="D. McGrew" initials="D." surname="McGrew"/>
            <date month="January" year="2008"/>
            <abstract>
              <t>This document defines algorithms for Authenticated Encryption with Associated Data (AEAD), and defines a uniform interface and a registry for such algorithms. The interface and registry can be used as an application-independent set of cryptoalgorithm suites. This approach provides advantages in efficiency and security, and promotes the reuse of crypto implementations. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5116"/>
          <seriesInfo name="DOI" value="10.17487/RFC5116"/>
        </reference>
        <reference anchor="RFC5869">
          <front>
            <title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="P. Eronen" initials="P." surname="Eronen"/>
            <date month="May" year="2010"/>
            <abstract>
              <t>This document specifies a simple Hashed Message Authentication Code (HMAC)-based key derivation function (HKDF), which can be used as a building block in various protocols and applications. The key derivation function (KDF) is intended to support a wide range of applications and requirements, and is conservative in its use of cryptographic hash functions. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5869"/>
          <seriesInfo name="DOI" value="10.17487/RFC5869"/>
        </reference>
        <reference anchor="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="TestVectors" target="https://github.com/eomara/sframe/blob/master/test-vectors.json">
          <front>
            <title>SFrame Test Vectors</title>
            <author>
              <organization/>
            </author>
            <date year="2021"/>
          </front>
        </reference>
        <reference anchor="RFC3711">
          <front>
            <title>The Secure Real-time Transport Protocol (SRTP)</title>
            <author fullname="M. Baugher" initials="M." surname="Baugher"/>
            <author fullname="D. McGrew" initials="D." surname="McGrew"/>
            <author fullname="M. Naslund" initials="M." surname="Naslund"/>
            <author fullname="E. Carrara" initials="E." surname="Carrara"/>
            <author fullname="K. Norrman" initials="K." surname="Norrman"/>
            <date month="March" year="2004"/>
            <abstract>
              <t>This document describes the Secure Real-time Transport Protocol (SRTP), a profile of the Real-time Transport Protocol (RTP), which can provide confidentiality, message authentication, and replay protection to the RTP traffic and to the control traffic for RTP, the Real-time Transport Control Protocol (RTCP). [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3711"/>
          <seriesInfo name="DOI" value="10.17487/RFC3711"/>
        </reference>
        <reference anchor="RFC8723">
          <front>
            <title>Double Encryption Procedures for the Secure Real-Time Transport Protocol (SRTP)</title>
            <author fullname="C. Jennings" initials="C." surname="Jennings"/>
            <author fullname="P. Jones" initials="P." surname="Jones"/>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="A.B. Roach" initials="A.B." surname="Roach"/>
            <date month="April" year="2020"/>
            <abstract>
              <t>In some conferencing scenarios, it is desirable for an intermediary to be able to manipulate some parameters in Real-time Transport Protocol (RTP) packets, while still providing strong end-to-end security guarantees. This document defines a cryptographic transform for the Secure Real-time Transport Protocol (SRTP) that uses two separate but related cryptographic operations to provide hop-by-hop and end-to-end security guarantees. Both the end-to-end and hop-by-hop cryptographic algorithms can utilize an authenticated encryption with associated data (AEAD) algorithm or take advantage of future SRTP transforms with different properties.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8723"/>
          <seriesInfo name="DOI" value="10.17487/RFC8723"/>
        </reference>
        <reference anchor="RFC7656">
          <front>
            <title>A Taxonomy of Semantics and Mechanisms for Real-Time Transport Protocol (RTP) Sources</title>
            <author fullname="J. Lennox" initials="J." surname="Lennox"/>
            <author fullname="K. Gross" initials="K." surname="Gross"/>
            <author fullname="S. Nandakumar" initials="S." surname="Nandakumar"/>
            <author fullname="G. Salgueiro" initials="G." surname="Salgueiro"/>
            <author fullname="B. Burman" initials="B." role="editor" surname="Burman"/>
            <date month="November" year="2015"/>
            <abstract>
              <t>The terminology about, and associations among, Real-time Transport Protocol (RTP) sources can be complex and somewhat opaque. This document describes a number of existing and proposed properties and relationships among RTP sources and defines common terminology for discussing protocol entities and their relationships.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7656"/>
          <seriesInfo name="DOI" value="10.17487/RFC7656"/>
        </reference>
        <reference anchor="I-D.ietf-webtrans-overview">
          <front>
            <title>The WebTransport Protocol Framework</title>
            <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
              <organization>Google</organization>
            </author>
            <date day="24" month="January" year="2023"/>
            <abstract>
              <t>   The WebTransport Protocol Framework enables clients constrained by
   the Web security model to communicate with a remote server using a
   secure multiplexed transport.  It consists of a set of individual
   protocols that are safe to expose to untrusted applications, combined
   with a model that allows them to be used interchangeably.

   This document defines the overall requirements on the protocols used
   in WebTransport, as well as the common features of the protocols,
   support for some of which may be optional.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-webtrans-overview-05"/>
        </reference>
        <reference anchor="I-D.ietf-moq-transport">
          <front>
            <title>Media over QUIC Transport</title>
            <author fullname="Luke Curley" initials="L." surname="Curley">
              <organization>Twitch</organization>
            </author>
            <author fullname="Kirill Pugin" initials="K." surname="Pugin">
              <organization>Meta</organization>
            </author>
            <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
              <organization>Cisco</organization>
            </author>
            <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
              <organization>Google</organization>
            </author>
            <date day="5" month="July" year="2023"/>
            <abstract>
              <t>   This document defines the core behavior for Media over QUIC Transport
   (MOQT), a media transport protocol over QUIC.  MOQT allows a producer
   of media to publish data and have it consumed via subscription by a
   multiplicity of endpoints.  It supports intermediate content
   distribution networks and is designed for high scale and low latency
   distribution.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-00"/>
        </reference>
        <reference anchor="I-D.ietf-mls-architecture">
          <front>
            <title>The Messaging Layer Security (MLS) Architecture</title>
            <author fullname="Benjamin Beurdouche" initials="B." surname="Beurdouche">
              <organization>Inria &amp; Mozilla</organization>
            </author>
            <author fullname="Eric Rescorla" initials="E." surname="Rescorla">
              <organization>Mozilla</organization>
            </author>
            <author fullname="Emad Omara" initials="E." surname="Omara">
              <organization>Google</organization>
            </author>
            <author fullname="Srinivas Inguva" initials="S." surname="Inguva">
              <organization>Twitter</organization>
            </author>
            <author fullname="Alan Duric" initials="A." surname="Duric">
              <organization>Wire</organization>
            </author>
            <date day="16" month="December" year="2022"/>
            <abstract>
              <t>   The Messaging Layer Security (MLS) protocol (I-D.ietf-mls-protocol)
   specification has the role of defining a Group Key Agreement
   protocol, including all the cryptographic operations and
   serialization/deserialization functions necessary for scalable and
   secure group messaging.  The MLS protocol is meant to protect against
   eavesdropping, tampering, message forgery, and provide further
   properties such as Forward Secrecy (FS) and Post-Compromise Security
   (PCS) in the case of past or future device compromises.

   This document describes a general secure group messaging
   infrastructure and its security goals.  It provides guidance on
   building a group messaging system and discusses security and privacy
   tradeoffs offered by multiple security mechanisms that are part of
   the MLS protocol (e.g., frequency of public encryption key rotation).

   The document also provides guidance for parts of the infrastructure
   that are not standardized by the MLS Protocol document and left to
   the application or the infrastructure architects to design.

   While the recommendations of this document are not mandatory to
   follow in order to interoperate at the protocol level, they affect
   the overall security guarantees that are achieved by a messaging
   application.  This is especially true in case of active adversaries
   that are able to compromise clients, the delivery service, or the
   authentication service.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-mls-architecture-10"/>
        </reference>
        <reference anchor="I-D.ietf-mls-protocol">
          <front>
            <title>The Messaging Layer Security (MLS) Protocol</title>
            <author fullname="Richard Barnes" initials="R." surname="Barnes">
              <organization>Cisco</organization>
            </author>
            <author fullname="Benjamin Beurdouche" initials="B." surname="Beurdouche">
              <organization>Inria &amp; Mozilla</organization>
            </author>
            <author fullname="Raphael Robert" initials="R." surname="Robert">
              <organization>Phoenix R&amp;D</organization>
            </author>
            <author fullname="Jon Millican" initials="J." surname="Millican">
              <organization>Meta Platforms</organization>
            </author>
            <author fullname="Emad Omara" initials="E." surname="Omara">
              <organization>Google</organization>
            </author>
            <author fullname="Katriel Cohn-Gordon" initials="K." surname="Cohn-Gordon">
              <organization>University of Oxford</organization>
            </author>
            <date day="27" month="March" year="2023"/>
            <abstract>
              <t>   Messaging applications are increasingly making use of end-to-end
   security mechanisms to ensure that messages are only accessible to
   the communicating endpoints, and not to any servers involved in
   delivering messages.  Establishing keys to provide such protections
   is challenging for group chat settings, in which more than two
   clients need to agree on a key but may not be online at the same
   time.  In this document, we specify a key establishment protocol that
   provides efficient asynchronous group key establishment with forward
   secrecy and post-compromise security for groups in size ranging from
   two to thousands.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-mls-protocol-20"/>
        </reference>
        <reference anchor="RFC7667">
          <front>
            <title>RTP Topologies</title>
            <author fullname="M. Westerlund" initials="M." surname="Westerlund"/>
            <author fullname="S. Wenger" initials="S." surname="Wenger"/>
            <date month="November" year="2015"/>
            <abstract>
              <t>This document discusses point-to-point and multi-endpoint topologies used in environments based on the Real-time Transport Protocol (RTP). In particular, centralized topologies commonly employed in the video conferencing industry are mapped to the RTP terminology.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7667"/>
          <seriesInfo name="DOI" value="10.17487/RFC7667"/>
        </reference>
        <reference anchor="RFC6716">
          <front>
            <title>Definition of the Opus Audio Codec</title>
            <author fullname="JM. Valin" initials="JM." surname="Valin"/>
            <author fullname="K. Vos" initials="K." surname="Vos"/>
            <author fullname="T. Terriberry" initials="T." surname="Terriberry"/>
            <date month="September" year="2012"/>
            <abstract>
              <t>This document defines the Opus interactive speech and audio codec. Opus is designed to handle a wide range of interactive audio applications, including Voice over IP, videoconferencing, in-game chat, and even live, distributed music performances. It scales from low bitrate narrowband speech at 6 kbit/s to very high quality stereo music at 510 kbit/s. Opus uses both Linear Prediction (LP) and the Modified Discrete Cosine Transform (MDCT) to achieve good compression of both speech and music. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6716"/>
          <seriesInfo name="DOI" value="10.17487/RFC6716"/>
        </reference>
        <reference anchor="RFC4566">
          <front>
            <title>SDP: Session Description Protocol</title>
            <author fullname="M. Handley" initials="M." surname="Handley"/>
            <author fullname="V. Jacobson" initials="V." surname="Jacobson"/>
            <author fullname="C. Perkins" initials="C." surname="Perkins"/>
            <date month="July" year="2006"/>
            <abstract>
              <t>This memo defines the Session Description Protocol (SDP). SDP is intended for describing multimedia sessions for the purposes of session announcement, session invitation, and other forms of multimedia session initiation. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4566"/>
          <seriesInfo name="DOI" value="10.17487/RFC4566"/>
        </reference>
        <reference anchor="I-D.codec-agnostic-rtp-payload-format">
          <front>
            <title>Codec agnostic RTP payload format for video</title>
            <author fullname="Sergio Garcia Murillo" initials="S. G." surname="Murillo">
              <organization>CoSMo Software</organization>
            </author>
            <author fullname="Dr. Alex Gouaillard" initials="A." surname="Gouaillard">
              <organization>CoSMo Software</organization>
            </author>
            <date day="19" month="February" year="2021"/>
            <abstract>
              <t>   RTP Media Chains usually rely on piping encoder output directly to
   packetizers.  Media packetization formats often support a specific
   codec format and optimize RTP packets generation accordingly.

   With the development of Selective Forward Unit (SFU) solutions, that
   do not process media content server side, the need for media content
   processing at the origin and at the destination has arised.

   RTP Media Chains used e.g. in WebRTC solutions are increasingly
   relying on application-specific transforms that sit in-between
   encoder and packetizer on one end and in-between depacketizer and
   decoder on the other end.  This use case has become so important,
   that the W3C is standardizing the capacity to access encoded content
   with the [WebRTCInsertableStreams] API proposal.  An extremely
   popular use case is application level end-to-end encryption of media
   content, using for instance [SFrame].

   Whatever the modification applied to the media content, RTP
   packetizers can no longer expect to use packetization formats that
   mandate media content to be in a specific codec format.

   In the extreme cases like encryption, where the RTP Payload is made
   completely opaque to the SFUs, some extra mechanism must also be
   added for them to be able to route the packets without depending on
   RTP payload or payload headers.

   The traditionnal process of creating a new RTP Payload specification
   per content would not be practical as we would need to make a new one
   for each codec-transform pair.

   This document describes a solution, which provides the following
   features in the case the encoded content has been modified before
   reaching the packetizer: - a paylaod agnostic RTP packetization
   format that can be used on any media content, - a signalling
   mechanism for the above format and the inner payload, Both of the
   above mechanism are backward compatible with most of (S)RTP/RTCP
   mechanisms used for bandwidth estimation and congestion control in

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-codec-agnostic-rtp-payload-format-00"/>
        </reference>
      </references>
    </references>
    <?line 945?>

<section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>The authors wish to specially thank Dr. Alex Gouaillard as one of the early
contributors to the document. His passion and energy were key to the design and
development of SFrame.</t>
    </section>
    <section anchor="example-api">
      <name>Example API</name>
      <t><strong>This section is not normative.</strong></t>
      <t>This section describes a notional API that an SFrame implementation might
expose.  The core concept is an "SFrame context", within which KID values are
meaningful.  In the key management scheme described in <xref target="sender-keys"/>, each
sender has a different context; in the scheme described in <xref target="mls"/>, all senders
share the same context.</t>
      <t>An SFrame context stores mappings from KID values to "key contexts", which are
different depending on whether the KID is to be used for sending or receiving
(an SFrame key should never be used for both operations).  A key context tracks
the key and salt associated to the KID, and the current CTR value.  A key
context to be used for sending also tracks the next CTR value to be used.</t>
      <t>The primary operations on an SFrame context are as follows:</t>
      <ul spacing="normal">
        <li>
          <strong>Create an SFrame context:</strong> The context is initialized with a ciphersuite and
no KID mappings.</li>
        <li>
          <strong>Adding a key for sending:</strong> The key and salt are derived from the base key, and
used to initialize a send context, together with a zero counter value.</li>
        <li>
          <strong>Adding a key for receiving:</strong> The key and salt are derived from the base key, and
used to initialize a send context.</li>
        <li>
          <strong>Encrypt a plaintext:</strong> Encrypt a given plaintext using the key for a given KID,
including the specified metadata.</li>
        <li>
          <strong>Decrypt an SFrame ciphertext:</strong> Decrypt an SFrame ciphertext with the KID
and CTR values specified in the SFrame Header, and the provided metadata.</li>
      </ul>
      <t><xref target="rust-api"/> shows an example of the types of structures and methods that could
be used to create an SFrame API in Rust.</t>
      <figure anchor="rust-api">
        <name>An example SFrame API</name>
        <sourcecode type="rust"><![CDATA[
type KeyId = u64;
type Counter = u64;
type CipherSuite = u16;

struct SendKeyContext {
  key: Vec<u8>,
  salt: Vec<u8>,
  next_counter: Counter,
}

struct RecvKeyContext {
  key: Vec<u8>,
  salt: Vec<u8>,
}

struct SFrameContext {
  cipher_suite: CipherSuite,
  send_keys: HashMap<KeyId, SendKeyContext>,
  recv_keys: HashMap<KeyId, RecvKeyContext>,
}

trait SFrameContextMethods {
  fn create(cipher_suite: CipherSuite) -> Self;
  fn add_send_key(&self, kid: KeyId, base_key: &[u8]);
  fn add_recv_key(&self, kid: KeyId, base_key: &[u8]);
  fn encrypt(&mut self, kid: KeyId, metadata: &[u8], plaintext: &[u8]) -> Vec<u8>;
  fn decrypt(&self, metadata: &[u8], ciphertext: &[u8]) -> Vec<u8>;
}
]]></sourcecode>
      </figure>
    </section>
    <section anchor="overhead-analysis">
      <name>Overhead Analysis</name>
      <t>Any use of SFrame will impose overhead in terms of the amount of bandwidth
necessary to transmit a given media stream.  Exactly how much overhead will be added
depends on several factors:</t>
      <ul spacing="normal">
        <li>How many senders are involved in a conference (length of KID)</li>
        <li>How long the conference has been going on (length of CTR)</li>
        <li>The cipher suite in use (length of authentication tag)</li>
        <li>Whether SFrame is used to encrypt packets, whole frames, or some other unit</li>
      </ul>
      <t>Overall, the overhead rate in kilobits per second can be estimated as:</t>
      <t><tt>
OverheadKbps = (1 + |CTR| + |KID| + |TAG|) * 8 * CTPerSecond / 1024
</tt></t>
      <t>Here the constant value <tt>1</tt> reflects the fixed SFrame header; <tt>|CTR|</tt> and
<tt>|KID|</tt> reflect the lengths of those fields; <tt>|TAG|</tt> reflects the cipher
overhead; and <tt>CTPerSecond</tt> reflects the number of SFrame ciphertexts
sent per second (e.g., packets or frames per second).</t>
      <t>In the remainder of this secton, we compute overhead estimates for a collection
of common scenarios.</t>
      <section anchor="assumptions">
        <name>Assumptions</name>
        <t>In the below calculations, we make conservative assumptions about SFrame
overhead, so that the overhead amounts we compute here are likely to be an upper
bound on those seen in practice.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="right">Bytes</th>
              <th align="left">Explanataion</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Fixed header</td>
              <td align="right">1</td>
              <td align="left">Fixed</td>
            </tr>
            <tr>
              <td align="left">Key ID (KID)</td>
              <td align="right">2</td>
              <td align="left">&gt;255 senders; or MLS epoch (E=4) and &gt;16 senders</td>
            </tr>
            <tr>
              <td align="left">Counter (CTR)</td>
              <td align="right">3</td>
              <td align="left">More than 24 hours of media in common cases</td>
            </tr>
            <tr>
              <td align="left">Cipher overhead</td>
              <td align="right">16</td>
              <td align="left">Full GCM tag (longest defined here)</td>
            </tr>
          </tbody>
        </table>
        <t>In total, then, we assume that each SFrame encryption will add 22 bytes of
overhead.</t>
        <t>We consider two scenarios, applying SFrame per-frame and per-packet.  In each
scenario, we compute the SFrame overhead in absolute terms (Kbps) and as a
percentage of the base bandwidth.</t>
      </section>
      <section anchor="audio">
        <name>Audio</name>
        <t>In audio streams, there is typically a one-to-one relationship between frames
and packets, so the overhead is the same whether one uses SFrame at a per-packet
or per-frame level.</t>
        <t>The below table considers three scenarios, based on recommended configurations
of the Opus codec <xref target="RFC6716"/>:</t>
        <ul spacing="normal">
          <li>Narrow-band speech: 120ms packets, 8Kbps</li>
          <li>Full-band speech: 20ms packets, 32Kbps</li>
          <li>Full-band stereo music: 10ms packets, 128Kbps</li>
        </ul>
        <table anchor="audio-overhead">
          <name>SFrame overhead for audio streams</name>
          <thead>
            <tr>
              <th align="left">Scenario</th>
              <th align="center">fps</th>
              <th align="center">Base Kbps</th>
              <th align="center">Overhead Kbps</th>
              <th align="center">Overhead %</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">NB speech, 120ms packets</td>
              <td align="center">8.3</td>
              <td align="center">8</td>
              <td align="center">1.4</td>
              <td align="center">17.9%</td>
            </tr>
            <tr>
              <td align="left">FB speech, 20ms packets</td>
              <td align="center">50</td>
              <td align="center">32</td>
              <td align="center">8.6</td>
              <td align="center">26.9%</td>
            </tr>
            <tr>
              <td align="left">FB stereo, 10ms packets</td>
              <td align="center">100</td>
              <td align="center">128</td>
              <td align="center">17.2</td>
              <td align="center">13.4%</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="video">
        <name>Video</name>
        <t>Video frames can be larger than an MTU and thus are commonly split across
multiple frames.  <xref target="video-overhead-per-frame"/> and <xref target="video-overhead-per-packet"/>
show the estimated overhead of encrypting a video stream, where SFrame is
applied per-frame and per-packet, respectively.  The choices of resolution,
frames per second, and bandwidth are chosen to roughly reflect the capabilities of
modern video codecs across a range from very low to very high quality.</t>
        <table anchor="video-overhead-per-frame">
          <name>SFrame overhead for a video stream encrypted per-frame</name>
          <thead>
            <tr>
              <th align="left">Scenario</th>
              <th align="center">fps</th>
              <th align="center">Base Kbps</th>
              <th align="center">Overhead Kbps</th>
              <th align="center">Overhead %</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">426 x 240</td>
              <td align="center">7.5</td>
              <td align="center">45</td>
              <td align="center">1.3</td>
              <td align="center">2.9%</td>
            </tr>
            <tr>
              <td align="left">640 x 360</td>
              <td align="center">15</td>
              <td align="center">200</td>
              <td align="center">2.6</td>
              <td align="center">1.3%</td>
            </tr>
            <tr>
              <td align="left">640 x 360</td>
              <td align="center">30</td>
              <td align="center">400</td>
              <td align="center">5.2</td>
              <td align="center">1.3%</td>
            </tr>
            <tr>
              <td align="left">1280 x 720</td>
              <td align="center">30</td>
              <td align="center">1500</td>
              <td align="center">5.2</td>
              <td align="center">0.3%</td>
            </tr>
            <tr>
              <td align="left">1920 x 1080</td>
              <td align="center">60</td>
              <td align="center">7200</td>
              <td align="center">10.3</td>
              <td align="center">0.1%</td>
            </tr>
          </tbody>
        </table>
        <table anchor="video-overhead-per-packet">
          <name>SFrame overhead for a video stream encrypted per-packet</name>
          <thead>
            <tr>
              <th align="left">Scenario</th>
              <th align="center">fps</th>
              <th align="center">pps</th>
              <th align="center">Base Kbps</th>
              <th align="center">Overhead Kbps</th>
              <th align="center">Overhead %</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">426 x 240</td>
              <td align="center">7.5</td>
              <td align="center">7.5</td>
              <td align="center">45</td>
              <td align="center">1.3</td>
              <td align="center">2.9%</td>
            </tr>
            <tr>
              <td align="left">640 x 360</td>
              <td align="center">15</td>
              <td align="center">30</td>
              <td align="center">200</td>
              <td align="center">5.2</td>
              <td align="center">2.6%</td>
            </tr>
            <tr>
              <td align="left">640 x 360</td>
              <td align="center">30</td>
              <td align="center">60</td>
              <td align="center">400</td>
              <td align="center">10.3</td>
              <td align="center">2.6%</td>
            </tr>
            <tr>
              <td align="left">1280 x 720</td>
              <td align="center">30</td>
              <td align="center">180</td>
              <td align="center">1500</td>
              <td align="center">30.9</td>
              <td align="center">2.1%</td>
            </tr>
            <tr>
              <td align="left">1920 x 1080</td>
              <td align="center">60</td>
              <td align="center">780</td>
              <td align="center">7200</td>
              <td align="center">134.1</td>
              <td align="center">1.9%</td>
            </tr>
          </tbody>
        </table>
        <t>In the per-frame case, the SFrame percentage overhead approaches zero as the
quality of the video goes up, since bandwidth is driven more by picture size
than frame rate.  In the per-packet case, the SFrame percentage overhead
approaches the ratio between the SFrame overhead per packet and the MTU (here 22
bytes of SFrame overhead divided by an assumed 1200-byte MTU, or about 1.8%).</t>
      </section>
      <section anchor="conferences">
        <name>Conferences</name>
        <t>Real conferences usually involve several audio and video streams.  The overhead
of SFrame in such a conference is the aggregate of the overhead over all the
individual streams.  Thus, while SFrame incurs a large percentage overhead on an
audio stream, if the conference also involves a video stream, then the audio
overhead is likely negligible relative to the overall bandwidth of the
conference.</t>
        <t>For example, <xref target="conference-overhead"/> shows the overhead estimates for a two
person conference where one person is sending low-quality media and the other
sending high-quality.  (And we assume that SFrame is applied per-frame.)  The
video streams dominate the bandwidth at the SFU, so the total bandwidth overhead
is only around 1%.</t>
        <table anchor="conference-overhead">
          <name>SFrame overhead for a two-person conference</name>
          <thead>
            <tr>
              <th align="left">Stream</th>
              <th align="center">Base Kbps</th>
              <th align="center">Overhead Kbps</th>
              <th align="center">Overhead %</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Participant 1 audio</td>
              <td align="center">8</td>
              <td align="center">1.4</td>
              <td align="center">17.9%</td>
            </tr>
            <tr>
              <td align="left">Participant 1 video</td>
              <td align="center">45</td>
              <td align="center">1.3</td>
              <td align="center">2.9%</td>
            </tr>
            <tr>
              <td align="left">Participant 2 audio</td>
              <td align="center">32</td>
              <td align="center">9</td>
              <td align="center">26.9%</td>
            </tr>
            <tr>
              <td align="left">Participant 2 video</td>
              <td align="center">1500</td>
              <td align="center">5</td>
              <td align="center">0.3%</td>
            </tr>
            <tr>
              <td align="left">Total at SFU</td>
              <td align="center">1585</td>
              <td align="center">16.5</td>
              <td align="center">1.0%</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="sframe-over-rtp">
        <name>SFrame over RTP</name>
        <t>SFrame is a generic encapsulation format, but many of the applications in which
it is likely to be integrated are based on RTP.  This section discusses how an
integration between SFrame and RTP could be done, and some of the challenges
that would need to be overcome.</t>
        <t>As discussed in <xref target="application-context"/>, there are two natural patterns for
integrating SFrame into an application: applying SFrame per-frame or per-packet.
In RTP-based applications, applying SFrame per-packet means that the payload of
each RTP packet will be an SFrame ciphertext, starting with an SFrame Header, as
shown in <xref target="sframe-packet"/>.  Applying SFrame per-frame means that different
RTP payloads will have different formats: The first payload of a frame will
contain the SFrame headers, and subsequent payloads will contain further chunks
of the ciphertext, as shown in <xref target="sframe-multi-packet"/>.</t>
        <t>In order for these media payloads to be properly interpreted by receivers,
receivers will need to be configured to know which of the above schemes the
sender has  applied to a given sequence of RTP packets. SFrame does not provide
a mechanism for distributing this configuration information. In applications
that use SDP for negotiating RTP media streams <xref target="RFC4566"/>, an appropriate
extension to SDP could provide this function.</t>
        <t>Applying SFrame per-frame also requires that packetization and depacketization
be done in a generic manner that does not depend on the media content of the
packets, since the content being packetized / depacketized will be opaque
ciphertext (except for the SFrame header).  In order for such a generic
packetization scheme to work interoperably one would have to be defined, e.g.,
as proposed in <xref target="I-D.codec-agnostic-rtp-payload-format"/>.</t>
        <figure anchor="sframe-packet">
          <name>SRTP packet with SFrame-protected payload</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="384" width="576" viewBox="0 0 576 384" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,208 L 8,368" fill="none" stroke="black"/>
                <path d="M 32,32 L 32,336" fill="none" stroke="black"/>
                <path d="M 64,32 L 64,64" fill="none" stroke="black"/>
                <path d="M 80,32 L 80,64" fill="none" stroke="black"/>
                <path d="M 96,32 L 96,64" fill="none" stroke="black"/>
                <path d="M 160,32 L 160,64" fill="none" stroke="black"/>
                <path d="M 176,32 L 176,64" fill="none" stroke="black"/>
                <path d="M 200,208 L 200,240" fill="none" stroke="black"/>
                <path d="M 288,32 L 288,64" fill="none" stroke="black"/>
                <path d="M 544,32 L 544,336" fill="none" stroke="black"/>
                <path d="M 568,32 L 568,368" fill="none" stroke="black"/>
                <path d="M 32,32 L 568,32" fill="none" stroke="black"/>
                <path d="M 32,64 L 544,64" fill="none" stroke="black"/>
                <path d="M 32,96 L 544,96" fill="none" stroke="black"/>
                <path d="M 32,126 L 544,126" fill="none" stroke="black"/>
                <path d="M 32,130 L 544,130" fill="none" stroke="black"/>
                <path d="M 32,176 L 544,176" fill="none" stroke="black"/>
                <path d="M 8,208 L 544,208" fill="none" stroke="black"/>
                <path d="M 32,240 L 200,240" fill="none" stroke="black"/>
                <path d="M 8,304 L 568,304" fill="none" stroke="black"/>
                <path d="M 32,336 L 544,336" fill="none" stroke="black"/>
                <path d="M 8,368 L 32,368" fill="none" stroke="black"/>
                <path d="M 544,368 L 568,368" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="560,304 548,298.4 548,309.6" fill="black" transform="rotate(180,552,304)"/>
                <polygon class="arrowhead" points="560,32 548,26.4 548,37.6" fill="black" transform="rotate(180,552,32)"/>
                <polygon class="arrowhead" points="32,304 20,298.4 20,309.6" fill="black" transform="rotate(0,24,304)"/>
                <polygon class="arrowhead" points="32,208 20,202.4 20,213.6" fill="black" transform="rotate(0,24,208)"/>
                <g class="text">
                  <text x="48" y="52">V=2</text>
                  <text x="72" y="52">P</text>
                  <text x="88" y="52">X</text>
                  <text x="124" y="52">CC</text>
                  <text x="168" y="52">M</text>
                  <text x="228" y="52">PT</text>
                  <text x="380" y="52">sequence</text>
                  <text x="444" y="52">number</text>
                  <text x="288" y="84">timestamp</text>
                  <text x="184" y="116">synchronization</text>
                  <text x="276" y="116">source</text>
                  <text x="332" y="116">(SSRC)</text>
                  <text x="404" y="116">identifier</text>
                  <text x="180" y="148">contributing</text>
                  <text x="260" y="148">source</text>
                  <text x="316" y="148">(CSRC)</text>
                  <text x="392" y="148">identifiers</text>
                  <text x="300" y="164">....</text>
                  <text x="200" y="196">RTP</text>
                  <text x="268" y="196">extension(s)</text>
                  <text x="364" y="196">(OPTIONAL)</text>
                  <text x="84" y="228">SFrame</text>
                  <text x="140" y="228">header</text>
                  <text x="140" y="276">SFrame</text>
                  <text x="208" y="276">encrypted</text>
                  <text x="264" y="276">and</text>
                  <text x="336" y="276">authenticated</text>
                  <text x="424" y="276">payload</text>
                  <text x="212" y="324">SRTP</text>
                  <text x="292" y="324">authentication</text>
                  <text x="368" y="324">tag</text>
                  <text x="60" y="372">SRTP</text>
                  <text x="120" y="372">Encrypted</text>
                  <text x="192" y="372">Portion</text>
                  <text x="340" y="372">SRTP</text>
                  <text x="416" y="372">Authenticated</text>
                  <text x="504" y="372">Portion</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
   +---+-+-+-------+-+-------------+-------------------------------+<-+
   |V=2|P|X|  CC   |M|     PT      |       sequence number         |  |
   +---+-+-+-------+-+-------------+-------------------------------+  |
   |                           timestamp                           |  |
   +---------------------------------------------------------------+  |
   |           synchronization source (SSRC) identifier            |  |
   +===============================================================+  |
   |            contributing source (CSRC) identifiers             |  |
   |                               ....                            |  |
   +---------------------------------------------------------------+  |
   |                   RTP extension(s) (OPTIONAL)                 |  |
+->+--------------------+------------------------------------------+  |
|  |   SFrame header    |                                          |  |
|  +--------------------+                                          |  |
|  |                                                               |  |
|  |          SFrame encrypted and authenticated payload           |  |
|  |                                                               |  |
+->+---------------------------------------------------------------+<-+
|  |                    SRTP authentication tag                    |  |
|  +---------------------------------------------------------------+  |
|                                                                     |
+--- SRTP Encrypted Portion             SRTP Authenticated Portion ---+
]]></artwork>
          </artset>
        </figure>
        <figure anchor="sframe-multi-packet">
          <name>Encryption flow with per-frame encryption for RTP</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="624" width="504" viewBox="0 0 504 624" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,192 L 8,224" fill="none" stroke="black"/>
                <path d="M 8,512 L 8,608" fill="none" stroke="black"/>
                <path d="M 32,32 L 32,64" fill="none" stroke="black"/>
                <path d="M 32,232 L 32,504" fill="none" stroke="black"/>
                <path d="M 72,464 L 72,504" fill="none" stroke="black"/>
                <path d="M 96,64 L 96,184" fill="none" stroke="black"/>
                <path d="M 136,512 L 136,608" fill="none" stroke="black"/>
                <path d="M 168,32 L 168,64" fill="none" stroke="black"/>
                <path d="M 192,32 L 192,128" fill="none" stroke="black"/>
                <path d="M 192,288 L 192,400" fill="none" stroke="black"/>
                <path d="M 192,512 L 192,608" fill="none" stroke="black"/>
                <path d="M 256,128 L 256,184" fill="none" stroke="black"/>
                <path d="M 256,232 L 256,280" fill="none" stroke="black"/>
                <path d="M 256,400 L 256,416" fill="none" stroke="black"/>
                <path d="M 256,448 L 256,504" fill="none" stroke="black"/>
                <path d="M 320,32 L 320,128" fill="none" stroke="black"/>
                <path d="M 320,192 L 320,224" fill="none" stroke="black"/>
                <path d="M 320,288 L 320,400" fill="none" stroke="black"/>
                <path d="M 320,512 L 320,608" fill="none" stroke="black"/>
                <path d="M 368,512 L 368,608" fill="none" stroke="black"/>
                <path d="M 432,464 L 432,504" fill="none" stroke="black"/>
                <path d="M 496,512 L 496,608" fill="none" stroke="black"/>
                <path d="M 32,32 L 168,32" fill="none" stroke="black"/>
                <path d="M 192,32 L 320,32" fill="none" stroke="black"/>
                <path d="M 32,64 L 168,64" fill="none" stroke="black"/>
                <path d="M 192,128 L 320,128" fill="none" stroke="black"/>
                <path d="M 8,192 L 320,192" fill="none" stroke="black"/>
                <path d="M 8,224 L 320,224" fill="none" stroke="black"/>
                <path d="M 192,288 L 320,288" fill="none" stroke="black"/>
                <path d="M 192,400 L 320,400" fill="none" stroke="black"/>
                <path d="M 72,464 L 328,464" fill="none" stroke="black"/>
                <path d="M 360,464 L 432,464" fill="none" stroke="black"/>
                <path d="M 8,512 L 136,512" fill="none" stroke="black"/>
                <path d="M 192,512 L 320,512" fill="none" stroke="black"/>
                <path d="M 368,512 L 496,512" fill="none" stroke="black"/>
                <path d="M 8,544 L 136,544" fill="none" stroke="black"/>
                <path d="M 8,608 L 136,608" fill="none" stroke="black"/>
                <path d="M 192,608 L 320,608" fill="none" stroke="black"/>
                <path d="M 368,608 L 496,608" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="440,504 428,498.4 428,509.6" fill="black" transform="rotate(90,432,504)"/>
                <polygon class="arrowhead" points="264,504 252,498.4 252,509.6" fill="black" transform="rotate(90,256,504)"/>
                <polygon class="arrowhead" points="264,280 252,274.4 252,285.6" fill="black" transform="rotate(90,256,280)"/>
                <polygon class="arrowhead" points="264,184 252,178.4 252,189.6" fill="black" transform="rotate(90,256,184)"/>
                <polygon class="arrowhead" points="104,184 92,178.4 92,189.6" fill="black" transform="rotate(90,96,184)"/>
                <polygon class="arrowhead" points="80,504 68,498.4 68,509.6" fill="black" transform="rotate(90,72,504)"/>
                <polygon class="arrowhead" points="40,504 28,498.4 28,509.6" fill="black" transform="rotate(90,32,504)"/>
                <g class="text">
                  <text x="64" y="52">frame</text>
                  <text x="124" y="52">metadata</text>
                  <text x="256" y="84">frame</text>
                  <text x="132" y="212">SFrame</text>
                  <text x="192" y="212">Encrypt</text>
                  <text x="256" y="340">encrypted</text>
                  <text x="256" y="356">frame</text>
                  <text x="208" y="436">generic</text>
                  <text x="256" y="436">RTP</text>
                  <text x="312" y="436">packetize</text>
                  <text x="344" y="468">...</text>
                  <text x="44" y="532">SFrame</text>
                  <text x="100" y="532">header</text>
                  <text x="240" y="564">payload</text>
                  <text x="288" y="564">2/N</text>
                  <text x="344" y="564">...</text>
                  <text x="416" y="564">payload</text>
                  <text x="464" y="564">N/N</text>
                  <text x="56" y="580">payload</text>
                  <text x="104" y="580">1/N</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
   +----------------+  +---------------+
   | frame metadata |  |               |
   +-------+--------+  |               |
           |           |     frame     |
           |           |               |
           |           |               |
           |           +-------+-------+
           |                   |
           |                   |
           V                   V
+--------------------------------------+
|            SFrame Encrypt            |
+--------------------------------------+
   |                           |
   |                           |
   |                           V
   |                   +-------+-------+
   |                   |               |
   |                   |               |
   |                   |   encrypted   |
   |                   |     frame     |
   |                   |               |
   |                   |               |
   |                   +-------+-------+
   |                           |
   |                  generic RTP packetize
   |                           |
   |    +----------------------+--------.....--------+
   |    |                      |                     |
   V    V                      V                     V
+---------------+      +---------------+     +---------------+
| SFrame header |      |               |     |               |
+---------------+      |               |     |               |
|               |      |  payload 2/N  | ... |  payload N/N  |
|  payload 1/N  |      |               |     |               |
|               |      |               |     |               |
+---------------+      +---------------+     +---------------+
]]></artwork>
          </artset>
        </figure>
      </section>
    </section>
    <section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>This section provides a set of test vectors that implementations can use to
verify that they correctly implement SFrame encryption and decryption.  For each
cipher suite, we provide:</t>
      <ul spacing="normal">
        <li>[in] The <tt>base_key</tt> value (hex encoded)</li>
        <li>[out] The <tt>secret</tt>, <tt>key</tt>, and <tt>salt</tt> values derived from the <tt>base_key</tt> (hex
encoded)</li>
        <li>A plaintext value that is encrypted in the following encryption cases</li>
        <li>
          <t>A sequence of encryption cases, including:
          </t>
          <ul spacing="normal">
            <li>[in] The <tt>KID</tt> and <tt>CTR</tt> values to be included in the header</li>
            <li>[out] The resulting encoded header (hex encoded)</li>
            <li>[out] The nonce computed from the <tt>salt</tt> and <tt>CTR</tt> values</li>
            <li>The ciphertext resulting from encrypting the plaintext with these parameters
(hex encoded)</li>
          </ul>
        </li>
      </ul>
      <t>An implementation should reproduce the output values given the input values:</t>
      <ul spacing="normal">
        <li>An implementation should be able to encrypt with the input values and the
plaintext to produce the ciphertext.</li>
        <li>An implementation must be able to decrypt with the input values and the
ciphertext to generate the plaintext.</li>
      </ul>
      <t>Line breaks and whitespace within values are inserted to conform to the width
requirements of the RFC format.  They should be removed before use.
These test vectors are also available in JSON format at <xref target="TestVectors"/>.</t>
      <section anchor="aesctr128hmacsha2564">
        <name>AES_CTR_128_HMAC_SHA256_4</name>
        <artwork><![CDATA[
CipherSuite:    0x01
Base Key:       101112131415161718191a1b1c1d1e1f
Key:            343d3290f5c0b936415bea9a43c6f5a2
Salt:           42d662fbad5cd81eb3aad79a
Plaintext:      46726f6d2068656176656e6c79206861
                726d6f6e79202f2f205468697320756e
                6976657273616c206672616d65206265
                67616e
]]></artwork>
        <artwork><![CDATA[
KID:            0x7
CTR:            0x0
Header:         0700
Nonce:          42d662fbad5cd81eb3aad79a
Ciphertext:     0700c5095af9dbbbed6a952de114ea7b
                42768509f1ffc9749abb1e95bf4514d8
                d82a0eef4b5ecac16fa193977fa1aa1c
                9fa5c7e730b934669c
]]></artwork>
        <artwork><![CDATA[
KID:            0x7
CTR:            0x1
Header:         0701
Nonce:          42d662fbad5cd81eb3aad79b
Ciphertext:     0701559e262525382885c6c93be8f61a
                9064db2dd1e1e96ab1dbd829ca4af4f4
                5f2b97a4889217a3f8a2159fb8201b7d
                71db01702b9caf8df6
]]></artwork>
        <artwork><![CDATA[
KID:            0x7
CTR:            0x2
Header:         0702
Nonce:          42d662fbad5cd81eb3aad798
Ciphertext:     07020a8f21e052eaa09e50da0a909d15
                6cc55b9ef2f2abbcca765f7af3cfb1af
                234e3eac1dbc376631c83cf1ff1f8ab3
                39dbc41044742c668d
]]></artwork>
        <artwork><![CDATA[
KID:            0xf
CTR:            0xaa
Header:         080faa
Nonce:          42d662fbad5cd81eb3aad730
Ciphertext:     080faa9c65aa5b167873f25827f17bc3
                4879a4aaa6b38dd9584472e1849d5da5
                1555f288d08f03166a5f26af01794006
                255c88b589861e2f8e3e
]]></artwork>
        <artwork><![CDATA[
KID:            0x1ff
CTR:            0xaa
Header:         0901ffaa
Nonce:          42d662fbad5cd81eb3aad730
Ciphertext:     0901ffaa9c65aa5b167873f25827f17b
                c34879a4aaa6b38dd9584472e1849d5d
                a51555f288d08f03166a5f26af017940
                06255c88b58986ca1ead10
]]></artwork>
        <artwork><![CDATA[
KID:            0x1ff
CTR:            0xaaaa
Header:         1901ffaaaa
Nonce:          42d662fbad5cd81eb3aa7d30
Ciphertext:     1901ffaaaa990cbeb4ae2e3a76be8bb9
                54b62591e791d0fa53c0553bc1d1e021
                d270b1a10688cd89195203b019789253
                73b04f9c08c3a4e563e2f6b9
]]></artwork>
        <artwork><![CDATA[
KID:            0xffffffffffffff
CTR:            0xffffffffffffff
Header:         6effffffffffffffffffffffffffff
Nonce:          42d662fbada327e14c552865
Ciphertext:     6effffffffffffffffffffffffffff41
                2c43c8077c286f7df3dd9988d1bd033f
                1067493e09421e5bfc363e50a3c803b4
                da9239514cb924dbcb5f33e33112083e
                99108de2ecd6
]]></artwork>
      </section>
      <section anchor="aesctr128hmacsha2568">
        <name>AES_CTR_128_HMAC_SHA256_8</name>
        <artwork><![CDATA[
CipherSuite:    0x02
Base Key:       202122232425262728292a2b2c2d2e2f
Key:            3fce747d505e46ec9b92d9f58ee7a5d4
Salt:           77fbf5f1d82c73f6d2b353c9
Plaintext:      46726f6d2068656176656e6c79206861
                726d6f6e79202f2f205468697320756e
                6976657273616c206672616d65206265
                67616e
]]></artwork>
        <artwork><![CDATA[
KID:            0x7
CTR:            0x0
Header:         0700
Nonce:          77fbf5f1d82c73f6d2b353c9
Ciphertext:     07009d89e5753e06edf3025f1ccd70b0
                95ebaf10c250e11da740f50f57b6ce86
                0d7321dfa49688a2cd6c6d9a71ae9d5c
                14ad0978efdd719a7f18c48f07
]]></artwork>
        <artwork><![CDATA[
KID:            0x7
CTR:            0x1
Header:         0701
Nonce:          77fbf5f1d82c73f6d2b353c8
Ciphertext:     0701becd2e9d10e3eed586491b3e0ece
                dba89407ae2151787c5117b55707d6b8
                a0754f4dc937e30ebdf7cafbd3769d65
                85d7991b1a6bd31e8bddb1adec
]]></artwork>
        <artwork><![CDATA[
KID:            0x7
CTR:            0x2
Header:         0702
Nonce:          77fbf5f1d82c73f6d2b353cb
Ciphertext:     070298508be6b16d034f15b504ced45a
                86d1bb43ed7cd3a62bf25557d1b082b0
                4e8e6ba6fe76160835dd8953e1be9640
                c988627ea447127ae4c103eabd
]]></artwork>
        <artwork><![CDATA[
KID:            0xf
CTR:            0xaa
Header:         080faa
Nonce:          77fbf5f1d82c73f6d2b35363
Ciphertext:     080faae7eec4b0556ddfb8068998351c
                d670ce95f0ce9cd4c6dca2eeee73fb14
                d20a0d0fd487337ed43fa7f98dad0995
                b8b870325aa35a105af9b1004b22
]]></artwork>
        <artwork><![CDATA[
KID:            0x1ff
CTR:            0xaa
Header:         0901ffaa
Nonce:          77fbf5f1d82c73f6d2b35363
Ciphertext:     0901ffaae7eec4b0556ddfb806899835
                1cd670ce95f0ce9cd4c6dca2eeee73fb
                14d20a0d0fd487337ed43fa7f98dad09
                95b8b870325aa3437cce05a6e67ee8
]]></artwork>
        <artwork><![CDATA[
KID:            0x1ff
CTR:            0xaaaa
Header:         1901ffaaaa
Nonce:          77fbf5f1d82c73f6d2b3f963
Ciphertext:     1901ffaaaa8c1789aa0abcd6abc27006
                aae4df5cba4ba07f8113080e9726baac
                d16c18539974a6204a36b9dc3dcd36ed
                9ab48e590d95d4adfb4290f4cb1ba184
]]></artwork>
        <artwork><![CDATA[
KID:            0xffffffffffffff
CTR:            0xffffffffffffff
Header:         6effffffffffffffffffffffffffff
Nonce:          77fbf5f1d8d38c092d4cac36
Ciphertext:     6effffffffffffffffffffffffffffa9
                bc6c7edde0fdfd13255a5b145c5ce84d
                b8f8960858eb998b8ea8f3e770160150
                813c5806441b64251bdd2be9e8cec138
                6b6f8e3b1982bcd16c84
]]></artwork>
      </section>
      <section anchor="aesgcm128sha256">
        <name>AES_GCM_128_SHA256</name>
        <artwork><![CDATA[
CipherSuite:    0x03
Base Key:       303132333435363738393a3b3c3d3e3f
Key:            2ea2e8163ff56c0613e6fa9f20a213da
Salt:           a80478b3f6fba19983d540d5
Plaintext:      46726f6d2068656176656e6c79206861
                726d6f6e79202f2f205468697320756e
                6976657273616c206672616d65206265
                67616e
]]></artwork>
        <artwork><![CDATA[
KID:            0x7
CTR:            0x0
Header:         0700
Nonce:          a80478b3f6fba19983d540d5
Ciphertext:     07000e426255e47ed70dd7d15d69d759
                bf459032ca15f5e8b2a91e7d348aa7c1
                86d403f620801c495b1717a35097411a
                a97cbb1406afd9f4e5215b46e4a39dc4
                0c27fd6bc7
]]></artwork>
        <artwork><![CDATA[
KID:            0x7
CTR:            0x1
Header:         0701
Nonce:          a80478b3f6fba19983d540d4
Ciphertext:     070103bbafa34ada8a6b9f2066bc34a1
                959d87384c9f4b1ce34fed58e938bde1
                43393910b1aeb55b48d91d5b0db3ea67
                e3d0e02b84e4cf8ecf81f8386f86cda4
                8fcd754191
]]></artwork>
        <artwork><![CDATA[
KID:            0x7
CTR:            0x2
Header:         0702
Nonce:          a80478b3f6fba19983d540d7
Ciphertext:     070258d58adebd8bf6f3cc0c1fcacf34
                ba4d7a763b2683fe302a57f1be7f2a27
                4bf81b2236995fec1203cadb146cd402
                e1c52d5e6aceaa5252822d25acd0ce4b
                a14e31fa24
]]></artwork>
        <artwork><![CDATA[
KID:            0xf
CTR:            0xaa
Header:         080faa
Nonce:          a80478b3f6fba19983d5407f
Ciphertext:     080faad0b1743bf5248f90869c945636
                6d55724d16bbe08060875815565e90b1
                14f9ccbdba192422b33848a1ae1e3bd2
                66a001b2f5bb64c0f1216bba82ab24b1
                ebd677c2ca29
]]></artwork>
        <artwork><![CDATA[
KID:            0x1ff
CTR:            0xaa
Header:         0901ffaa
Nonce:          a80478b3f6fba19983d5407f
Ciphertext:     0901ffaad0b1743bf5248f90869c9456
                366d55724d16bbe08060875815565e90
                b114f9ccbdba192422b33848a1ae1e3b
                d266a001b2f5bb8c718170432b6f922c
                1f0fb307514a0e
]]></artwork>
        <artwork><![CDATA[
KID:            0x1ff
CTR:            0xaaaa
Header:         1901ffaaaa
Nonce:          a80478b3f6fba19983d5ea7f
Ciphertext:     1901ffaaaa9de65e21e4f1ca2247b879
                43c03c5cb7b182090e93d508dcfb76e0
                8174c6397356e682d2eaddabc0b3c101
                8d2c13c3570f61c185789dff3cb4469c
                f471ca71ceb025a5
]]></artwork>
        <artwork><![CDATA[
KID:            0xffffffffffffff
CTR:            0xffffffffffffff
Header:         6effffffffffffffffffffffffffff
Nonce:          a80478b3f6045e667c2abf2a
Ciphertext:     6effffffffffffffffffffffffffff09
                981bdcdad80e380b6f74cf6afdbce946
                839bedadd57578bfcd809dbcea535546
                cc24660613d2761adea852155785011e
                633522450f95fd9f8ccc96fa3de9a247
                cfd3
]]></artwork>
      </section>
      <section anchor="aesgcm256sha512">
        <name>AES_GCM_256_SHA512</name>
        <artwork><![CDATA[
CipherSuite:    0x04
Base Key:       404142434445464748494a4b4c4d4e4f
                505152535455565758595a5b5c5d5e5f
Key:            436774b0b5ae45633d96547f8f3cb06c
                8e6628eff2e4255b5c4d77e721aa3355
Salt:           31ed26f90a072e6aee646298
Plaintext:      46726f6d2068656176656e6c79206861
                726d6f6e79202f2f205468697320756e
                6976657273616c206672616d65206265
                67616e
]]></artwork>
        <artwork><![CDATA[
KID:            0x7
CTR:            0x0
Header:         0700
Nonce:          31ed26f90a072e6aee646298
Ciphertext:     0700f3e297c1e95207710bd31ccc4ba3
                96fbef7b257440bde638ff0f3c891154
                0136df61b26220249d6c432c245ae8d5
                5ef45bfccf3afe18dd36d64d8e341653
                e1a0f10be2
]]></artwork>
        <artwork><![CDATA[
KID:            0x7
CTR:            0x1
Header:         0701
Nonce:          31ed26f90a072e6aee646299
Ciphertext:     070193268b0bf030071bff443bb6b447
                1bdfb1cc81bc9625f4697b0336ff4665
                d15f152f02169448d8a967fb06359a87
                d2145398de044ee92acfcc27b7a98f38
                712b60c28c
]]></artwork>
        <artwork><![CDATA[
KID:            0x7
CTR:            0x2
Header:         0702
Nonce:          31ed26f90a072e6aee64629a
Ciphertext:     0702649691ba27c4c01a41280fba4657
                c03fa7fe21c8f5c862e9094227c3ca3e
                c0d9468b1a2cb060ff0978f25a24e6b1
                06f5a6e10534b69d975605f31534caea
                88b33b455a
]]></artwork>
        <artwork><![CDATA[
KID:            0xf
CTR:            0xaa
Header:         080faa
Nonce:          31ed26f90a072e6aee646232
Ciphertext:     080faa2858c10b5ddd231c1f26819490
                521678603a050448d563c503b1fd890d
                02ead01d754f074ecb6f32da9b2f3859
                f380b4f47d4ed539d6103e61580a82c0
                14b28eb48b4a
]]></artwork>
        <artwork><![CDATA[
KID:            0x1ff
CTR:            0xaa
Header:         0901ffaa
Nonce:          31ed26f90a072e6aee646232
Ciphertext:     0901ffaa2858c10b5ddd231c1f268194
                90521678603a050448d563c503b1fd89
                0d02ead01d754f074ecb6f32da9b2f38
                59f380b4f47d4e32c565b3b3fa20fc7e
                cff21a1cee3eec
]]></artwork>
        <artwork><![CDATA[
KID:            0x1ff
CTR:            0xaaaa
Header:         1901ffaaaa
Nonce:          31ed26f90a072e6aee64c832
Ciphertext:     1901ffaaaad9bc6a258a07d210a814d5
                45eca70321c0e87498ada6e5c708b7ea
                d162ffcf4fbaba1eb82650590a87122b
                4d95fe36bd88b278994922fe5c09f14c
                728521333297f84f
]]></artwork>
        <artwork><![CDATA[
KID:            0xffffffffffffff
CTR:            0xffffffffffffff
Header:         6effffffffffffffffffffffffffff
Nonce:          31ed26f90af8d195119b9d67
Ciphertext:     6effffffffffffffffffffffffffffaf
                480d4779ce0c02b5137ee6a61e026c04
                ac999cb0c97319feceeb258d58df23bc
                e14979e5c67a431777b34498062e72f9
                39ca4acb471bad80259bb44f78a15248
                7e67
]]></artwork>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+W9e3vcxpE3+j8+BV7myYa0Zka4zU2x/YaWZFtrS9aRZCd5
kqzYABokVsPBZDBDims6n/3UrRuNy1CUL/vsOcvdWOQMutFdXV31q+qq6vF4
7O3K3Uo/8l/rbL/V/pdbdan949f074mn0nSrr+Bb+tvLq2wN/z7y860qduNS
74pxXeBXY73OxkHkZWqnz6vtzSO/3uWeV262j/zddl/voiBYwvf1bqvV5SP/
2dM3X3oKfn/kH51uNqsSGpbVuvbVOvdfabUavykv9ZH3Tt9cV9scGqx3ervW
u/ETfLUHY4q9K73e60ee759vq/0GepJJPNd5qXgq9RF8vbvZwJiP/lxt35Xr
c/8rfBo/v1TlCj7nGfwJZzOptuf4jdpmF/DNxW63qR89fIgP4kfllZ6Yxx7i
Bw/TbXVd64fcxUNsel7uLvap7XZ8fS7f4pcrIE+9c3q2D0243aSsTGeDNJ5c
7C5XR56n9ruLagtzH0Ovvl+u60f+04n/3aXaKvqE1+nppcqdD2HYal3+F5H6
kY901/S5ZkroCp/8k8LPJ1l12er93yf+96ne7kqn+3+HhS3X7uftN3xVVeft
V/znnp790zl903vJ64n/fL8tV6vKectrvT0vK/8rIDgsq/t9+22Pq9fPK/91
VeyugbPct9bUw+Scephccg9/yqr6sqrlcSB8aySvJt9O/C8UsFztDOVVmV2o
be63v+sMo6yzyn37dpX+qdxcTer39Om2wv0GLLqrtq1X/nXif6nSld45L/xr
tdfrtfv5B9bwhho4a+iV66LaXsLzV7RX3gAD/qAzeHn9iBqKADjiPU7f+/LA
ET+gtucamNbwrHAqdP6QOcZwbLqqUtgrNezUh8jn4yvuZvKfdbWmrnLg/0d+
FESh53nj8dhXKUgEle08781FWfsgYPaXer3zc11n2zLVtb+70MPCydfrfLyr
YFfk8Gu2vdkgSVCA0O6AXkSo+JcaVm1d1pc+UAL+QulAI66B8L7yL/erXblR
292Nn1XrQm+hO+1narUawQPe9QWsup9Bh1u1kubAUVd6W/vHtV7BJIG22Dcw
Uo4SZr8udzWsFMjN7+sT6AnekmW6ptl43MOl3ikgh/LXWuc693cVyKN3rW5y
nZU1ScVrIHm13/kX6gq/MJ1V1B+Qb28GNkFCan+zrTZVDb02U8/LosARF9vq
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
V+eMX49b++1+GOip+WywJyPS3Z8hSdP6cKgnK9udn+/Xm76oaX04OCYj25uf
IUnTETWDPRnZ3vkZVKL2wx96nziy/R5aovvhg86YRLZ3NNcPQ0rUfOgoUXdM
Itvh/9H/Rtr0U2Y/+GBj1an9sCG9fDSW3fJFlX60Ym8++jWgxeF1uc/P4W16
z58HiNT+9S/vx0f+7xwb0T9Ck7aS88GCDJIBo7hvQmLjI/8nz/u2fMdHZBYi
W3DJPiaE0AQc3+mbujl2M/Y8GBn6PTvHEGJ6+CSZ33zu3j4Khq38DfbidHAJ
dgLhVMD/u20JFo/xeKu1B6ZFTTMB4T8WpzG+aw1m9XENWPnHHxlmj3FwP/10
MkKbDP4u0UVAxiM7WKSxV18oPAyHv7ZgykgXlytsKpB+0JXr02mRBgMGXfMI
zrXKLjCYrCGIcZfAaMVtLtQC3A0GfrYjv5Nu2fAjNzTBI8sKTDT0k4Gh8OyH
mv1OQqnH5QZsEPY6na6tJ81+SmbhtqzZKyhfo4VEJ+PoaW6MgGq/2+x3bI54
p09Pn3RObGkVV6okJ5ecMU3DcPbTT6PGxyl9W7MM3Vk5+6bVyo2Zge/oGP34
9PTJific2uMjs+wKTCs8oRiv9Poc3gH8sM92ezJjm1MwdDypcoXnYbD6HMjG
vdAZD/mzbEOZSmNp2eP8zjn6Tp1j+GDj1bKkIuqo1Xm1hXlf4gBgfbqW04Mx
63bW7oMbeHhbf8pY4PbV7bdPX9z+5fYb/EeEBoKaZ0/aks1/jO41oJgj3B6M
P//Z7xfN+HMF2+3/j9s/tUzzBJnmv/39/59pT/z3836I/wff3zlcfqPO7xr/
z36/QYY//+eXt8fBO9z2strSlNs/py1xap4ZN8jAowM3x80lzqsGhI5YrLPT
lmKLQImZc8nrcrUid5Hpw2s0C4jVOzqX05NdI9Sblt5Wb7a6xoFjmOHakcTs
CqXX1hs6E+agFuty7ugZj0MY5GCUTpnLLR6yiVuSHdQDct08vlL26ZZe/Zq7
H9BKEveC/nFAWVdqtTcuaT4ocXQmQB5ouEMfH8YKCwR55Hmf+KdGkB9/8+zJ
CcMH5/Ck1xWiivpCvNN86IydZCL4jx+/eSW9GISBMYKA/0jr0VSf/WBj4ZyT
Ja8VGD8IaWiMI59eAXAiLdfKHAA1QIfBjIdgxkUNxpU/gcEatAlrtq2wXwqs
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
BUTTZQpquZiD2YoWcn/h9Ew8eP8vT0IHQeYAAQA=

-->

</rfc>
