rfc8723xml2.original.xml | rfc8723.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="UTF-8"?> | <?xml version='1.0' encoding='utf-8'?> | |||
<!DOCTYPE rfc SYSTEM 'rfc2629.dtd' []> | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
<rfc ipr="trust200902" category="std" docName="draft-ietf-perc-double-12"> | <rfc | |||
<?rfc toc="yes"?> | xmlns:xi="http://www.w3.org/2001/XInclude" | |||
<?rfc symrefs="yes"?> | number="8723" | |||
<?rfc sortrefs="yes"?> | updates="" | |||
<?rfc compact="yes"?> | obsoletes="" | |||
<?rfc subcompact="no"?> | category="std" | |||
<?rfc private=""?> | consensus="true" | |||
<?rfc topblock="yes"?> | submissionType="IETF" | |||
<?rfc comments="no"?> | ipr="trust200902" | |||
<front> | sortRefs="true" | |||
<title abbrev="Double SRTP">SRTP Double Encryption Procedures</title> | symRefs="true" | |||
xml:lang="en" | ||||
<author initials="C." surname="Jennings" fullname="Cullen Jennings"> | docName="draft-ietf-perc-double-12" | |||
<organization>Cisco Systems</organization> | tocInclude="true" | |||
<address> | version="3"> | |||
<postal> | <front> | |||
<street></street> | <title abbrev="Double SRTP">Double Encryption Procedures for the Secure Real | |||
<city></city> | -Time Transport Protocol (SRTP)</title> | |||
<code></code> | <seriesInfo name="RFC" value="8723"/> | |||
<country></country> | <author initials="C." surname="Jennings" fullname="Cullen Jennings"> | |||
<region></region> | <organization>Cisco Systems</organization> | |||
</postal> | <address> | |||
<phone></phone> | <email>fluffy@iii.ca</email> | |||
<email>fluffy@iii.ca</email> | </address> | |||
<uri></uri> | </author> | |||
</address> | <author initials="P." surname="Jones" fullname="Paul E. Jones"> | |||
</author> | <organization>Cisco Systems</organization> | |||
<author initials="P." surname="Jones" fullname="Paul E. Jones"> | <address> | |||
<organization>Cisco Systems</organization> | <email>paulej@packetizer.com</email> | |||
<address> | </address> | |||
<postal> | </author> | |||
<street></street> | <author initials="R." surname="Barnes" fullname="Richard Barnes"> | |||
<city></city> | <organization>Cisco Systems</organization> | |||
<code></code> | <address> | |||
<country></country> | <email>rlb@ipv.sx</email> | |||
<region></region> | </address> | |||
</postal> | </author> | |||
<phone></phone> | <author initials="A.B." surname="Roach" fullname="Adam Roach"> | |||
<email>paulej@packetizer.com</email> | <organization>Mozilla</organization> | |||
<uri></uri> | <address> | |||
</address> | <email>adam@nostrum.com</email> | |||
</author> | </address> | |||
<author initials="R." surname="Barnes" fullname="Richard Barnes"> | </author> | |||
<organization>Cisco Systems</organization> | <date year="2020" month="April"/> | |||
<address> | <area>Internet</area> | |||
<postal> | <workgroup/> | |||
<street></street> | <keyword>PERC</keyword> | |||
<city></city> | <keyword>SRTP</keyword> | |||
<code></code> | <keyword>RTP</keyword> | |||
<country></country> | <keyword>conferencing</keyword> | |||
<region></region> | <keyword>encryption</keyword> | |||
</postal> | <abstract> | |||
<phone></phone> | <t>In some conferencing scenarios, it is desirable for an intermediary | |||
<email>rlb@ipv.sx</email> | to be able to manipulate some parameters in Real-time Transport Protocol (RTP) | |||
<uri></uri> | ||||
</address> | ||||
</author> | ||||
<author initials="A.B." surname="Roach" fullname="Adam Roach"> | ||||
<organization>Mozilla</organization> | ||||
<address> | ||||
<postal> | ||||
<street></street> | ||||
<city></city> | ||||
<code></code> | ||||
<country></country> | ||||
<region></region> | ||||
</postal> | ||||
<phone></phone> | ||||
<email>adam@nostrum.com</email> | ||||
<uri></uri> | ||||
</address> | ||||
</author> | ||||
<date year="2019" month="August" day="29"/> | ||||
<area>Internet</area> | ||||
<workgroup></workgroup> | ||||
<keyword>PERC</keyword> | ||||
<keyword>SRTP</keyword> | ||||
<keyword>RTP</keyword> | ||||
<keyword>conferencing</keyword> | ||||
<keyword>encryption</keyword> | ||||
<abstract> | ||||
<t>In some conferencing scenarios, it is desirable for an intermediary | ||||
to be able to manipulate some parameters in Real Time Protocol (RTP) | ||||
packets, while still providing strong end-to-end security | packets, while still providing strong end-to-end security | |||
guarantees. This document defines a cryptographic transform for the | guarantees. This document defines a cryptographic transform for the | |||
Secure Real Time Protocol (SRTP) that uses two separate but related | Secure Real-time Transport Protocol (SRTP) that uses two separate but related | |||
cryptographic operations to provide hop-by-hop and end-to-end | cryptographic operations to provide hop-by-hop and end-to-end | |||
security guarantees. Both the end-to-end and hop-by-hop | security guarantees. Both the end-to-end and hop-by-hop | |||
cryptographic algorithms can utilize an authenticated encryption | cryptographic algorithms can utilize an authenticated encryption | |||
with associated data (AEAD) algorithm or take advantage of future SRTP | with associated data (AEAD) algorithm or take advantage of future SRTP | |||
transforms with different properties. | transforms with different properties. | |||
</t> | </t> | |||
</abstract> | </abstract> | |||
</front> | ||||
</front> | <middle> | |||
<section anchor="introduction" numbered="true" toc="default"> | ||||
<middle> | <name>Introduction</name> | |||
<t>Cloud conferencing systems that are based on switched conferencing | ||||
<section anchor="introduction" title="Introduction"> | have a central Media Distributor (MD) device that receives media from | |||
<t>Cloud conferencing systems that are based on switched conferencing | ||||
have a central Media Distributor device that receives media from | ||||
endpoints and distributes it to other endpoints, but does not need | endpoints and distributes it to other endpoints, but does not need | |||
to interpret or change the media content. For these systems, it is | to interpret or change the media content. For these systems, it is | |||
desirable to have one cryptographic key that enables encryption and | desirable to have one cryptographic key that enables encryption and | |||
authentication of the media | authentication of the media | |||
end-to-end while still allowing certain information in the header of | end-to-end while still allowing certain information in the header of | |||
a Real Time Protocol (RTP) packet to be changed by the Media | an RTP packet to be changed by the MD. | |||
Distributor. At the same time, a separate cryptographic key | At the same time, a separate cryptographic key | |||
provides integrity and optional confidentiality for the media | provides integrity and optional confidentiality for the media | |||
flowing between the Media Distributor and the endpoints. The | flowing between the MD and the endpoints. The | |||
framework document <xref target="I-D.ietf-perc-private-media-framework"/> | framework document <xref target="I-D.ietf-perc-private-media-framework" format=" | |||
default"/> | ||||
describes this concept in more detail. | describes this concept in more detail. | |||
</t> | </t> | |||
<t>This specification defines a transform for the Secure Real Time | <t>This specification defines a transform for | |||
Protocol (SRTP) that uses the AES-GCM algorithm <xref target="RFC7714"/> to | SRTP that uses 1) the AES Galois/Counter Mode (AES-GCM) algorithm <xref target=" | |||
RFC7714" format="default"/> to | ||||
provide encryption and integrity for an RTP packet for the | provide encryption and integrity for an RTP packet for the | |||
end-to-end cryptographic key as well as a hop-by-hop cryptographic | end-to-end cryptographic key and 2) a hop-by-hop cryptographic | |||
encryption and integrity between the endpoint and the Media | encryption and integrity between the endpoint and the MD. | |||
Distributor. The Media Distributor decrypts and checks integrity of | The MD decrypts and checks integrity of | |||
the hop-by-hop security. The Media Distributor MAY change some of | the hop-by-hop security. The MD <bcp14>MAY</bcp14> change some of | |||
the RTP header information that would impact the end-to-end | the RTP header information that would impact the end-to-end | |||
integrity. In that case, the original value of any RTP header field | integrity. In that case, the original value of any RTP header field | |||
that is changed is included in an "Original Header Block" that is | that is changed is included in an "Original Header Block" that is | |||
added to the packet. The new RTP packet is encrypted with the | added to the packet. The new RTP packet is encrypted with the | |||
hop-by-hop cryptographic algorithm before it is sent. The receiving | hop-by-hop cryptographic algorithm before it is sent. The receiving | |||
endpoint decrypts and checks integrity using the hop-by-hop | endpoint decrypts and checks integrity using the hop-by-hop | |||
cryptographic algorithm and then replaces any parameters the Media | cryptographic algorithm and then replaces any parameters the MD | |||
Distributor changed using the information in the Original Header | changed using the information in the Original Header | |||
Block before decrypting and checking the end-to-end integrity. | Block before decrypting and checking the end-to-end integrity. | |||
</t> | </t> | |||
<t>One can think of the double as a normal SRTP transform for encrypting | <t>One can think of the double transform as a normal SRTP transform for en | |||
the RTP in a way where things that only know half of the key, can | crypting | |||
the RTP in a way such that things that only know half of the key, can | ||||
decrypt and modify part of the RTP packet but not other parts, | decrypt and modify part of the RTP packet but not other parts, | |||
including the media payload. | including the media payload. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="terminology" numbered="true" toc="default"> | ||||
<section anchor="terminology" title="Terminology"> | <name>Terminology</name> | |||
<t>The key words "MUST", "MUST NOT", "REQUIRED", & | <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>R | |||
quot;SHALL", "SHALL NOT", | EQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT R | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14> | |||
ECOMMENDED", "MAY", and | RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
"OPTIONAL" in this document are to be interpreted as described in | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to | |||
BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, th | be interpreted as | |||
ey appear in all | described in BCP 14 <xref target="RFC2119" format="default"/> <xref tar | |||
capitals, as shown here. | get="RFC8174" format="default"/> | |||
when, and only when, they appear in all capitals, as shown here. | ||||
</t> | </t> | |||
<t>Terms used throughout this document include: | <t>Terms used throughout this document include: | |||
</t> | </t> | |||
<t> | <dl spacing="normal"> | |||
<list style="symbols"> | <dt>Media Distributor (MD):</dt> | |||
<t>Media Distributor: A device that receives media from endpoints and | <dd>A device that receives media from endpoints and | |||
distributes it to other endpoints, but does not need to interpret | distributes it to other endpoints, but does not need to interpret | |||
or change the media content (see also | or change the media content (see also | |||
<xref target="I-D.ietf-perc-private-media-framework"/>)</t> | <xref target="I-D.ietf-perc-private-media-framework" format="default"/>).</dd> | |||
<t>end-to-end: The path from one endpoint through one or | <dt>end-to-end:</dt> | |||
more Media Distributors to the endpoint at the other end.</t> | <dd>The path from one endpoint through one or | |||
<t>hop-by-hop: The path from the endpoint to or from the | more MDs to the endpoint at the other end.</dd> | |||
Media Distributor.</t> | <dt>hop-by-hop:</dt> | |||
<t>Original Header Block (OHB): An octet string that contains the | <dd>The path from the endpoint to or from the MD.</dd> | |||
<dt>Original Header Block (OHB):</dt> | ||||
<dd>An octet string that contains the | ||||
original values from the RTP header that might have been changed | original values from the RTP header that might have been changed | |||
by a Media Distributor.</t> | by an MD.</dd> | |||
</list> | </dl> | |||
</t> | </section> | |||
</section> | <section anchor="cryptographic-context" numbered="true" toc="default"> | |||
<name>Cryptographic Context</name> | ||||
<section anchor="cryptographic-context" title="Cryptographic Context"> | <t>This specification uses a cryptographic context with two parts: | |||
<t>This specification uses a cryptographic context with two parts: | ||||
</t> | ||||
<t> | ||||
<list style="symbols"> | ||||
<t>An inner (end-to-end) part that is used by endpoints that originate and | ||||
consume media to ensure the integrity of media end-to-end, and</t> | ||||
<t>An outer (hop-by-hop) part that is used between endpoints and Media | ||||
Distributors to ensure the integrity of media over a single hop and to | ||||
enable a Media Distributor to modify certain RTP header fields. RTCP | ||||
is also handled using the hop-by-hop cryptographic part.</t> | ||||
</list> | ||||
</t> | </t> | |||
<t>The RECOMMENDED cipher for the hop-by-hop and end-to-end algorithm is | <ul spacing="normal"> | |||
<li>An inner (end-to-end) part that is used by endpoints that originate | ||||
and | ||||
consume media to ensure the integrity of media end-to-end, and</li> | ||||
<li>An outer (hop-by-hop) part that is used between endpoints and MDs | ||||
to ensure the integrity of media over a single hop and to | ||||
enable an MD to modify certain RTP header fields. RTCP | ||||
is also handled using the hop-by-hop cryptographic part.</li> | ||||
</ul> | ||||
<t>The <bcp14>RECOMMENDED</bcp14> cipher for the hop-by-hop and end-to-end | ||||
algorithms is | ||||
AES-GCM. Other combinations of SRTP ciphers that support the | AES-GCM. Other combinations of SRTP ciphers that support the | |||
procedures in this document can be added to the IANA registry. | procedures in this document can be added to the IANA registry. | |||
</t> | </t> | |||
<t>The keys and salt for these algorithms are generated with the following | <t>The keys and salt for these algorithms are generated with the following | |||
steps: | steps: | |||
</t> | </t> | |||
<t> | <ul spacing="normal"> | |||
<list style="symbols"> | <li>Generate key and salt values of the length required for the combined | |||
<t>Generate key and salt values of the length required for the combined | inner (end-to-end) and outer (hop-by-hop) algorithms.</li> | |||
inner (end-to-end) and outer (hop-by-hop) algorithms.</t> | <li>Assign the key and salt values generated for the inner (end-to-end) | |||
<t>Assign the key and salt values generated for the inner (end-to-end) | ||||
algorithm to the first half of the key and the first half of the | algorithm to the first half of the key and the first half of the | |||
salt for the double algorithm.</t> | salt for the double algorithm.</li> | |||
<t>Assign the key and salt values for the outer (hop-by-hop) algorithm | <li>Assign the key and salt values for the outer (hop-by-hop) algorithm | |||
to the second half of the key and second half of the salt for the | to the second half of the key and second half of the salt for the | |||
double algorithm. The first half of the key is referred to as the | double algorithm. The first half of the key is referred to as the | |||
inner key while the second half is referred to as the outer key. | inner key while the second half is referred to as the outer key. | |||
When a key is used by a cryptographic algorithm, the salt used is | When a key is used by a cryptographic algorithm, the salt that is used is | |||
the part of the salt generated with that key.</t> | the part of the salt generated with that key.</li> | |||
<t>the SSRC is the same for both the inner and out outer algorithms as | <li>the synchronization source (SSRC) is the same for both the inner and | |||
it can not be changed.</t> | outer algorithms as | |||
<t>The SEQ and ROC are tracked independently for the inner and outer | it cannot be changed.</li> | |||
algorithms.</t> | <li>The sequence number (SEQ) and rollover counter (ROC) are tracked ind | |||
</list> | ependently for the inner and outer | |||
</t> | algorithms.</li> | |||
<t>If the Media Distributor is to be able to modify header fields but | </ul> | |||
not decrypt the payload, then it must have cryptographic key for the | <t>If the MD is to be able to modify header fields but | |||
outer algorithm, but not the inner (end-to-end) algorithm. This | not decrypt the payload, then it must have a cryptographic key for the | |||
document does not define how the Media Distributor should be | outer algorithm but not the inner (end-to-end) algorithm. This | |||
document does not define how the MD should be | ||||
provisioned with this information. One possible way to provide | provisioned with this information. One possible way to provide | |||
keying material for the outer (hop-by-hop) algorithm is to use | keying material for the outer (hop-by-hop) algorithm is to use | |||
<xref target="I-D.ietf-perc-dtls-tunnel"/>. | <xref target="I-D.ietf-perc-dtls-tunnel" format="default"/>. | |||
</t> | </t> | |||
<section anchor="key-derivation" numbered="true" toc="default"> | ||||
<section anchor="key-derivation" title="Key Derivation"> | <name>Key Derivation</name> | |||
<t>Although SRTP uses a single master key to derive keys for an SRTP | <t>Although SRTP uses a single master key to derive keys for an SRTP | |||
session, this transform requires separate inner and outer keys. | session, this transform requires separate inner and outer keys. | |||
In order to allow the inner and outer keys to be managed | In order to allow the inner and outer keys to be managed | |||
independently via the master key, the transforms defined in this | independently via the master key, the transforms defined in this | |||
document MUST be used with the following pseudo-random function | document <bcp14>MUST</bcp14> be used with the following pseudorandom function | |||
(PRF), which preserves the separation between the two halves of the | (PRF), which preserves the separation between the two halves of the | |||
key. Given a positive integer <spanx style="verb">n</spanx> representing the de | key. Given a positive integer <tt>n</tt> representing the desired output | |||
sired output | length, a master key <tt>k_master</tt>, and an input <tt>x</tt>: | |||
length, a master key <spanx style="verb">k_master</spanx>, and an input <spanx s | ||||
tyle="verb">x</spanx>: | ||||
</t> | </t> | |||
<artwork align="center" name="" type="" alt=""><![CDATA[ | ||||
PRF_double_n(k_master,x) = PRF_(n/2)(inner(k_master),x) || | ||||
PRF_(n/2)(outer(k_master),x) | ||||
]]></artwork> | ||||
<figure align="center"><artwork align="center"> | <t>Here <tt>PRF_double_n(k_master, x)</tt> represents the AES_CM PRF Key | |||
PRF\_double\_n(k\_master,x) = PRF\_(n/2)(inner(k\_master),x) || | Derivation Function (KDF) (see | |||
PRF\_(n/2)(outer(k\_master),x) | <xref target="RFC3711" section="4.3.3" sectionFormat="of" format="default"/>) fo | |||
</artwork></figure> | r | |||
<t>Here <spanx style="verb">PRF_n(k, x)</spanx> represents the AES_CM PRF KDF (s | ||||
ee Section 4.3.3 | ||||
of <xref target="RFC3711"/>) for | ||||
DOUBLE_AEAD_AES_128_GCM_AEAD_AES_128_GCM algorithm and | DOUBLE_AEAD_AES_128_GCM_AEAD_AES_128_GCM algorithm and | |||
AES_256_CM_PRF KDF <xref target="RFC6188"/> for DOUBLE_AEAD_AES_256_GCM_AEAD_AES | AES_256_CM_PRF KDF <xref target="RFC6188" format="default"/> for DOUBLE_AEAD_AES | |||
_256_GCM | _256_GCM_AEAD_AES_256_GCM | |||
algorithm. <spanx style="verb">inner(key)</spanx> represents the first half of t | algorithm. The term <tt>inner(k_master)</tt> represents the first half of | |||
he key, and <spanx style="verb">outer(key)</spanx> | the key; <tt>outer(k_master)</tt> | |||
represents the second half of the key. | represents the second half of the key. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="ohb" numbered="true" toc="default"> | ||||
<section anchor="ohb" title="Original Header Block"> | <name>Original Header Block</name> | |||
<t>The Original Header Block (OHB) contains the original values of any | <t>The OHB contains the original values of any | |||
modified RTP header fields. In the encryption process, the OHB is | modified RTP header fields. In the encryption process, the OHB is | |||
included in an SRTP packet as described in <xref target="rtp-operations"/>. In the | included in an SRTP packet as described in <xref target="rtp-operations" format= "default"/>. In the | |||
decryption process, the receiving endpoint uses it to reconstruct | decryption process, the receiving endpoint uses it to reconstruct | |||
the original RTP header, so that it can pass the proper AAD value to | the original RTP header so that it can pass the proper additional authenticated data (AAD) value to | |||
the inner transform. | the inner transform. | |||
</t> | </t> | |||
<t>The OHB can reflect modifications to the following fields in an RTP header: t | <t>The OHB can reflect modifications to the following fields in an RTP hea | |||
he | der: the | |||
payload type, the sequence number, and the marker bit. All other fields in the | payload type (PT), the SEQ, and the marker bit. All other fields in the | |||
RTP header MUST remain unmodified; since the OHB cannot reflect their original | RTP header <bcp14>MUST</bcp14> remain unmodified; since the OHB cannot reflect t | |||
values, the receiver will be unable to verify the E2E integrity of the packet. | heir original | |||
values, the receiver will be unable to verify the end-to-end integrity of the pa | ||||
cket. | ||||
</t> | </t> | |||
<t>The OHB has the following syntax (in ABNF <xref target="RFC5234"/>): | <t>The OHB has the following syntax (in ABNF <xref target="RFC5234" format ="default"/>): | |||
</t> | </t> | |||
<sourcecode name="" src="" type="abnf" markers="false"><![CDATA[ | ||||
<figure align="left"><artwork align="left"> | ||||
OCTET = %x00-FF | OCTET = %x00-FF | |||
PT = OCTET | PT = OCTET | |||
SEQ = 2OCTET | SEQ = 2OCTET | |||
Config = OCTET | Config = OCTET | |||
OHB = [ PT ] [ SEQ ] Config | OHB = [ PT ] [ SEQ ] Config | |||
</artwork></figure> | ]]></sourcecode> | |||
<t>If present, the PT and SEQ parts of the OHB contain the original payload type | <t>If present, the PT and SEQ parts of the OHB contain the original payloa | |||
and sequence number fields, respectively. The final "config" octet of | d type | |||
the OHB | and sequence number fields, respectively. The final "Config" octet of the OHB | |||
specifies whether these fields are present, and the original value of the | specifies whether these fields are present, and the original value of the | |||
marker bit (if necessary): | marker bit (if necessary): | |||
</t> | </t> | |||
<artwork align="left" name="" type="" alt=""><![CDATA[ | ||||
<figure align="left"><artwork align="left"> | ||||
+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
|R R R R B M P Q| | |R R R R B M P Q| | |||
+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
</artwork></figure> | ]]></artwork> | |||
<t> | <ul spacing="normal"> | |||
<list style="symbols"> | <li>P: PT is present</li> | |||
<t>P: PT is present</t> | <li>Q: SEQ is present</li> | |||
<t>Q: SEQ is present</t> | <li>M: Marker bit is present</li> | |||
<t>M: Marker bit is present</t> | <li>B: Value of marker bit</li> | |||
<t>B: Value of marker bit</t> | <li>R: Reserved, <bcp14>MUST</bcp14> be set to 0</li> | |||
<t>R: Reserved, MUST be set to 0</t> | </ul> | |||
</list> | ||||
</t> | <t>In particular, an all-zero OHB Config octet (<tt>0x00</tt>) indicates t | |||
<t>In particular, an all-zero OHB config octet (0x00) indicates that | hat | |||
there have been no modifications from the original header. | there have been no modifications from the original header. | |||
</t> | </t> | |||
<t>If the marker bit is not present (M=0), then B MUST be set to zero. | <t>If the marker bit is not present (M=0), then <tt>B</tt> <bcp14>MUST</bc | |||
That is, if <spanx style="verb">C</spanx> represents the value of the config oct | p14> be set to zero. | |||
et, then the | That is, if <tt>C</tt> represents the value of the Config octet, then the | |||
masked value <spanx style="verb">C & 0x0C</spanx> MUST NOT have the value <s | masked value <tt>C & 0x0C</tt> <bcp14>MUST NOT</bcp14> have the value <tt>0x | |||
panx style="verb">0x80</spanx>. | 80</tt>. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="rtp-operations" numbered="true" toc="default"> | ||||
<section anchor="rtp-operations" title="RTP Operations"> | <name>RTP Operations</name> | |||
<t>As implied by the use of the word "double" above, this transform | <t>As implied by the use of the word "double" above, this transform | |||
applies AES-GCM to the SRTP packet twice. This allows media | applies AES-GCM to the SRTP packet twice. This allows media | |||
distributors to be able to modify some header fields while allowing | distributors to be able to modify some header fields while allowing | |||
endpoints to verify the end-to-end integrity of a packet. | endpoints to verify the end-to-end integrity of a packet. | |||
</t> | </t> | |||
<t>The first, "inner" application of AES-GCM encrypts the SRTP payload | <t>The first, "inner" application of AES-GCM encrypts the SRTP payload | |||
and integrity-protects a version of the SRTP header with extensions | and protects the integrity of a version of the SRTP header with extensions | |||
truncated. Omitting extensions from the inner integrity check means | truncated. Omitting extensions from the inner integrity check means | |||
that they can be modified by a media distributor holding only the | that they can be modified by an MD holding only the outer key. | |||
"outer" key. | ||||
</t> | </t> | |||
<t>The second, "outer" application of AES-GCM encrypts the ciphertext | <t>The second, "outer" application of AES-GCM encrypts the ciphertext | |||
produced by the inner encryption (i.e., the encrypted payload and | produced by the inner encryption (i.e., the encrypted payload and | |||
authentication tag), plus an OHB that expresses any changes made | authentication tag), plus an OHB that expresses any changes made | |||
between the inner and outer transforms. | between the inner and outer transforms. | |||
</t> | </t> | |||
<t>A media distributor that has the outer key but not the inner key may | <t>An MD that has the outer key but not the inner key may | |||
modify the header fields that can be included in the OHB by | modify the header fields that can be included in the OHB by | |||
decrypting, modifying, and re-encrypting the packet. | decrypting, modifying, and re-encrypting the packet. | |||
</t> | </t> | |||
<section anchor="encrypt" numbered="true" toc="default"> | ||||
<section anchor="encrypt" title="Encrypting a Packet"> | <name>Encrypting a Packet</name> | |||
<t>To encrypt a packet, the endpoint encrypts the packet using the inner | <t>An endpoint encrypts a packet by using the inner (end-to-end) | |||
(end-to-end) cryptographic key and then encrypts using the outer | cryptographic key and then the outer (hop-by-hop) cryptographic key. | |||
(hop-by-hop) cryptographic key. The encryption also supports a mode | The encryption also supports a mode | |||
for repair packets that only does the outer (hop-by-hop) encryption. | for repair packets that only does the outer (hop-by-hop) encryption. | |||
The processes is as follows: | The processes is as follows: | |||
</t> | </t> | |||
<t> | <ol spacing="normal" type="1"> | |||
<list style="numbers"> | <li>Form an RTP packet. If there are any header extensions, | |||
<t>Form an RTP packet. If there are any header extensions, they MUST | they <bcp14>MUST</bcp14> use <xref target="RFC8285" format="default"/>.</li> | |||
use <xref target="RFC8285"/>.</t> | <li>If the packet is for repair mode data, skip to <xref | |||
<t>If the packet is for repair mode data, skip to step 6.</t> | target="step6" format="none">step 6</xref>.</li> | |||
<t>Form a synthetic RTP packet with the following contents: | <li> | |||
<list style="symbols"> | <t>Form a synthetic RTP packet with the following contents:</t> | |||
<t>Header: The RTP header of the original packet with the following | <ul spacing="normal"> | |||
modifications:</t> | <li> | |||
<t>The X bit is set to zero</t> | <t>Header: The RTP header of the original packet with | |||
<t>The header is truncated to remove any extensions (i.e., keep | the following modifications:</t> | |||
only the first 12 + 4 * CC bytes of the header)</t> | <ul spacing="normal"> | |||
<t>Payload: The RTP payload of the original packet (including padding when prese | <li>The X bit is set to zero.</li> | |||
nt) </t> | <li>The header is truncated to remove any extensions | |||
</list></t> | (i.e., keep only the first 12 + 4 * CSRC count (CC) bytes of the header).</li> | |||
<t>Apply the inner cryptographic algorithm to the synthetic RTP packet | </ul> | |||
from the previous step.</t> | </li> | |||
<t>Replace the header of the protected RTP packet with the header of | <li>Payload: The RTP payload of the original packet (including | |||
padding when present).</li> | ||||
</ul> | ||||
</li> | ||||
<li anchor="step4a">Apply the inner cryptographic algorithm to the syn | ||||
thetic RTP packet from the previous step.</li> | ||||
<li>Replace the header of the protected RTP packet with the header of | ||||
the original packet (to restore any header extensions and reset | the original packet (to restore any header extensions and reset | |||
the X bit), and append an empty OHB (0x00) to the encrypted | the X bit), and append an empty OHB (<tt>0x00</tt>) to the encrypted | |||
payload (with the authentication tag) obtained from the step 4.</t> | payload (with the authentication tag) obtained from <xref | |||
<t>Apply the outer cryptographic algorithm to the RTP packet. If | target="step4a" format="none">step 4</xref>.</li> | |||
encrypting RTP header extensions hop-by-hop, then <xref target="RFC6904"/> MUST | <li anchor="step6">Apply the outer cryptographic algorithm to the RTP | |||
packet. If | ||||
encrypting RTP header extensions hop-by-hop, then <xref target="RFC6904" format= | ||||
"default"/> <bcp14>MUST</bcp14> | ||||
be used when encrypting the RTP packet using the outer | be used when encrypting the RTP packet using the outer | |||
cryptographic key.</t> | cryptographic key.</li> | |||
</list> | </ol> | |||
</t> | <t>When using Encrypted Key Transport (EKT) <xref target="I-D.ietf-perc- | |||
<t>When using EKT <xref target="I-D.ietf-perc-srtp-ekt-diet"/>, the EKT Field co | srtp-ekt-diet" format="default"/>, the EKTField comes | |||
mes | after the SRTP packet, exactly like using EKT with any other SRTP | |||
after the SRTP packet exactly like using EKT with any other SRTP | ||||
transform. | transform. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="relay" numbered="true" toc="default"> | ||||
<section anchor="relay" title="Relaying a Packet"> | <name>Relaying a Packet</name> | |||
<t>The Media Distributor has the part of the key for the outer | <t>The MD has the part of the key for the outer | |||
(hop-by-hop) cryptographic algorithm, but it does not have the part | (hop-by-hop) cryptographic algorithm, but it does not have the part | |||
of the key for the (end-to-end) cryptographic algorithm. The | of the key for the inner (end-to-end) cryptographic algorithm. The | |||
cryptographic algorithm and key used to decrypt a packet and | cryptographic algorithm and key used to decrypt a packet and | |||
any encrypted RTP header extensions would be the same as those | any encrypted RTP header extensions would be the same as those | |||
used in the endpoint's outer algorithm and key. | used in the endpoint's outer algorithm and key. | |||
</t> | </t> | |||
<t>In order to modify a packet, the Media Distributor decrypts the | <t>In order to modify a packet, the MD decrypts the | |||
received packet, modifies the packet, updates the OHB with | received packet, modifies the packet, updates the OHB with | |||
any modifications not already present in the OHB, and re-encrypts | any modifications not already present in the OHB, and re-encrypts | |||
the packet using the the outer (hop-by-hop) cryptographic key | the packet using the outer (hop-by-hop) cryptographic key | |||
before transmitting. | before transmitting using the following steps: | |||
</t> | </t> | |||
<t> | <ol spacing="normal" type="1"> | |||
<list style="numbers"> | <li anchor="step1">Apply the outer (hop-by-hop) cryptographic algorith | |||
<t>Apply the outer (hop-by-hop) cryptographic algorithm to decrypt the | m to decrypt the | |||
packet. If decrypting RTP header extensions hop-by-hop, then | packet. If decrypting RTP header extensions hop-by-hop, then | |||
<xref target="RFC6904"/> MUST be used. Note that the RTP payload produced by | <xref target="RFC6904" format="default"/> <bcp14>MUST</bcp14> be used. Note tha t the RTP payload produced by | |||
this decryption operation contains the original encrypted payload | this decryption operation contains the original encrypted payload | |||
with the tag from the inner transform and the OHB appended.</t> | with the tag from the inner transform and the OHB appended.</li> | |||
<t>Make any desired changes to the fields are allowed to be changed, | <li>Make any desired changes to the fields that are allowed to be chan | |||
i.e., PT, SEQ, and M. The Media Distributor MAY also make | ged, | |||
i.e., PT, SEQ, and M. The MD <bcp14>MAY</bcp14> also make | ||||
modifications to header extensions, without the need to reflect | modifications to header extensions, without the need to reflect | |||
these changes in the OHB.</t> | these changes in the OHB.</li> | |||
<t>Reflect any changes to header fields in the OHB: | <li> | |||
<list style="symbols"> | <t>Reflect any changes to header fields in the OHB: | |||
<t>If Media Distributor changed a field that is not already in the | </t> | |||
OHB, then it MUST add the original value of the field to the | <ul spacing="normal"> | |||
<li>If the MD changed a field that is not already in the | ||||
OHB, then it <bcp14>MUST</bcp14> add the original value of the field to the | ||||
OHB. Note that this might result in an increase in the size of | OHB. Note that this might result in an increase in the size of | |||
the OHB.</t> | the OHB.</li> | |||
<t>If the Media Distributor took a field that had previously been | <li>If the MD took a field that had previously been | |||
modified and reset to its original value, then it SHOULD drop | modified and reset to its original value, then it <bcp14>SHOULD</bcp14> drop | |||
the corresponding information from the OHB. Note that this | the corresponding information from the OHB. Note that this | |||
might result in a decrease in the size of the OHB.</t> | might result in a decrease in the size of the OHB.</li> | |||
<t>Otherwise, the Media Distributor MUST NOT modify the OHB.</t> | <li>Otherwise, the MD <bcp14>MUST NOT</bcp14> modify the OHB.</li> | |||
</list></t> | </ul> | |||
<t>Apply the outer (hop-by-hop) cryptographic algorithm to the | </li> | |||
packet. If the RTP Sequence Number has been modified, SRTP | <li anchor="step4">Apply the outer (hop-by-hop) cryptographic algorith | |||
m to the | ||||
packet. If the RTP sequence number has been modified, SRTP | ||||
processing happens as defined in SRTP and will end up using the new | processing happens as defined in SRTP and will end up using the new | |||
Sequence Number. If encrypting RTP header extensions hop-by-hop, | sequence number. If encrypting RTP header extensions hop-by-hop, | |||
then <xref target="RFC6904"/> MUST be used.</t> | then <xref target="RFC6904" format="default"/> <bcp14>MUST</bcp14> be used.</li> | |||
</list> | </ol> | |||
</t> | <t>In order to avoid nonce reuse, the cryptographic contexts | |||
<t>In order to avoid nonce reuse, the cryptographic contexts used in | used in steps | |||
step 1 and step 5 MUST use different, independent master keys. Note | <xref target="step1" format="counter">1</xref> and <xref | |||
that this means that the key used for decryption by the MD MUST be | target="step4" format="counter">4</xref> <bcp14>MUST</bcp14> use different, inde | |||
pendent master keys. Note | ||||
that this means that the key used for decryption by the MD <bcp14>MUST</bcp14> b | ||||
e | ||||
different from the key used for re-encryption to the end recipient. | different from the key used for re-encryption to the end recipient. | |||
</t> | </t> | |||
<t>Note that if multiple MDs modify the same packet, then the first MD | <t>Note that if multiple MDs modify the same packet, then the first MD | |||
to alter a given header field is the one that adds it to the OHB. | to alter a given header field is the one that adds it to the OHB. | |||
If a subsequent MD changes the value of a header field that has | If a subsequent MD changes the value of a header field that has | |||
already been changed, then the original value will already be in the | already been changed, then the original value will already be in the | |||
OHB, so no update to the OHB is required. | OHB, so no update to the OHB is required. | |||
</t> | </t> | |||
<t>A Media Distributor that decrypts, modifies, and re-encrypts | <t>An MD that decrypts, modifies, and re-encrypts | |||
packets in this way MUST use an independent key for each recipient, | packets in this way <bcp14>MUST</bcp14> use an independent key for each recipien | |||
and MUST NOT re-encrypt the packet using the sender's keys. If the | t, | |||
Media Distributor decrypts and re-encrypts with the same key and | and <bcp14>MUST NOT</bcp14> re-encrypt the packet using the sender's keys. If t | |||
he | ||||
MD decrypts and re-encrypts with the same key and | ||||
salt, it will result in the reuse of a (key, nonce) pair, | salt, it will result in the reuse of a (key, nonce) pair, | |||
undermining the security of AES-GCM. | undermining the security of AES-GCM. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="decrypt" numbered="true" toc="default"> | ||||
<section anchor="decrypt" title="Decrypting a Packet"> | <name>Decrypting a Packet</name> | |||
<t>To decrypt a packet, the endpoint first decrypts and verifies using | <t>To decrypt a packet, the endpoint first decrypts and verifies using | |||
the outer (hop-by-hop) cryptographic key, then uses the OHB to | the outer (hop-by-hop) cryptographic key, then uses the OHB to | |||
reconstruct the original packet, which it decrypts and verifies with | reconstruct the original packet, which it decrypts and verifies with | |||
the inner (end-to-end) cryptographic key. | the inner (end-to-end) cryptographic key using the following steps: | |||
</t> | </t> | |||
<t> | <ol spacing="normal" type="1"> | |||
<list style="numbers"> | <li>Apply the outer cryptographic algorithm to the packet. If the | |||
<t>Apply the outer cryptographic algorithm to the packet. If the | ||||
integrity check does not pass, discard the packet. The result of | integrity check does not pass, discard the packet. The result of | |||
this is referred to as the outer SRTP packet. If decrypting RTP | this is referred to as the outer SRTP packet. If decrypting RTP | |||
header extensions hop-by-hop, then <xref target="RFC6904"/> MUST be used when | header extensions hop-by-hop, then <xref target="RFC6904" format="default"/> <bc | |||
decrypting the RTP packet using the outer cryptographic key.</t> | p14>MUST</bcp14> be used when | |||
<t>If the packet is for repair mode data, skip the rest of the | decrypting the RTP packet using the outer cryptographic key.</li> | |||
<li>If the packet is for repair mode data, skip the rest of the | ||||
steps. Note that the packet that results from the repair algorithm | steps. Note that the packet that results from the repair algorithm | |||
will still have encrypted data that needs to be decrypted as | will still have encrypted data that needs to be decrypted as | |||
specified by the repair algorithm sections.</t> | specified by the repair algorithm sections.</li> | |||
<t>Remove the inner authentication tag and the OHB from the end of the | <li>Remove the inner authentication tag and the OHB from the end of th | |||
payload of the outer SRTP packet.</t> | e | |||
<t>Form a new synthetic SRTP packet with: | payload of the outer SRTP packet.</li> | |||
<list style="symbols"> | <li> | |||
<t>Header = Received header, with the following modifications:</t> | <t>Form a new synthetic SRTP packet with: </t> | |||
<t>Header fields replaced with values from OHB (if any)</t> | <ul spacing="normal"> | |||
<t>The X bit is set to zero</t> | <li> | |||
<t>The header is truncated to remove any extensions (i.e., keep | <t>Header = Received header, with the following modifications:< | |||
only the first 12 + 4 * CC bytes of the header)</t> | /t> | |||
<t>Payload is the encrypted payload from the outer SRTP packet (after | <ul spacing="normal"> | |||
the inner tag and OHB have been stripped).</t> | <li>Header fields replaced with values from OHB (if any).</l | |||
<t>Authentication tag is the inner authentication tag from the outer | i> | |||
SRTP packet.</t> | <li>The X bit is set to zero.</li> | |||
</list></t> | <li>The header is truncated to remove any extensions (i.e., | |||
<t>Apply the inner cryptographic algorithm to this synthetic SRTP | keep | |||
packet. Note if the RTP Sequence Number was changed by the Media | only the first 12 + 4 * CC bytes of the header).</li> | |||
Distributor, the synthetic packet has the original Sequence | </ul> | |||
Number. If the integrity check does not pass, discard the packet.</t> | </li> | |||
</list> | <li>Payload is the encrypted payload from the outer SRTP packet (a | |||
</t> | fter | |||
<t>Once the packet has been successfully decrypted, the application needs | the inner tag and OHB have been stripped).</li> | |||
<li>Authentication tag is the inner authentication tag from the ou | ||||
ter | ||||
SRTP packet.</li> | ||||
</ul> | ||||
</li> | ||||
<li>Apply the inner cryptographic algorithm to this synthetic SRTP | ||||
packet. Note if the RTP sequence number was changed by the MD, the synthetic pa | ||||
cket has the original sequence | ||||
number. If the integrity check does not pass, discard the packet.</li> | ||||
</ol> | ||||
<t>Once the packet has been successfully decrypted, the application need | ||||
s | ||||
to be careful about which information it uses to get the correct | to be careful about which information it uses to get the correct | |||
behavior. The application MUST use only the information found in the | behavior. The application <bcp14>MUST</bcp14> use only the information found in | |||
synthetic SRTP packet and MUST NOT use the other data that was in the | the | |||
synthetic SRTP packet and <bcp14>MUST NOT</bcp14> use the other data that was in | ||||
the | ||||
outer SRTP packet with the following exceptions: | outer SRTP packet with the following exceptions: | |||
</t> | </t> | |||
<t> | <ul spacing="normal"> | |||
<list style="symbols"> | <li>The PT from the outer SRTP packet is used for normal matching to | |||
<t>The PT from the outer SRTP packet is used for normal matching to SDP | Session Description Protocol (SDP) and codec selection.</li> | |||
and codec selection.</t> | <li>The sequence number from the outer SRTP packet is used for normal | |||
<t>The sequence number from the outer SRTP packet is used for normal | RTP ordering.</li> | |||
RTP ordering.</t> | </ul> | |||
</list> | <t>The PT and sequence number from the inner SRTP packet can be used for | |||
</t> | ||||
<t>The PT and sequence number from the inner SRTP packet can be used for | ||||
collection of various statistics. | collection of various statistics. | |||
</t> | </t> | |||
<t>If the RTP header of the outer packet contains extensions, they MAY | <t>If the RTP header of the outer packet contains extensions, they <bcp1 4>MAY</bcp14> | |||
be used. However, because extensions are not protected end-to-end, | be used. However, because extensions are not protected end-to-end, | |||
implementations SHOULD reject an RTP packet containing headers that | implementations <bcp14>SHOULD</bcp14> reject an RTP packet containing headers th at | |||
would require end-to-end protection. | would require end-to-end protection. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="rtcp-operations" numbered="true" toc="default"> | ||||
<section anchor="rtcp-operations" title="RTCP Operations"> | <name>RTCP Operations</name> | |||
<t>Unlike RTP, which is encrypted both hop-by-hop and end-to-end using | <t>Unlike RTP, which is encrypted both hop-by-hop and end-to-end using | |||
two separate cryptographic keys, RTCP is encrypted using only the outer | two separate cryptographic keys, RTCP is encrypted using only the outer | |||
(hop-by-hop) cryptographic key. The procedures for RTCP encryption | (hop-by-hop) cryptographic key. The procedures for RTCP encryption | |||
are specified in <xref target="RFC3711"/> and this document introduces no | are specified in <xref target="RFC3711" format="default"/>, and this document in troduces no | |||
additional steps. | additional steps. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="use-with-other-rtp-mechanisms" numbered="true" toc="default | ||||
<section anchor="use-with-other-rtp-mechanisms" title="Use with Other RTP Mechan | "> | |||
isms"> | <name>Use with Other RTP Mechanisms</name> | |||
<t>Media Distributors sometimes interact with RTP media packets sent | <t>MDs sometimes interact with RTP media packets sent | |||
by endpoints, e.g., to provide recovery or receive commands via | by endpoints, e.g., to provide recovery or receive commands via | |||
DTMF. When media packets are encrypted end-to-end, these procedures | dual-tone multi-frequency (DTMF) signaling. When media packets are encrypted en d-to-end, these procedures | |||
require modification. (End-to-end interactions, including | require modification. (End-to-end interactions, including | |||
end-to-end recovery, are not affected by end-to-end encryption.) | end-to-end recovery, are not affected by end-to-end encryption.) | |||
</t> | </t> | |||
<t>Repair mechanisms, in general, will need to perform recovery on | <t>Repair mechanisms, in general, will need to perform recovery on | |||
encrypted packets (double-encrypted when using this transform), | encrypted packets (double-encrypted when using this transform), | |||
since the Media Distributor does not have access to the plaintext of | since the MD does not have access to the plaintext of | |||
the packet, only an intermediate, E2E-encrypted form. | the packet, only an intermediate, E2E-encrypted form. | |||
</t> | </t> | |||
<t>When the recovery mechanism calls for the recovery packet itself to | <t>When the recovery mechanism calls for the recovery packet itself to | |||
be encrypted, it is encrypted with only the outer, hop-by-hop key. This | be encrypted, it is encrypted with only the outer, hop-by-hop key. This | |||
allows a media distributor to generate recovery packets without | allows an MD to generate recovery packets without | |||
having access to the inner, end-to-end keys. However, it also results in | having access to the inner, end-to-end keys. However, it also results in | |||
recovery packets being triple-encrypted, twice for the base | recovery packets being triple-encrypted, twice for the base | |||
transform, and once for the recovery protection. | transform, and once for the recovery protection. | |||
</t> | </t> | |||
<section anchor="rtx" numbered="true" toc="default"> | ||||
<section anchor="rtx" title="RTP Retransmission (RTX)"> | <name>RTP Retransmission (RTX)</name> | |||
<t>When using RTX <xref target="RFC4588"/> with double, the cached payloads MUST | <t>When using RTX <xref target="RFC4588" format="default"/> with the dou | |||
be the | ble transform, the cached payloads <bcp14>MUST</bcp14> be the | |||
double-encrypted packets, i.e., the bits that are sent over the wire to the | double-encrypted packets, i.e., the bits that are sent over the wire to the | |||
other side. When encrypting a retransmission packet, it MUST be | other side. When encrypting a retransmission packet, it <bcp14>MUST</bcp14> be | |||
encrypted the packet in repair mode (i.e., with only the hop-by-hop key). | encrypted like a packet in repair mode (i.e., with only the hop-by-hop key). | |||
</t> | </t> | |||
<t>If the Media Distributor were to cache the inner, E2E-encrypted | <t>If the MD were to cache the inner, E2E-encrypted | |||
payload and retransmit that with an RTX OSN field prepended, then | payload and retransmit it with an RTX original sequence number field prepended, | |||
then | ||||
the modifications to the payload would cause the inner integrity | the modifications to the payload would cause the inner integrity | |||
check to fail at the receiver. | check to fail at the receiver. | |||
</t> | </t> | |||
<t>A typical RTX receiver would decrypt the packet, undo the RTX | <t>A typical RTX receiver would decrypt the packet, undo the RTX | |||
transformation, then process the resulting packet normally by | transformation, then process the resulting packet normally by | |||
using the steps in <xref target="decrypt"/>. | using the steps in <xref target="decrypt" format="default"/>. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="red" numbered="true" toc="default"> | ||||
<section anchor="red" title="Redundant Audio Data (RED)"> | <name>Redundant Audio Data (RED)</name> | |||
<t>When using RED <xref target="RFC2198"/> with double, the processing at the se | <t>When using RED <xref target="RFC2198" format="default"/> with the dou | |||
nder | ble transform, the processing at the sender | |||
and receiver is the same as when using RED with any other SRTP | and receiver is the same as when using RED with any other SRTP | |||
transform. | transform. | |||
</t> | </t> | |||
<t>The main difference between double and any other transform is that | <t>The main difference between the double transform and any other transf | |||
in an intermediated environment, usage of RED must be end-to-end. A | orm is that | |||
Media Distributor cannot synthesize RED packets, because it lacks | in an intermediated environment, usage of RED must be end-to-end. | |||
An MD cannot synthesize RED packets, because it lacks | ||||
access to the plaintext media payloads that are combined to form a | access to the plaintext media payloads that are combined to form a | |||
RED payload. | RED payload. | |||
</t> | </t> | |||
<t>Note that FlexFEC may often provide similar or better repair | <t>Note that Flexible Forward Error Correction (Flex FEC) may often prov | |||
capabilities compared to RED. For most applications, FlexFEC is a | ide similar or better repair | |||
better choice than RED; in particular, FlexFEC has modes in which | capabilities compared to RED. For most applications, Flex FEC is a | |||
the Media Distributor can synthesize recovery packets. | better choice than RED; in particular, Flex FEC has modes in which | |||
the MD can synthesize recovery packets. | ||||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="fec" numbered="true" toc="default"> | ||||
<section anchor="fec" title="Forward Error Correction (FEC)"> | <name>Forward Error Correction (FEC)</name> | |||
<t>When using Flex FEC <xref target="I-D.ietf-payload-flexible-fec-scheme"/> wit | <t>When using Flex FEC <xref target="RFC8627" format="default"/> with | |||
h | the double transform, repair packets <bcp14>MUST</bcp14> be constructed by first | |||
double, repair packets MUST be constructed by first | ||||
double-encrypting the packet, then performing FEC. Processing of | double-encrypting the packet, then performing FEC. Processing of | |||
repair packets proceeds in the opposite order, performing FEC | repair packets proceeds in the opposite order, performing FEC | |||
recovery and then decrypting. This ensures that the original media | recovery and then decrypting. This ensures that the original media | |||
is not revealed to the Media Distributor but at the same time allows | is not revealed to the MD but, at the same time, allows | |||
the Media Distributor to repair media. When encrypting a packet | the MD to repair media. When encrypting a packet | |||
that contains the Flex FEC data, which is already encrypted, it MUST | that contains the Flex FEC data, which is already encrypted, it <bcp14>MUST</bcp | |||
14> | ||||
be encrypted with only the outer, hop-by-hop transform. | be encrypted with only the outer, hop-by-hop transform. | |||
</t> | </t> | |||
<t>The algorithm recommended in <xref target="I-D.ietf-rtcweb-fec"/> for repair | <t>The algorithm recommended in <xref target="I-D.ietf-rtcweb-fec" forma | |||
of video | t="default"/> for repair of video | |||
is Flex FEC <xref target="I-D.ietf-payload-flexible-fec-scheme"/>. Note that fo | is Flex FEC <xref target="RFC8627" format="default"/>. Note that for | |||
r | interoperability with WebRTC, <xref target="I-D.ietf-rtcweb-fec" format="default | |||
interoperability with WebRTC, <xref target="I-D.ietf-rtcweb-fec"/> recommends no | "/> recommends not | |||
t | using additional FEC-only "m=" lines in SDP for the repair packets. | |||
using additional FEC only m-line in SDP for the repair packets. | ||||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="dtmf" numbered="true" toc="default"> | ||||
<section anchor="dtmf" title="DTMF"> | <name>DTMF</name> | |||
<t>When DTMF is sent using the mechanism in <xref target="RFC4733"/>, it is | <t>When DTMF is sent using the mechanism in <xref target="RFC4733" forma | |||
end-to-end encrypted and the relay can not read it, so it cannot be | t="default"/>, it is | |||
used to control the relay. Other out of band methods to control the | end-to-end encrypted; the relay cannot read it, so it cannot be | |||
used to control the relay. Other out-of-band methods to control the | ||||
relay need to be used instead. | relay need to be used instead. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="recommended-inner-and-outer-cryptographic-algorithms" numbe | ||||
red="true" toc="default"> | ||||
<name>Recommended Inner and Outer Cryptographic Algorithms</name> | ||||
<section anchor="recommended-inner-and-outer-cryptographic-algorithms" title="Re | <t>This specification recommends and defines AES-GCM as both the inner | |||
commended Inner and Outer Cryptographic Algorithms"> | ||||
<t>This specification recommends and defines AES-GCM as both the inner | ||||
and outer cryptographic algorithms, identified as | and outer cryptographic algorithms, identified as | |||
DOUBLE_AEAD_AES_128_GCM_AEAD_AES_128_GCM and | DOUBLE_AEAD_AES_128_GCM_AEAD_AES_128_GCM and | |||
DOUBLE_AEAD_AES_256_GCM_AEAD_AES_256_GCM. These algorithm provide for | DOUBLE_AEAD_AES_256_GCM_AEAD_AES_256_GCM. These algorithms provide for | |||
authenticated encryption and will consume additional processing time | authenticated encryption and will consume additional processing time | |||
double-encrypting for hop-by-hop and end-to-end. However, the | double-encrypting for hop-by-hop and end-to-end. However, the | |||
approach is secure and simple, and is thus viewed as an acceptable | approach is secure and simple; thus, it is viewed as an acceptable | |||
trade-off in processing efficiency. | trade-off in processing efficiency. | |||
</t> | </t> | |||
<t>Note that names for the cryptographic transforms are of the form | <t>Note that names for the cryptographic transforms are of the form | |||
DOUBLE_(inner algorithm)_(outer algorithm). | DOUBLE_(inner algorithm)_(outer algorithm). | |||
</t> | </t> | |||
<t>While this document only defines a profile based on AES-GCM, it is | <t>While this document only defines a profile based on AES-GCM, it is | |||
possible for future documents to define further profiles with | possible for future documents to define further profiles with | |||
different inner and outer algorithms in this same framework. For example, | different inner and outer algorithms in this same framework. For example, | |||
if a new SRTP transform was defined that encrypts some or all of the | if a new SRTP transform were defined that encrypts some or all of the | |||
RTP header, it would be reasonable for systems to have the option of | RTP header, it would be reasonable for systems to have the option of | |||
using that for the outer algorithm. Similarly, if a new transform was | using that for the outer algorithm. Similarly, if a new transform were | |||
defined that provided only integrity, that would also be reasonable to | defined that provided only integrity, that would also be reasonable to | |||
use for the outer transform as the payload data is already encrypted by the | use for the outer transform as the payload data is already encrypted by the | |||
inner transform. | inner transform. | |||
</t> | </t> | |||
<t>The AES-GCM cryptographic algorithm introduces an additional 16 | <t>The AES-GCM cryptographic algorithm introduces an additional 16 | |||
octets to the length of the packet. When using AES-GCM for both the | octets to the length of the packet. When using AES-GCM for both the | |||
inner and outer cryptographic algorithms, the total additional | inner and outer cryptographic algorithms, the total additional | |||
length is 32 octets. The OHB will consume an additional 1-4 octets. | length is 32 octets. The OHB will consume an additional 1-4 octets. | |||
Packets in repair mode will carry additional repair data, further | Packets in repair mode will carry additional repair data, further | |||
increasing their size. | increasing their size. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="sec" numbered="true" toc="default"> | ||||
<section anchor="sec" title="Security Considerations"> | <name>Security Considerations</name> | |||
<t>This SRTP transform provides protection against two classes of | <t>This SRTP transform provides protection against two classes of | |||
attacker: An network attacker that knows neither the inner nor outer | attacker: a network attacker that knows neither the inner nor outer | |||
keys, and a malicious MD that knows the outer key. Obviously, it | keys and a malicious MD that knows the outer key. Obviously, it | |||
provides no protections against an attacker that holds both the | provides no protections against an attacker that holds both the | |||
inner and outer keys. | inner and outer keys. | |||
</t> | </t> | |||
<t>The protections with regard to the network are the same as with the | <t>The protections with regard to the network are the same as with the | |||
normal SRTP AES-GCM transforms. The major difference is that the | normal SRTP AES-GCM transforms. The major difference is that the | |||
double transforms are designed to work better in a group context. | double transforms are designed to work better in a group context. | |||
In such contexts, it is important to note that because these | In such contexts, it is important to note that because these | |||
transforms are symmetric, they do not protect against attacks within | transforms are symmetric, they do not protect against attacks within | |||
the group. Any member of the group can generate valid SRTP packets | the group. Any member of the group can generate valid SRTP packets | |||
for any SSRC in use by the group. | for any SSRC in use by the group. | |||
</t> | </t> | |||
<t>With regard to a malicious MD, the recipient can verify the | <t>With regard to a malicious MD, the recipient can verify the | |||
integrity of the base header fields and confidentiality and | integrity of the base header fields and confidentiality and | |||
integrity of the payload. The recipient has no assurance, however, | integrity of the payload. The recipient has no assurance, however, | |||
of the integrity of the header extensions in the packet. | of the integrity of the header extensions in the packet. | |||
</t> | </t> | |||
<t>The main innovation of this transform relative to other SRTP | <t>The main innovation of this transform relative to other SRTP | |||
transforms is that it allows a partly-trusted MD to decrypt, modify, | transforms is that it allows a partly trusted MD to decrypt, modify, | |||
and re-encrypt a packet. When this is done, the cryptographic | and re-encrypt a packet. When this is done, the cryptographic | |||
contexts used for decryption and re-encryption MUST use different, | contexts used for decryption and re-encryption <bcp14>MUST</bcp14> use different , | |||
independent master keys. If the same context is | independent master keys. If the same context is | |||
used, the nonce formation rules for SRTP will cause the same key and | used, the nonce formation rules for SRTP will cause the same key and | |||
nonce to be used with two different plaintexts, which substantially | nonce to be used with two different plaintexts, which substantially | |||
degrades the security of AES-GCM. | degrades the security of AES-GCM. | |||
</t> | </t> | |||
<t>In other words, from the perspective of the MD, re-encrypting | <t>In other words, from the perspective of the MD, re-encrypting | |||
packets using this protocol will involve the same cryptographic | packets using this protocol will involve the same cryptographic | |||
operations as if it had established independent AES-GCM crypto | operations as if it had established independent AES-GCM crypto | |||
contexts with the sender and the receiver. If the MD doesn't modify | contexts with the sender and the receiver. This property allows | |||
any header fields, then an MD that supports AES-GCM could be unused | the use of an MD that supports AES-GCM but does not modify any | |||
unmodified. | header fields, without requiring any modification to the MD. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="iana" numbered="true" toc="default"> | ||||
<name>IANA Considerations</name> | ||||
<section anchor="dtlssrtp" numbered="true" toc="default"> | ||||
<section anchor="iana" title="IANA Considerations"> | <name>DTLS-SRTP</name> | |||
<section anchor="dtlssrtp" title="DTLS-SRTP"> | <t>IANA has added the following protection profiles to the | |||
<t>We request IANA to add the following values to defines a DTLS-SRTP | "DTLS-SRTP Protection Profiles" registry defined in <xref target="RFC5764" forma | |||
"SRTP Protection Profile" defined in <xref target="RFC5764"/>. | t="default"/>. | |||
</t> | </t> | |||
<texttable> | <table align="center"> | |||
<ttcol align="left">Value</ttcol> | <name>Updates to the DTLS-SRTP Protection Profiles Registry</name> | |||
<ttcol align="left">Profile</ttcol> | <thead> | |||
<ttcol align="left">Reference</ttcol> | <tr> | |||
<th align="left">Value</th> | ||||
<th align="left">Profile</th> | ||||
<th align="left">Reference</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> | ||||
<td align="left">{0x00, 0x09}</td> | ||||
<td align="left">DOUBLE_AEAD_AES_128_GCM_AEAD_AES_128_GCM</td> | ||||
<td align="left">RFC 8723</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">{0x00, 0x0A}</td> | ||||
<td align="left">DOUBLE_AEAD_AES_256_GCM_AEAD_AES_256_GCM</td> | ||||
<td align="left">RFC 8723</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<c>{0x00, 0x09}</c><c>DOUBLE_AEAD_AES_128_GCM_AEAD_AES_128_GCM</c><c>RFCXXXX</c> | <t>The SRTP transform parameters for each of these protection profiles a | |||
<c>{0x00, 0x0A}</c><c>DOUBLE_AEAD_AES_256_GCM_AEAD_AES_256_GCM</c><c>RFCXXXX</c> | re: | |||
</texttable> | ||||
<t>Note to IANA: Please assign value RFCXXXX and update table to point at | ||||
this RFC for these values. | ||||
</t> | ||||
<t>The SRTP transform parameters for each of these protection are: | ||||
</t> | </t> | |||
<table align="center"> | ||||
<name>SRTP Transform Parameters for DOUBLE_AEAD_AES_128_GCM_AEAD_AES_128_GCM</na | ||||
me> | ||||
<tbody> | ||||
<tr> | ||||
<th colspan="2">DOUBLE_AEAD_AES_128_GCM_AEAD_AES_128_GCM</th> | ||||
</tr> | ||||
<tr> | ||||
<td>cipher:</td> | ||||
<td>AES_128_GCM then AES_128_GCM</td> | ||||
</tr> | ||||
<tr> | ||||
<td>cipher_key_length:</td><td>256 bits</td> | ||||
</tr> | ||||
<tr> | ||||
<td>cipher_salt_length:</td><td>192 bits</td> | ||||
</tr> | ||||
<tr> | ||||
<td>aead_auth_tag_length:</td><td>256 bits</td> | ||||
</tr> | ||||
<tr> | ||||
<td>auth_function:</td><td>NULL</td> | ||||
</tr> | ||||
<tr> | ||||
<td>auth_key_length:</td><td>N/A</td> | ||||
</tr> | ||||
<tr> | ||||
<td>auth_tag_length:</td><td>N/A</td> | ||||
</tr> | ||||
<tr> | ||||
<td>maximum lifetime:</td><td>at most 2<sup>31</sup> SRTCP packets and | ||||
at most 2<sup>48</sup> SRTP packets</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<figure align="left"><artwork align="left"> | <table align="center"> | |||
DOUBLE_AEAD_AES_128_GCM_AEAD_AES_128_GCM | <name>SRTP Transform Parameters for DOUBLE_AEAD_AES_256_GCM_AEAD_AES_256_GCM</na | |||
cipher: AES_128_GCM then AES_128_GCM | me> | |||
cipher_key_length: 256 bits | <tbody> | |||
cipher_salt_length: 192 bits | <tr> | |||
aead_auth_tag_length: 256 bits | <th colspan="2">DOUBLE_AEAD_AES_256_GCM_AEAD_AES_256_GCM</th> | |||
auth_function: NULL | </tr> | |||
auth_key_length: N/A | <tr> | |||
auth_tag_length: N/A | <td>cipher:</td><td>AES_256_GCM then AES_256_GCM</td> | |||
maximum lifetime: at most 2^31 SRTCP packets and | </tr> | |||
at most 2^48 SRTP packets | <tr> | |||
<td>cipher_key_length:</td><td>512 bits</td> | ||||
DOUBLE_AEAD_AES_256_GCM_AEAD_AES_256_GCM | </tr> | |||
cipher: AES_256_GCM then AES_256_GCM | <tr> | |||
cipher_key_length: 512 bits | <td>cipher_salt_length:</td><td>192 bits</td> | |||
cipher_salt_length: 192 bits | </tr> | |||
aead_auth_tag_length: 256 bits | <tr> | |||
auth_function: NULL | <td>aead_auth_tag_length:</td><td>256 bits</td> | |||
auth_key_length: N/A | </tr> | |||
auth_tag_length: N/A | <tr> | |||
maximum lifetime: at most 2^31 SRTCP packets and | <td>auth_function:</td><td>NULL</td> | |||
at most 2^48 SRTP packets | </tr> | |||
</artwork></figure> | <tr> | |||
<t>The first half of the key and salt is used for the inner (end-to-end) | <td>auth_key_length:</td><td>N/A</td> | |||
</tr> | ||||
<tr> | ||||
<td>auth_tag_length:</td><td>N/A</td> | ||||
</tr> | ||||
<tr> | ||||
<td>maximum lifetime:</td><td>at most 2<sup>31</sup> SRTCP packets and | ||||
at most 2<sup>48</sup> SRTP packets</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>The first half of the key and salt is used for the inner (end-to-end) | ||||
algorithm and the second half is used for the outer (hop-by-hop) | algorithm and the second half is used for the outer (hop-by-hop) | |||
algorithm. | algorithm. | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="acknowledgments" title="Acknowledgments"> | ||||
<t>Thank you for reviews and improvements to this specification from Alex | ||||
Gouaillard, David Benham, Magnus Westerlund, Nils Ohlmeier, Paul | ||||
Jones, Roni Even, and Suhas Nandakumar. In addition, thank you to | ||||
Sergio Garcia Murillo proposed the change of transporting the OHB | ||||
information in the RTP payload instead of the RTP header. | ||||
</t> | ||||
</section> | ||||
</middle> | </middle> | |||
<back> | <back> | |||
<references title="Normative References"> | <displayreference target="I-D.ietf-perc-dtls-tunnel" to="DTLS-TUNNEL"/> | |||
<?rfc include="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.21 | <displayreference target="I-D.ietf-perc-private-media-framework" to="PRIVATE | |||
19.xml"?> | -MEDIA-FRAMEWORK"/> | |||
<?rfc include="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.37 | <displayreference target="I-D.ietf-perc-srtp-ekt-diet" to="EKT-SRTP"/> | |||
11.xml"?> | <displayreference target="I-D.ietf-rtcweb-fec" to="WEBRTC-FEC"/> | |||
<?rfc include="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.57 | <references> | |||
64.xml"?> | <name>References</name> | |||
<?rfc include="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.61 | <references> | |||
88.xml"?> | <name>Normative References</name> | |||
<?rfc include="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.69 | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
04.xml"?> | FC.2119.xml"/> | |||
<?rfc include="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.77 | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
14.xml"?> | FC.3711.xml"/> | |||
<?rfc include="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.81 | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
74.xml"?> | FC.5764.xml"/> | |||
<?rfc include="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.82 | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
85.xml"?> | FC.6188.xml"/> | |||
</references> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
<references title="Informative References"> | FC.6904.xml"/> | |||
<?rfc include="https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.i | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
etf-payload-flexible-fec-scheme.xml"?> | FC.7714.xml"/> | |||
<?rfc include="https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.i | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
etf-perc-dtls-tunnel.xml"?> | FC.8174.xml"/> | |||
<?rfc include="https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.i | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
etf-perc-private-media-framework.xml"?> | FC.8285.xml"/> | |||
<?rfc include="https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.i | </references> | |||
etf-perc-srtp-ekt-diet.xml"?> | <references> | |||
<?rfc include="https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.i | <name>Informative References</name> | |||
etf-rtcweb-fec.xml"?> | ||||
<?rfc include="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.21 | ||||
98.xml"?> | ||||
<?rfc include="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.45 | ||||
88.xml"?> | ||||
<?rfc include="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.47 | ||||
33.xml"?> | ||||
<?rfc include="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.52 | ||||
34.xml"?> | ||||
</references> | ||||
<section anchor="encryption-overview" title="Encryption Overview"> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
<t>The following figure shows a double encrypted SRTP packet. The sides | FC.8627.xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference. | ||||
I-D.draft-ietf-perc-dtls-tunnel-06.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference. | ||||
I-D.draft-ietf-perc-private-media-framework-12.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference. | ||||
I-D.draft-ietf-perc-srtp-ekt-diet-10.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference. | ||||
I-D.draft-ietf-rtcweb-fec-10.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.2198.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.4588.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.4733.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.5234.xml"/> | ||||
</references> | ||||
</references> | ||||
<section anchor="encryption-overview" numbered="true" toc="default"> | ||||
<name>Encryption Overview</name> | ||||
<t>The following figures show a double-encrypted SRTP packet. The sides | ||||
indicate the parts of the packet that are encrypted and authenticated | indicate the parts of the packet that are encrypted and authenticated | |||
by the hop-by-hop and end-to-end operations. | by the hop-by-hop and end-to-end operations. | |||
</t> | </t> | |||
<artwork alt="" type="ascii-art"><![CDATA[ | ||||
<figure align="center"><artwork align="center"> | 0 1 2 3 | |||
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 | 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 | IO | |V=2|P|X| CC |M| PT | sequence number | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ IO | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| timestamp | IO | | timestamp | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ IO | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| synchronization source (SSRC) identifier | IO | | synchronization source (SSRC) identifier | | |||
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ IO | +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ | |||
| contributing source (CSRC) identifiers | IO | | contributing source (CSRC) identifiers | | |||
| .... | IO | | .... | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<+O | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| RTP extension (OPTIONAL) ... | |O | | RTP extension (OPTIONAL) ... | | |||
+>+>+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<+ | +>+>+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
O | O I | payload ... | | |||
O I | payload ... | IO | O I | +-------------------------------+ | |||
O I | +-------------------------------+ IO | O I | | RTP padding | RTP pad count | | |||
O I | | RTP padding | RTP pad count | IO | O +>+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
O +>+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<+O | O | | E2E authentication tag | | |||
O | | E2E authentication tag | |O | O | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
O | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |O | O | | OHB ... | | |||
O | | OHB ... | |O | +>| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
+>| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |+ | | | | HBH authentication tag | | |||
| | | HBH authentication tag | || | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ || | | | | |||
| | || | | +- E2E Encrypted Portion | |||
| +- E2E Encrypted Portion E2E Authenticated Portion ---+| | | | |||
| | | +--- HBH Encrypted Portion | |||
+--- HBH Encrypted Portion HBH Authenticated Portion ----+ | ]]></artwork> | |||
</artwork></figure> | ||||
</section> | ||||
</back> | <artwork alt="" type="ascii-art"><![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 | I O | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ I O | ||||
| timestamp | I O | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ I O | ||||
| synchronization source (SSRC) identifier | I O | ||||
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ I O | ||||
| contributing source (CSRC) identifiers | I O | ||||
| .... | I O | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<+ O | ||||
| RTP extension (OPTIONAL) ... | | O | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<+ O | ||||
| payload ... | I O | ||||
| +-------------------------------+ I O | ||||
| | RTP padding | RTP pad count | I O | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<+ O | ||||
| E2E authentication tag | | O | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | O | ||||
| OHB ... | | O | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |<+ | ||||
| HBH authentication tag | | | | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | ||||
| | | ||||
E2E Authenticated Portion ---+ | | ||||
| | ||||
HBH Authenticated Portion -----+ | ||||
]]></artwork> | ||||
</section> | ||||
<section anchor="acknowledgments" numbered="false" toc="default"> | ||||
<name>Acknowledgments</name> | ||||
<t>Thank you to <contact fullname="Alex Gouaillard"/>, | ||||
<contact fullname="David Benham"/>, <contact fullname="Magnus Westerlund"/>, | ||||
<contact fullname="Nils Ohlmeier"/>, <contact fullname="Roni Even"/>, and <conta | ||||
ct fullname="Suhas Nandakumar"/> | ||||
for reviews and improvements to this specification. In addition, thank you to | ||||
<contact fullname="Sergio Garcia Murillo"/>, who proposed the change of transpor | ||||
ting the OHB | ||||
information in the RTP payload instead of the RTP header. | ||||
</t> | ||||
</section> | ||||
</back> | ||||
</rfc> | </rfc> | |||
End of changes. 118 change blocks. | ||||
569 lines changed or deleted | 679 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |