<?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.29 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-avtcore-rtp-sframe-02" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title>RTP Payload Format for SFrame</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-avtcore-rtp-sframe-02"/>
    <author initials="P." surname="Thatcher" fullname="Peter Thatcher">
      <organization>Microsoft</organization>
      <address>
        <email>pthatcher@microsoft.com</email>
      </address>
    </author>
    <author initials="Y." surname="Fablet" fullname="Youenn Fablet">
      <organization>Apple</organization>
      <address>
        <email>youenn@apple.com</email>
      </address>
    </author>
    <author initials="A." surname="Rosenberg" fullname="Aron Rosenberg">
      <organization>Apple</organization>
      <address>
        <email>aron.rosenberg@apple.com</email>
      </address>
    </author>
    <date/>
    <area>Applications and Real-Time</area>
    <workgroup>Audio/Video Transport Core Maintenance</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 48?>

<t>This document describes the RTP payload format of SFrame, its use in SDP, and per stream key derivation.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://ietf-wg-avtcore.github.io/draft-ietf-avtcore-rtp-sframe/draft-ietf-avtcore-rtp-sframe.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-avtcore-rtp-sframe/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Audio/Video Transport Core Maintenance Working Group mailing list (<eref target="mailto:avt@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/avt/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/avt/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-avtcore/draft-ietf-avtcore-rtp-sframe"/>.</t>
    </note>
  </front>
  <middle>
    <?line 52?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>SFrame <xref target="RFC9605"/> describes an end-to-end encryption and authentication mechanism
for media data in a multiparty conference call, in which central media servers (SFUs) can access the
media metadata needed to make forwarding decisions without having access to the actual media.</t>
      <t>This document describes how to packetize a media frame encrypted using SFrame into RTP packets, how to
signal support in SDP, and how to derive per SSRC SFrame keys from a common key.</t>
    </section>
    <section anchor="terminology-and-notation">
      <name>Terminology and Notation</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>
    </section>
    <section anchor="sframe-format">
      <name>SFrame format</name>
      <t>An SFrame ciphertext comprises a header and encrypted data.
The SFrame header has a size varying between 1 to 17 bytes.
The encrypted data can be of arbitrary length and is larger than the unencrypted data by a fixed overhead that depends on the encryption algorithm.
The overhead can be up to 16 bytes.</t>
      <t>An SFrame ciphertext having an arbitrary long length, an application may decide to partition the data encrypted with SFrame
into pieces small enough that the SFrame ciphertext fits in a single RTP packet.
We call this per-packet SFrame.
This has the advantage of allowing to decrypt the content as soon as received.</t>
      <t>An alternative is to encrypt the data, a media frame typically, and send the SFrame ciphertext over several RTP packets.
We call this per-frame SFrame.
This has the advantage of limiting the SFrame overhead, especially for video frames.
This alternative is also compatible with <xref target="WebRTC_Encoded_Transform"/>, which is important for backward compatibility of existing services.</t>
      <t>The RTP format presented in this document supports both alternatives.</t>
    </section>
    <section anchor="rtp-header-usage">
      <name>RTP Header Usage</name>
      <t>The general RTP payload format for SFrame is depicted below.</t>
      <artwork><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |V=2|P|X|  CC   |M|     PT      |       sequence number         |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                           timestamp                           |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |           synchronization source (SSRC) identifier            |
  +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
  |            contributing source (CSRC) identifiers             |
  |                             ....                              |
  +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
  |S E T x x x x x|                                               |
  |                                                               |
  :                       SFrame payload                          :
  |                                                               |
  |                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                               :    OPTIONAL RTP padding       |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
      <t>The first byte of the RTP payload is the SFrame payload descriptor.</t>
      <t>The S bit of the SFrame payload descriptor MUST be 0 for all fragments except for the first one of the SFrame frame.</t>
      <t>The E bit of the SFrame payload descriptor MUST be 0 for all fragments except for the last one of the SFrame frame.</t>
      <t>A SFrame frame is protecting media content that can be either in a packetized format or in a raw format as defined by <xref target="WebRTC_Encoded_Transform"/>.
The T bit of the SFrame payload descriptor MUST be 0 if the fragment comes from a raw format as defined by <xref target="WebRTC_Encoded_Transform"/>.
The T bit of the SFrame payload descriptor MUST be 1 if the fragment comes from a packetized format.
All fragments of a SFrame frame MUST have the same T bit value.</t>
      <t>The 5 remaining bits of the SFrame payload descriptor are reserved for future use.</t>
      <t>The payload type (PT) identifies the format of the media encrypted with SFrame.</t>
      <t>The SSRC, timestamp, marker bit, and CSRCs of the SFrame RTP packets MUST be the same
as those of the output of the media-format-specific packetization.
The header extensions of the SFrame RTP packets SHOULD be the same
as those of the output of the media-format-specific packetization, but some may be omitted
if it is known that the omitted header extensions do not need to be duplicated on each SFrame RTP packet.</t>
    </section>
    <section anchor="rtp-processing-of-sframe-frames">
      <name>RTP Processing of SFrame frames</name>
      <section anchor="rtp-packetization-of-sframe">
        <name>RTP Packetization of SFrame</name>
        <t>For a given SFrame frame to be sent, the following steps are done:</t>
        <ol spacing="normal" type="1"><li>
            <t>Let content be the SFrame frame payload to be sent.</t>
          </li>
          <li>
            <t>Let metadata be the SFrame frame metadata. It contains information such as payload type, timestamp, synchronization source, contributing sources, marker bit, header extensions, and payload origin.</t>
          </li>
          <li>
            <t>Fragment the content in a list of payloads so that RTP packets generated from them do not exceed the network maximum transmission unit size.</t>
          </li>
          <li>
            <t>For each payload in the list, run the following steps:
            </t>
            <ol spacing="normal" type="1"><li>
                <t>Let descriptor be a SFrame payload descriptor, initialized to a zero byte.</t>
              </li>
              <li>
                <t>Set the first bit S of the descriptor to 1 if the payload is first in the list and 0 otherwise.</t>
              </li>
              <li>
                <t>Set the second bit E of the descriptor to 1 if the payload is last in the list and 0 otherwise.</t>
              </li>
              <li>
                <t>Set the third bit T of the descriptor to 1 if the SFrame frame payload origin is packetized, and 0 if it is raw.</t>
              </li>
              <li>
                <t>Prepend the payload with the descriptor.</t>
              </li>
              <li>
                <t>Let packet be a RTP packet with payload.</t>
              </li>
              <li>
                <t>Set the packet's RTP header, including header extensions, using the metadata.</t>
              </li>
              <li>
                <t>In particular, if the SFrame frame marker bit is set, set the RTP header marker bit to the value of the second bit E of the descriptor.</t>
              </li>
              <li>
                <t>Send the packet.</t>
              </li>
            </ol>
          </li>
        </ol>
        <t>SFrame packets can be generated either from RTP media packets or from media frames as defined by <xref target="WebRTC_Encoded_Transform"/>.
The two kind of processing are presented below.</t>
        <section anchor="per-frame-sframe-sending">
          <name>Per-frame SFrame sending</name>
          <t>For per-frame SFrame, the following steps are done on sender side, with a media frame as input:</t>
          <ol spacing="normal" type="1"><li>
              <t>Generate a list of RTP packets from the media frame using the media-format-specific packetizer.</t>
            </li>
            <li>
              <t>Let packet be the last RTP packet in the list.</t>
            </li>
            <li>
              <t>Let payload be a SFrame ciphertext generated from the media frame data.</t>
            </li>
            <li>
              <t>Let metadata be a SFrame frame metadata.</t>
            </li>
            <li>
              <t>Set the SFrame metadata payload origin to raw.</t>
            </li>
            <li>
              <t>Set the SFrame metadata marker bit if the packet has its marker bit set.</t>
            </li>
            <li>
              <t>Set the SFrame metadata other fields (timestamp, payload type, RTP header extensions...) using the packet RTP header.</t>
            </li>
            <li>
              <t>Send the SFrame frame generated from payload and metadata to the SFrame packetizer.</t>
            </li>
          </ol>
        </section>
        <section anchor="per-packet-sframe-sending">
          <name>Per-packet SFrame sending</name>
          <t>For per-packet SFrame, the following steps are done on sender side, with a media frame as input:</t>
          <ol spacing="normal" type="1"><li>
              <t>Generate a list of RTP packets from the media frame using the media-format-specific packetizer.
The packetizer can be made aware of the SFrame overhead so that packet payloads do not get further split when doing SFrame packetization,
to get a 1-1 match between the generated RTP packets and the SFrame encrypted sent RTP packets.</t>
            </li>
            <li>
              <t>For each RTP packet in the list, run the following steps:
              </t>
              <ol spacing="normal" type="1"><li>
                  <t>Let payload be a SFrame ciphertext generated from the RTP packet payload.</t>
                </li>
                <li>
                  <t>Let metadata be a SFrame frame metadata.</t>
                </li>
                <li>
                  <t>Set the SFrame metadata content origin to packetized.</t>
                </li>
                <li>
                  <t>Set the SFrame metadata other fields using the packet RTP header, including the marker bit.</t>
                </li>
                <li>
                  <t>Send the SFrame frame generated from payload and metadata to the SFrame packetizer.</t>
                </li>
              </ol>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="rtp-depacketization-of-sframe">
        <name>RTP depacketization of SFrame</name>
        <t>When receiving a RTP SFrame packet, the following steps are done:</t>
        <ol spacing="normal" type="1"><li>
            <t>Add the packet to the set of received RTP packets.</t>
          </li>
          <li>
            <t>Sort the set in order of the RTP sequence number.</t>
          </li>
          <li>
            <t>Search for the smallest list of RTP packets in the set such that:
            </t>
            <ol spacing="normal" type="1"><li>
                <t>The packets are consecutive in sequence number.</t>
              </li>
              <li>
                <t>The first packet of the list has its S bit set to 1.</t>
              </li>
              <li>
                <t>The last packet of the list has its E bit set to 1.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>If there is no such list, abort these steps.</t>
          </li>
          <li>
            <t>Remove the selected RTP packets from the set of received RTP packets.</t>
          </li>
          <li>
            <t>If the T bits of each RTP packet of the list do not have the same value, abort these steps.</t>
          </li>
          <li>
            <t>If the payload types of each RTP packet of the list do not have the same value, abort these steps.</t>
          </li>
          <li>
            <t>For each RTP packet of the list, remove the first byte of the packet's payload.</t>
          </li>
          <li>
            <t>Let the SFrame payload be the concatenation of the payloads of each RTP packet of the list.</t>
          </li>
          <li>
            <t>Let the SFrame metadata be computed from the RTP headers of the RTP packets of the list, in particular:
            </t>
            <ol spacing="normal" type="1"><li>
                <t>The metadata's marker bit is set if the marker bit of the last RTP packet of the list is set.</t>
              </li>
              <li>
                <t>The metadata's payload origin is packetized if the T bit value is 1 and raw otherwise.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>Decrypt the SFrame payload to obtain the media decrypted data.</t>
          </li>
          <li>
            <t>If the frame metadata content origin is raw, aka the T bits of each RTP packet of the list are 0, send the media frame created from the media decrypted data and SFrame metadata to the receiving pipeline.</t>
          </li>
          <li>
            <t>Otherwise, run the following sub-steps:
            </t>
            <ol spacing="normal" type="1"><li>
                <t>Let packetizer be a media-format-specific packetizer selected from the frame payload type.</t>
              </li>
              <li>
                <t>Send the media decrypted data and SFrame metadata to the packetizer.</t>
              </li>
              <li>
                <t>If the packetizer generates a media frame, send the media frame to the receiving pipeline.</t>
              </li>
            </ol>
          </li>
        </ol>
      </section>
    </section>
    <section anchor="sframe-sdp-negotiation">
      <name>SFrame SDP negotiation</name>
      <t>SFrame packetization is indicated via a new "a=sframe" SDP attribute defined in this specification.
This attribute is used at media level, it does not appear at session level.</t>
      <t>The presence of the "a=sframe" attribute in a media section (in either an offer or an answer) indicates that the
endpoint is expecting to receive RTP packets encrypted with SFrame for that media section, as defined below.</t>
      <t>Once each peer has verified that the other party expects to receive SFrame RTP packets, senders are expected to send SFrame encrypted RTP packets.
If one peer expects to use SFrame for a media section and identifies that the other peer does not support it, the peer
is expected to stop the transceiver associated with the media section, which will generate a zero port for that m-section.</t>
      <t>When SFrame is in use for that media section, it will apply to the relevant media encodings defined for that media section.
This includes RTP payload types bound to media packetizers and media depacketizers as defined in <xref target="RFC7656"/>, typically audio formats such as Opus and RTP video formats such as H264.
This notably includes RTP payload types representing <xref target="WebRTC_Encoded_Transform"/> <eref target="https://w3c.github.io/webrtc-encoded-transform/#dom-rtcencodedvideoframe-data">encoded video frame formats</eref> and <eref target="https://w3c.github.io/webrtc-encoded-transform/#dom-rtcencodedaudioframe-data">encoded audio frame formats</eref>.</t>
      <t>This does not include RTP-Based Redundancy mechanisms as defined in <xref target="RFC7656"/>.
For instance, RTX defined in <xref target="RFC4588"/> will retransmit SFrame-based packets.
Forward error correction formats as defined in <xref target="RFC5109"/> will protect the encrypted content.
For Redundant Audio Data, known as RED, as defined in <xref target="RFC2198"/>, a RED packetizer will take as input SFrame encrypted media data instead of unencrypted media data.</t>
      <t>If BUNDLE is in use and the "a=sframe" attribute is present for a media section but not for another media section of the same BUNDLE,
payload types for media encodings that are relevant for SFrame MUST NOT be reused between the two media sections.</t>
      <t>Questions:</t>
      <ol spacing="normal" type="1"><li>
          <t>Should we precise how RTX/FEC works with SFrame packetization? No impact AFAIK since RTX/FEC would work on packets (whether SFramed or not).</t>
        </li>
        <li>
          <t>Is RED current proposal (transmit SFrame ciphertext blocks) good enough? An alternative is to have SFrame being applied on the entire RED packet payload.</t>
        </li>
        <li>
          <t>Should we allow <tt>a=sframe</tt> at session level to mean that all media sections want sframe?</t>
        </li>
      </ol>
      <t>Here is an example of SFrame being negotiated for audio (opus and CN) and for video (H264 and VP8):</t>
      <artwork><![CDATA[
m=audio 50000 RTP/SAVPF 10 11
a=sframe
a=rtpmap:10 opus/48000/2
a=rtpmap:11 CN/8000

m=video 50002 RTP/SAVPF 100 101
a=sframe
a=rtpmap:100 H264/90000
a=rtpmap:101 VP8/90000
]]></artwork>
    </section>
    <section anchor="sframe-sdp-rtp-key-management">
      <name>SFrame SDP RTP Key Management</name>
      <t>When SFrame is used with SDP and specifies RTP as the media transport, an additional key derivation step MAY be applied to produce a unique key per SDP m= line using the SSRC.
The resulting per SSRC stream key is used as the initial key in the session for that m= line and becomes the input to the SFrame <tt>derive_key_salt</tt> function.</t>
      <t>This initial derivation step starts with the <tt>base_key</tt> of the session. Then, each SSRC stream involved in the SDP session, MUST perform this derivation step to produce
the initial SFrame <tt>ssrc_key</tt> for that stream in the SDP session. This step is performed using HMAC-based Key Derivation Function (HKDF) <xref target="RFC5869"/> as follows:</t>
      <artwork><![CDATA[
ssrc_key = HKDF-Expand(HKDF-Extract(SSRC, base_key), "SFrame 1.0 RTP Stream", CipherSuite.Nh)
]]></artwork>
      <t>In the derivation of ssrc_key:</t>
      <ul spacing="normal">
        <li>
          <t>The SSRC is encoded as a 4-byte big-endian byte sequence and passed as the salt value to HKDF-Extract.</t>
        </li>
        <li>
          <t>The same CipherSuite is used for this step as for the per packet / frame step the resulting key will be used with.</t>
        </li>
      </ul>
    </section>
    <section anchor="sframe-ratcheting-with-per-ssrc-keys">
      <name>SFrame Ratcheting with per SSRC keys</name>
      <t>If ratcheting is used with this per SSRC key derivation algorithm, the per SSRC key derivation step MUST be done once at the start of the session, and then each subsequent
ratchet is done on the per SSRC specific keys using the SFrame ratcheting algorithm described in section 5.1 of <xref target="RFC9605"/>.
In this per SSRC key derivation algorithm, the same algorithm defined in section 5.1 of <xref target="RFC9605"/> is used to produce the KID from the key_generation and ratchet_steps inputs. This results in all streams using the same KID, but different keys and CTR values.</t>
      <t>This results in a key tree that looks like the following for an offer that has three different SSRC's a, b, and c.</t>
      <artwork><![CDATA[
+--------+
|base_key|
+---┬----+ Initial
    |     Derivation       Ratchet 1         Ratchet 2         Ratchet N
    |    +----------+   +-------------+   +-------------+   +-------------+
    |--->|ssrc_key_a|-->|ssrc_key_a[1]|-->|ssrc_key_a[2]|-->|ssrc_key_a[N]|
    |    +----------+   +-------------+   +-------------+   +-------------+
    |    +----------+   +-------------+   +-------------+   +-------------+
    |--->|ssrc_key_b|-->|ssrc_key_b[1]|-->|ssrc_key_b[2]|-->|ssrc_key_b[N]|
    |    +----------+   +-------------+   +-------------+   +-------------+
    |    +----------+   +-------------+   +-------------+   +-------------+
    +--->|ssrc_key_c|-->|ssrc_key_c[1]|-->|ssrc_key_c[2]|-->|ssrc_key_c[N]|
         +----------+   +-------------+   +-------------+   +-------------+
]]></artwork>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This document is subject to the security considerations of SFrame.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document updates the "attribute-name (formerly "att-field")" subregistry of the "Session Description Protocol (SDP) Parameters" registry (see Section 8.2.4 of <xref target="RFC8866"/>).
Specifically, it adds the SDP "a=sframe" attribute for use at the media level.</t>
      <t>Contact name: IETF AVT Working Group</t>
      <t>Contact email address: avt@ietf.org</t>
      <t>Attribute name: sframe</t>
      <t>Attribute syntax: This attribute takes no values</t>
      <t>Attribute semantics: N/A</t>
      <t>Attribute value: N/A</t>
      <t>Usage Level: media</t>
      <t>Charset dependent: No</t>
      <t>Purpose: The presence of this attribute in the SDP indicates that the endpoint is capable of processing SFrame packets</t>
      <t>O/A procedures: SDP O/A procedures are defined in section 6</t>
      <t>Mux Category: NORMAL</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="WebRTC_Encoded_Transform" target="https://w3c.github.io/webrtc-encoded-transform/">
        <front>
          <title>WebRTC Encoded Transform</title>
          <author>
            <organization>World Wide Web Consortium</organization>
          </author>
          <date year="2025" month="May"/>
        </front>
      </reference>
      <reference anchor="RFC9605">
        <front>
          <title>Secure Frame (SFrame): Lightweight Authenticated Encryption for Real-Time Media</title>
          <author fullname="E. Omara" initials="E." surname="Omara"/>
          <author fullname="J. Uberti" initials="J." surname="Uberti"/>
          <author fullname="S. G. Murillo" initials="S. G." surname="Murillo"/>
          <author fullname="R. Barnes" initials="R." role="editor" surname="Barnes"/>
          <author fullname="Y. Fablet" initials="Y." surname="Fablet"/>
          <date month="August" year="2024"/>
          <abstract>
            <t>This document describes the Secure Frame (SFrame) end-to-end encryption and authentication mechanism for media frames in a multiparty conference call, in which central media servers (Selective Forwarding Units or SFUs) can access the media metadata needed to make forwarding decisions without having access to the actual media.</t>
            <t>This 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>
        </front>
        <seriesInfo name="RFC" value="9605"/>
        <seriesInfo name="DOI" value="10.17487/RFC9605"/>
      </reference>
      <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="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="RFC4588">
        <front>
          <title>RTP Retransmission Payload Format</title>
          <author fullname="J. Rey" initials="J." surname="Rey"/>
          <author fullname="D. Leon" initials="D." surname="Leon"/>
          <author fullname="A. Miyazaki" initials="A." surname="Miyazaki"/>
          <author fullname="V. Varsa" initials="V." surname="Varsa"/>
          <author fullname="R. Hakenberg" initials="R." surname="Hakenberg"/>
          <date month="July" year="2006"/>
          <abstract>
            <t>RTP retransmission is an effective packet loss recovery technique for real-time applications with relaxed delay bounds. This document describes an RTP payload format for performing retransmissions. Retransmitted RTP packets are sent in a separate stream from the original RTP stream. It is assumed that feedback from receivers to senders is available. In particular, it is assumed that Real-time Transport Control Protocol (RTCP) feedback as defined in the extended RTP profile for RTCP-based feedback (denoted RTP/AVPF) is available in this memo. [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="4588"/>
        <seriesInfo name="DOI" value="10.17487/RFC4588"/>
      </reference>
      <reference anchor="RFC5109">
        <front>
          <title>RTP Payload Format for Generic Forward Error Correction</title>
          <author fullname="A. Li" initials="A." role="editor" surname="Li"/>
          <date month="December" year="2007"/>
          <abstract>
            <t>This document specifies a payload format for generic Forward Error Correction (FEC) for media data encapsulated in RTP. It is based on the exclusive-or (parity) operation. The payload format described in this document allows end systems to apply protection using various protection lengths and levels, in addition to using various protection group sizes to adapt to different media and channel characteristics. It enables complete recovery of the protected packets or partial recovery of the critical parts of the payload depending on the packet loss situation. This scheme is completely compatible with non-FEC-capable hosts, so the receivers in a multicast group that do not implement FEC can still work by simply ignoring the protection data. This specification obsoletes RFC 2733 and RFC 3009. The FEC specified in this document is not backward compatible with RFC 2733 and RFC 3009. [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="5109"/>
        <seriesInfo name="DOI" value="10.17487/RFC5109"/>
      </reference>
      <reference anchor="RFC2198">
        <front>
          <title>RTP Payload for Redundant Audio Data</title>
          <author fullname="C. Perkins" initials="C." surname="Perkins"/>
          <author fullname="I. Kouvelas" initials="I." surname="Kouvelas"/>
          <author fullname="O. Hodson" initials="O." surname="Hodson"/>
          <author fullname="V. Hardman" initials="V." surname="Hardman"/>
          <author fullname="M. Handley" initials="M." surname="Handley"/>
          <author fullname="J.C. Bolot" initials="J.C." surname="Bolot"/>
          <author fullname="A. Vega-Garcia" initials="A." surname="Vega-Garcia"/>
          <author fullname="S. Fosse-Parisis" initials="S." surname="Fosse-Parisis"/>
          <date month="September" year="1997"/>
          <abstract>
            <t>This document describes a payload format for use with the real-time transport protocol (RTP), version 2, for encoding redundant audio data. [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="2198"/>
        <seriesInfo name="DOI" value="10.17487/RFC2198"/>
      </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="RFC8866">
        <front>
          <title>SDP: Session Description Protocol</title>
          <author fullname="A. Begen" initials="A." surname="Begen"/>
          <author fullname="P. Kyzivat" initials="P." surname="Kyzivat"/>
          <author fullname="C. Perkins" initials="C." surname="Perkins"/>
          <author fullname="M. Handley" initials="M." surname="Handley"/>
          <date month="January" year="2021"/>
          <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. This document obsoletes RFC 4566.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8866"/>
        <seriesInfo name="DOI" value="10.17487/RFC8866"/>
      </reference>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIABDxYGkAA9U823LbxpLv+IpZ5SHShqRExVJkVnkTRpdjVSxZR6Sdk0ql
7CE4JHEEYnAwgCTGcr5iP2O/ar9k+zIzGJAUbVWcrV2lKpEGM909fe9GI+12
OyqTMlU9sXU9vBJXcpFqORZnupjLUkx0IQZnhZyrrWis4wx+6YlxISdlO1Hl
pC1vy1gXql2UedtMcF87laUyZRTDf6a6WPSEKcfRGP7qiQ8n/eHpxyhK8qIn
yqIy5f7e3vO9/UgWSgIB/TxPEziY6MwImY3FtZJpe5gg9jtd3EwLXeW4rxon
evdtMlZaDAuZmVwXpTgGQsSFTLJSZTKL4cyNWsCxcU+cw1qRqbJ9gqRHtyqr
VC8S4qkAhSgXObLqZ6AmyabibwgA1+cySWEd+PEDMqajiykuyyKewfKsLHPT
293FXbiU3KqO27aLC7ujQt8ZtQvnd/HcNCln1QhOEpfvpo7Ruxt5jyeZ/QHO
JQgdBt2B+26EtflpZ1bO060oMiWI6Z1MdQZcWSgT5UlP/FrquCUMsLBQEwO/
Leb4y2+RqUbzxBgQL7Px/HR4FkWyKme6AHG0gXwhksz0xFVHDGeyjGeqoEVW
vCsFYmw+AAbKLPmddKYnLpK40EaDiPGZYqHkpT3ww9w97sR63sD3S0ecyVGq
ygDbL7pSWRauN5GhtqoQ0YIO/CBxfQVDvyOutVHZSBXTAEm/0NnSg09gkXCi
U7gTAbYoI5sF3ULV/lmNrofH706zWI/V+B1pNVjzvEewPM+FxdgToNLpWPwM
NoBnQfkzlGBSzWmT9REMVViowkOlPWzk+3v7B+29Az4li6kCZXS6ePdtHOjf
nRoVZdxWDKxdOmC7UdRut4UcGViKyygazhIjwP1Uc5WVYqxMXCQjZUQ5UwKd
Vm6d1oSdlp5Yn9USSWlEZRSIQAxOrlrkVHLQIYCs5FyAgwBwRXJLzO4w3nky
HgPLo6/QbRR6XMX4MIoYpvjw4d+uz46fH+4dfPwY0CIzoTK4hIb7jOHXuFjk
eI5QIruBdOvbxFzFMxCxmUfoX+dqnEhknkQypZhXaZnksigXItbZRBUATIlY
pmkLN9zNkngmYgBXyNQeNqq4VYUR24OzN2YH9gKcOFaGWBTxnrkqJSHJlELZ
lRqc1o1Cpt3JYozebKzixJDzvQMh6aoUM3mLDxwwTSwHmVQOdedx6cz0HZ7I
ZXyjyuR3hVcjSsiDOBYBJZVBHJa94G21FSqeA/fBcCKTTDPAaqqcnHMoUYuJ
JKlIvoPB9bGDCEI2gFPPgQCwkzkIAJY6KOChKuZJplM9XRCgS11KFvZwRgcF
xg8jti7eDIZbLf6vuHxNv1+f/v3N+fXpCf4+eNl/9cr/4nYMXr5+8wqeR/a3
+uTx64uL08sTPgyrYmnpov/LFt9t6/XV8Pz1Zf/VFl65BF5HntcQNvHeI+Ka
KvJCITul8UIY45kfj69E95nV2/1u9znoLf9x1P3u2ceP0R3oJiPTWQpXpj9B
0MCTPFeyILVMU1CrPCllCiIBFAaYngnwqoo4aXnNFhhF/cytxEkOm0p1XyLz
8yIxaCxwUIK4CGmtCKieHWK9PWx3zSQeMahDt7JYoLaMVHmnVCa6yIDud2K0
gLDHZ5vwyBiAQ+AUZDFKwGiKhUhVNi1nhB10N0UvVcCNZUb6XWVLIEbACTFJ
7uFvDXaGVOFuVPYcrN0A3+hgaPUpJD9gRHOmyR+z1FQ50X3o6F7PMGd9WUi6
hhWmv0VP6pwJ7HlBNjxWbHjgvmkdaaOL1PdCA7cYIzK5PFFg48LMUdIq09V0
xncsa3EEpE3Qs5K7QuNNVWCynehndlekrWiObX5gwXTYY6BQyZuMb2VWyimL
KE31Hd6ZzJmIpU3gCEvSeKBQI3uNKIBeMPcxM0+mmOFR9EORwnF7V3/51pL/
gRQkQSoXrPoG3fb6u6Lw4Dn8G/xP4JrWXJRBf/qeaTIH0eA9a4xOR1pCmRyk
iLRRAn5LeSmBNhbo0nXBKDWZF6xAtsLS/fDhsRzg48eWDSNwNpmjPwXSCNcI
robhwENL0gQCEZCs7hNDJGOwSWLS2qENwDbwggMCNpbsdspGWLBu24iRRsOr
yTfkPhDISzb2NwZ4xKCnKgt43ojxdWGCdwA7TGLEO1KgPwDxjz/+wARkT6z+
dNes7a9Z+5YBdOHht+KZOBCH4jtxJJ4/ZQ1AfNP+k/8AjIe3L/Yfrh7+8SDE
8TFQ9XDxQCReDZnUB0uyUf+qKFnIqjkkh/4qD1+KjjVscj8lVGlQDczzDXv+
CjrMIotnkBLbhBncQ1UAB7YxA9gRYDmQdk2SgBmOjhd/8p9lfqCLgphbsY1Y
Ko6XqDAr/NjEUyE68LNxw5e7y0CciqG4d/9spms9HU89sw5G75Fn1tidG3j0
p/eF6PgUjD9rL0Qr/svld9bLjSkTr+n48/aCvpDc6SQpTEkZB/rz5eIpMWEw
cqucSealLqy7HwjIRNz5RzcLSpQh0dkjT40xEuLXFEOBgUgSq5xdeOnJ0pla
gsqNBsZ6+sWxpnIj0n5jAZmTF7pUMVk3pxEuJ6EsyeZ1CgKv4oS5LnzqwtQ+
KeSdW6JkfZJkGLsWG0M2J5LDpzIi4a2ODxjXlS+H/vcI6W4mZIVXnajfkB7m
hk2REGTIkBWBNbjENN3KtHJ6cwBp4lwmGZUMCcPZTDDWVJjGQEFNtIhJVVaw
VhkH0x3CHpbYvhoG/p1NqG5D4F+sLGszb2dSECRadQBtQR5f3IAWAcGcm2IU
WSY9yEM9kx0jIko5tfHKDaV8XjUpajOVbUo1J0nsRWBbIUiYLb8gB1YZ9wUe
p8FWuF+UipaAcAqxFFBhaYNVHKTNwMQIlAkkDVZ5k2EZ6gsV+3wN5WMtMl1S
88PWzOOKKyes6jKhZDxbvZdPTq8KjS0Q1CPfXrIpOWyxe0La621RdIZ6JaaQ
7WZNHWZCMGduWc1x9Y8pVW5IGcfYW42ibke8UqV3OpbPDWheMT3Ujjvmmz/r
zrmHHXHOCMBgsLhj2VBSVQFzQJyh6jc0dn0W1lqXFJmmfq9IyjbpLCYooqdJ
Rvc4c54jLAjJn6aJIbWyh7BGZJUIFZSLCZQ2+RwAMndKgaFBcfWXqRLfNACJ
98m8gm3o92zTWlQZKB22IZgekCppjY+gXGkjNS1RVNk6kVLL1Qol8DojVbu3
VaeEfT8oF2VKDhLEK8XvqtAUyjsW4ECVQTRFPzhwlhbgwaaD88RB4OdDAf0k
gz2hMZrdJWYFi1EggDGhOf18NBRzn4AFSsiCkQw/gWStHbDuUOz24aVlcXoH
AiHQob0qqJ3ToJq8dRNxJxChbWyQ+Gpl41MWxPKleMvXhvaz9qN847SizG+N
PXB/lH2mtVQL8zzjLk9cpRKhrGFGbWt4W6NANY2lpCYg3GWbvBRFHdc3i7u+
oWee9Z1eo9kEbZJUW6JNl8ggkRqOlW67tk+Cro15cp4C5ixuEuxtTjCFc04c
PWvdrnBtg6/Ak18ttXGoMwRH2I0vN3k2+20MLHgc+0eQJLRYMZp9KImuFuIi
+/i/Wd4EXi10Ys51NSCE+rEppqrCx4Nab30uHKhvYKLBCTaI0FMFPbJV79og
kZV2TTCSj4SiKLAYu8MfW7JvUFgy4g0nQiOYBCpKzTlMC4MNRpUbYWlW2USl
EGi2gxjYDI6BcdW2DNX8TiAuS0S91SJudiKZM0sMdsjQm3nSrOk2rI7F7jW7
0YldVe3G4/9vug1eaDgL7+0czhx4K+QdUt5MYH1b3iUM9v4+kbAJwhTWJlVB
kjeQNZb0kgSeBi+umpkrEgPiwINSdNtdoKGEVMG9tihnoURDLsim8Ou6AV1V
s/sc5iDrrfez0pCnW3aAbCnIfbZ5N2Piso257K628DqCf+pswz432FoYdEm/
vAtYiWdf1hCJhrHKH6sWfkbV4rcbFKlofwPU5xQL/XEYix1FGPoBlXt3sqJP
A3y16jYC53WB9h10i5ZazNZh4QiL76zQKyRwimuN3CongqeiAq3OKWNtvHwZ
0AJIPCp+yZGtoq5Pcf5qr2qpJezOvw+ca6esMTxKsW/DydOlk5h10baCukKZ
5nuwtcmR5R8UvSQU2n+t5tq1KVSq4mWT93b1KekwYm5zUC2+bPrhBazranZI
KKt7jM7zZsKOcewvwLLOZQUQW9ixcexa7Vj67Nk7Hut11nR1bHYDaoRVfuYN
Lbjkp+63Dnzo3/AtWbXiG9nBmNBufE4b3jQJ0/fQChyKr81q/u4ymOCBA7qU
xoVy4rOd9Tg2FUwOXdBbww1dcnjYPwyqN4B8Ery0XRIH2I8eYW8hCPL2Ha9/
919r4WRjRODCDVTsRj7BJNCp7LXqV71hohEXal362iSQLr2sBta11h47T3KV
QoVC13nt2LM2Flej9pp47POXkR+a2ZD41E7F077UDwJDXolpT73eUqIVugtP
iAuNppkGPsLxDXyrB0oGJ1ciU1NdJrIxhdWMnvgaGzJZbubdAgaccroTW/KF
HYwkOLLkXpTyFaR7Te246nuf+E7d705ohgxCfGnpT9WtwmEsdH/KkAO0kzIS
QwU3i2iTaxlTpRl7LxYQFqDJPNuMopkzsQ1rtkaW6LomGIzpd6hy71Sx469t
fA80Al7nkJiSzav73L6zwCqJ40rDH63tS9tQ7u9ryWk1im9bMr/Ga3EbTNlR
HUiqsRk+DtqydAWeaWOSTEjQaju5ZUsLTgT4CLe+SJVWkuNGpATFxPqE6Amw
4RxgcL9lXtMwUNjIb9KOwLy0/RCaTcXwaeTZbQktdc5dLGxJ0EUBqTE6TqTn
d20Tnsc8mHGXpKm3J9fvI5y1bNr2TMfmjPU8BKgN3vYxMWL9gvBxdmhR2yFo
LI6B+BcWGnPjWuLroVlr4VxamcYrRc4gRrrKeNww6O6gvzA2aWZH1Fg3oYny
sNp3hweHOLji53aExKlt+7bF+B7167yyw+NAiR2dWdrycv/wmaUbpClHAGsD
/YWyjSI0o00NJ/GrHWUNJ3Yc8t+2nzgE+9VYz9vwyD4hkDxhj255h67oEVpW
fEmEBDJAWE96WiOwLEOOtX+U6CCv1RhELbN4UY+4bhJmh/oOSYZT5DH1TP6x
uvXZwdER8JYUtlC2H+9aFO0RIfamf8bDrEIVBUCOdVFY63YqsI6Yg+7ec4fB
vuUli6jdi80+mF53y1LQZwPihIbL+EUUgL8+PWmtRbPffX6ECixxSxg2CXGJ
s7iuX7Lq4BpDwpAySGpohpOK9Q6QFLjAH99cnrw6DbyB6yysDz7GtUPXOkd8
D4cyp2cZu8TmDtcpRrIZdStq2lE961z7FvIn/MrVep9gsMsN22IaVCgKwWH/
BDu7DRpwlOzvFVSe+DtXwYOZrlLwtRSCY8jCaFYY9Gz37PQYh3tvTCPwNdKK
78WlxvE4CfrQP+uf/4SzjrEKjhNsfF2kMx9Rt+9mivjDIDGrRtaB/exDzkT6
IeIKFDPDgTmdayNTsb2k12EDZpTq+MbsiKnWYzuZ+b1YO/JIVZgFMFLUPMDp
UH7ByRpdJsDsWv/qMurbkFk0hineO0V5v5LXsDuX9s0rDlo0JSHuUJZ8+vso
emmrZRySv5fzPFXBW1Sm1CV5NtCwQ9vWzpkfX7LHq+cht9GL09rbq6OdHs/8
zV/wwYM9+EHPtDvov706E9090e1G7j7wS1Hmc5n3YB1R7D47gv27+8GDLqDc
xdUIgDJGBLrfAApQ99aD3aMgs/sc6QjXu0itXabBnEami8HnJ7UQFzKTU4Uv
O1dCO5kBqyymtDi5ysmrjV122pTFUbpvmXhUeDymeWDQt+aHD1Sdi4v+L1Rw
WJXBpht9/YDpR5Ul/6p4Ip7G6wH1/IXAZD1oseEcA790AU+CHzFgTu+G8YMv
Lnw+zaTad5v8yLWHWNfqlMMiw/uOFI+O8Fn0ls1223v+DuAdwHsHtlW+F5Mq
c4mSTVYY4zIHIA7hiKrPzN5jdEE47+sXYUQYVdCQSPHQQHC9JLvV6a3y74KR
UfZMi/0ZMARjEdcdywTUPI9CzriLGVPETI5njMe7jA5JxMoGwfJwMqL1X1u8
vOgf2+CJCndSE3JmmQUG9tPJ2Y6LkUeHGCOlsdWrsQbnSBIvBG5vn97nIKNt
+zt9v7PN8y2Olzv4YQRfqNvZ4+YmXWKrJY7J6w2qpFSdy9kOW8i5HWCvSQRh
OLxAxr9TO4OkkBjhMyIsQp+1qXc0Sqb4VU6CbwPwb99J5EkDEygjKoztcoAw
wmt0HCYKcQGlXp9ZKI7p0viOaE7FD/nbXZuksbgbpkKfm2AqMFK1lYe18DV9
xkZ7+QWzsy38woViflHvaLgKN5/ut4fc9J8qtDyx67axj7CTRvYFELLQ9ovR
dJaspOVSDjtdY6oRc76MLKE0u23fJTVw+zYHfbwTuBjmRHBPT33zoxeXlhx0
ukhV+NFWhzXq8zlCAg/x+MRuAxYvgMCPIrCfzk/qPg26KFvkuRLUXu0d9/TJ
vxlry6wqxn2Ow6YfcocIBQQ8NzVOJvTxWMlMpCg6vGblNs4VhjCJDQBUsWtJ
tYbsKE1u1FLXipNA246grfyNA56skSJjvwa0QAwrQmzn8r9p259vogfnFB5o
9b//879oXZyz46NvCHmINnBQ/GONIRjndyv7KyuXNSCPHNE0/vzcFYYFv/3H
g3NC7+RD889fu78tr+yvrFz+9vDl6frr7jhq0j9aueNo5Y6j//N3/KZ5x7hJ
f7xyx3jljrG/o/hCdLm0UEGVgN/e4Je4kH+yjzDL31tiuKlG/6Sa1b3jswfj
xsE646aYct6/7H8CdJWPbWcRi0ZXKrbxw2WxTdlEkS7oSZtet27tbCEthZom
4JsWvtk5sNnciZ0Ywt+voM7WsYbKB3KWHXElkTCoZ8yW8Oe3DTiUgXWxR539
zrPayR4dHR5+/AhF1cC1bulLLiigIMs1PhlaW+ui/6KCuAxSZdeuPcb5R2Am
f56NX6iL/tuhaHzwX++ib7IRJfhR0xPh5/9R1PcYGZitEoJ1swAw9z2x1HDG
XgC9WmRf3TgBGPFDYkB2udsPn9Beu0rfUIlXeKUe3w9InsnCKPfNIsgX9uoo
uqoKKEFVT6z2qZtN8DrDXO05i7DnHMscP5lfGrhqjoJF0evdPj8eV4C0R4Cb
a/xCezXYHkbRRXUvjv3/YOLy9fVF/1X0P7hGVvvLQgAA

-->

</rfc>
