<?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.25 (Ruby 3.1.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-sframe-enc-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.16.0 -->
  <front>
    <title abbrev="SFrame">Secure Frame (SFrame)</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-sframe-enc-01"/>
    <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="March" day="13"/>
    <area>Applications and Real-Time</area>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <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>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>Modern multi-party video call systems use Selective Forwarding Unit (SFU)
servers to efficiently route RTP 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 payloads sent over SRTP</t>
      <figure>
        <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">
              <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>
    </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>SFU:</dt>
        <dd>
          <t>Selective Forwarding Unit (AKA RTP Switch)</t>
        </dd>
        <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>
    </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.</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 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, which is typically applied in one of two
ways: Either to encrypt whole media frames (per-frame) or individual media
payloads (per-packet).  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.</t>
        <t>For example, <xref target="media-stack"/> shows a typical media stack that takes media in
from some source, encodes it into frames, divides those frames into media
payloads, and then sends those payloads in SRTP packets.  Arrows indicate the
points where SFrame protection would be integrated into this media stack, when
applied per-frame or per-packet.</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"/>.</t>
        <t>As noted above, however, SFrame is a general media encapsulation, and can be
applied in other scenarios.  The precise efficiency and complexity trade-offs
will depend on the environment in which SFrame is being integrated.</t>
        <figure anchor="media-stack">
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="512" width="648" viewBox="0 0 648 512" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
                <path d="M 24,112 L 24,144" fill="none" stroke="black"/>
                <path d="M 24,368 L 24,400" fill="none" stroke="black"/>
                <path d="M 56,32 L 56,208" fill="none" stroke="black"/>
                <path d="M 56,320 L 56,496" fill="none" stroke="black"/>
                <path d="M 80,64 L 80,128" fill="none" stroke="black"/>
                <path d="M 80,400 L 80,464" fill="none" stroke="black"/>
                <path d="M 168,64 L 168,128" fill="none" stroke="black"/>
                <path d="M 168,400 L 168,464" fill="none" stroke="black"/>
                <path d="M 192,104 L 192,144" fill="none" stroke="black"/>
                <path d="M 200,384 L 200,424" fill="none" stroke="black"/>
                <path d="M 224,64 L 224,128" fill="none" stroke="black"/>
                <path d="M 224,400 L 224,464" fill="none" stroke="black"/>
                <path d="M 272,136 L 272,392" fill="none" stroke="black"/>
                <path d="M 336,64 L 336,128" fill="none" stroke="black"/>
                <path d="M 336,400 L 336,464" fill="none" stroke="black"/>
                <path d="M 360,104 L 360,144" fill="none" stroke="black"/>
                <path d="M 368,384 L 368,424" fill="none" stroke="black"/>
                <path d="M 392,64 L 392,128" fill="none" stroke="black"/>
                <path d="M 392,400 L 392,464" fill="none" stroke="black"/>
                <path d="M 440,136 L 440,392" fill="none" stroke="black"/>
                <path d="M 488,64 L 488,128" fill="none" stroke="black"/>
                <path d="M 488,400 L 488,464" fill="none" stroke="black"/>
                <path d="M 512,32 L 512,88" fill="none" stroke="black"/>
                <path d="M 512,104 L 512,208" fill="none" stroke="black"/>
                <path d="M 512,320 L 512,424" fill="none" stroke="black"/>
                <path d="M 512,440 L 512,496" fill="none" stroke="black"/>
                <path d="M 536,240 L 536,288" fill="none" stroke="black"/>
                <path d="M 584,96 L 584,232" fill="none" stroke="black"/>
                <path d="M 584,288 L 584,432" fill="none" stroke="black"/>
                <path d="M 640,240 L 640,288" 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,208 L 264,208" fill="none" stroke="black"/>
                <path d="M 280,208 L 432,208" fill="none" stroke="black"/>
                <path d="M 448,208 L 512,208" fill="none" stroke="black"/>
                <path d="M 536,240 L 640,240" fill="none" stroke="black"/>
                <path d="M 536,288 L 640,288" fill="none" stroke="black"/>
                <path d="M 56,320 L 264,320" fill="none" stroke="black"/>
                <path d="M 280,320 L 432,320" fill="none" stroke="black"/>
                <path d="M 448,320 L 512,320" fill="none" stroke="black"/>
                <path d="M 80,400 L 168,400" fill="none" stroke="black"/>
                <path d="M 224,400 L 336,400" fill="none" stroke="black"/>
                <path d="M 392,400 L 488,400" fill="none" stroke="black"/>
                <path d="M 176,432 L 216,432" fill="none" stroke="black"/>
                <path d="M 344,432 L 384,432" fill="none" stroke="black"/>
                <path d="M 496,432 L 584,432" 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 56,496 L 512,496" fill="none" stroke="black"/>
                <path d="M 24,400 L 40,432" fill="none" stroke="black"/>
                <path d="M 24,368 L 40,400" 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,400 L 24,368" fill="none" stroke="black"/>
                <path d="M 8,432 L 24,400" 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,336 C 15.16936,336 8,343.16936 8,352" fill="none" stroke="black"/>
                <path d="M 24,336 C 32.83064,336 40,343.16936 40,352" fill="none" stroke="black"/>
                <path d="M 24,368 C 15.16936,368 8,360.83064 8,352" fill="none" stroke="black"/>
                <path d="M 24,368 C 32.83064,368 40,360.83064 40,352" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="592,232 580,226.4 580,237.6" fill="black" transform="rotate(90,584,232)"/>
                <polygon class="arrowhead" points="504,432 492,426.4 492,437.6" fill="black" transform="rotate(180,496,432)"/>
                <polygon class="arrowhead" points="448,392 436,386.4 436,397.6" fill="black" transform="rotate(90,440,392)"/>
                <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,424 364,418.4 364,429.6" fill="black" transform="rotate(90,368,424)"/>
                <polygon class="arrowhead" points="368,104 356,98.4 356,109.6" fill="black" transform="rotate(270,360,104)"/>
                <polygon class="arrowhead" points="352,432 340,426.4 340,437.6" fill="black" transform="rotate(180,344,432)"/>
                <polygon class="arrowhead" points="280,392 268,386.4 268,397.6" fill="black" transform="rotate(90,272,392)"/>
                <polygon class="arrowhead" points="280,136 268,130.4 268,141.6" fill="black" transform="rotate(270,272,136)"/>
                <polygon class="arrowhead" points="224,96 212,90.4 212,101.6" fill="black" transform="rotate(0,216,96)"/>
                <polygon class="arrowhead" points="208,424 196,418.4 196,429.6" fill="black" transform="rotate(90,200,424)"/>
                <polygon class="arrowhead" points="200,104 188,98.4 188,109.6" fill="black" transform="rotate(270,192,104)"/>
                <polygon class="arrowhead" points="184,432 172,426.4 172,437.6" fill="black" transform="rotate(180,176,432)"/>
                <g class="text">
                  <text x="436" y="84">SRTP</text>
                  <text x="124" y="100">Encode</text>
                  <text x="280" y="100">Packetize</text>
                  <text x="440" y="100">Encrypt</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="200" y="260">E2E</text>
                  <text x="232" y="260">Key</text>
                  <text x="368" y="260">HBH</text>
                  <text x="400" y="260">Key</text>
                  <text x="584" y="260">Media</text>
                  <text x="220" y="276">Management</text>
                  <text x="388" y="276">Management</text>
                  <text x="588" y="276">Server</text>
                  <text x="196" y="340">SFrame</text>
                  <text x="364" y="340">SFrame</text>
                  <text x="200" y="356">Unprotect</text>
                  <text x="368" y="356">Unprotect</text>
                  <text x="200" y="372">(per-frame)</text>
                  <text x="372" y="372">(per-packet)</text>
                  <text x="436" y="420">SRTP</text>
                  <text x="124" y="436">Decode</text>
                  <text x="280" y="436">Depacketize</text>
                  <text x="440" y="436">Decrypt</text>
                  <text x="24" y="452">Bob</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
      +--------------------------------------------------------+
      |                                                        |
      |  +----------+      +-------------+      +-----------+  |
 .-.  |  |          |      |             |      |   SRTP    |  |
|   | |  |  Encode  |----->|  Packetize  |----->|  Encrypt  |-----------+
 '+'  |  |          |  ^   |             |  ^   |           |  |        |
 /|\  |  +----------+  |   +-----+-------+  |   +-----------+  |        |
/ + \ |                |         ^          |         ^        |        |
 / \  |              SFrame      |       SFrame       |        |        |
/   \ |              Protect     |       Protect      |        |        |
Alice |            (per-frame)   |     (per-packet)   |        |        |
      +--------------------------|--------------------|--------+        |
                                 |                    |                 v
                                 |                    |           +-----+------+
                       E2E Key   |          HBH Key   |           |   Media    |
                      Management |         Management |           |   Server   |
                                 |                    |           +-----+------+
                                 |                    |                 |
      +--------------------------|--------------------|--------+        |
 .-.  |              SFrame      |        SFrame      |        |        |
|   | |             Unprotect    |       Unprotect    |        |        |
 '+'  |            (per-frame)   |      (per-packet)  |        |        |
 /|\  |                 |        V           |        V        |        |
/ + \ |  +----------+   |  +-----+-------+   |  +-----------+  |        |
 / \  |  |          |   V  |             |   V  |   SRTP    |  |        |
/   \ |  |  Decode  |<-----| Depacketize |<-----|  Decrypt  |<----------+
 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="496" viewBox="0 0 496 320" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
              <path d="M 8,64 L 8,304" fill="none" stroke="black"/>
              <path d="M 24,32 L 24,256" fill="none" stroke="black"/>
              <path d="M 40,32 L 40,64" fill="none" stroke="black"/>
              <path d="M 72,32 L 72,64" fill="none" stroke="black"/>
              <path d="M 88,32 L 88,64" fill="none" stroke="black"/>
              <path d="M 128,32 L 128,64" fill="none" stroke="black"/>
              <path d="M 472,32 L 472,256" fill="none" stroke="black"/>
              <path d="M 488,32 L 488,304" fill="none" stroke="black"/>
              <path d="M 24,32 L 472,32" fill="none" stroke="black"/>
              <path d="M 24,64 L 472,64" fill="none" stroke="black"/>
              <path d="M 24,224 L 472,224" fill="none" stroke="black"/>
              <path d="M 24,256 L 472,256" fill="none" stroke="black"/>
              <path d="M 8,304 L 40,304" fill="none" stroke="black"/>
              <path d="M 464,304 L 488,304" fill="none" stroke="black"/>
              <g class="text">
                <text x="480" y="36">^</text>
                <text x="32" y="52">S</text>
                <text x="56" y="52">LEN</text>
                <text x="80" y="52">X</text>
                <text x="104" y="52">KID</text>
                <text x="224" y="52">Frame</text>
                <text x="280" y="52">Counter</text>
                <text x="16" y="68">^</text>
                <text x="216" y="148">Encrypted</text>
                <text x="276" y="148">Data</text>
                <text x="16" y="228">&gt;</text>
                <text x="480" y="228">&lt;</text>
                <text x="220" y="244">Authentication</text>
                <text x="296" y="244">Tag</text>
                <text x="88" y="308">Encrypted</text>
                <text x="160" y="308">Portion</text>
                <text x="336" y="308">Authenticated</text>
                <text x="424" y="308">Portion</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
  +-+---+-+----+------------------------------------------+^+
  |S|LEN|X|KID |         Frame 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.  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>
        <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">
                <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">
                <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">
              <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 ciphersuite in use (see <xref target="ciphersuites"/>).  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 of a key for the encryption algorithm, in bytes</li>
          <li>
            <tt>AEAD.Nn</tt> - The size of a nonce for the encryption algorithm, in bytes</li>
          <li>
            <tt>AEAD.Nt</tt> - The overhead of the encryption algorithm, in bytes (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[
sframe_secret = HKDF-Extract(base_key, 'SFrame10')
sframe_key = HKDF-Expand(sframe_secret, 'key', AEAD.Nk)
sframe_salt = HKDF-Expand(sframe_secret, 'salt', AEAD.Nn)
]]></artwork>
          <t>The hash function used for HKDF is determined by the ciphersuite in use.</t>
        </section>
        <section anchor="encryption">
          <name>Encryption</name>
          <t>SFrame encryption uses the AEAD encryption algorithm for the ciphersuite 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.</t>
          <artwork><![CDATA[
def encrypt(S, 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>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 visibile to the SFU (e.g., an RTP
header extension).</t>
          <t>The encrypted payload is then passed to a generic RTP packetized to construct
the RTP packets and encrypt it using SRTP keys for the HBH encryption to the
media server.</t>
          <figure>
            <name>Encryption flow with per-frame encryption</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="752" width="504" viewBox="0 0 504 752" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
                  <path d="M 8,176 L 8,336" fill="none" stroke="black"/>
                  <path d="M 8,640 L 8,736" fill="none" stroke="black"/>
                  <path d="M 32,32 L 32,64" fill="none" stroke="black"/>
                  <path d="M 32,344 L 32,632" fill="none" stroke="black"/>
                  <path d="M 56,176 L 56,336" fill="none" stroke="black"/>
                  <path d="M 72,592 L 72,632" fill="none" stroke="black"/>
                  <path d="M 80,224 L 80,256" fill="none" stroke="black"/>
                  <path d="M 96,64 L 96,160" fill="none" stroke="black"/>
                  <path d="M 136,640 L 136,736" 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,400 L 192,512" fill="none" stroke="black"/>
                  <path d="M 192,640 L 192,736" fill="none" stroke="black"/>
                  <path d="M 232,256 L 232,288" fill="none" stroke="black"/>
                  <path d="M 256,128 L 256,392" fill="none" stroke="black"/>
                  <path d="M 256,512 L 256,528" fill="none" stroke="black"/>
                  <path d="M 256,560 L 256,632" fill="none" stroke="black"/>
                  <path d="M 320,32 L 320,128" fill="none" stroke="black"/>
                  <path d="M 320,400 L 320,512" fill="none" stroke="black"/>
                  <path d="M 320,640 L 320,736" fill="none" stroke="black"/>
                  <path d="M 368,640 L 368,736" fill="none" stroke="black"/>
                  <path d="M 432,592 L 432,632" fill="none" stroke="black"/>
                  <path d="M 496,640 L 496,736" 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 192,400 L 320,400" fill="none" stroke="black"/>
                  <path d="M 192,512 L 320,512" fill="none" stroke="black"/>
                  <path d="M 72,592 L 328,592" fill="none" stroke="black"/>
                  <path d="M 360,592 L 432,592" fill="none" stroke="black"/>
                  <path d="M 8,640 L 136,640" fill="none" stroke="black"/>
                  <path d="M 192,640 L 320,640" fill="none" stroke="black"/>
                  <path d="M 368,640 L 496,640" fill="none" stroke="black"/>
                  <path d="M 8,672 L 136,672" fill="none" stroke="black"/>
                  <path d="M 8,736 L 136,736" fill="none" stroke="black"/>
                  <path d="M 192,736 L 320,736" fill="none" stroke="black"/>
                  <path d="M 368,736 L 496,736" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="440,632 428,626.4 428,637.6" fill="black" transform="rotate(90,432,632)"/>
                  <polygon class="arrowhead" points="264,632 252,626.4 252,637.6" fill="black" transform="rotate(90,256,632)"/>
                  <polygon class="arrowhead" points="264,392 252,386.4 252,397.6" fill="black" transform="rotate(90,256,392)"/>
                  <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="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,632 68,626.4 68,637.6" fill="black" transform="rotate(90,72,632)"/>
                  <polygon class="arrowhead" points="40,632 28,626.4 28,637.6" fill="black" transform="rotate(90,32,632)"/>
                  <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="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="256" y="452">encrypted</text>
                    <text x="256" y="468">frame</text>
                    <text x="208" y="548">generic</text>
                    <text x="256" y="548">RTP</text>
                    <text x="312" y="548">packetize</text>
                    <text x="344" y="596">...</text>
                    <text x="44" y="660">SFrame</text>
                    <text x="100" y="660">header</text>
                    <text x="240" y="692">payload</text>
                    <text x="288" y="692">2/N</text>
                    <text x="344" y="692">...</text>
                    <text x="416" y="692">payload</text>
                    <text x="464" y="692">N/N</text>
                    <text x="56" y="708">payload</text>
                    <text x="104" y="708">1/N</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
   +----------------+  +---------------+
   | frame metadata |  |               |
   +-------+--------+  |               |
           |           |     frame     |
           |           |               |
           |           |               |
           |           +-------+-------+
           |                   |
header ----+------------------>| AAD
+-----+                        |
|  S  |                        |
+-----+                        |
| KID +--+--> sframe_key ----->| Key
|     |  |                     |
|     |  +--> sframe_salt --+  |
+-----+                     |  |
| CTR +---------------------+->| Nonce
|     |                        |
|     |                        |
+-----+                        |
   |                       AEAD.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 anchor="decryption">
          <name>Decryption</name>
          <t>Before decrypting, a client needs to assemble a full SFrame ciphertext.  When
SFrame is applied per-packet, this is done by extracting the payload of a
decrypted SRTP packet.  When SFrame is applied per-frame, the receiving client
buffers all packets that belongs to the same frame using the frame beginning and
ending marks in the generic RTP frame header extension. Once all packets are
available and in order, the receiver forms an SFrame ciphertext by concatenating
their payloads, 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):
  CTR, KID, ciphertext = parse_ciphertext(sframe)

  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 anchor="duplicate-frames">
          <name>Duplicate Frames</name>
          <t>Unlike messaging application, in video calls, receiving a duplicate frame
doesn't necessary mean the client is under a replay attack, there are other
reasons that might cause this, for example the sender might just be sending them
in case of packet loss. SFrame decryptors use the highest received frame counter
to protect against this. It allows only older frame pithing a short interval to
support out of order delivery.</t>
        </section>
      </section>
      <section anchor="ciphersuites">
        <name>Ciphersuites</name>
        <t>Each SFrame session uses a single ciphersuite 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 ciphersuites:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Value</th>
              <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>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0x0001</td>
              <td align="left">
                <tt>AES_CTR_128_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>
              <td align="left">RFC XXXX</td>
            </tr>
            <tr>
              <td align="left">0x0002</td>
              <td align="left">
                <tt>AES_CTR_128_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>
              <td align="left">RFC XXXX</td>
            </tr>
            <tr>
              <td align="left">0x0003</td>
              <td align="left">
                <tt>AES_CTR_128_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>
              <td align="left">RFC XXXX</td>
            </tr>
            <tr>
              <td align="left">0x0004</td>
              <td align="left">
                <tt>AES_GCM_128_SHA256_128</tt></td>
              <td align="left">32</td>
              <td align="left">16</td>
              <td align="left">12</td>
              <td align="left">16</td>
              <td align="left">RFC XXXX</td>
            </tr>
            <tr>
              <td align="left">0x0005</td>
              <td align="left">
                <tt>AES_GCM_256_SHA512_128</tt></td>
              <td align="left">64</td>
              <td align="left">32</td>
              <td align="left">12</td>
              <td align="left">16</td>
              <td align="left">RFC XXXX</td>
            </tr>
          </tbody>
        </table>
        <!-- RFC EDITOR: Please replace XXXX above with the RFC number assigned to this
document -->

<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 ciphersuites might be
configured for different media streams.  For example, in order to conserve
bandwidth, a session might use a ciphersuite with eighty-bit tags for video frames
and another ciphersuite 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 and
<tt>Nh</tt> represents the output size of the hash function:</t>
          <artwork><![CDATA[
def derive_subkeys(sframe_key):
  aead_secret = HKDF-Extract(sframe_key, 'SFrame10 AES CTR AEAD')
  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>tag_len</tt> fixed by the ciphersuite.</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)
  auth_data = aad_len + ct_len + nonce + aad + ct
  tag = HMAC(auth_key, auth_data)
  return truncate(tag, tag_len)

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 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 key
when end points joins 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>
      <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, for example the RTP SSRC.  SFrame KID
values are then used to distinguish generations of the sender's key.  At the
beginning of a call, each sender encrypts with KID=0.  Thereafter, the sender
can ratchet their key forward for forward secrecy:</t>
        <artwork><![CDATA[
sender_key[i+1] = HKDF-Expand(
                    HKDF-Extract(sender_key[i], 'SFrame10 ratchet'),
                      '', AEAD.Nk)
]]></artwork>
        <t>The sender signals such an update by incrementing their KID value.  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>In SFrame, we derive per-sender <tt>base_key</tt> values from the group secret for an
epoch, and use the KID field to signal the epoch and sender index.  First, we
use the MLS exporter to compute a shared SFrame secret for the epoch.</t>
        <artwork><![CDATA[
sframe_epoch_secret = MLS-Exporter("SFrame 10 MLS", "", AEAD.Nk)

sender_base_key[index] = HKDF-Expand(sframe_epoch_secret,
                           encode_big_endian(index, 4), AEAD.Nk)
]]></artwork>
        <t>For compactness, do not send the whole epoch number.  Instead, we send only its
low-order E bits.  Note that E effectively defines a re-ordering window, since
no more than 2^E epoch 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.  (Sender indices cannot be
similarly compressed.)</t>
        <artwork><![CDATA[
KID = (sender_index << E) + (epoch % (1 << E))
]]></artwork>
        <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>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="384" width="328" viewBox="0 0 328 384" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px">
              <path d="M 80,48 L 80,352" fill="none" stroke="black"/>
              <path d="M 104,64 L 104,96" fill="none" stroke="black"/>
              <path d="M 104,192 L 104,224" fill="none" stroke="black"/>
              <path d="M 104,272 L 104,336" fill="none" stroke="black"/>
              <path d="M 80,64 L 120,64" fill="none" stroke="black"/>
              <path d="M 208,64 L 224,64" fill="none" stroke="black"/>
              <path d="M 104,96 L 120,96" fill="none" stroke="black"/>
              <path d="M 208,96 L 224,96" fill="none" stroke="black"/>
              <path d="M 80,144 L 120,144" fill="none" stroke="black"/>
              <path d="M 200,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 224,272" fill="none" stroke="black"/>
              <path d="M 104,304 L 120,304" fill="none" stroke="black"/>
              <path d="M 200,304 L 224,304" fill="none" stroke="black"/>
              <path d="M 104,336 L 120,336" fill="none" stroke="black"/>
              <path d="M 208,336 L 224,336" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="232,336 220,330.4 220,341.6" fill="black" transform="rotate(0,224,336)"/>
              <polygon class="arrowhead" points="232,304 220,298.4 220,309.6" fill="black" transform="rotate(0,224,304)"/>
              <polygon class="arrowhead" points="232,272 220,266.4 220,277.6" fill="black" transform="rotate(0,224,272)"/>
              <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,96 220,90.4 220,101.6" fill="black" transform="rotate(0,224,96)"/>
              <polygon class="arrowhead" points="232,64 220,58.4 220,69.6" fill="black" transform="rotate(0,224,64)"/>
              <g class="text">
                <text x="32" y="36">...</text>
                <text x="24" y="68">Epoch</text>
                <text x="60" y="68">17</text>
                <text x="164" y="68">index=33</text>
                <text x="248" y="68">KID</text>
                <text x="272" y="68">=</text>
                <text x="304" y="68">0x211</text>
                <text x="164" y="100">index=51</text>
                <text x="248" y="100">KID</text>
                <text x="272" y="100">=</text>
                <text x="304" y="100">0x331</text>
                <text x="24" y="148">Epoch</text>
                <text x="60" y="148">16</text>
                <text x="160" y="148">index=2</text>
                <text x="248" y="148">KID</text>
                <text x="272" y="148">=</text>
                <text x="300" y="148">0x20</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">14</text>
                <text x="160" y="276">index=3</text>
                <text x="248" y="276">KID</text>
                <text x="272" y="276">=</text>
                <text x="300" y="276">0x3e</text>
                <text x="160" y="308">index=7</text>
                <text x="248" y="308">KID</text>
                <text x="272" y="308">=</text>
                <text x="300" y="308">0x7e</text>
                <text x="164" y="340">index=20</text>
                <text x="248" y="340">KID</text>
                <text x="272" y="340">=</text>
                <text x="304" y="340">0x14e</text>
                <text x="32" y="372">...</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
  ...
         |
Epoch 17 +--+-- index=33 --> KID = 0x211
         |  |
         |  +-- index=51 --> KID = 0x331
         |
         |
Epoch 16 +--+-- index=2 ---> KID = 0x20
         |
         |
Epoch 15 +--+-- index=3 ---> KID = 0x3f
         |  |
         |  +-- index=5 ---> KID = 0x5f
         |
         |
Epoch 14 +--+-- index=3 ---> KID = 0x3e
         |  |
         |  +-- index=7 ---> KID = 0x7e
         |  |
         |  +-- index=20 --> KID = 0x14e
         |
  ...
]]></artwork>
        </artset>
      </section>
    </section>
    <section anchor="media-considerations">
      <name>Media Considerations</name>
      <section anchor="sfu">
        <name>SFU</name>
        <t>Selective Forwarding Units (SFUs) as described in <xref section="3.7" sectionFormat="of" target="RFC7667"/>
receives the RTP streams from each participant and selects 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 reduce the number of SDP O/A required to
establish a new RTP stream, the SFU may decide to reuse previously existing RTP
sessions or even pre-allocate a predefined number of RTP streams and choose in
each moment in time which participant media will be sending through it.</t>
          <t>This means that in the same 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 if 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 async 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 is
arrived and 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
MUST 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>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document makes no requests of IANA.</t>
    </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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="P. Eronen" initials="P." surname="Eronen">
              <organization/>
            </author>
            <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>
      </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">
              <organization/>
            </author>
            <author fullname="D. McGrew" initials="D." surname="McGrew">
              <organization/>
            </author>
            <author fullname="M. Naslund" initials="M." surname="Naslund">
              <organization/>
            </author>
            <author fullname="E. Carrara" initials="E." surname="Carrara">
              <organization/>
            </author>
            <author fullname="K. Norrman" initials="K." surname="Norrman">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="P. Jones" initials="P." surname="Jones">
              <organization/>
            </author>
            <author fullname="R. Barnes" initials="R." surname="Barnes">
              <organization/>
            </author>
            <author fullname="A.B. Roach" initials="A.B." surname="Roach">
              <organization/>
            </author>
            <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="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="19" month="December" year="2022"/>
            <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-17"/>
        </reference>
        <reference anchor="RFC7667">
          <front>
            <title>RTP Topologies</title>
            <author fullname="M. Westerlund" initials="M." surname="Westerlund">
              <organization/>
            </author>
            <author fullname="S. Wenger" initials="S." surname="Wenger">
              <organization/>
            </author>
            <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="I-D.murillo-perc-lite">
          <front>
            <title>End to End Media Encryption Procedures</title>
            <author fullname="Sergio Garcia Murillo" initials="S. G." surname="Murillo">
              <organization>CoSMo Software Consulting</organization>
            </author>
            <author fullname="Dr. Alex Gouaillard" initials="A." surname="Gouaillard">
              <organization>CoSMo Software Consulting</organization>
            </author>
            <date day="12" month="May" year="2020"/>
            <abstract>
              <t>   In some conferencing scenarios, it is desirable for an intermediary
   to be able to manipulate some RTP parameters, while still providing
   strong end-to-end security guarantees.  This document defines a
   procedure to perform end to end media authenticated encryption.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-murillo-perc-lite-01"/>
        </reference>
      </references>
    </references>
    <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="overhead">
      <name>Overhead</name>
      <t>The encryption overhead will vary between audio and video streams, because in
audio each packet is considered a separate frame, so it will always have extra
MAC and IV, however a video frame usually consists of multiple RTP packets.</t>
      <t>The number of bytes overhead per frame is calculated as the following</t>
      <artwork><![CDATA[
1 + FrameCounter length + 4
]]></artwork>
      <t>The constant 1 is the SFrame header byte and 4 bytes for the HBH authentication tag for both audio and video packets.</t>
      <section anchor="audio">
        <name>Audio</name>
        <t>Using three different audio frame durations</t>
        <ul spacing="normal">
          <li>20ms (50 packets/s)</li>
          <li>40ms (25 packets/s)</li>
          <li>100ms (10 packets/s)</li>
        </ul>
        <t>Up to 3 bytes frame counter (3.8 days of data for 20ms frame duration) and 4
bytes fixed MAC length.</t>
        <table>
          <thead>
            <tr>
              <th align="center">Counter len</th>
              <th align="center">Packets</th>
              <th align="center">Overhead</th>
              <th align="center">Overhead</th>
              <th align="center">Overhead</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center">bps@20ms</td>
              <td align="center">bps@40ms</td>
              <td align="center">bps@100ms</td>
            </tr>
            <tr>
              <td align="center">1</td>
              <td align="center">0-255</td>
              <td align="center">2400</td>
              <td align="center">1200</td>
              <td align="center">480</td>
            </tr>
            <tr>
              <td align="center">2</td>
              <td align="center">255 - 65K</td>
              <td align="center">2800</td>
              <td align="center">1400</td>
              <td align="center">560</td>
            </tr>
            <tr>
              <td align="center">3</td>
              <td align="center">65K - 16M</td>
              <td align="center">3200</td>
              <td align="center">1600</td>
              <td align="center">640</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="video">
        <name>Video</name>
        <t>The per-stream overhead bits per second as calculated for the following video
encodings:</t>
        <ul spacing="normal">
          <li>30fps @ 1000Kbps (4 packets per frame)</li>
          <li>30fps @ 512Kbps (2 packets per frame)</li>
          <li>15fps @ 200Kbps (2 packets per frame)</li>
          <li>7.5fps @ 30Kbps (1 packet per frame)</li>
        </ul>
        <t>Overhead <tt>bps = (Counter length + 1 + 4 ) * 8 * fps</tt></t>
        <table>
          <thead>
            <tr>
              <th align="center">Counter len</th>
              <th align="center">Frames</th>
              <th align="center">Overhead</th>
              <th align="center">Overhead</th>
              <th align="center">Overhead</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="center"> </td>
              <td align="center"> </td>
              <td align="center">bps@30fps</td>
              <td align="center">bps@15fps</td>
              <td align="center">bps@7.5fps</td>
            </tr>
            <tr>
              <td align="center">1</td>
              <td align="center">0-255</td>
              <td align="center">1440</td>
              <td align="center">1440</td>
              <td align="center">720</td>
            </tr>
            <tr>
              <td align="center">2</td>
              <td align="center">256 - 65K</td>
              <td align="center">1680</td>
              <td align="center">1680</td>
              <td align="center">840</td>
            </tr>
            <tr>
              <td align="center">3</td>
              <td align="center">56K - 16M</td>
              <td align="center">1920</td>
              <td align="center">1920</td>
              <td align="center">960</td>
            </tr>
            <tr>
              <td align="center">4</td>
              <td align="center">16M - 4B</td>
              <td align="center">2160</td>
              <td align="center">2160</td>
              <td align="center">1080</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="sframe-vs-perc-lite">
        <name>SFrame vs PERC-lite</name>
        <t><xref target="RFC8723"/> has significant overhead over SFrame because the overhead is per
packet, not per frame, and OHB (Original Header Block) which duplicates any RTP
header/extension field modified by the SFU.</t>
        <t><xref target="I-D.murillo-perc-lite"/>
          <eref target="https://mailarchive.ietf.org/arch/msg/perc/SB0qMHWz6EsDtz3yIEX0HWp5IEY/"/> is
slightly better because it doesn’t use the OHB anymore, however it still does
per packet encryption using SRTP.</t>
        <t>Below the the overheard in <xref target="I-D.murillo-perc-lite"/> implemented by Cosmos
Software which uses extra 11 bytes per packet to preserve the <tt>PT</tt>, <tt>SEQ_NUM</tt>,
<tt>TIME_STAMP</tt> and <tt>SSRC</tt> fields in addition to the extra MAC tag per packet.</t>
        <t><tt>
OverheadPerPacket = 11 + MAC length
Overhead bps = PacketPerSecond * OverHeadPerPacket * 8
</tt></t>
        <t>Similar to SFrame, we will assume the HBH authentication tag length will always
be 4 bytes for audio and video even though it is not the case in this
<xref target="I-D.murillo-perc-lite"/> implementation</t>
        <section anchor="audio-1">
          <name>Audio</name>
          <table>
            <thead>
              <tr>
                <th align="center">Overhead bps@20ms</th>
                <th align="center">Overhead  bps@40ms</th>
                <th align="center">Overhead bps@100ms</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="center">6000</td>
                <td align="center">3000</td>
                <td align="center">1200</td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="video-1">
          <name>Video</name>
          <table>
            <thead>
              <tr>
                <th align="center">Overhead  bps@30fps</th>
                <th align="center">Overhead  bps@15fps</th>
                <th align="center">Overhead  bps@7.5fps</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="center">(4 packets per frame)</td>
                <td align="center">(2 packets per frame)</td>
                <td align="center">(1 packet per frame)</td>
              </tr>
              <tr>
                <td align="center">14400</td>
                <td align="center">7200</td>
                <td align="center">3600</td>
              </tr>
            </tbody>
          </table>
          <t>For a conference with a single incoming audio stream (@ 50 pps) and 4 incoming
video streams (@200 Kbps), the savings in overhead is 34800 - 9600 = ~25 Kbps,
or ~3%.</t>
        </section>
      </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
ciphersuite, 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:         1700
Nonce:          42d662fbad5cd81eb3aad79a
Ciphertext:     1700c5095af9dbbbed6a952de114ea7b
                42768509f1ffc9749abb1e95bf4514d8
                d82a0eef4b5ecac16fa193977fa1aa1c
                9fa5c7e73093ab2a43
]]></artwork>
        <artwork><![CDATA[
KID:            0x7
CTR:            0x1
Header:         1701
Nonce:          42d662fbad5cd81eb3aad79b
Ciphertext:     1701559e262525382885c6c93be8f61a
                9064db2dd1e1e96ab1dbd829ca4af4f4
                5f2b97a4889217a3f8a2159fb8201b7d
                71db01702bd4bab5c7
]]></artwork>
        <artwork><![CDATA[
KID:            0x7
CTR:            0x2
Header:         1702
Nonce:          42d662fbad5cd81eb3aad798
Ciphertext:     17020a8f21e052eaa09e50da0a909d15
                6cc55b9ef2f2abbcca765f7af3cfb1af
                234e3eac1dbc376631c83cf1ff1f8ab3
                39dbc41044cc930d87
]]></artwork>
        <artwork><![CDATA[
KID:            0xf
CTR:            0xaa
Header:         190faa
Nonce:          42d662fbad5cd81eb3aad730
Ciphertext:     190faa9c65aa5b167873f25827f17bc3
                4879a4aaa6b38dd9584472e1849d5da5
                1555f288d08f03166a5f26af01794006
                255c88b58986246287c9
]]></artwork>
        <artwork><![CDATA[
KID:            0x1ff
CTR:            0xaa
Header:         1a01ffaa
Nonce:          42d662fbad5cd81eb3aad730
Ciphertext:     1a01ffaa9c65aa5b167873f25827f17b
                c34879a4aaa6b38dd9584472e1849d5d
                a51555f288d08f03166a5f26af017940
                06255c88b589863003872e
]]></artwork>
        <artwork><![CDATA[
KID:            0x1ff
CTR:            0xaaaa
Header:         2a01ffaaaa
Nonce:          42d662fbad5cd81eb3aa7d30
Ciphertext:     2a01ffaaaa990cbeb4ae2e3a76be8bb9
                54b62591e791d0fa53c0553bc1d1e021
                d270b1a10688cd89195203b019789253
                73b04f9c08c3a4e5fb0173ef
]]></artwork>
        <artwork><![CDATA[
KID:            0xffffffffffffff
CTR:            0xffffffffffffff
Header:         7fffffffffffffffffffffffffffff
Nonce:          42d662fbada327e14c552865
Ciphertext:     7fffffffffffffffffffffffffffff41
                2c43c8077c286f7df3dd9988d1bd033f
                1067493e09421e5bfc363e50a3c803b4
                da9239514cb924dbcb5f33e33112083e
                99103ef272e8
]]></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:         1700
Nonce:          77fbf5f1d82c73f6d2b353c9
Ciphertext:     17009d89e5753e06edf3025f1ccd70b0
                95ebaf10c250e11da740f50f57b6ce86
                0d7321dfa49688a2cd6c6d9a71ae9d5c
                14ad0978efe0216ae5f6788ffe
]]></artwork>
        <artwork><![CDATA[
KID:            0x7
CTR:            0x1
Header:         1701
Nonce:          77fbf5f1d82c73f6d2b353c8
Ciphertext:     1701becd2e9d10e3eed586491b3e0ece
                dba89407ae2151787c5117b55707d6b8
                a0754f4dc937e30ebdf7cafbd3769d65
                85d7991b1aa6f36e418fdec6fa
]]></artwork>
        <artwork><![CDATA[
KID:            0x7
CTR:            0x2
Header:         1702
Nonce:          77fbf5f1d82c73f6d2b353cb
Ciphertext:     170298508be6b16d034f15b504ced45a
                86d1bb43ed7cd3a62bf25557d1b082b0
                4e8e6ba6fe76160835dd8953e1be9640
                c988627ea4f1bb846e87523f8b
]]></artwork>
        <artwork><![CDATA[
KID:            0xf
CTR:            0xaa
Header:         190faa
Nonce:          77fbf5f1d82c73f6d2b35363
Ciphertext:     190faae7eec4b0556ddfb8068998351c
                d670ce95f0ce9cd4c6dca2eeee73fb14
                d20a0d0fd487337ed43fa7f98dad0995
                b8b870325aa349ac0590c2745d5d
]]></artwork>
        <artwork><![CDATA[
KID:            0x1ff
CTR:            0xaa
Header:         1a01ffaa
Nonce:          77fbf5f1d82c73f6d2b35363
Ciphertext:     1a01ffaae7eec4b0556ddfb806899835
                1cd670ce95f0ce9cd4c6dca2eeee73fb
                14d20a0d0fd487337ed43fa7f98dad09
                95b8b870325aa31d576e8a34093320
]]></artwork>
        <artwork><![CDATA[
KID:            0x1ff
CTR:            0xaaaa
Header:         2a01ffaaaa
Nonce:          77fbf5f1d82c73f6d2b3f963
Ciphertext:     2a01ffaaaa8c1789aa0abcd6abc27006
                aae4df5cba4ba07f8113080e9726baac
                d16c18539974a6204a36b9dc3dcd36ed
                9ab48e590d95d4ad1b05f8375508c55d
]]></artwork>
        <artwork><![CDATA[
KID:            0xffffffffffffff
CTR:            0xffffffffffffff
Header:         7fffffffffffffffffffffffffffff
Nonce:          77fbf5f1d8d38c092d4cac36
Ciphertext:     7fffffffffffffffffffffffffffffa9
                bc6c7edde0fdfd13255a5b145c5ce84d
                b8f8960858eb998b8ea8f3e770160150
                813c5806441b64251bdd2be9e8cec138
                6b6f5e73eaa6c19e6555
]]></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:         1700
Nonce:          a80478b3f6fba19983d540d5
Ciphertext:     17000e426255e47ed70dd7d15d69d759
                bf459032ca15f5e8b2a91e7d348aa7c1
                86d403f620801c495b1717a35097411a
                a97cbb140671eb3b49ac3775926db74d
                57b91e8e6c
]]></artwork>
        <artwork><![CDATA[
KID:            0x7
CTR:            0x1
Header:         1701
Nonce:          a80478b3f6fba19983d540d4
Ciphertext:     170103bbafa34ada8a6b9f2066bc34a1
                959d87384c9f4b1ce34fed58e938bde1
                43393910b1aeb55b48d91d5b0db3ea67
                e3d0e02b843afd41630c940b1948e72d
                d45396a43a
]]></artwork>
        <artwork><![CDATA[
KID:            0x7
CTR:            0x2
Header:         1702
Nonce:          a80478b3f6fba19983d540d7
Ciphertext:     170258d58adebd8bf6f3cc0c1fcacf34
                ba4d7a763b2683fe302a57f1be7f2a27
                4bf81b2236995fec1203cadb146cd402
                e1c52d5e6a10989dfe0f4116da1ee4c2
                fad0d21f8f
]]></artwork>
        <artwork><![CDATA[
KID:            0xf
CTR:            0xaa
Header:         190faa
Nonce:          a80478b3f6fba19983d5407f
Ciphertext:     190faad0b1743bf5248f90869c945636
                6d55724d16bbe08060875815565e90b1
                14f9ccbdba192422b33848a1ae1e3bd2
                66a001b2f5bb727112772e0072ea8679
                ca1850cf11d8
]]></artwork>
        <artwork><![CDATA[
KID:            0x1ff
CTR:            0xaa
Header:         1a01ffaa
Nonce:          a80478b3f6fba19983d5407f
Ciphertext:     1a01ffaad0b1743bf5248f90869c9456
                366d55724d16bbe08060875815565e90
                b114f9ccbdba192422b33848a1ae1e3b
                d266a001b2f5bbc9c63bd3973c19bd57
                127f565380ed4a
]]></artwork>
        <artwork><![CDATA[
KID:            0x1ff
CTR:            0xaaaa
Header:         2a01ffaaaa
Nonce:          a80478b3f6fba19983d5ea7f
Ciphertext:     2a01ffaaaa9de65e21e4f1ca2247b879
                43c03c5cb7b182090e93d508dcfb76e0
                8174c6397356e682d2eaddabc0b3c101
                8d2c13c3570f61c1beaab805f27b565e
                1329a823a7a649b6
]]></artwork>
        <artwork><![CDATA[
KID:            0xffffffffffffff
CTR:            0xffffffffffffff
Header:         7fffffffffffffffffffffffffffff
Nonce:          a80478b3f6045e667c2abf2a
Ciphertext:     7fffffffffffffffffffffffffffff09
                981bdcdad80e380b6f74cf6afdbce946
                839bedadd57578bfcd809dbcea535546
                cc24660613d2761adea852155785011e
                633534f4ecc3b8257c8d34321c27854a
                1422
]]></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:         1700
Nonce:          31ed26f90a072e6aee646298
Ciphertext:     1700f3e297c1e95207710bd31ccc4ba3
                96fbef7b257440bde638ff0f3c891154
                0136df61b26220249d6c432c245ae8d5
                5ef45bfccf32530a15aeaaf313a03838
                e51bd45652
]]></artwork>
        <artwork><![CDATA[
KID:            0x7
CTR:            0x1
Header:         1701
Nonce:          31ed26f90a072e6aee646299
Ciphertext:     170193268b0bf030071bff443bb6b447
                1bdfb1cc81bc9625f4697b0336ff4665
                d15f152f02169448d8a967fb06359a87
                d2145398de0ce3fbe257b0992a3da153
                7590459f3c
]]></artwork>
        <artwork><![CDATA[
KID:            0x7
CTR:            0x2
Header:         1702
Nonce:          31ed26f90a072e6aee64629a
Ciphertext:     1702649691ba27c4c01a41280fba4657
                c03fa7fe21c8f5c862e9094227c3ca3e
                c0d9468b1a2cb060ff0978f25a24e6b1
                06f5a6e1053c1b8f5fce794d88a0e481
                8c081e18ea
]]></artwork>
        <artwork><![CDATA[
KID:            0xf
CTR:            0xaa
Header:         190faa
Nonce:          31ed26f90a072e6aee646232
Ciphertext:     190faa2858c10b5ddd231c1f26819490
                521678603a050448d563c503b1fd890d
                02ead01d754f074ecb6f32da9b2f3859
                f380b4f47d4edd1e15f42f9a2d7ecfac
                99067e238321
]]></artwork>
        <artwork><![CDATA[
KID:            0x1ff
CTR:            0xaa
Header:         1a01ffaa
Nonce:          31ed26f90a072e6aee646232
Ciphertext:     1a01ffaa2858c10b5ddd231c1f268194
                90521678603a050448d563c503b1fd89
                0d02ead01d754f074ecb6f32da9b2f38
                59f380b4f47d4e3bf7040eb10ec25b81
                26b2ce7b1d9d31
]]></artwork>
        <artwork><![CDATA[
KID:            0x1ff
CTR:            0xaaaa
Header:         2a01ffaaaa
Nonce:          31ed26f90a072e6aee64c832
Ciphertext:     2a01ffaaaad9bc6a258a07d210a814d5
                45eca70321c0e87498ada6e5c708b7ea
                d162ffcf4fbaba1eb82650590a87122b
                4d95fe36bd88b278812166d26e046ed0
                a530b7ee232ee0f2
]]></artwork>
        <artwork><![CDATA[
KID:            0xffffffffffffff
CTR:            0xffffffffffffff
Header:         7fffffffffffffffffffffffffffff
Nonce:          31ed26f90af8d195119b9d67
Ciphertext:     7fffffffffffffffffffffffffffffaf
                480d4779ce0c02b5137ee6a61e026c04
                ac999cb0c97319feceeb258d58df23bc
                e14979e5c67a431777b34498062e72f9
                39ca42ec84ffbc7b50eff923f515a2df
                760c
]]></artwork>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
IhzI9sYAAA==

-->

</rfc>
