<?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.7.1 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-sframe-enc-04" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.2 -->
  <front>
    <title abbrev="SFrame">Secure Frame (SFrame)</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-sframe-enc-04"/>
    <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="October" day="22"/>
    <area>Applications and Real-Time</area>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 55?>

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

<section anchor="introduction">
      <name>Introduction</name>
      <t>Modern multi-party video call systems use Selective Forwarding Unit (SFU)
servers to efficiently route media streams to call endpoints based on factors such
as available bandwidth, desired video size, codec support, and other factors. An
SFU typically does not need access to the media content of the conference,
allowing for the media to be "end-to-end" encrypted so that it cannot be
decrypted by the SFU. In order for the SFU to work properly, though, it usually
needs to be able to access RTP metadata and RTCP feedback messages, which is not
possible if all RTP/RTCP traffic is end-to-end encrypted.</t>
      <t>As such, two layers of encryptions and authentication are required:</t>
      <ol spacing="normal" type="1"><li>
          <t>Hop-by-hop (HBH) encryption of media, metadata, and feedback messages
between the the endpoints and SFU</t>
        </li>
        <li>
          <t>End-to-end (E2E) encryption of media between the endpoints</t>
        </li>
      </ol>
      <t>The Secure Real-Time Protocol (SRTP) is already widely used for HBH encryption
<xref target="RFC3711"/>. The SRTP "double encryption" scheme defines a way to do E2E
encryption in SRTP <xref target="RFC8723"/>. Unfortunately, this scheme has poor efficiency
and high complexity, and its entanglement with RTP makes it unworkable in
several realistic SFU scenarios.</t>
      <t>This document proposes a new end-to-end encryption mechanism known as SFrame,
specifically designed to work in group conference calls with SFUs. SFrame is a
general encryption framing that can be used to protect media payloads, agnostic
of transport.</t>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in
BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all
capitals, as shown here.</t>
      <dl>
        <dt>IV:</dt>
        <dd>
          <t>Initialization Vector</t>
        </dd>
        <dt>MAC:</dt>
        <dd>
          <t>Message Authentication Code</t>
        </dd>
        <dt>E2EE:</dt>
        <dd>
          <t>End to End Encryption</t>
        </dd>
        <dt>HBH:</dt>
        <dd>
          <t>Hop By Hop</t>
        </dd>
      </dl>
      <t>We use "Selective Forwarding Unit (SFU)" and "media stream" in a less formal sense
than in <xref target="RFC7656"/>.  An SFU is a selective switching function for media
payloads, and a media stream a sequence of media payloads, in both cases
regardless of whether those media payloads are transported over RTP or some
other protocol.</t>
    </section>
    <section anchor="goals">
      <name>Goals</name>
      <t>SFrame is designed to be a suitable E2EE protection scheme for conference call
media in a broad range of scenarios, as outlined by the following goals:</t>
      <ol spacing="normal" type="1"><li>
          <t>Provide an secure E2EE mechanism for audio and video in conference calls
that can be used with arbitrary SFU servers.</t>
        </li>
        <li>
          <t>Decouple media encryption from key management to allow SFrame to be used
with an arbitrary key management system.</t>
        </li>
        <li>
          <t>Minimize packet expansion to allow successful conferencing in as many
network conditions as possible.</t>
        </li>
        <li>
          <t>Independence from the underlying transport, including use in non-RTP
transports, e.g., WebTransport <xref target="I-D.ietf-webtrans-overview"/>.</t>
        </li>
        <li>
          <t>When used with RTP and its associated error resilience mechanisms, i.e., RTX
and FEC, require no special handling for RTX and FEC packets.</t>
        </li>
        <li>
          <t>Minimize the changes needed in SFU servers.</t>
        </li>
        <li>
          <t>Minimize the changes needed in endpoints.</t>
        </li>
        <li>
          <t>Work with the most popular audio and video codecs used in conferencing
scenarios.</t>
        </li>
      </ol>
    </section>
    <section anchor="sframe">
      <name>SFrame</name>
      <t>This document defines an encryption mechanism that provides effective end-to-end
encryption, is simple to implement, has no dependencies on RTP, and minimizes
encryption bandwidth overhead. Because SFrame can encrypt a full frame, rather
than individual packets, bandwidth overhead can be reduced by adding encryption
overhead only once per media frame, instead of once per packet.</t>
      <section anchor="application-context">
        <name>Application Context</name>
        <t>SFrame is a general encryption framing, intended to be used as an E2E encryption
layer over an underlying HBH-encrypted transport such as SRTP or QUIC
<xref target="RFC3711"/><xref target="I-D.ietf-moq-transport"/>.</t>
        <t>The scale at which SFrame encryption is applied to media determines the overall
amount of overhead that SFrame adds to the media stream, as well as the
engineering complexity involved in integrating SFrame into a particular
environment. Two patterns are common: Either using SFrame to encrypt whole
media frames (per-frame) or individual transport-level media payloads
(per-packet).</t>
        <t>For example, <xref target="media-stack"/> shows a typical media sender stack that takes media
in from some source, encodes it into frames, divides those frames into media
packets, and then sends those payloads in SRTP packets. The receiver stack
performs the reverse operations, reassembling frames from SRTP packets and
decoding.  Arrows indicate two different ways that SFrame protection could be
integrated into this media stack, to encrypt whole frames or individual media
packets.</t>
        <t>Applying SFrame per-frame in this system offers higher efficiency, but may
require a more complex integration in environments where depacketization relies
on the content of media packets. Applying SFrame per-packet avoids this
complexity, at the cost of higher bandwidth consumption.  Some quantitative
discussion of these trade-offs is provided in <xref target="overhead-analysis"/>.</t>
        <t>As noted above, however, SFrame is a general media encapsulation, and can be
applied in other scenarios.  The important thing is that the sender and
receivers of an SFrame-encrypted object agree on that object's semantics.
SFrame does not provide this agreement; it must be arranged by the application.</t>
        <figure anchor="media-stack">
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="576" width="632" viewBox="0 0 632 576" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 24,112 L 24,144" fill="none" stroke="black"/>
                <path d="M 24,432 L 24,464" fill="none" stroke="black"/>
                <path d="M 56,32 L 56,240" fill="none" stroke="black"/>
                <path d="M 56,352 L 56,560" fill="none" stroke="black"/>
                <path d="M 80,64 L 80,128" fill="none" stroke="black"/>
                <path d="M 80,464 L 80,528" fill="none" stroke="black"/>
                <path d="M 168,64 L 168,128" fill="none" stroke="black"/>
                <path d="M 168,464 L 168,528" fill="none" stroke="black"/>
                <path d="M 200,104 L 200,144" fill="none" stroke="black"/>
                <path d="M 200,208 L 200,384" fill="none" stroke="black"/>
                <path d="M 200,448 L 200,488" fill="none" stroke="black"/>
                <path d="M 224,64 L 224,128" fill="none" stroke="black"/>
                <path d="M 224,464 L 224,528" fill="none" stroke="black"/>
                <path d="M 336,64 L 336,128" fill="none" stroke="black"/>
                <path d="M 336,464 L 336,528" fill="none" stroke="black"/>
                <path d="M 360,104 L 360,144" fill="none" stroke="black"/>
                <path d="M 360,208 L 360,384" fill="none" stroke="black"/>
                <path d="M 368,448 L 368,488" fill="none" stroke="black"/>
                <path d="M 392,64 L 392,128" fill="none" stroke="black"/>
                <path d="M 392,464 L 392,528" fill="none" stroke="black"/>
                <path d="M 440,136 L 440,456" fill="none" stroke="black"/>
                <path d="M 488,64 L 488,128" fill="none" stroke="black"/>
                <path d="M 488,464 L 488,528" fill="none" stroke="black"/>
                <path d="M 512,32 L 512,88" fill="none" stroke="black"/>
                <path d="M 512,104 L 512,240" fill="none" stroke="black"/>
                <path d="M 512,352 L 512,488" fill="none" stroke="black"/>
                <path d="M 512,504 L 512,560" fill="none" stroke="black"/>
                <path d="M 552,272 L 552,320" fill="none" stroke="black"/>
                <path d="M 584,96 L 584,264" fill="none" stroke="black"/>
                <path d="M 584,320 L 584,496" fill="none" stroke="black"/>
                <path d="M 624,272 L 624,320" fill="none" stroke="black"/>
                <path d="M 56,32 L 512,32" fill="none" stroke="black"/>
                <path d="M 80,64 L 168,64" fill="none" stroke="black"/>
                <path d="M 224,64 L 336,64" fill="none" stroke="black"/>
                <path d="M 392,64 L 488,64" fill="none" stroke="black"/>
                <path d="M 176,96 L 216,96" fill="none" stroke="black"/>
                <path d="M 344,96 L 384,96" fill="none" stroke="black"/>
                <path d="M 496,96 L 584,96" fill="none" stroke="black"/>
                <path d="M 80,128 L 168,128" fill="none" stroke="black"/>
                <path d="M 224,128 L 336,128" fill="none" stroke="black"/>
                <path d="M 392,128 L 488,128" fill="none" stroke="black"/>
                <path d="M 56,240 L 192,240" fill="none" stroke="black"/>
                <path d="M 208,240 L 352,240" fill="none" stroke="black"/>
                <path d="M 368,240 L 432,240" fill="none" stroke="black"/>
                <path d="M 448,240 L 512,240" fill="none" stroke="black"/>
                <path d="M 552,272 L 624,272" fill="none" stroke="black"/>
                <path d="M 200,304 L 232,304" fill="none" stroke="black"/>
                <path d="M 336,304 L 360,304" fill="none" stroke="black"/>
                <path d="M 552,320 L 624,320" fill="none" stroke="black"/>
                <path d="M 56,352 L 192,352" fill="none" stroke="black"/>
                <path d="M 208,352 L 352,352" fill="none" stroke="black"/>
                <path d="M 368,352 L 432,352" fill="none" stroke="black"/>
                <path d="M 448,352 L 512,352" fill="none" stroke="black"/>
                <path d="M 80,464 L 168,464" fill="none" stroke="black"/>
                <path d="M 224,464 L 336,464" fill="none" stroke="black"/>
                <path d="M 392,464 L 488,464" fill="none" stroke="black"/>
                <path d="M 176,496 L 216,496" fill="none" stroke="black"/>
                <path d="M 344,496 L 384,496" fill="none" stroke="black"/>
                <path d="M 496,496 L 584,496" fill="none" stroke="black"/>
                <path d="M 80,528 L 168,528" fill="none" stroke="black"/>
                <path d="M 224,528 L 336,528" fill="none" stroke="black"/>
                <path d="M 392,528 L 488,528" fill="none" stroke="black"/>
                <path d="M 56,560 L 512,560" fill="none" stroke="black"/>
                <path d="M 24,464 L 40,496" fill="none" stroke="black"/>
                <path d="M 24,432 L 40,464" fill="none" stroke="black"/>
                <path d="M 24,144 L 40,176" fill="none" stroke="black"/>
                <path d="M 24,112 L 40,144" fill="none" stroke="black"/>
                <path d="M 8,144 L 24,112" fill="none" stroke="black"/>
                <path d="M 8,176 L 24,144" fill="none" stroke="black"/>
                <path d="M 8,464 L 24,432" fill="none" stroke="black"/>
                <path d="M 8,496 L 24,464" fill="none" stroke="black"/>
                <path d="M 24,80 C 15.16936,80 8,87.16936 8,96" fill="none" stroke="black"/>
                <path d="M 24,80 C 32.83064,80 40,87.16936 40,96" fill="none" stroke="black"/>
                <path d="M 24,112 C 15.16936,112 8,104.83064 8,96" fill="none" stroke="black"/>
                <path d="M 24,112 C 32.83064,112 40,104.83064 40,96" fill="none" stroke="black"/>
                <path d="M 24,400 C 15.16936,400 8,407.16936 8,416" fill="none" stroke="black"/>
                <path d="M 24,400 C 32.83064,400 40,407.16936 40,416" fill="none" stroke="black"/>
                <path d="M 24,432 C 15.16936,432 8,424.83064 8,416" fill="none" stroke="black"/>
                <path d="M 24,432 C 32.83064,432 40,424.83064 40,416" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="592,264 580,258.4 580,269.6" fill="black" transform="rotate(90,584,264)"/>
                <polygon class="arrowhead" points="504,496 492,490.4 492,501.6" fill="black" transform="rotate(180,496,496)"/>
                <polygon class="arrowhead" points="448,456 436,450.4 436,461.6" fill="black" transform="rotate(90,440,456)"/>
                <polygon class="arrowhead" points="448,136 436,130.4 436,141.6" fill="black" transform="rotate(270,440,136)"/>
                <polygon class="arrowhead" points="392,96 380,90.4 380,101.6" fill="black" transform="rotate(0,384,96)"/>
                <polygon class="arrowhead" points="376,488 364,482.4 364,493.6" fill="black" transform="rotate(90,368,488)"/>
                <polygon class="arrowhead" points="368,384 356,378.4 356,389.6" fill="black" transform="rotate(90,360,384)"/>
                <polygon class="arrowhead" points="368,208 356,202.4 356,213.6" fill="black" transform="rotate(270,360,208)"/>
                <polygon class="arrowhead" points="368,104 356,98.4 356,109.6" fill="black" transform="rotate(270,360,104)"/>
                <polygon class="arrowhead" points="352,496 340,490.4 340,501.6" fill="black" transform="rotate(180,344,496)"/>
                <polygon class="arrowhead" points="224,96 212,90.4 212,101.6" fill="black" transform="rotate(0,216,96)"/>
                <polygon class="arrowhead" points="208,488 196,482.4 196,493.6" fill="black" transform="rotate(90,200,488)"/>
                <polygon class="arrowhead" points="208,384 196,378.4 196,389.6" fill="black" transform="rotate(90,200,384)"/>
                <polygon class="arrowhead" points="208,208 196,202.4 196,213.6" fill="black" transform="rotate(270,200,208)"/>
                <polygon class="arrowhead" points="208,104 196,98.4 196,109.6" fill="black" transform="rotate(270,200,104)"/>
                <polygon class="arrowhead" points="184,496 172,490.4 172,501.6" fill="black" transform="rotate(180,176,496)"/>
                <g class="text">
                  <text x="440" y="84">HBH</text>
                  <text x="124" y="100">Encode</text>
                  <text x="280" y="100">Packetize</text>
                  <text x="440" y="100">Protect</text>
                  <text x="196" y="164">SFrame</text>
                  <text x="356" y="164">SFrame</text>
                  <text x="200" y="180">Protect</text>
                  <text x="360" y="180">Protect</text>
                  <text x="24" y="196">Alice</text>
                  <text x="200" y="196">(per-frame)</text>
                  <text x="364" y="196">(per-packet)</text>
                  <text x="264" y="292">E2E</text>
                  <text x="296" y="292">Key</text>
                  <text x="464" y="292">HBH</text>
                  <text x="496" y="292">Key</text>
                  <text x="584" y="292">Media</text>
                  <text x="284" y="308">Management</text>
                  <text x="492" y="308">Management</text>
                  <text x="588" y="308">Server</text>
                  <text x="196" y="404">SFrame</text>
                  <text x="364" y="404">SFrame</text>
                  <text x="200" y="420">Unprotect</text>
                  <text x="368" y="420">Unprotect</text>
                  <text x="200" y="436">(per-frame)</text>
                  <text x="372" y="436">(per-packet)</text>
                  <text x="440" y="484">HBH</text>
                  <text x="124" y="500">Decode</text>
                  <text x="280" y="500">Depacketize</text>
                  <text x="440" y="500">Unprotect</text>
                  <text x="24" y="516">Bob</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
      +--------------------------------------------------------+
      |                                                        |
      |  +----------+      +-------------+      +-----------+  |
 .-.  |  |          |      |             |      |    HBH    |  |
|   | |  |  Encode  |----->|  Packetize  |----->|  Protect  |-----------+
 '+'  |  |          |   ^  |             |  ^   |           |  |        |
 /|\  |  +----------+   |  +-------------+  |   +-----------+  |        |
/ + \ |                 |                   |         ^        |        |
 / \  |              SFrame              SFrame       |        |        |
/   \ |              Protect             Protect      |        |        |
Alice |            (per-frame)         (per-packet)   |        |        |
      |                 ^                   ^         |        |        |
      |                 |                   |         |        |        |
      +-----------------|-------------------|---------|--------+        |
                        |                   |         |                 v
                        |                   |         |             +---+----+
                        |      E2E Key      |         | HBH Key     | Media  |
                        +---- Management ---+         | Management  | Server |
                        |                   |         |             +---+----+
                        |                   |         |                 |
      +-----------------|-------------------|---------|--------+        |
      |                 |                   |         |        |        |
      |                 V                   V         |        |        |
 .-.  |              SFrame               SFrame      |        |        |
|   | |             Unprotect            Unprotect    |        |        |
 '+'  |            (per-frame)          (per-packet)  |        |        |
 /|\  |                 |                    |        V        |        |
/ + \ |  +----------+   |  +-------------+   |  +-----------+  |        |
 / \  |  |          |   V  |             |   V  |    HBH    |  |        |
/   \ |  |  Decode  |<-----| Depacketize |<-----| Unprotect |<----------+
 Bob  |  |          |      |             |      |           |  |
      |  +----------+      +-------------+      +-----------+  |
      |                                                        |
      +--------------------------------------------------------+
]]></artwork>
          </artset>
        </figure>
        <t>Like SRTP, SFrame does not define how the keys used for SFrame are exchanged by
the parties in the conference.  Keys for SFrame might be distributed over an
existing E2E-secure channel (see <xref target="sender-keys"/>), or derived from an E2E-secure
shared secret (see <xref target="mls"/>).  The key management system MUST ensure that each
key used for encrypting media is used by exactly one media sender, in order to
avoid reuse of IVs.</t>
      </section>
      <section anchor="sframe-ciphertext">
        <name>SFrame Ciphertext</name>
        <t>An SFrame ciphertext comprises an SFrame header followed by the output of an
AEAD encryption of the plaintext <xref target="RFC5116"/>, with the header provided as additional
authenticated data (AAD).</t>
        <t>The SFrame header is a variable-length structure described in detail in
<xref target="sframe-header"/>.  The structure of the encrypted data and authentication tag
are determined by the AEAD algorithm in use.</t>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="320" width="512" viewBox="0 0 512 320" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,64 L 8,304" fill="none" stroke="black"/>
              <path d="M 32,32 L 32,256" fill="none" stroke="black"/>
              <path d="M 48,32 L 48,64" fill="none" stroke="black"/>
              <path d="M 88,32 L 88,64" fill="none" stroke="black"/>
              <path d="M 104,32 L 104,64" fill="none" stroke="black"/>
              <path d="M 144,32 L 144,64" fill="none" stroke="black"/>
              <path d="M 312,32 L 312,64" fill="none" stroke="black"/>
              <path d="M 480,32 L 480,256" fill="none" stroke="black"/>
              <path d="M 504,32 L 504,304" fill="none" stroke="black"/>
              <path d="M 32,32 L 504,32" fill="none" stroke="black"/>
              <path d="M 8,64 L 480,64" fill="none" stroke="black"/>
              <path d="M 8,224 L 504,224" fill="none" stroke="black"/>
              <path d="M 32,256 L 480,256" fill="none" stroke="black"/>
              <path d="M 8,304 L 32,304" fill="none" stroke="black"/>
              <path d="M 480,304 L 504,304" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="496,224 484,218.4 484,229.6" fill="black" transform="rotate(180,488,224)"/>
              <polygon class="arrowhead" points="496,32 484,26.4 484,37.6" fill="black" transform="rotate(180,488,32)"/>
              <polygon class="arrowhead" points="32,224 20,218.4 20,229.6" fill="black" transform="rotate(0,24,224)"/>
              <polygon class="arrowhead" points="32,64 20,58.4 20,69.6" fill="black" transform="rotate(0,24,64)"/>
              <g class="text">
                <text x="40" y="52">K</text>
                <text x="68" y="52">KLEN</text>
                <text x="96" y="52">C</text>
                <text x="124" y="52">CLEN</text>
                <text x="216" y="52">Key</text>
                <text x="244" y="52">ID</text>
                <text x="392" y="52">Counter</text>
                <text x="224" y="148">Encrypted</text>
                <text x="284" y="148">Data</text>
                <text x="228" y="244">Authentication</text>
                <text x="304" y="244">Tag</text>
                <text x="80" y="308">Encrypted</text>
                <text x="152" y="308">Portion</text>
                <text x="352" y="308">Authenticated</text>
                <text x="440" y="308">Portion</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
   +-+----+-+----+--------------------+--------------------+<-+
   |K|KLEN|C|CLEN|       Key ID       |      Counter       |  |
+->+-+----+-+----+--------------------+--------------------+  |
|  |                                                       |  |
|  |                                                       |  |
|  |                                                       |  |
|  |                                                       |  |
|  |                   Encrypted Data                      |  |
|  |                                                       |  |
|  |                                                       |  |
|  |                                                       |  |
|  |                                                       |  |
+->+-------------------------------------------------------+<-+
|  |                 Authentication Tag                    |  |
|  +-------------------------------------------------------+  |
|                                                             |
|                                                             |
+--- Encrypted Portion               Authenticated Portion ---+
]]></artwork>
        </artset>
        <t>When SFrame is applied per-packet, the payload of each packet will be an SFrame
ciphertext.  When SFrame is applied per-frame, the SFrame ciphertext
representing an encrypted frame will span several packets, with the header
appearing in the first packet and the authentication tag in the last packet.</t>
      </section>
      <section anchor="sframe-header">
        <name>SFrame Header</name>
        <t>The SFrame header specifies two values from which encryption parameters are
derived:</t>
        <ul spacing="normal">
          <li>
            <t>A Key ID (KID) that determines which encryption key should be used</t>
          </li>
          <li>
            <t>A counter (CTR) that is used to construct the IV for the encryption</t>
          </li>
        </ul>
        <t>Applications MUST ensure that each (KID, CTR) combination is used for exactly
one encryption operation. A typical approach to achieving this gaurantee is
outlined in <xref target="header-value-uniqueness"/>.</t>
        <figure anchor="fig-sframe-header">
          <name>SFrame header</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="160" width="352" viewBox="0 0 352 160" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,112 L 8,144" fill="none" stroke="black"/>
                <path d="M 24,112 L 24,144" fill="none" stroke="black"/>
                <path d="M 72,112 L 72,144" fill="none" stroke="black"/>
                <path d="M 88,112 L 88,144" fill="none" stroke="black"/>
                <path d="M 136,112 L 136,144" fill="none" stroke="black"/>
                <path d="M 240,112 L 240,144" fill="none" stroke="black"/>
                <path d="M 344,112 L 344,144" fill="none" stroke="black"/>
                <path d="M 24,64 L 56,64" fill="none" stroke="black"/>
                <path d="M 88,64 L 120,64" fill="none" stroke="black"/>
                <path d="M 8,112 L 344,112" fill="none" stroke="black"/>
                <path d="M 8,144 L 344,144" fill="none" stroke="black"/>
                <path d="M 24,64 C 15.16936,64 8,71.16936 8,80" fill="none" stroke="black"/>
                <path d="M 56,64 C 64.83064,64 72,56.83064 72,48" fill="none" stroke="black"/>
                <path d="M 88,64 C 79.16936,64 72,56.83064 72,48" fill="none" stroke="black"/>
                <path d="M 120,64 C 128.83064,64 136,71.16936 136,80" fill="none" stroke="black"/>
                <g class="text">
                  <text x="52" y="36">Config</text>
                  <text x="100" y="36">Byte</text>
                  <text x="16" y="100">0</text>
                  <text x="32" y="100">1</text>
                  <text x="48" y="100">2</text>
                  <text x="64" y="100">3</text>
                  <text x="80" y="100">4</text>
                  <text x="96" y="100">5</text>
                  <text x="112" y="100">6</text>
                  <text x="128" y="100">7</text>
                  <text x="16" y="132">X</text>
                  <text x="48" y="132">K</text>
                  <text x="80" y="132">Y</text>
                  <text x="112" y="132">C</text>
                  <text x="188" y="132">KID...</text>
                  <text x="292" y="132">CTR...</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
   Config Byte
        |
 .-----' '-----.
|               |
 0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+------------+------------+
|X|  K  |Y|  C  |   KID...   |   CTR...   |
+-+-+-+-+-+-+-+-+------------+------------+
]]></artwork>
          </artset>
        </figure>
        <t>The SFrame Header has the overall structure shown in <xref target="fig-sframe-header"/>.  The
first byte is a "config byte", with the following fields:</t>
        <dl>
          <dt>Extended Key Id Flag (X, 1 bit):</dt>
          <dd>
            <t>Indicates if the K field contains the key id or the key id 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 id
length if set to 1.</t>
          </dd>
          <dt>Extended Counter Flag (Y, 1 bit):</dt>
          <dd>
            <t>Indicates if the C field contains the counter or the counter length.</t>
          </dd>
          <dt>Counter or Counter Length (C, 3 bits):</dt>
          <dd>
            <t>This field contains the counter (CTR) if the Y flag is set to 0, or the counter
length if set to 1.</t>
          </dd>
        </dl>
        <t>The Key ID and Counter fields are encoded as compact unsigned integers in
network (big-endian) byte order.  If the value of one of these fields is in the
range 0-7, then the value is carried in the corresponding bits of the config
byte (K or C) and the corresponding flag (X or Y) is set to zero.  Otherwise,
the value MUST be encoded with the minimum number of bytes required and
appended after the configuration byte, with the Key ID first and Counter second.
The header field (K or C) is set to the number of bytes in the encoded value,
minus one.  The value 000 represents a length of 1, 001 a length of 2, etc.
This allows a 3-bit length field to represent the value lengths 1-8.</t>
        <t>The SFrame header can thus take one of the four forms shown in
<xref target="fig-sframe-header-cases"/>, depending on which of the X and Y flags are set.</t>
        <figure anchor="fig-sframe-header-cases">
          <name>Forms of Encoded SFrame Header</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="336" width="544" viewBox="0 0 544 336" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,48 L 8,80" fill="none" stroke="black"/>
                <path d="M 8,128 L 8,160" fill="none" stroke="black"/>
                <path d="M 8,208 L 8,240" fill="none" stroke="black"/>
                <path d="M 8,288 L 8,320" fill="none" stroke="black"/>
                <path d="M 24,48 L 24,80" fill="none" stroke="black"/>
                <path d="M 24,128 L 24,160" fill="none" stroke="black"/>
                <path d="M 24,208 L 24,240" fill="none" stroke="black"/>
                <path d="M 24,288 L 24,320" fill="none" stroke="black"/>
                <path d="M 72,48 L 72,80" fill="none" stroke="black"/>
                <path d="M 72,128 L 72,160" fill="none" stroke="black"/>
                <path d="M 72,192 L 72,240" fill="none" stroke="black"/>
                <path d="M 72,272 L 72,320" fill="none" stroke="black"/>
                <path d="M 88,48 L 88,80" fill="none" stroke="black"/>
                <path d="M 88,128 L 88,160" fill="none" stroke="black"/>
                <path d="M 88,208 L 88,240" fill="none" stroke="black"/>
                <path d="M 88,288 L 88,320" fill="none" stroke="black"/>
                <path d="M 136,48 L 136,80" fill="none" stroke="black"/>
                <path d="M 136,128 L 136,160" fill="none" stroke="black"/>
                <path d="M 136,208 L 136,240" fill="none" stroke="black"/>
                <path d="M 136,288 L 136,320" fill="none" stroke="black"/>
                <path d="M 336,128 L 336,160" fill="none" stroke="black"/>
                <path d="M 336,208 L 336,240" fill="none" stroke="black"/>
                <path d="M 336,288 L 336,320" fill="none" stroke="black"/>
                <path d="M 536,288 L 536,320" 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"/>
                <path d="M 8,128 L 336,128" fill="none" stroke="black"/>
                <path d="M 8,160 L 336,160" fill="none" stroke="black"/>
                <path d="M 8,208 L 336,208" fill="none" stroke="black"/>
                <path d="M 8,240 L 336,240" fill="none" stroke="black"/>
                <path d="M 8,288 L 536,288" fill="none" stroke="black"/>
                <path d="M 8,320 L 536,320" fill="none" stroke="black"/>
                <g class="text">
                  <text x="16" y="36">KID</text>
                  <text x="40" y="36">&lt;</text>
                  <text x="60" y="36">8,</text>
                  <text x="88" y="36">CTR</text>
                  <text x="112" y="36">&lt;</text>
                  <text x="132" y="36">8:</text>
                  <text x="16" y="68">0</text>
                  <text x="48" y="68">KID</text>
                  <text x="80" y="68">0</text>
                  <text x="112" y="68">CTR</text>
                  <text x="16" y="116">KID</text>
                  <text x="40" y="116">&lt;</text>
                  <text x="60" y="116">8,</text>
                  <text x="88" y="116">CTR</text>
                  <text x="116" y="116">&gt;=</text>
                  <text x="140" y="116">8:</text>
                  <text x="16" y="148">0</text>
                  <text x="48" y="148">KID</text>
                  <text x="80" y="148">1</text>
                  <text x="108" y="148">CLEN</text>
                  <text x="180" y="148">CTR...</text>
                  <text x="264" y="148">(length=CLEN)</text>
                  <text x="16" y="196">KID</text>
                  <text x="44" y="196">&gt;=</text>
                  <text x="64" y="196">8</text>
                  <text x="96" y="196">CTR</text>
                  <text x="120" y="196">&lt;</text>
                  <text x="140" y="196">8:</text>
                  <text x="16" y="228">1</text>
                  <text x="44" y="228">KLEN</text>
                  <text x="80" y="228">0</text>
                  <text x="112" y="228">CTR</text>
                  <text x="180" y="228">KID...</text>
                  <text x="264" y="228">(length=KLEN)</text>
                  <text x="16" y="276">KID</text>
                  <text x="44" y="276">&gt;=</text>
                  <text x="64" y="276">8</text>
                  <text x="96" y="276">CTR</text>
                  <text x="124" y="276">&gt;=</text>
                  <text x="148" y="276">8:</text>
                  <text x="16" y="308">1</text>
                  <text x="44" y="308">KLEN</text>
                  <text x="80" y="308">1</text>
                  <text x="108" y="308">CLEN</text>
                  <text x="180" y="308">KID...</text>
                  <text x="264" y="308">(length=KLEN)</text>
                  <text x="380" y="308">CTR...</text>
                  <text x="464" y="308">(length=CLEN)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
KID < 8, CTR < 8:
+-+-----+-+-----+
|0| KID |0| CTR |
+-+-----+-+-----+

KID < 8, CTR >= 8:
+-+-----+-+-----+------------------------+
|0| KID |1|CLEN |  CTR... (length=CLEN)  |
+-+-----+-+-----+------------------------+

KID >= 8, CTR < 8:
+-+-----+-+-----+------------------------+
|1|KLEN |0| CTR |  KID... (length=KLEN)  |
+-+-----+-+-----+------------------------+

KID >= 8, CTR >= 8:
+-+-----+-+-----+------------------------+------------------------+
|1|KLEN |1|CLEN |  KID... (length=KLEN)  |  CTR... (length=CLEN)  |
+-+-----+-+-----+------------------------+------------------------+
]]></artwork>
          </artset>
        </figure>
      </section>
      <section anchor="encryption-schema">
        <name>Encryption Schema</name>
        <t>SFrame encryption uses an AEAD encryption algorithm and hash function defined by
the cipher suite in use (see <xref target="cipher-suites"/>).  We will refer to the following
aspects of the AEAD algorithm below:</t>
        <ul spacing="normal">
          <li>
            <t><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"/>).</t>
          </li>
          <li>
            <t><tt>AEAD.Nk</tt> - The size in bytes of a key for the encryption algorithm</t>
          </li>
          <li>
            <t><tt>AEAD.Nn</tt> - The size in bytes of a nonce for the encryption algorithm</t>
          </li>
          <li>
            <t><tt>AEAD.Nt</tt> - The overhead in bytes of the encryption algorithm (typically the
size of a "tag" that is added to the plaintext)</t>
          </li>
        </ul>
        <section anchor="key-selection">
          <name>Key Selection</name>
          <t>Each SFrame encryption or decryption operation is premised on a single secret
<tt>base_key</tt>, which is labeled with an integer KID value signaled in the SFrame
header.</t>
          <t>The sender and receivers need to agree on which key should be used for a given
KID.  The process for provisioning keys and their KID values is beyond the scope
of this specification, but its security properties will bound the assurances
that SFrame provides.  For example, if SFrame is used to provide E2E security
against intermediary media nodes, then SFrame keys need to be negotiated in a
way that does not make them accessible to these intermediaries.</t>
          <t>For each known KID value, the client stores the corresponding symmetric key
<tt>base_key</tt>.  For keys that can be used for encryption, the client also stores
the next counter value CTR to be used when encrypting (initially 0).</t>
          <t>When encrypting a plaintext, the application specifies which KID is to be used,
and the counter is incremented after successful encryption.  When decrypting,
the <tt>base_key</tt> for decryption is selected from the available keys using the KID
value in the SFrame Header.</t>
          <t>A given key MUST NOT be used for encryption by multiple senders.  Such reuse
would result in multiple encrypted frames being generated with the same (key,
nonce) pair, which harms the protections provided by many AEAD algorithms.
Implementations SHOULD mark each key as usable for encryption or decryption,
never both.</t>
          <t>Note that the set of available keys might change over the lifetime of a
real-time session.  In such cases, the client will need to manage key usage to
avoid media loss due to a key being used to encrypt before all receivers are
able to use it to decrypt.  For example, an application may make decryption-only
keys available immediately, but delay the use of keys for encryption until (a)
all receivers have acknowledged receipt of the new key or (b) a timeout expires.</t>
        </section>
        <section anchor="key-derivation">
          <name>Key Derivation</name>
          <t>SFrame encrytion and decryption use a key and salt derived from the <tt>base_key</tt>
associated to a KID.  Given a <tt>base_key</tt> value, the key and salt are derived
using HKDF <xref target="RFC5869"/> as follows:</t>
          <artwork><![CDATA[
def derive_key_salt(KID, base_key):
  sframe_secret = HKDF-Extract("", base_key)
  info = "SFrame 1.0 Secret key " + KID + cipher_suite
  sframe_key = HKDF-Expand(sframe_secret, info, AEAD.Nk)
  sframe_salt = HKDF-Expand(sframe_secret, info, AEAD.Nn)
  return sframe_key, sframe_salt
]]></artwork>
          <t>In the derivation of <tt>sframe_secret</tt>:
* The <tt>+</tt> operator represents concatenation of byte strings.
* The KID value is encoded as an 8-byte big-endian integer, not the compressed
  form used in the SFrame header.
* The <tt>cipher_suite</tt> value is a 2-byte big-endian integer representing the
  cipher suite in use (see <xref target="sframe-cipher-suites"/>).</t>
          <t>The hash function used for HKDF is determined by the cipher suite in use.</t>
        </section>
        <section anchor="encryption">
          <name>Encryption</name>
          <t>SFrame encryption uses the AEAD encryption algorithm for the cipher suite in use.
The key for the encryption is the <tt>sframe_key</tt> and the nonce is formed by XORing
the <tt>sframe_salt</tt> with the current counter, encoded as a big-endian integer of
length <tt>AEAD.Nn</tt>.</t>
          <t>The encryptor forms an SFrame header using the CTR, and KID values provided.
The encoded header is provided as AAD to the AEAD encryption operation, together
with application-provided metadata about the encrypted media (see <xref target="metadata"/>).</t>
          <artwork><![CDATA[
def encrypt(CTR, KID, metadata, plaintext):
  sframe_key, sframe_salt = key_store[KID]

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

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

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

  sframe_key, sframe_salt = key_store[KID]

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

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

def AEAD.Encrypt(key, nonce, aad, pt):
  enc_key, auth_key = derive_subkeys(key)
  iv = nonce + 0x00000000 # append four zero bytes
  ct = AES-CTR.Encrypt(enc_key, iv, 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")

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

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

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

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-00"/>
        </reference>
        <reference anchor="I-D.ietf-mls-architecture">
          <front>
            <title>The Messaging Layer Security (MLS) Architecture</title>
            <author fullname="Benjamin Beurdouche" initials="B." surname="Beurdouche">
              <organization>Inria &amp; Mozilla</organization>
            </author>
            <author fullname="Eric Rescorla" initials="E." surname="Rescorla">
              <organization>Mozilla</organization>
            </author>
            <author fullname="Emad Omara" initials="E." surname="Omara">
              <organization>Google</organization>
            </author>
            <author fullname="Srinivas Inguva" initials="S." surname="Inguva">
         </author>
            <author fullname="Alan Duric" initials="A." surname="Duric">
              <organization>Wire</organization>
            </author>
            <date day="26" month="July" year="2023"/>
            <abstract>
              <t>   The Messaging Layer Security (MLS) protocol (I-D.ietf-mls-protocol)
   provides a Group Key Agreement protocol for messaging applications.
   MLS is meant to protect against eavesdropping, tampering, message
   forgery, and provide Forward Secrecy (FS) and Post-Compromise
   Security (PCS).

   This document describes the architecture for using MLS in a general
   secure group messaging infrastructure and defines the security goals
   for MLS.  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 MLS and are instead left to the application.

   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 the 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-11"/>
        </reference>
        <reference anchor="I-D.ietf-mls-protocol">
          <front>
            <title>The Messaging Layer Security (MLS) Protocol</title>
            <author fullname="Richard Barnes" initials="R." surname="Barnes">
              <organization>Cisco</organization>
            </author>
            <author fullname="Benjamin Beurdouche" initials="B." surname="Beurdouche">
              <organization>Inria &amp; Mozilla</organization>
            </author>
            <author fullname="Raphael Robert" initials="R." surname="Robert">
              <organization>Phoenix R&amp;D</organization>
            </author>
            <author fullname="Jon Millican" initials="J." surname="Millican">
              <organization>Meta Platforms</organization>
            </author>
            <author fullname="Emad Omara" initials="E." surname="Omara">
              <organization>Google</organization>
            </author>
            <author fullname="Katriel Cohn-Gordon" initials="K." surname="Cohn-Gordon">
              <organization>University of Oxford</organization>
            </author>
            <date day="27" month="March" year="2023"/>
            <abstract>
              <t>Messaging applications are increasingly making use of end-to-end security mechanisms to ensure that messages are only accessible to the communicating endpoints, and not to any servers involved in delivering messages.  Establishing keys to provide such protections is challenging for group chat settings, in which more than two clients need to agree on a key but may not be online at the same time.  In this document, we specify a key establishment protocol that provides efficient asynchronous group key establishment with forward secrecy (FS) and post-compromise security (PCS) for groups in size ranging from two to thousands.
              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-mls-protocol-20"/>
        </reference>
        <reference anchor="RFC7667">
          <front>
            <title>RTP Topologies</title>
            <author fullname="M. Westerlund" initials="M." surname="Westerlund"/>
            <author fullname="S. Wenger" initials="S." surname="Wenger"/>
            <date month="November" year="2015"/>
            <abstract>
              <t>This document discusses point-to-point and multi-endpoint topologies used in environments based on the Real-time Transport Protocol (RTP). In particular, centralized topologies commonly employed in the video conferencing industry are mapped to the RTP terminology.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7667"/>
          <seriesInfo name="DOI" value="10.17487/RFC7667"/>
        </reference>
        <reference anchor="RFC6716">
          <front>
            <title>Definition of the Opus Audio Codec</title>
            <author fullname="JM. Valin" initials="JM." surname="Valin"/>
            <author fullname="K. Vos" initials="K." surname="Vos"/>
            <author fullname="T. Terriberry" initials="T." surname="Terriberry"/>
            <date month="September" year="2012"/>
            <abstract>
              <t>This document defines the Opus interactive speech and audio codec. Opus is designed to handle a wide range of interactive audio applications, including Voice over IP, videoconferencing, in-game chat, and even live, distributed music performances. It scales from low bitrate narrowband speech at 6 kbit/s to very high quality stereo music at 510 kbit/s. Opus uses both Linear Prediction (LP) and the Modified Discrete Cosine Transform (MDCT) to achieve good compression of both speech and music. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6716"/>
          <seriesInfo name="DOI" value="10.17487/RFC6716"/>
        </reference>
        <reference anchor="RFC4566">
          <front>
            <title>SDP: Session Description Protocol</title>
            <author fullname="M. Handley" initials="M." surname="Handley"/>
            <author fullname="V. Jacobson" initials="V." surname="Jacobson"/>
            <author fullname="C. Perkins" initials="C." surname="Perkins"/>
            <date month="July" year="2006"/>
            <abstract>
              <t>This memo defines the Session Description Protocol (SDP). SDP is intended for describing multimedia sessions for the purposes of session announcement, session invitation, and other forms of multimedia session initiation. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4566"/>
          <seriesInfo name="DOI" value="10.17487/RFC4566"/>
        </reference>
        <reference anchor="I-D.codec-agnostic-rtp-payload-format">
          <front>
            <title>Codec agnostic RTP payload format for video</title>
            <author fullname="Sergio Garcia Murillo" initials="S. G." surname="Murillo">
              <organization>CoSMo Software</organization>
            </author>
            <author fullname="Dr. Alex Gouaillard" initials="A." surname="Gouaillard">
              <organization>CoSMo Software</organization>
            </author>
            <date day="19" month="February" year="2021"/>
            <abstract>
              <t>   RTP Media Chains usually rely on piping encoder output directly to
   packetizers.  Media packetization formats often support a specific
   codec format and optimize RTP packets generation accordingly.

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

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

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

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

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

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

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

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

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

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

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

trait SFrameContextMethods {
  fn create(cipher_suite: CipherSuite) -> Self;
  fn add_send_key(&self, kid: KeyId, base_key: &[u8]);
  fn add_recv_key(&self, kid: KeyId, base_key: &[u8]);
  fn encrypt(&mut self, kid: KeyId, metadata: &[u8], plaintext: &[u8]) -> Vec<u8>;
  fn decrypt(&self, metadata: &[u8], ciphertext: &[u8]) -> Vec<u8>;
}
]]></sourcecode>
      </figure>
    </section>
    <section anchor="overhead-analysis">
      <name>Overhead Analysis</name>
      <t>Any use of SFrame will impose overhead in terms of the amount of bandwidth
necessary to transmit a given media stream.  Exactly how much overhead will be added
depends on several factors:</t>
      <ul spacing="normal">
        <li>
          <t>How many senders are involved in a conference (length of KID)</t>
        </li>
        <li>
          <t>How long the conference has been going on (length of CTR)</t>
        </li>
        <li>
          <t>The cipher suite in use (length of authentication tag)</t>
        </li>
        <li>
          <t>Whether SFrame is used to encrypt packets, whole frames, or some other unit</t>
        </li>
      </ul>
      <t>Overall, the overhead rate in kilobits per second can be estimated as:</t>
      <t><tt>
OverheadKbps = (1 + |CTR| + |KID| + |TAG|) * 8 * CTPerSecond / 1024
</tt></t>
      <t>Here the constant value <tt>1</tt> reflects the fixed SFrame header; <tt>|CTR|</tt> and
<tt>|KID|</tt> reflect the lengths of those fields; <tt>|TAG|</tt> reflects the cipher
overhead; and <tt>CTPerSecond</tt> reflects the number of SFrame ciphertexts
sent per second (e.g., packets or frames per second).</t>
      <t>In the remainder of this secton, we compute overhead estimates for a collection
of common scenarios.</t>
      <section anchor="assumptions">
        <name>Assumptions</name>
        <t>In the below calculations, we make conservative assumptions about SFrame
overhead, so that the overhead amounts we compute here are likely to be an upper
bound on those seen in practice.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Field</th>
              <th align="right">Bytes</th>
              <th align="left">Explanation</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Fixed header</td>
              <td align="right">1</td>
              <td align="left">Fixed</td>
            </tr>
            <tr>
              <td align="left">Key ID (KID)</td>
              <td align="right">2</td>
              <td align="left">&gt;255 senders; or MLS epoch (E=4) and &gt;16 senders</td>
            </tr>
            <tr>
              <td align="left">Counter (CTR)</td>
              <td align="right">3</td>
              <td align="left">More than 24 hours of media in common cases</td>
            </tr>
            <tr>
              <td align="left">Cipher overhead</td>
              <td align="right">16</td>
              <td align="left">Full GCM tag (longest defined here)</td>
            </tr>
          </tbody>
        </table>
        <t>In total, then, we assume that each SFrame encryption will add 22 bytes of
overhead.</t>
        <t>We consider two scenarios, applying SFrame per-frame and per-packet.  In each
scenario, we compute the SFrame overhead in absolute terms (Kbps) and as a
percentage of the base bandwidth.</t>
      </section>
      <section anchor="audio">
        <name>Audio</name>
        <t>In audio streams, there is typically a one-to-one relationship between frames
and packets, so the overhead is the same whether one uses SFrame at a per-packet
or per-frame level.</t>
        <t>The below table considers three scenarios, based on recommended configurations
of the Opus codec <xref target="RFC6716"/>:</t>
        <ul spacing="normal">
          <li>
            <t>Narrow-band speech: 120ms packets, 8Kbps</t>
          </li>
          <li>
            <t>Full-band speech: 20ms packets, 32Kbps</t>
          </li>
          <li>
            <t>Full-band stereo music: 10ms packets, 128Kbps</t>
          </li>
        </ul>
        <table anchor="audio-overhead">
          <name>SFrame overhead for audio streams</name>
          <thead>
            <tr>
              <th align="left">Scenario</th>
              <th align="center">fps</th>
              <th align="center">Base Kbps</th>
              <th align="center">Overhead Kbps</th>
              <th align="center">Overhead %</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">NB speech, 120ms packets</td>
              <td align="center">8.3</td>
              <td align="center">8</td>
              <td align="center">1.4</td>
              <td align="center">17.9%</td>
            </tr>
            <tr>
              <td align="left">FB speech, 20ms packets</td>
              <td align="center">50</td>
              <td align="center">32</td>
              <td align="center">8.6</td>
              <td align="center">26.9%</td>
            </tr>
            <tr>
              <td align="left">FB stereo, 10ms packets</td>
              <td align="center">100</td>
              <td align="center">128</td>
              <td align="center">17.2</td>
              <td align="center">13.4%</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="video">
        <name>Video</name>
        <t>Video frames can be larger than an MTU and thus are commonly split across
multiple frames.  <xref target="video-overhead-per-frame"/> and <xref target="video-overhead-per-packet"/>
show the estimated overhead of encrypting a video stream, where SFrame is
applied per-frame and per-packet, respectively.  The choices of resolution,
frames per second, and bandwidth are chosen to roughly reflect the capabilities of
modern video codecs across a range from very low to very high quality.</t>
        <table anchor="video-overhead-per-frame">
          <name>SFrame overhead for a video stream encrypted per-frame</name>
          <thead>
            <tr>
              <th align="left">Scenario</th>
              <th align="center">fps</th>
              <th align="center">Base Kbps</th>
              <th align="center">Overhead Kbps</th>
              <th align="center">Overhead %</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">426 x 240</td>
              <td align="center">7.5</td>
              <td align="center">45</td>
              <td align="center">1.3</td>
              <td align="center">2.9%</td>
            </tr>
            <tr>
              <td align="left">640 x 360</td>
              <td align="center">15</td>
              <td align="center">200</td>
              <td align="center">2.6</td>
              <td align="center">1.3%</td>
            </tr>
            <tr>
              <td align="left">640 x 360</td>
              <td align="center">30</td>
              <td align="center">400</td>
              <td align="center">5.2</td>
              <td align="center">1.3%</td>
            </tr>
            <tr>
              <td align="left">1280 x 720</td>
              <td align="center">30</td>
              <td align="center">1500</td>
              <td align="center">5.2</td>
              <td align="center">0.3%</td>
            </tr>
            <tr>
              <td align="left">1920 x 1080</td>
              <td align="center">60</td>
              <td align="center">7200</td>
              <td align="center">10.3</td>
              <td align="center">0.1%</td>
            </tr>
          </tbody>
        </table>
        <table anchor="video-overhead-per-packet">
          <name>SFrame overhead for a video stream encrypted per-packet</name>
          <thead>
            <tr>
              <th align="left">Scenario</th>
              <th align="center">fps</th>
              <th align="center">pps</th>
              <th align="center">Base Kbps</th>
              <th align="center">Overhead Kbps</th>
              <th align="center">Overhead %</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">426 x 240</td>
              <td align="center">7.5</td>
              <td align="center">7.5</td>
              <td align="center">45</td>
              <td align="center">1.3</td>
              <td align="center">2.9%</td>
            </tr>
            <tr>
              <td align="left">640 x 360</td>
              <td align="center">15</td>
              <td align="center">30</td>
              <td align="center">200</td>
              <td align="center">5.2</td>
              <td align="center">2.6%</td>
            </tr>
            <tr>
              <td align="left">640 x 360</td>
              <td align="center">30</td>
              <td align="center">60</td>
              <td align="center">400</td>
              <td align="center">10.3</td>
              <td align="center">2.6%</td>
            </tr>
            <tr>
              <td align="left">1280 x 720</td>
              <td align="center">30</td>
              <td align="center">180</td>
              <td align="center">1500</td>
              <td align="center">30.9</td>
              <td align="center">2.1%</td>
            </tr>
            <tr>
              <td align="left">1920 x 1080</td>
              <td align="center">60</td>
              <td align="center">780</td>
              <td align="center">7200</td>
              <td align="center">134.1</td>
              <td align="center">1.9%</td>
            </tr>
          </tbody>
        </table>
        <t>In the per-frame case, the SFrame percentage overhead approaches zero as the
quality of the video goes up, since bandwidth is driven more by picture size
than frame rate.  In the per-packet case, the SFrame percentage overhead
approaches the ratio between the SFrame overhead per packet and the MTU (here 22
bytes of SFrame overhead divided by an assumed 1200-byte MTU, or about 1.8%).</t>
      </section>
      <section anchor="conferences">
        <name>Conferences</name>
        <t>Real conferences usually involve several audio and video streams.  The overhead
of SFrame in such a conference is the aggregate of the overhead over all the
individual streams.  Thus, while SFrame incurs a large percentage overhead on an
audio stream, if the conference also involves a video stream, then the audio
overhead is likely negligible relative to the overall bandwidth of the
conference.</t>
        <t>For example, <xref target="conference-overhead"/> shows the overhead estimates for a two
person conference where one person is sending low-quality media and the other
sending high-quality.  (And we assume that SFrame is applied per-frame.)  The
video streams dominate the bandwidth at the SFU, so the total bandwidth overhead
is only around 1%.</t>
        <table anchor="conference-overhead">
          <name>SFrame overhead for a two-person conference</name>
          <thead>
            <tr>
              <th align="left">Stream</th>
              <th align="center">Base Kbps</th>
              <th align="center">Overhead Kbps</th>
              <th align="center">Overhead %</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Participant 1 audio</td>
              <td align="center">8</td>
              <td align="center">1.4</td>
              <td align="center">17.9%</td>
            </tr>
            <tr>
              <td align="left">Participant 1 video</td>
              <td align="center">45</td>
              <td align="center">1.3</td>
              <td align="center">2.9%</td>
            </tr>
            <tr>
              <td align="left">Participant 2 audio</td>
              <td align="center">32</td>
              <td align="center">9</td>
              <td align="center">26.9%</td>
            </tr>
            <tr>
              <td align="left">Participant 2 video</td>
              <td align="center">1500</td>
              <td align="center">5</td>
              <td align="center">0.3%</td>
            </tr>
            <tr>
              <td align="left">Total at SFU</td>
              <td align="center">1585</td>
              <td align="center">16.5</td>
              <td align="center">1.0%</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="sframe-over-rtp">
        <name>SFrame over RTP</name>
        <t>SFrame is a generic encapsulation format, but many of the applications in which
it is likely to be integrated are based on RTP.  This section discusses how an
integration between SFrame and RTP could be done, and some of the challenges
that would need to be overcome.</t>
        <t>As discussed in <xref target="application-context"/>, there are two natural patterns for
integrating SFrame into an application: applying SFrame per-frame or per-packet.
In RTP-based applications, applying SFrame per-packet means that the payload of
each RTP packet will be an SFrame ciphertext, starting with an SFrame Header, as
shown in <xref target="sframe-packet"/>.  Applying SFrame per-frame means that different
RTP payloads will have different formats: The first payload of a frame will
contain the SFrame headers, and subsequent payloads will contain further chunks
of the ciphertext, as shown in <xref target="sframe-multi-packet"/>.</t>
        <t>In order for these media payloads to be properly interpreted by receivers,
receivers will need to be configured to know which of the above schemes the
sender has  applied to a given sequence of RTP packets. SFrame does not provide
a mechanism for distributing this configuration information. In applications
that use SDP for negotiating RTP media streams <xref target="RFC4566"/>, an appropriate
extension to SDP could provide this function.</t>
        <t>Applying SFrame per-frame also requires that packetization and depacketization
be done in a generic manner that does not depend on the media content of the
packets, since the content being packetized / depacketized will be opaque
ciphertext (except for the SFrame header).  In order for such a generic
packetization scheme to work interoperably one would have to be defined, e.g.,
as proposed in <xref target="I-D.codec-agnostic-rtp-payload-format"/>.</t>
        <figure anchor="sframe-packet">
          <name>SRTP packet with SFrame-protected payload</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="384" width="576" viewBox="0 0 576 384" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,208 L 8,368" fill="none" stroke="black"/>
                <path d="M 32,32 L 32,336" fill="none" stroke="black"/>
                <path d="M 64,32 L 64,64" fill="none" stroke="black"/>
                <path d="M 80,32 L 80,64" fill="none" stroke="black"/>
                <path d="M 96,32 L 96,64" fill="none" stroke="black"/>
                <path d="M 160,32 L 160,64" fill="none" stroke="black"/>
                <path d="M 176,32 L 176,64" fill="none" stroke="black"/>
                <path d="M 200,208 L 200,240" fill="none" stroke="black"/>
                <path d="M 288,32 L 288,64" fill="none" stroke="black"/>
                <path d="M 544,32 L 544,336" fill="none" stroke="black"/>
                <path d="M 568,32 L 568,368" fill="none" stroke="black"/>
                <path d="M 32,32 L 568,32" fill="none" stroke="black"/>
                <path d="M 32,64 L 544,64" fill="none" stroke="black"/>
                <path d="M 32,96 L 544,96" fill="none" stroke="black"/>
                <path d="M 32,126 L 544,126" fill="none" stroke="black"/>
                <path d="M 32,130 L 544,130" fill="none" stroke="black"/>
                <path d="M 32,176 L 544,176" fill="none" stroke="black"/>
                <path d="M 8,208 L 544,208" fill="none" stroke="black"/>
                <path d="M 32,240 L 200,240" fill="none" stroke="black"/>
                <path d="M 8,304 L 568,304" fill="none" stroke="black"/>
                <path d="M 32,336 L 544,336" fill="none" stroke="black"/>
                <path d="M 8,368 L 32,368" fill="none" stroke="black"/>
                <path d="M 544,368 L 568,368" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="560,304 548,298.4 548,309.6" fill="black" transform="rotate(180,552,304)"/>
                <polygon class="arrowhead" points="560,32 548,26.4 548,37.6" fill="black" transform="rotate(180,552,32)"/>
                <polygon class="arrowhead" points="32,304 20,298.4 20,309.6" fill="black" transform="rotate(0,24,304)"/>
                <polygon class="arrowhead" points="32,208 20,202.4 20,213.6" fill="black" transform="rotate(0,24,208)"/>
                <g class="text">
                  <text x="48" y="52">V=2</text>
                  <text x="72" y="52">P</text>
                  <text x="88" y="52">X</text>
                  <text x="124" y="52">CC</text>
                  <text x="168" y="52">M</text>
                  <text x="228" y="52">PT</text>
                  <text x="380" y="52">sequence</text>
                  <text x="444" y="52">number</text>
                  <text x="288" y="84">timestamp</text>
                  <text x="184" y="116">synchronization</text>
                  <text x="276" y="116">source</text>
                  <text x="332" y="116">(SSRC)</text>
                  <text x="404" y="116">identifier</text>
                  <text x="180" y="148">contributing</text>
                  <text x="260" y="148">source</text>
                  <text x="316" y="148">(CSRC)</text>
                  <text x="392" y="148">identifiers</text>
                  <text x="300" y="164">....</text>
                  <text x="200" y="196">RTP</text>
                  <text x="268" y="196">extension(s)</text>
                  <text x="364" y="196">(OPTIONAL)</text>
                  <text x="84" y="228">SFrame</text>
                  <text x="140" y="228">header</text>
                  <text x="140" y="276">SFrame</text>
                  <text x="208" y="276">encrypted</text>
                  <text x="264" y="276">and</text>
                  <text x="336" y="276">authenticated</text>
                  <text x="424" y="276">payload</text>
                  <text x="212" y="324">SRTP</text>
                  <text x="292" y="324">authentication</text>
                  <text x="368" y="324">tag</text>
                  <text x="60" y="372">SRTP</text>
                  <text x="120" y="372">Encrypted</text>
                  <text x="192" y="372">Portion</text>
                  <text x="340" y="372">SRTP</text>
                  <text x="416" y="372">Authenticated</text>
                  <text x="504" y="372">Portion</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
   +---+-+-+-------+-+-------------+-------------------------------+<-+
   |V=2|P|X|  CC   |M|     PT      |       sequence number         |  |
   +---+-+-+-------+-+-------------+-------------------------------+  |
   |                           timestamp                           |  |
   +---------------------------------------------------------------+  |
   |           synchronization source (SSRC) identifier            |  |
   +===============================================================+  |
   |            contributing source (CSRC) identifiers             |  |
   |                               ....                            |  |
   +---------------------------------------------------------------+  |
   |                   RTP extension(s) (OPTIONAL)                 |  |
+->+--------------------+------------------------------------------+  |
|  |   SFrame header    |                                          |  |
|  +--------------------+                                          |  |
|  |                                                               |  |
|  |          SFrame encrypted and authenticated payload           |  |
|  |                                                               |  |
+->+---------------------------------------------------------------+<-+
|  |                    SRTP authentication tag                    |  |
|  +---------------------------------------------------------------+  |
|                                                                     |
+--- SRTP Encrypted Portion             SRTP Authenticated Portion ---+
]]></artwork>
          </artset>
        </figure>
        <figure anchor="sframe-multi-packet">
          <name>Encryption flow with per-frame encryption for RTP</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="624" width="504" viewBox="0 0 504 624" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,192 L 8,224" fill="none" stroke="black"/>
                <path d="M 8,512 L 8,608" fill="none" stroke="black"/>
                <path d="M 32,32 L 32,64" fill="none" stroke="black"/>
                <path d="M 32,232 L 32,504" fill="none" stroke="black"/>
                <path d="M 72,464 L 72,504" fill="none" stroke="black"/>
                <path d="M 96,64 L 96,184" fill="none" stroke="black"/>
                <path d="M 136,512 L 136,608" fill="none" stroke="black"/>
                <path d="M 168,32 L 168,64" fill="none" stroke="black"/>
                <path d="M 192,32 L 192,128" fill="none" stroke="black"/>
                <path d="M 192,288 L 192,400" fill="none" stroke="black"/>
                <path d="M 192,512 L 192,608" fill="none" stroke="black"/>
                <path d="M 256,128 L 256,184" fill="none" stroke="black"/>
                <path d="M 256,232 L 256,280" fill="none" stroke="black"/>
                <path d="M 256,400 L 256,416" fill="none" stroke="black"/>
                <path d="M 256,448 L 256,504" fill="none" stroke="black"/>
                <path d="M 320,32 L 320,128" fill="none" stroke="black"/>
                <path d="M 320,192 L 320,224" fill="none" stroke="black"/>
                <path d="M 320,288 L 320,400" fill="none" stroke="black"/>
                <path d="M 320,512 L 320,608" fill="none" stroke="black"/>
                <path d="M 368,512 L 368,608" fill="none" stroke="black"/>
                <path d="M 432,464 L 432,504" fill="none" stroke="black"/>
                <path d="M 496,512 L 496,608" fill="none" stroke="black"/>
                <path d="M 32,32 L 168,32" fill="none" stroke="black"/>
                <path d="M 192,32 L 320,32" fill="none" stroke="black"/>
                <path d="M 32,64 L 168,64" fill="none" stroke="black"/>
                <path d="M 192,128 L 320,128" fill="none" stroke="black"/>
                <path d="M 8,192 L 320,192" fill="none" stroke="black"/>
                <path d="M 8,224 L 320,224" fill="none" stroke="black"/>
                <path d="M 192,288 L 320,288" fill="none" stroke="black"/>
                <path d="M 192,400 L 320,400" fill="none" stroke="black"/>
                <path d="M 72,464 L 328,464" fill="none" stroke="black"/>
                <path d="M 360,464 L 432,464" fill="none" stroke="black"/>
                <path d="M 8,512 L 136,512" fill="none" stroke="black"/>
                <path d="M 192,512 L 320,512" fill="none" stroke="black"/>
                <path d="M 368,512 L 496,512" fill="none" stroke="black"/>
                <path d="M 8,544 L 136,544" fill="none" stroke="black"/>
                <path d="M 8,608 L 136,608" fill="none" stroke="black"/>
                <path d="M 192,608 L 320,608" fill="none" stroke="black"/>
                <path d="M 368,608 L 496,608" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="440,504 428,498.4 428,509.6" fill="black" transform="rotate(90,432,504)"/>
                <polygon class="arrowhead" points="264,504 252,498.4 252,509.6" fill="black" transform="rotate(90,256,504)"/>
                <polygon class="arrowhead" points="264,280 252,274.4 252,285.6" fill="black" transform="rotate(90,256,280)"/>
                <polygon class="arrowhead" points="264,184 252,178.4 252,189.6" fill="black" transform="rotate(90,256,184)"/>
                <polygon class="arrowhead" points="104,184 92,178.4 92,189.6" fill="black" transform="rotate(90,96,184)"/>
                <polygon class="arrowhead" points="80,504 68,498.4 68,509.6" fill="black" transform="rotate(90,72,504)"/>
                <polygon class="arrowhead" points="40,504 28,498.4 28,509.6" fill="black" transform="rotate(90,32,504)"/>
                <g class="text">
                  <text x="64" y="52">frame</text>
                  <text x="124" y="52">metadata</text>
                  <text x="256" y="84">frame</text>
                  <text x="132" y="212">SFrame</text>
                  <text x="192" y="212">Encrypt</text>
                  <text x="256" y="340">encrypted</text>
                  <text x="256" y="356">frame</text>
                  <text x="208" y="436">generic</text>
                  <text x="256" y="436">RTP</text>
                  <text x="312" y="436">packetize</text>
                  <text x="344" y="468">...</text>
                  <text x="44" y="532">SFrame</text>
                  <text x="100" y="532">header</text>
                  <text x="240" y="564">payload</text>
                  <text x="288" y="564">2/N</text>
                  <text x="344" y="564">...</text>
                  <text x="416" y="564">payload</text>
                  <text x="464" y="564">N/N</text>
                  <text x="56" y="580">payload</text>
                  <text x="104" y="580">1/N</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
   +----------------+  +---------------+
   | frame metadata |  |               |
   +-------+--------+  |               |
           |           |     frame     |
           |           |               |
           |           |               |
           |           +-------+-------+
           |                   |
           |                   |
           V                   V
+--------------------------------------+
|            SFrame Encrypt            |
+--------------------------------------+
   |                           |
   |                           |
   |                           V
   |                   +-------+-------+
   |                   |               |
   |                   |               |
   |                   |   encrypted   |
   |                   |     frame     |
   |                   |               |
   |                   |               |
   |                   +-------+-------+
   |                           |
   |                  generic RTP packetize
   |                           |
   |    +----------------------+--------.....--------+
   |    |                      |                     |
   V    V                      V                     V
+---------------+      +---------------+     +---------------+
| SFrame header |      |               |     |               |
+---------------+      |               |     |               |
|               |      |  payload 2/N  | ... |  payload N/N  |
|  payload 1/N  |      |               |     |               |
|               |      |               |     |               |
+---------------+      +---------------+     +---------------+
]]></artwork>
          </artset>
        </figure>
      </section>
    </section>
    <section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>This section provides a set of test vectors that implementations can use to
verify that they correctly implement SFrame encryption and decryption.  In
addition to test vectors for the overall process of SFrame
encryption/decryption, we also provide test vectors for header
encoding/decoding, and for AEAD encryption/decryption using the AES-CTR
construction defined in <xref target="aes-ctr-with-sha2"/>.</t>
      <t>All values are either numeric or byte strings.  Numeric values are represented
as hex values, prefixed with <tt>0x</tt>.  Byte strings are represented in hex
encoding.</t>
      <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.</t>
      <t>These test vectors are also available in JSON format at <xref target="TestVectors"/>.  In the
JSON test vectors, numeric values are JSON numbers and byte string values are
JSON strings containing the hex encoding of the byte strings.</t>
      <section anchor="header-encodingdecoding">
        <name>Header encoding/decoding</name>
        <t>For each case, we provide:</t>
        <ul spacing="normal">
          <li>
            <t><tt>kid</tt>: A KID value</t>
          </li>
          <li>
            <t><tt>ctr</tt>: A CTR value</t>
          </li>
          <li>
            <t><tt>header</tt>: An encoded SFrame header</t>
          </li>
        </ul>
        <t>An implementation should verify that:</t>
        <ul spacing="normal">
          <li>
            <t>Encoding a header with the KID and CTR results in the provided header value</t>
          </li>
          <li>
            <t>Decoding the provided header value results in the provided KID and CTR values</t>
          </li>
        </ul>
        <artwork><![CDATA[
kid: 0x0000000000000000
ctr: 0x0000000000000000
header: 00
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000000
ctr: 0x0000000000000001
header: 01
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000000
ctr: 0x00000000000000ff
header: 08ff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000000
ctr: 0x0000000000000100
header: 090100
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000000
ctr: 0x000000000000ffff
header: 09ffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000000
ctr: 0x0000000000010000
header: 0a010000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000000
ctr: 0x0000000000ffffff
header: 0affffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000000
ctr: 0x0000000001000000
header: 0b01000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000000
ctr: 0x00000000ffffffff
header: 0bffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000000
ctr: 0x0000000100000000
header: 0c0100000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000000
ctr: 0x000000ffffffffff
header: 0cffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000000
ctr: 0x0000010000000000
header: 0d010000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000000
ctr: 0x0000ffffffffffff
header: 0dffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000000
ctr: 0x0001000000000000
header: 0e01000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000000
ctr: 0x00ffffffffffffff
header: 0effffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000000
ctr: 0x0100000000000000
header: 0f0100000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000000
ctr: 0xffffffffffffffff
header: 0fffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000001
ctr: 0x0000000000000000
header: 10
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000001
ctr: 0x0000000000000001
header: 11
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000001
ctr: 0x00000000000000ff
header: 18ff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000001
ctr: 0x0000000000000100
header: 190100
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000001
ctr: 0x000000000000ffff
header: 19ffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000001
ctr: 0x0000000000010000
header: 1a010000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000001
ctr: 0x0000000000ffffff
header: 1affffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000001
ctr: 0x0000000001000000
header: 1b01000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000001
ctr: 0x00000000ffffffff
header: 1bffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000001
ctr: 0x0000000100000000
header: 1c0100000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000001
ctr: 0x000000ffffffffff
header: 1cffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000001
ctr: 0x0000010000000000
header: 1d010000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000001
ctr: 0x0000ffffffffffff
header: 1dffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000001
ctr: 0x0001000000000000
header: 1e01000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000001
ctr: 0x00ffffffffffffff
header: 1effffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000001
ctr: 0x0100000000000000
header: 1f0100000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000001
ctr: 0xffffffffffffffff
header: 1fffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000000000ff
ctr: 0x0000000000000000
header: 80ff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000000000ff
ctr: 0x0000000000000001
header: 81ff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000000000ff
ctr: 0x00000000000000ff
header: 88ffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000000000ff
ctr: 0x0000000000000100
header: 89ff0100
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000000000ff
ctr: 0x000000000000ffff
header: 89ffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000000000ff
ctr: 0x0000000000010000
header: 8aff010000
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000000000ff
ctr: 0x0000000000ffffff
header: 8affffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000000000ff
ctr: 0x0000000001000000
header: 8bff01000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000000000ff
ctr: 0x00000000ffffffff
header: 8bffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000000000ff
ctr: 0x0000000100000000
header: 8cff0100000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000000000ff
ctr: 0x000000ffffffffff
header: 8cffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000000000ff
ctr: 0x0000010000000000
header: 8dff010000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000000000ff
ctr: 0x0000ffffffffffff
header: 8dffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000000000ff
ctr: 0x0001000000000000
header: 8eff01000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000000000ff
ctr: 0x00ffffffffffffff
header: 8effffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000000000ff
ctr: 0x0100000000000000
header: 8fff0100000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000000000ff
ctr: 0xffffffffffffffff
header: 8fffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000100
ctr: 0x0000000000000000
header: 900100
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000100
ctr: 0x0000000000000001
header: 910100
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000100
ctr: 0x00000000000000ff
header: 980100ff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000100
ctr: 0x0000000000000100
header: 9901000100
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000100
ctr: 0x000000000000ffff
header: 990100ffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000100
ctr: 0x0000000000010000
header: 9a0100010000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000100
ctr: 0x0000000000ffffff
header: 9a0100ffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000100
ctr: 0x0000000001000000
header: 9b010001000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000100
ctr: 0x00000000ffffffff
header: 9b0100ffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000100
ctr: 0x0000000100000000
header: 9c01000100000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000100
ctr: 0x000000ffffffffff
header: 9c0100ffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000100
ctr: 0x0000010000000000
header: 9d0100010000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000100
ctr: 0x0000ffffffffffff
header: 9d0100ffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000100
ctr: 0x0001000000000000
header: 9e010001000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000100
ctr: 0x00ffffffffffffff
header: 9e0100ffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000100
ctr: 0x0100000000000000
header: 9f01000100000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000000100
ctr: 0xffffffffffffffff
header: 9f0100ffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000000000ffff
ctr: 0x0000000000000000
header: 90ffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000000000ffff
ctr: 0x0000000000000001
header: 91ffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000000000ffff
ctr: 0x00000000000000ff
header: 98ffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000000000ffff
ctr: 0x0000000000000100
header: 99ffff0100
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000000000ffff
ctr: 0x000000000000ffff
header: 99ffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000000000ffff
ctr: 0x0000000000010000
header: 9affff010000
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000000000ffff
ctr: 0x0000000000ffffff
header: 9affffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000000000ffff
ctr: 0x0000000001000000
header: 9bffff01000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000000000ffff
ctr: 0x00000000ffffffff
header: 9bffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000000000ffff
ctr: 0x0000000100000000
header: 9cffff0100000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000000000ffff
ctr: 0x000000ffffffffff
header: 9cffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000000000ffff
ctr: 0x0000010000000000
header: 9dffff010000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000000000ffff
ctr: 0x0000ffffffffffff
header: 9dffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000000000ffff
ctr: 0x0001000000000000
header: 9effff01000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000000000ffff
ctr: 0x00ffffffffffffff
header: 9effffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000000000ffff
ctr: 0x0100000000000000
header: 9fffff0100000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000000000ffff
ctr: 0xffffffffffffffff
header: 9fffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000010000
ctr: 0x0000000000000000
header: a0010000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000010000
ctr: 0x0000000000000001
header: a1010000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000010000
ctr: 0x00000000000000ff
header: a8010000ff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000010000
ctr: 0x0000000000000100
header: a90100000100
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000010000
ctr: 0x000000000000ffff
header: a9010000ffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000010000
ctr: 0x0000000000010000
header: aa010000010000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000010000
ctr: 0x0000000000ffffff
header: aa010000ffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000010000
ctr: 0x0000000001000000
header: ab01000001000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000010000
ctr: 0x00000000ffffffff
header: ab010000ffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000010000
ctr: 0x0000000100000000
header: ac0100000100000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000010000
ctr: 0x000000ffffffffff
header: ac010000ffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000010000
ctr: 0x0000010000000000
header: ad010000010000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000010000
ctr: 0x0000ffffffffffff
header: ad010000ffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000010000
ctr: 0x0001000000000000
header: ae01000001000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000010000
ctr: 0x00ffffffffffffff
header: ae010000ffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000010000
ctr: 0x0100000000000000
header: af0100000100000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000010000
ctr: 0xffffffffffffffff
header: af010000ffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000ffffff
ctr: 0x0000000000000000
header: a0ffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000ffffff
ctr: 0x0000000000000001
header: a1ffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000ffffff
ctr: 0x00000000000000ff
header: a8ffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000ffffff
ctr: 0x0000000000000100
header: a9ffffff0100
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000ffffff
ctr: 0x000000000000ffff
header: a9ffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000ffffff
ctr: 0x0000000000010000
header: aaffffff010000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000ffffff
ctr: 0x0000000000ffffff
header: aaffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000ffffff
ctr: 0x0000000001000000
header: abffffff01000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000ffffff
ctr: 0x00000000ffffffff
header: abffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000ffffff
ctr: 0x0000000100000000
header: acffffff0100000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000ffffff
ctr: 0x000000ffffffffff
header: acffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000ffffff
ctr: 0x0000010000000000
header: adffffff010000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000ffffff
ctr: 0x0000ffffffffffff
header: adffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000ffffff
ctr: 0x0001000000000000
header: aeffffff01000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000ffffff
ctr: 0x00ffffffffffffff
header: aeffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000ffffff
ctr: 0x0100000000000000
header: afffffff0100000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000000ffffff
ctr: 0xffffffffffffffff
header: afffffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000001000000
ctr: 0x0000000000000000
header: b001000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000001000000
ctr: 0x0000000000000001
header: b101000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000001000000
ctr: 0x00000000000000ff
header: b801000000ff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000001000000
ctr: 0x0000000000000100
header: b9010000000100
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000001000000
ctr: 0x000000000000ffff
header: b901000000ffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000001000000
ctr: 0x0000000000010000
header: ba01000000010000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000001000000
ctr: 0x0000000000ffffff
header: ba01000000ffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000001000000
ctr: 0x0000000001000000
header: bb0100000001000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000001000000
ctr: 0x00000000ffffffff
header: bb01000000ffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000001000000
ctr: 0x0000000100000000
header: bc010000000100000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000001000000
ctr: 0x000000ffffffffff
header: bc01000000ffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000001000000
ctr: 0x0000010000000000
header: bd01000000010000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000001000000
ctr: 0x0000ffffffffffff
header: bd01000000ffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000001000000
ctr: 0x0001000000000000
header: be0100000001000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000001000000
ctr: 0x00ffffffffffffff
header: be01000000ffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000001000000
ctr: 0x0100000000000000
header: bf010000000100000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000001000000
ctr: 0xffffffffffffffff
header: bf01000000ffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000ffffffff
ctr: 0x0000000000000000
header: b0ffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000ffffffff
ctr: 0x0000000000000001
header: b1ffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000ffffffff
ctr: 0x00000000000000ff
header: b8ffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000ffffffff
ctr: 0x0000000000000100
header: b9ffffffff0100
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000ffffffff
ctr: 0x000000000000ffff
header: b9ffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000ffffffff
ctr: 0x0000000000010000
header: baffffffff010000
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000ffffffff
ctr: 0x0000000000ffffff
header: baffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000ffffffff
ctr: 0x0000000001000000
header: bbffffffff01000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000ffffffff
ctr: 0x00000000ffffffff
header: bbffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000ffffffff
ctr: 0x0000000100000000
header: bcffffffff0100000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000ffffffff
ctr: 0x000000ffffffffff
header: bcffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000ffffffff
ctr: 0x0000010000000000
header: bdffffffff010000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000ffffffff
ctr: 0x0000ffffffffffff
header: bdffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000ffffffff
ctr: 0x0001000000000000
header: beffffffff01000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000ffffffff
ctr: 0x00ffffffffffffff
header: beffffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000ffffffff
ctr: 0x0100000000000000
header: bfffffffff0100000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x00000000ffffffff
ctr: 0xffffffffffffffff
header: bfffffffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000100000000
ctr: 0x0000000000000000
header: c00100000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000100000000
ctr: 0x0000000000000001
header: c10100000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000100000000
ctr: 0x00000000000000ff
header: c80100000000ff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000100000000
ctr: 0x0000000000000100
header: c901000000000100
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000100000000
ctr: 0x000000000000ffff
header: c90100000000ffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000100000000
ctr: 0x0000000000010000
header: ca0100000000010000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000100000000
ctr: 0x0000000000ffffff
header: ca0100000000ffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000100000000
ctr: 0x0000000001000000
header: cb010000000001000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000100000000
ctr: 0x00000000ffffffff
header: cb0100000000ffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000100000000
ctr: 0x0000000100000000
header: cc01000000000100000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000100000000
ctr: 0x000000ffffffffff
header: cc0100000000ffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000100000000
ctr: 0x0000010000000000
header: cd0100000000010000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000100000000
ctr: 0x0000ffffffffffff
header: cd0100000000ffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000100000000
ctr: 0x0001000000000000
header: ce010000000001000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000100000000
ctr: 0x00ffffffffffffff
header: ce0100000000ffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000100000000
ctr: 0x0100000000000000
header: cf01000000000100000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000000100000000
ctr: 0xffffffffffffffff
header: cf0100000000ffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000ffffffffff
ctr: 0x0000000000000000
header: c0ffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000ffffffffff
ctr: 0x0000000000000001
header: c1ffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000ffffffffff
ctr: 0x00000000000000ff
header: c8ffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000ffffffffff
ctr: 0x0000000000000100
header: c9ffffffffff0100
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000ffffffffff
ctr: 0x000000000000ffff
header: c9ffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000ffffffffff
ctr: 0x0000000000010000
header: caffffffffff010000
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000ffffffffff
ctr: 0x0000000000ffffff
header: caffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000ffffffffff
ctr: 0x0000000001000000
header: cbffffffffff01000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000ffffffffff
ctr: 0x00000000ffffffff
header: cbffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000ffffffffff
ctr: 0x0000000100000000
header: ccffffffffff0100000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000ffffffffff
ctr: 0x000000ffffffffff
header: ccffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000ffffffffff
ctr: 0x0000010000000000
header: cdffffffffff010000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000ffffffffff
ctr: 0x0000ffffffffffff
header: cdffffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000ffffffffff
ctr: 0x0001000000000000
header: ceffffffffff01000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000ffffffffff
ctr: 0x00ffffffffffffff
header: ceffffffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000ffffffffff
ctr: 0x0100000000000000
header: cfffffffffff0100000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x000000ffffffffff
ctr: 0xffffffffffffffff
header: cfffffffffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000010000000000
ctr: 0x0000000000000000
header: d0010000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000010000000000
ctr: 0x0000000000000001
header: d1010000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000010000000000
ctr: 0x00000000000000ff
header: d8010000000000ff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000010000000000
ctr: 0x0000000000000100
header: d90100000000000100
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000010000000000
ctr: 0x000000000000ffff
header: d9010000000000ffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000010000000000
ctr: 0x0000000000010000
header: da010000000000010000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000010000000000
ctr: 0x0000000000ffffff
header: da010000000000ffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000010000000000
ctr: 0x0000000001000000
header: db01000000000001000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000010000000000
ctr: 0x00000000ffffffff
header: db010000000000ffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000010000000000
ctr: 0x0000000100000000
header: dc0100000000000100000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000010000000000
ctr: 0x000000ffffffffff
header: dc010000000000ffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000010000000000
ctr: 0x0000010000000000
header: dd010000000000010000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000010000000000
ctr: 0x0000ffffffffffff
header: dd010000000000ffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000010000000000
ctr: 0x0001000000000000
header: de01000000000001000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000010000000000
ctr: 0x00ffffffffffffff
header: de010000000000ffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000010000000000
ctr: 0x0100000000000000
header: df0100000000000100000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000010000000000
ctr: 0xffffffffffffffff
header: df010000000000ffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000ffffffffffff
ctr: 0x0000000000000000
header: d0ffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000ffffffffffff
ctr: 0x0000000000000001
header: d1ffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000ffffffffffff
ctr: 0x00000000000000ff
header: d8ffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000ffffffffffff
ctr: 0x0000000000000100
header: d9ffffffffffff0100
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000ffffffffffff
ctr: 0x000000000000ffff
header: d9ffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000ffffffffffff
ctr: 0x0000000000010000
header: daffffffffffff010000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000ffffffffffff
ctr: 0x0000000000ffffff
header: daffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000ffffffffffff
ctr: 0x0000000001000000
header: dbffffffffffff01000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000ffffffffffff
ctr: 0x00000000ffffffff
header: dbffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000ffffffffffff
ctr: 0x0000000100000000
header: dcffffffffffff0100000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000ffffffffffff
ctr: 0x000000ffffffffff
header: dcffffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000ffffffffffff
ctr: 0x0000010000000000
header: ddffffffffffff010000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000ffffffffffff
ctr: 0x0000ffffffffffff
header: ddffffffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000ffffffffffff
ctr: 0x0001000000000000
header: deffffffffffff01000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000ffffffffffff
ctr: 0x00ffffffffffffff
header: deffffffffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000ffffffffffff
ctr: 0x0100000000000000
header: dfffffffffffff0100000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0000ffffffffffff
ctr: 0xffffffffffffffff
header: dfffffffffffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0001000000000000
ctr: 0x0000000000000000
header: e001000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0001000000000000
ctr: 0x0000000000000001
header: e101000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0001000000000000
ctr: 0x00000000000000ff
header: e801000000000000ff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0001000000000000
ctr: 0x0000000000000100
header: e9010000000000000100
]]></artwork>
        <artwork><![CDATA[
kid: 0x0001000000000000
ctr: 0x000000000000ffff
header: e901000000000000ffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0001000000000000
ctr: 0x0000000000010000
header: ea01000000000000010000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0001000000000000
ctr: 0x0000000000ffffff
header: ea01000000000000ffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0001000000000000
ctr: 0x0000000001000000
header: eb0100000000000001000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0001000000000000
ctr: 0x00000000ffffffff
header: eb01000000000000ffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0001000000000000
ctr: 0x0000000100000000
header: ec010000000000000100000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0001000000000000
ctr: 0x000000ffffffffff
header: ec01000000000000ffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0001000000000000
ctr: 0x0000010000000000
header: ed01000000000000010000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0001000000000000
ctr: 0x0000ffffffffffff
header: ed01000000000000ffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0001000000000000
ctr: 0x0001000000000000
header: ee0100000000000001000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0001000000000000
ctr: 0x00ffffffffffffff
header: ee01000000000000ffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0001000000000000
ctr: 0x0100000000000000
header: ef010000000000000100000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0001000000000000
ctr: 0xffffffffffffffff
header: ef01000000000000ffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00ffffffffffffff
ctr: 0x0000000000000000
header: e0ffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00ffffffffffffff
ctr: 0x0000000000000001
header: e1ffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00ffffffffffffff
ctr: 0x00000000000000ff
header: e8ffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00ffffffffffffff
ctr: 0x0000000000000100
header: e9ffffffffffffff0100
]]></artwork>
        <artwork><![CDATA[
kid: 0x00ffffffffffffff
ctr: 0x000000000000ffff
header: e9ffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00ffffffffffffff
ctr: 0x0000000000010000
header: eaffffffffffffff010000
]]></artwork>
        <artwork><![CDATA[
kid: 0x00ffffffffffffff
ctr: 0x0000000000ffffff
header: eaffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00ffffffffffffff
ctr: 0x0000000001000000
header: ebffffffffffffff01000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x00ffffffffffffff
ctr: 0x00000000ffffffff
header: ebffffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00ffffffffffffff
ctr: 0x0000000100000000
header: ecffffffffffffff0100000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x00ffffffffffffff
ctr: 0x000000ffffffffff
header: ecffffffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00ffffffffffffff
ctr: 0x0000010000000000
header: edffffffffffffff010000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x00ffffffffffffff
ctr: 0x0000ffffffffffff
header: edffffffffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00ffffffffffffff
ctr: 0x0001000000000000
header: eeffffffffffffff01000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x00ffffffffffffff
ctr: 0x00ffffffffffffff
header: eeffffffffffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x00ffffffffffffff
ctr: 0x0100000000000000
header: efffffffffffffff0100000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x00ffffffffffffff
ctr: 0xffffffffffffffff
header: efffffffffffffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0100000000000000
ctr: 0x0000000000000000
header: f00100000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0100000000000000
ctr: 0x0000000000000001
header: f10100000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0100000000000000
ctr: 0x00000000000000ff
header: f80100000000000000ff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0100000000000000
ctr: 0x0000000000000100
header: f901000000000000000100
]]></artwork>
        <artwork><![CDATA[
kid: 0x0100000000000000
ctr: 0x000000000000ffff
header: f90100000000000000ffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0100000000000000
ctr: 0x0000000000010000
header: fa0100000000000000010000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0100000000000000
ctr: 0x0000000000ffffff
header: fa0100000000000000ffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0100000000000000
ctr: 0x0000000001000000
header: fb010000000000000001000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0100000000000000
ctr: 0x00000000ffffffff
header: fb0100000000000000ffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0100000000000000
ctr: 0x0000000100000000
header: fc01000000000000000100000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0100000000000000
ctr: 0x000000ffffffffff
header: fc0100000000000000ffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0100000000000000
ctr: 0x0000010000000000
header: fd0100000000000000010000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0100000000000000
ctr: 0x0000ffffffffffff
header: fd0100000000000000ffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0100000000000000
ctr: 0x0001000000000000
header: fe010000000000000001000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0100000000000000
ctr: 0x00ffffffffffffff
header: fe0100000000000000ffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0x0100000000000000
ctr: 0x0100000000000000
header: ff01000000000000000100000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0x0100000000000000
ctr: 0xffffffffffffffff
header: ff0100000000000000ffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0xffffffffffffffff
ctr: 0x0000000000000000
header: f0ffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0xffffffffffffffff
ctr: 0x0000000000000001
header: f1ffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0xffffffffffffffff
ctr: 0x00000000000000ff
header: f8ffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0xffffffffffffffff
ctr: 0x0000000000000100
header: f9ffffffffffffffff0100
]]></artwork>
        <artwork><![CDATA[
kid: 0xffffffffffffffff
ctr: 0x000000000000ffff
header: f9ffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0xffffffffffffffff
ctr: 0x0000000000010000
header: faffffffffffffffff010000
]]></artwork>
        <artwork><![CDATA[
kid: 0xffffffffffffffff
ctr: 0x0000000000ffffff
header: faffffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0xffffffffffffffff
ctr: 0x0000000001000000
header: fbffffffffffffffff01000000
]]></artwork>
        <artwork><![CDATA[
kid: 0xffffffffffffffff
ctr: 0x00000000ffffffff
header: fbffffffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0xffffffffffffffff
ctr: 0x0000000100000000
header: fcffffffffffffffff0100000000
]]></artwork>
        <artwork><![CDATA[
kid: 0xffffffffffffffff
ctr: 0x000000ffffffffff
header: fcffffffffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0xffffffffffffffff
ctr: 0x0000010000000000
header: fdffffffffffffffff010000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0xffffffffffffffff
ctr: 0x0000ffffffffffff
header: fdffffffffffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0xffffffffffffffff
ctr: 0x0001000000000000
header: feffffffffffffffff01000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0xffffffffffffffff
ctr: 0x00ffffffffffffff
header: feffffffffffffffffffffffffffffff
]]></artwork>
        <artwork><![CDATA[
kid: 0xffffffffffffffff
ctr: 0x0100000000000000
header: ffffffffffffffffff0100000000000000
]]></artwork>
        <artwork><![CDATA[
kid: 0xffffffffffffffff
ctr: 0xffffffffffffffff
header: ffffffffffffffffffffffffffffffffff
]]></artwork>
      </section>
      <section anchor="aead-encryptiondecryption-using-aes-ctr-and-hmac">
        <name>AEAD encryption/decryption using AES-CTR and HMAC</name>
        <t>For each case, we provide:</t>
        <ul spacing="normal">
          <li>
            <t><tt>cipher_suite</tt>: The index of the cipher suite in use (see
<xref target="sframe-cipher-suites"/>)</t>
          </li>
          <li>
            <t><tt>key</tt>: The <tt>key</tt> input to encryption/decryption</t>
          </li>
          <li>
            <t><tt>enc_key</tt>: The encryption subkey produced by the <tt>derive_subkeys()</tt> algorithm</t>
          </li>
          <li>
            <t><tt>auth_key</tt>: The encryption subkey produced by the <tt>derive_subkeys()</tt> algorithm</t>
          </li>
          <li>
            <t><tt>nonce</tt>: The <tt>nonce</tt> input to encryption/decryption</t>
          </li>
          <li>
            <t><tt>aad</tt>: The <tt>aad</tt> input to encryption/decryption</t>
          </li>
          <li>
            <t><tt>pt</tt>: The plaintext</t>
          </li>
          <li>
            <t><tt>ct</tt>: The ciphertext</t>
          </li>
        </ul>
        <t>An implementation should verify that the following are true, where
<tt>AEAD.Encrypt</tt> and <tt>AEAD.Decrypt</tt> are as defined in <xref target="aes-ctr-with-sha2"/>:</t>
        <ul spacing="normal">
          <li>
            <t><tt>AEAD.Encrypt(key, nonce, aad, pt) == ct</tt></t>
          </li>
          <li>
            <t><tt>AEAD.Decrypt(key, nonce, aad, ct) == pt</tt></t>
          </li>
        </ul>
        <t>The other values in the test vector are intermediate values provided to
facilitate debugging of test failures.</t>
        <artwork><![CDATA[
cipher_suite: 0x0001
key: 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f
enc_key: 000102030405060708090a0b0c0d0e0f
auth_key: 101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f
nonce: 101112131415161718191a1b
aad: 4945544620534672616d65205747
pt: 64726166742d696574662d736672616d652d656e63
ct: 6339af04ada1d064688a442b8dc69d5b6bfa40f4bef0583e8081069cc60705
]]></artwork>
        <artwork><![CDATA[
cipher_suite: 0x0002
key: 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f
enc_key: 000102030405060708090a0b0c0d0e0f
auth_key: 101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f
nonce: 101112131415161718191a1b
aad: 4945544620534672616d65205747
pt: 64726166742d696574662d736672616d652d656e63
ct: 6339af04ada1d064688a442b8dc69d5b6bfa40f4be6e93b7da076927bb
]]></artwork>
        <artwork><![CDATA[
cipher_suite: 0x0003
key: 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f
enc_key: 000102030405060708090a0b0c0d0e0f
auth_key: 101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f
nonce: 101112131415161718191a1b
aad: 4945544620534672616d65205747
pt: 64726166742d696574662d736672616d652d656e63
ct: 6339af04ada1d064688a442b8dc69d5b6bfa40f4be09480509
]]></artwork>
      </section>
      <section anchor="sframe-encryptiondecryption">
        <name>SFrame encryption/decryption</name>
        <t>For each case, we provide:</t>
        <ul spacing="normal">
          <li>
            <t><tt>cipher_suite</tt>: The index of the cipher suite in use (see
<xref target="sframe-cipher-suites"/>)</t>
          </li>
          <li>
            <t><tt>kid</tt>: A KID value</t>
          </li>
          <li>
            <t><tt>ctr</tt>: A CTR value</t>
          </li>
          <li>
            <t><tt>base_key</tt>: The <tt>base_key</tt> input to the <tt>derive_key_salt</tt> algorithm</t>
          </li>
          <li>
            <t><tt>sframe_key_label</tt>: The label used to derive <tt>sframe_key</tt> in the <tt>derive_key_salt</tt> algorithm</t>
          </li>
          <li>
            <t><tt>sframe_salt_label</tt>: The label used to derive <tt>sframe_salt</tt> in the <tt>derive_key_salt</tt> algorithm</t>
          </li>
          <li>
            <t><tt>sframe_secret</tt>: The <tt>sframe_secret</tt> variable in the <tt>derive_key_salt</tt> algorithm</t>
          </li>
          <li>
            <t><tt>sframe_key</tt>: The <tt>sframe_key</tt> value produced by the <tt>derive_key_salt</tt> algorithm</t>
          </li>
          <li>
            <t><tt>sframe_salt</tt>: The <tt>sframe_salt</tt> value produced by the <tt>derive_key_salt</tt> algorithm</t>
          </li>
          <li>
            <t><tt>metadata</tt>: The <tt>metadata</tt> input to the SFrame <tt>encrypt</tt> algorithm</t>
          </li>
          <li>
            <t><tt>pt</tt>: The plaintext</t>
          </li>
          <li>
            <t><tt>ct</tt>: The SFrame ciphertext</t>
          </li>
        </ul>
        <t>An implementation should verify that the following are true, where
<tt>encrypt</tt> and <tt>decrypt</tt> are as defined in <xref target="encryption-schema"/>, using an SFrame
context initialized with <tt>base_key</tt> assigned to <tt>kid</tt>:</t>
        <ul spacing="normal">
          <li>
            <t><tt>encrypt(ctr, kid, metadata, plaintext) == ct</tt></t>
          </li>
          <li>
            <t><tt>decrypt(metadata, ct) == pt</tt></t>
          </li>
        </ul>
        <t>The other values in the test vector are intermediate values provided to
facilitate debugging of test failures.</t>
        <artwork><![CDATA[
cipher_suite: 0x0001
kid: 0x0000000000000123
ctr: 0x0000000000004567
base_key: 000102030405060708090a0b0c0d0e0f
sframe_key_label: 534672616d6520312e3020536563726574206b65792000000000000001230001
sframe_salt_label: 534672616d6520312e30205365637265742073616c742000000000000001230001
sframe_secret: d926952ca8b7ec4a95941d1ada3a5203ceff8cceee34f574d23909eb314c40c0
sframe_key: 3f7d9a7c83ae8e1c8a11ae695ab59314b367e359fadac7b9c46b2bc6f81f46e16b96f0811868d59402b7e870102720b3
sframe_salt: 50b29329a04dc0f184ac3168
metadata: 4945544620534672616d65205747
nonce: 50b29329a04dc0f184ac740f
aad: 99012345674945544620534672616d65205747
pt: 64726166742d696574662d736672616d652d656e63
ct: 9901234567449408b6f490086165b9d6f62b24ae1a59a56486b4ae8ed036b88912e24f11
]]></artwork>
        <artwork><![CDATA[
cipher_suite: 0x0002
kid: 0x0000000000000123
ctr: 0x0000000000004567
base_key: 000102030405060708090a0b0c0d0e0f
sframe_key_label: 534672616d6520312e3020536563726574206b65792000000000000001230002
sframe_salt_label: 534672616d6520312e30205365637265742073616c742000000000000001230002
sframe_secret: d926952ca8b7ec4a95941d1ada3a5203ceff8cceee34f574d23909eb314c40c0
sframe_key: e2ec5c797540310483b16bf6e7a570d2a27d192fe869c7ccd8584a8d9dab91549fbe553f5113461ec6aa83bf3865553e
sframe_salt: e68ac8dd3d02fbcd368c5577
metadata: 4945544620534672616d65205747
nonce: e68ac8dd3d02fbcd368c1010
aad: 99012345674945544620534672616d65205747
pt: 64726166742d696574662d736672616d652d656e63
ct: 99012345673f31438db4d09434e43afa0f8a2f00867a2be085046a9f5cb4f101d607
]]></artwork>
        <artwork><![CDATA[
cipher_suite: 0x0003
kid: 0x0000000000000123
ctr: 0x0000000000004567
base_key: 000102030405060708090a0b0c0d0e0f
sframe_key_label: 534672616d6520312e3020536563726574206b65792000000000000001230003
sframe_salt_label: 534672616d6520312e30205365637265742073616c742000000000000001230003
sframe_secret: d926952ca8b7ec4a95941d1ada3a5203ceff8cceee34f574d23909eb314c40c0
sframe_key: 2c5703089cbb8c583475e4fc461d97d18809df79b6d550f78eb6d50ffa80d89211d57909934f46f5405e38cd583c69fe
sframe_salt: 38c16e4f5159700c00c7f350
metadata: 4945544620534672616d65205747
nonce: 38c16e4f5159700c00c7b637
aad: 99012345674945544620534672616d65205747
pt: 64726166742d696574662d736672616d652d656e63
ct: 990123456717fc8af28a5a695afcfc6c8df6358a17e26b2fcb3bae32e443
]]></artwork>
        <artwork><![CDATA[
cipher_suite: 0x0004
kid: 0x0000000000000123
ctr: 0x0000000000004567
base_key: 000102030405060708090a0b0c0d0e0f
sframe_key_label: 534672616d6520312e3020536563726574206b65792000000000000001230004
sframe_salt_label: 534672616d6520312e30205365637265742073616c742000000000000001230004
sframe_secret: d926952ca8b7ec4a95941d1ada3a5203ceff8cceee34f574d23909eb314c40c0
sframe_key: d34f547f4ca4f9a7447006fe7fcbf768
sframe_salt: 75234edefe07819026751816
metadata: 4945544620534672616d65205747
nonce: 75234edefe07819026755d71
aad: 99012345674945544620534672616d65205747
pt: 64726166742d696574662d736672616d652d656e63
ct: 9901234567b7412c2513a1b66dbb48841bbaf17f598751176ad847681a69c6d0b091c07018ce4adb34eb
]]></artwork>
        <artwork><![CDATA[
cipher_suite: 0x0005
kid: 0x0000000000000123
ctr: 0x0000000000004567
base_key: 000102030405060708090a0b0c0d0e0f
sframe_key_label: 534672616d6520312e3020536563726574206b65792000000000000001230005
sframe_salt_label: 534672616d6520312e30205365637265742073616c742000000000000001230005
sframe_secret: 0fc3ea6de6aac97a35f194cf9bed94d4b5230f1cb45a785c9fe5dce9c188938ab6ba005bc4c0a19181599e9d1bcf7b74aca48b60bf5e254e546d809313e083a3
sframe_key: d3e27b0d4a5ae9e55df01a70e6d4d28d969b246e2936f4b7a5d9b494da6b9633
sframe_salt: 84991c167b8cd23c93708ec7
metadata: 4945544620534672616d65205747
nonce: 84991c167b8cd23c9370cba0
aad: 99012345674945544620534672616d65205747
pt: 64726166742d696574662d736672616d652d656e63
ct: 990123456794f509d36e9beacb0e261d99c7d1e972f1fed787d4049f17ca21353c1cc24d56ceabced279
]]></artwork>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
jM/HrdX3fq6BZJ7VQlIi3f6rkzTOwzpIWrZbfz8tllVR4zysxUnJdvNXJ2lK
oqYWkpLtpb/aTVQ//LnyxJLtW+wS5YfHJZxEtpd2rp/rNlH10NpEbZxEtsP/
o/+NdtMvmf3gwVJvp/qhIb08astq+Saf7ryxm0efQ7Vonpdt/pqX6ZZ/x6ip
/eMf3q+n/u8sG9E/QJM2l/PBlAySGqO4akLiywf+R8/7IXvPR2RaRdbKJfuY
UIUmxfF9cleYYzdlz4ORkXxg5xiqmB62JPObz93do2BYyt8jFAvAHOwE0lNB
/1+vMrB4lMc7XHhgWhQ0EhD+bXEaY18LMKsPC9CVf/2V1ew2Ivfx41ELbTL4
nqGLgIxHdrDIy15xHeJhOHxbgSkjIOYzfFVU+lpXrk+nRQkYMOiaR+U8CaNr
DCYzBFHuEsBW3OZCLdC7wcCP1uR3ShwbvmWHJnhkWYGJhn4yMBRe/Fyw30ko
9TRbgg3CXqezhfak6adkFq6ygr2C8jNaSHQyjp5mYwTkm/Vys2ZzxDs7P3tW
OrGlWZyFGTm55IxpGASjjx9bxscpsLVZhu6smH3T4cyOmYHf6Bj98Ozs2ZH4
nFz8yCy7AdMKTyjas2RxBX0AP2yi9YbMWHMKho6nMJvheRjMPgeyMRQ64yF/
ln5RhmIsLX2cXzpHX4dXGD5ovFqaVESdcHaVr2Dcc0QA5qdsOR3Lvq7+qVvB
tQ+/ZF3g/vv77384f3X/9P4p/iNSA7WaF89c0fYU3WtAMUu4Hbe/3rt/2Rn3
FWz3/z9+/1wzzTNkmn96//8y7xP/7fdH/F/bf+lw+W149RD+e/evNMP9/z79
fUTe4rbX+YqG7P6dOeJUtWkbzcCjAzfLzSXOK6OEtliss9OWYotgE1PnkrfZ
bEbuIgXDMzsLiNUHgMvpydoIdfOmt0qWq6RAxDHMcGFJYnaFUrfFks6EOahF
u5xL+4zHIQxyMEqnzNkKD9nELckO6hq5rprPQt3a2Ve/Y/A1u5LEvaB/HLSs
m3C2US5pPiix9kxQeeDFNfr4MFZYVJBTz/vCP1Ny/PD7F8+OWH2wDk8qoFCr
KK7FO82HzggkEsF/+PTtG4GiNAyMEQT9j3Y9GuqLn3UsnHWy5DmB8bUqDeHY
8qkLUCem2SJUB0BG0WFlxkNlxtYalCu/A8gqbRPmbJUjXAqsu86SG47yAXhX
4WYVwoiQnzwdQECuXSZ/mwje3iwyjLFICnbwErObjfcp6JbZlf/N3TrxzIoC
qxH//uD/gf7tVJYoNOn6gd/z+/7AH/oj/8Q7bpf/z5YTzhfv/i8A8HsA8wv8
+5TFFxCu0+n4/AUIKF92gmt0fBhU21FuOKz6qwOHQw8+OmzLnEyHttaRnKUO
cagP0bjSgdKePF5WU6Aoq2UHEdMYnxxYy9IEecASmcUY5XH+QQ45ieNj//kM
lt/hX1pA6mm2PuLQIj6pKTBEEsF8z6/TYQQonIWyNXzQhYWH5RurhcADCB1+
wn9+YFXx8PsWTCX0UVAndFbeDJYXovT/Fz9FLPE4JqHIj27L7dcTdRTaS4ug
Yw1VKWQ81l8eHOvTOqTUwpZO1Vc92qfmd/VRjfrpVqN2JYeg8kvzsKV9/biR
3USeochVGDELsDlIjnMyByiUO8LwRQlGIusUhSRo7yqg5XAKrAi0zMLFEbMd
WUTAjS8YVZIDfCqfmLMh6TFTZqbHsUnd9kmLTyrNq9AmClcrOcrhIa5gW1pi
KA3w75Si603ccnblER6H3xPRj/Tm4r6WMndjm1+OLEr+d7LKAfsf8cjoFuyx
lmdQIak7NUQyASMYSbGZ+4vNfIqTnRIpCh3cy3kIyyUzXZiuk5WF70ZOAfEd
a4nKRPGKtqcLDGAYRIdmU5mIxDh6yGY4CKiMVabCeHkUNLaWB2PYYHxIInYY
D7nb7fpaDSgoXo/4CoAFLfg1cB71Wn6yjjoc7kLxUfhKvw1zpFoxpoCZhmrN
Nbcp/KA9rrU08WiP0gzwzNziKBBnG4ognxdaTHo1YrJN4XxoB3NQDDICEJ53
8VyJFKQ1rzBeEwXpHPbeBSLI/9If016LH049tTXof7377j1uKz7+i83ua9q4
gL7+qhZSo/prugjI8sTNS/auQ6bkV/j4yK/ruxkqIYW4PDS8B5AKyBo249a7
q0Lq+09HaldSbYGuoWEDup+DuM14PKA9MNcqHeI5cTkw67msX0d/ILcgqMcm
bNe/wBDRUAc7WVrfRtxNZR+ScZhQ2HtYXJvoWvYram8hWwsUn5qIe0V55vin
Nv0kPro/i82wSlJO6HFUES9End1I85LzZppAM1LKL/GXjgzxkpDkR88SedQm
EeYmgvmSgEKRXTIcjEdVyjZBIBwZIyWhb9AiYc/am+dPffSkOU41DjoAWBla
In6TIYN+Vb1PGb/fknKU2GNVGtdhiOjlS07eotioIkFbZS0bKO7SbnYDB42h
m05R6dV7RQ1MH6K4ZtoE0HtIOlLV1jA0t8AsHgCzoIi7LQHp2dEhZjawJgD+
oUlnQn3BZzyo+wMg74E2qsJYAvUcN+gRrorf0Z4qoepoU52HtRFz5Iau2kYc
xpLMM0nhgunIMO1DPNLeJSZ3vQOaXlqJRbMQ+FbHOC+UEkVymzc91K7CmVFv
xILnta+C/HQ8im/iUSibC9lCRZ5wp1UTlIOz/St4bYGCVHZ4YL1Iou/ZD4zx
O7gl0mGBqE2ZhSopbNPkLheNqoiANpTBQQFRKtGEQ3Ew/AlVM3LeY/QfJ3PR
2QL7K0CdEbO/KNCcBGS8UrwXBbgBuk6gHei0xplhJZpQMA2eNKsuvfAK9eg1
52WQ7351Jz78BYbUibIp0GjYiqhAukVyla8ziS3zQ48yjMgBoA5ZKEcTQMwl
8SyTNDRWcq1eYdAqXBBZjpN0NF3Z/xJhEPUaDL58lRQ1GmtxN58n61UWIaIW
swl5CPtKaL19uJEvnI7CWZFLbyTKF3wMwTomsyZutVbIK6ak2EclhxmnmsCa
7KLM+XPp99Csv1Y5fMnyzzDbIjWywuqu5RnNnZEicwGWGh7uaD3aCsA3A1VO
L7WMF1esxxuqEWWsVU4qMwoGdfZE+OqkTDk/YwdIgsh6Yp7Yi1Y2YQxl49VG
i1FlKzVMCkp+TjqeqYWOLH+BkcF0nuTd0mKGeYJW2KFuXXLI4eKkvA0KkVvb
FkpBydKATcsjaX0E+1G2UnLqOlSxnSbG0grZm9Kp2l1pQwaOfqGCzcUtJflV
8xAsQ2Z0zF5CwhERS+N2JgDwQh8iZd0A/V7l68QOx+PjLnc6+PSRjy/51JE8
hVmarDENEV/wMMuuTV+LhOIT0TJdcNg1qVXOkiC5pCQAHyT6fE6In/QpH0uQ
WQ6yM95w3ik1Y+oriaSiTqdJinGfIek9Snajn1ElrVIKB1lrQo6ywMN0FWvl
zMM7ljyGem2MjPdYbmsiZXNClBMcURzHySzkczE5pXyvznNtpRDUlhnoHkee
i/F1eAODiFB0wWaFB8b021IrNZid+J6dO4fTIzy1BrJjnnryYQlGMJ+H8hb8
DD2sIe/B9vZbp6ohqkxe/KEIZ2v3jNhd1p6VnkLzwtvdt7QYQ3v9W5LXAc4H
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
5nGGtz08Vmkk77nQpU7p5AMrhKklxZasYkdylnmqHaoLqiHMxuEZJrC5pudD
F5IeEb94Dg/5MSbSq1KHlhK0lhXzkza7yOK1aaj4DhMyqDrEijwjwe9ZlWGB
VP77HEbFThvWays3MpCl5NtVbrYwIlwYTEAbxjZ7ng2jV4NHyQCZmN+MAeLC
KONRVXQs+FrReUvTSKzykzMvAmPsjCUYWXt70OmqvapmdTy8S+GlO5VVoWwZ
6xXMOdepbxRVQnm0nE8WLgtxA0oKASdHzq1aDU7Ypgpe8DgMx/HnWZcFoMav
7XroX6W46bALidfkmiwgy+xAabXBKH+DFFbRZUUx/JhNDHZ/i+C7xopz6Gzi
rOJbOevXYWNIC7DTUDCd2RGjFPJgxzjJ+awEzonnEt1HVA+CUnLXYLQuOLdL
Y258SXRpoxsEf/qAw0kcKOJvQr0Chiulkmzi1zutZLu1Cp7QTs+5pGhLke/M
XJdpTlRqTnZbfMWlqTq8qBzeFmSFLpx8T2WgYnhD4zAtDE1FFMZL8l4JM4pi
tWooEFcWHCTF9/2YsVHtXHVK5alqCpZiwv5YSRooNlOuTbUudaleTDcr8nhF
15vFe+10sqkTUoZWafRk5hsaWPdamavYeBPS3apARozXIPUE+Gm5SiSmUdf9
bXnmmgGnsvE00R4yfiBlzzNTKIorJHKAD+uYVkyQ3svoIh9VSd3U7bJuV60U
O1Hn9p5dPoWvLpPS/Bx7wEVjjRfPjvuj+hs2b3vqJjX/4tlrggbaR44lgxEY
ouNW1WL332A4GlGkknNrq6ev2Ka4xmdKdJi7NwA1FZnX4USKBlcwalBuYQx1
u7jJFokT55knEoqPG5WoneONFFJZWhOSTzNV4CcPULK1lD5lPLVkAqxVOM4C
c/lNrSwKyHlioZKYk9N8GcLEWmHQ/mFC19DoVF9nsUjKi2Fg0XtlJJ5LAAkg
AzrTNS3EyBSENJ3dkW52a0LTmW/lIECyNr2QYjk5dJoWFVWaJpdPO7xa5KAK
RphK3pa102YeonXmFJXH2n3H9H/8d9xuKEfZ8Hf8pdyt/vNXvfvX93+BLfrp
U/z+kjfr12+dbd0sFzkhtLb9+8+CzyNXZ+MfxSCvQcF+oI2Nz6f81eGjirho
bsg3KzxYp8tLrHzOWny++rS/WvrosFOqrSTYPC1hU/h1+DxEZ/zrwN9Dv/+W
dFZ/KAe1cDvEaoU/vn774sdXZz+Uj9QEn+P217X47IDkMZ/3ET5u9YUtiFbG
576BPo23xzfD2aHrbeFUCi+VbmWkQoOse/xG+DTN1w5/JMea8OGyHdWSBw/Q
57Pw86cSR1CiCsM8iHM9Sa/zVeXsn5qcOTOnmrWlELG63cPWYLXB5ajLupJO
W0puGD44+FizC5WHX37G24wqA6YyCWqmzJEnxxbE2obWxJU+c09bNNwa4hYN
y3gfNzV8FFJtg59rGvxcc61LPU+6DCnrXsXcOl1uDbEBaQf5T2rwc1ODWkrX
EnDbLndqaMTloxBLjPjPwXFr8jwGSenyRjigs31rYA2cpB+jgtGp8lMD8PrH
1Bstjbr10fi4unBkQ65/XBVo9yXV4L4eyfv6p029b/t6fTv8R23XvSev8Duq
cNbTV/TUs54E3O4z9b7V659I+cpOZnsj1H52bkKmUjwtpz3NmLlWRBUafMDf
EiH8FiO3fk4owLaUOKXLsumLVOjygxtuLLloTtIUB1PwrY6eVKW1bl/LV3yl
j5UdWQ34cnP7+PIhO6/fwUGZt+qwQkqfmuMnq+DEE/te7lux/LXDoAyVudxT
1XifmGp+4YLds6W7my3wVgKHXNbqUVgsBulzRpquMfXrr2FStKP1qo0T1i6u
wx7ZvWcwGCulWqoTq6ozmM+ER2bojMH0G99/Zdej4Xf0dd1Y0bOAAX3Qec7w
A8fhEpdcdj/g3RzfWBDLABBVAKDJgdeKYLLndJWE7zkz4xZvkyqWWFFIUuAs
XLBW1UpSqNBjBAa+OmfiUHKntIa4t7CqCbsC+NDuzso+p2tS0JXGF7ADy3FE
WlGaSsqGwokOb8JsRnFqgNm/X/z4StXTgf//9VdcBbII5MIrcs1QOxteyy38
w/CpFbsImBTW3NjZf9ROEVgckopPcHZ05WcVL2hPsV0opMKUcg4XStEsYm/h
bAqcu3yfxZen/pl1DxE8BK6jhzqvBx8y3+Pzhb7mxBH8lA9YypWUebFWPHV7
rgYUqk3DzirSOUVcxqJQqUQ6Z0jeUaipopvNjRoh2b3xhJBO71FOh7l8Wf15
QJna59wZ/NT11NUsO8IIDIxgTxhpamCM4cteUAJ7NBP6ug+cNLWxmdDXPeAE
LnVDebA7pDR1MQrlwc6QAnmuIU31o11hpWkZq6l+tCOsQD/XsCLr4W7Q0rSK
WWQ93AlaYD3X0GLn8S7w0rQOu9h5vAO8wHmu4SWlH7aHmKb1GCalH7aGGJSe
a4hp5adtYaZpE5blXx7FM3hUIgaP4tUEw0jE4FGJ2ADDGluwhUSsh2JLxGAr
iVgLx6F0sJVErIPjSsRgS4lYA6k098GWErEKqSwRg60lYgVWhSODrSViGVZV
IgY7SMTgUYkY7CARg0clYrCTRAwelYjBThIxeFQiBjtKxOBRiRjsKBGDRyVi
sLNEDB6ViMGuEhEaPCYRx939oRiZOA72hmKNbzzef0y2XByDPNtCMtZDcig+
nuxPZ1c2jsM03Uo61sEq8cE43H/+y/JxPE3TLSVkFVqFQ8fT/XmzKiPHUZpu
LSXL8GrWz9iSkrviVycnx3Ga7iApXYi1K3zsSMrdcKyXleMkTXeSljbMBjk0
LknLXfBskpe49HeUmAZqo8QcVyTmY7gGW9jVk+7j0qUZjpGak+AT4FijnIyx
2b4jsyXnhDTKvbFyaM+w9qW4Kz0nocJrL8xKXMHQ9uWGsgSdTA1ue2BX4VmG
ty+3VqXoJLLx2xnDmlXFEPddUXWSdBK7OO6IZe3aZ5j7rvx6aTpJynjuhGmD
lGKo+0qpJok6Sau47oBto0xluDtJVWrwuFT9FDi2VP0EOI5U/ZSRuVIVmz0q
VZtgudSffArFy1JV4bUXZmW+0FrpPrhVparBbQ/sqlxraaa741cnVW38dsaw
bl052umuONZLVRfHHbGsX/0lDXU3PJukahnPnTAtoeNC3RfXZqlaxXUHbCsI
uXB3wZeX7WNSNdxCa3oIkpGrYfBJkKyxhmNuuO/4bNkaTmQuHpGujdCcWVDQ
9qW9K1/D0OC2F3YlHlHw9uWNsowNpzZ+e2BY4WIFcV/+rcrZMHJx3BnLmrWm
YO67zupkbRiX8dwR01qpoKDuKxPq5W2YVHHdCdsGGabg7ivDmmRumNbhuwPG
jVJXQd5B7kqDx+Xup0Gy5e4nQXLk7qeNz5W73PARudsMzZ0Ha/vbB1pZ7hrc
9sKuzCWWZrsPflW5a+O3B4ZVPna0291xrJO7Lo47Y2khU4a5L571creM546Y
OuiUoe6La5PcreK6E7YlhMpw98W3We7W4bsDxhWUypC3x1ktlcfk7nQLbeZh
WEbyToNPhGWNeDpWTfcdpS19pxM9Jw/K3wfgOfNh4O07C64EnoY2fnthWOIY
A3FfTilL4enUxXEPLCt8bWDuy9FVSTyNynjujGnNCjRQ9119ddJ4Gldx3RHb
Wnlh4O4rLeol8jSpw3cnjBsknIG8r4RrksrTtB7nHbBulMsG9taSWTd4XDJ/
KixbMn8iLEcyf+ooXcmsmj4omR+C586I4xjaB15ZMtv47YVhmWdKm/nuEKuS
2cVxDyz18yrMffGsk8xlPHfG1EKnCnVfXOslcxXXHbF1EKrC3RffJslch+9O
GJdQqkLeF+dmyVyP8w5YV5Cqwt4Wb8OSj0nmaAvN4jFoRjZHwSdDs8YdjU3j
fcdqy+doYs3NAxL6QYjOzNgQ950PV0ZHoYvjXliW+MeGuS/flOV0NC3juQem
FU63oe7L41VZHUVVXHfGtmZd2nD3XZN18jqK6/DdEeNaSWJD3leO1MvsKKnH
eSesG+SfDXtf+dckt6O0Ce8dMG+U3Db0LWW31eBx2f3p0GzZ/cnQHNn96WN1
Zbdp/IDsfhiiOzelY9d9IJZlt4vjXljK8zqY++JZld1lPPfAVD+vg7ovrnWy
u4rrzthaz+vg7otvveyuw3dHjB2U6iDvi3OT7K7HeSesS0jVwd4X72bZ3YT3
DphX0KqDvh3u9nQ/JrvjLXb2x+EZ6R0HnwGeNfp4bDffd8S2BI8nzhw1yvBH
YDpz5MLcd2ZcKR6HZTz3wrTETS7UfbmoLMnjaRXXPbCt8L4Ld1+ur0rzOKrD
d2eMa1arC3nflVon0eO4Hucdsa6VMS7sfSVMvVSPkya8d8K8QTq60PeVjk2S
PU6bcd8B+0bZ7sLfSro7DR6X7p8Dni3dPwM8R7p/jhG70t1u3ijdH4PpzlIl
MHIfmGXpXsZzL0zleT3UfXGtSvcqrntgq5/Xw90X3zrpXofvzhhbz+sh74tz
vXSvx3lHrJ3n9bD3xbtJujfhvRPmJbTqoe+Le7N0b8Z9B+wriNXD3wZ/l3yP
Sfdki910G4hGvifBZ4Fo0SAZuy/sO25bxieT0lw1SPlHoTqzVYa67xy5cj4J
q7juhW2Jt8pw9+WpsqxPpnX47oFxZTWUIe+7DqryPonqcd4Z65o1XIa97/qt
k/lJ3IT3jpjXSp8y9H1lT73cT5Jm3HfCvkF2luHvKzubZH9SlvdbSP/aHhql
f7mHLeR/qcHj8v/zQLTl/2eB6Mj/zzNuV/67LzTI/8ehuvNVk/60D9Sy/K/i
uhe28rwJ7r74VuV/Hb57YKyfN0HeF+c6+V+P885YW8+bYO+Ld738b8J7R8yd
503Q98W9Sf43474T9qXnTfD3xb9Z/j+E/w4jqKDW1MPjYyij8Jj8T7fYtbaD
aXaANPhMMC1KpOPyK/uO3t4F0rIV0GAHbAHXmbcq3H1ny90J0rIl0GgLPAq5
xGlVyPtyWHk3SMvWwAP2wCOwK+ujCnvflVHdEdKyRfCgTfAg9JqVXYW+76qu
2xXSslXwiF3wAPxauVSFv69Uqt8Z0rJl8Kht0NhDg2St9rCvZG3aHar7wd5S
sXF/qPbx6A5RafD4DvG5YNo7xGeC6ewQ5Vf2heruEOVXaneIbeDS82a4++Jb
3iHq8N0LY3neDHlfnKs7RD3Oe2CtnzfD3hfvuh2iCe+dMbeeN0PfF/f6HaIZ
9x2xd543w98X/6Yd4iH8dxpB6XlzD/uOoXmHeHgMO4yi8ry5j/px0IUHj96x
IfdrUHX/716ePX30JgS+I/NdscnWySVfOZst4uSD71wF69PveI8AXmZyWCR4
CZC+DZbbtKlN8fHjEd2wkNwJOPoIry43a7zjohZ7fAN+eGfesm5AKTZTeI5o
x5uIr4tFzC6BfNlN8o5/Lg6PLv1wdpWvsvX1HOHhnW+fFeAiX0SKRvJli2GF
YazewY9bvLFcywvLWZjRvcx8O4U8Nbeabnf1BI0tzWez/JbunsCbnVcbZAW8
6dm7RJ7qyHU5l8Q4/OhZoh7hnSHFo7e0MD/Z0A6BjC2fKNXyYfAtf7k+8r/6
yoex6LbSTbVtxG0BA7rJhK+xV/eHyI0W1l0kcq/KOlnRrbLArdJU33qxzr00
jLJZtsZf42S6ubpS14sgnDTMZptVUvA1q569MpSk8wBL+Iwyr9ftdwfdYXfU
PemOu5Nu2J12o27cTbpoXQdBL+gHg2AYjIKTYBxMgjCYBlEQB0mQ9rq9oNfr
9XuD3rA36p30xr1JL+xNe1Ev7iW91JOl8HhPnmJyrDj/iZ0S7ZvheDApp/5g
MhgOB4NRrzvsD0YnvVEwikdD+HYyOPGW61N/NKCHo5NBLx5NRvB8NOrFJ/2R
aQz/GyWjPkhGaN7vT8K0OwjjMIi7o8FoPA4Hg950HEejSTycjqZpOOimg2mS
dofjfjLujoPuaBJFSIyhkb41k9X7f5P1PzZZo2TSn57EYfdkNOmdTKcPTlT/
/03U/9hEdSeDMRBhIjoGqBiVG8js3el/TJvY+r6mKeBl7frmu9l47b0efnlX
hLN1aatnVOjXWThNZgKNPiPSdHEXg7AbX6p9aTvw+Mv28BnObh3AzCVKbyg9
BJKtMnUB2E4kKcGjcfN9U00a1eNkKONIjfcCqm6XVRD1d5cBhM0vE6342EAe
UcHk5c+tiSWOEhY/pH+Z5dmm++jDjx9bYgKEC3XXH96pBsjBG9k6C2fZf+sb
7syqCIsiu1oww/Ey80QZJ60M1ljLh8ctfWtvy9DE1uUE20PT7P+b+puTWyd+
g16/zhs0GI5OPEWoLTaNssw49V1h3g96Sb+LIh4kdR+egxTvdUdT+HfS65Yx
ImwrcmI7mLAvBKMIPz0IleQABr72RpNhLwrH05MkGoST4WQAmxvMYj/ELjCp
ZhxFSZL0BynAj3v9SXeSTGEviwYwemvgp34/PYkn4Uk07ofJOAmicRgEYQLw
w+lwAm9M+6OTpD+cpAA+OplOosFo2ptGo3QcpINREoymk1EKOl4wHo1jQKTb
A6TGJ0j6k1532rdJAsToTnuTfm8SdgdxBBrCeBBG/WA09hQXPrK1yuZcB+Zk
gHoAbs5YXr7XR2743Nu0BRlAd8fTUTqYdLtjaDqcTuJROgJFYhAmQTichMPR
YDyaDpCscbc/mo7HE5j83iC1r4mqV4P/hXi+95vwfO835fmkl0TD6GRyMhwA
ct3BuD8FPk5HyUk4POnGoA6exMGklyZjMFxOoigeD4HDxvEkDqeTYDiYpNNk
OOynwyCAgQZJNApDgJH2x6MhPE9cnk9G4zAax3E/7vbSaRT3R+NoODw52ZHn
68DgqfA/j+f7KVCzP46ngxi00P4gGfTDNOym47CX4iI4ATU66Y6H3cEonKTD
aDpAEyAGNnzMmvgX4vf+b8Lv/d+U33sRsHW/O55E0ynw3rg/OBkmgxREeRBP
gNXHQLU4PZlMR/Fw2E1Pxgl+6qZpOO7G40kvCGIgR3cygb4GoxRWzTDpj6MY
IIF5kpb4HX4JRgB+GAwnJ13ApRudpP1hd0d+rwMzBXL+8/g9OElhO0x743AY
4oaYRmk0giWYjvpD2CZPkh5shWk07U/DpN9LBoP+g3w++Jfi88FvwueD35TP
Y2wzOEkHUThIQakZDIBxRmkC8zhNT0DLcPj0ZAjTnICSnnRPwLjv9kYnQ7Dy
RzvyaR2YYXwS/PP4dHoyCHpRbxj0w2A6GsXT6WA8HgTTaZgCCw8nYxhXcDIK
4/EAiBAAL0ejGHhnEkTAScE4SgZhPIVBPOz1Gf5L8e/wN+HfYZl/u2nUT8JR
nIAKEE1Owv4wDSaDKJ1Mk3gyiAdT4A5QUGEvHIYn42EE0nIYR8kkAqE76Y/D
6WgaAthpNIi6YTAB/htOJskkDqZRihMbAiuDmtmdpsOkNxwkw8EoBtr1gz7s
tP2wX+L/pHcy7cYDEFjJBFQUTGQMT7rJKIaFA/rLaALq6SgB3RkU1yloO/Fk
CnwZh6jF90u6+ngwAQ4JgL9A1Pf60aQP05ZEu+otdWAiGPQ/b31MQCrABtcf
JTArYTTtguCGjQ9UuzhIJie9NEiT+GR8Eg+6oNoFJ1HYC/rDfhREUW8QD0dR
Ek6jJO6diNPt/wI3zZXItlcBAA==

-->

</rfc>
