rfc9605xml2.original.xml | rfc9605.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="UTF-8"?> | <?xml version='1.0' encoding='utf-8'?> | |||
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?> | <!DOCTYPE rfc [ | |||
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.17 (Ruby 2. | ||||
6.10) --> | ||||
<!DOCTYPE rfc [ | ||||
<!ENTITY nbsp " "> | <!ENTITY nbsp " "> | |||
<!ENTITY zwsp "​"> | <!ENTITY zwsp "​"> | |||
<!ENTITY nbhy "‑"> | <!ENTITY nbhy "‑"> | |||
<!ENTITY wj "⁠"> | <!ENTITY wj "⁠"> | |||
]> | ]> | |||
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" number="9605" | ||||
<rfc ipr="trust200902" docName="draft-ietf-sframe-enc-latest" category="std" con | docName="draft-ietf-sframe-enc-09" category="std" consensus="true" submissionTyp | |||
sensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="t | e="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3"> | |||
rue"> | ||||
<front> | <front> | |||
<title abbrev="SFrame">Secure Frame (SFrame): Lightweight Authenticated Encr yption for Real-Time Media</title> | <title abbrev="SFrame">Secure Frame (SFrame): Lightweight Authenticated Encr yption for Real-Time Media</title> | |||
<seriesInfo name="RFC" value="9605"/> | ||||
<author initials="E." surname="Omara" fullname="Emad Omara"> | <author initials="E." surname="Omara" fullname="Emad Omara"> | |||
<organization>Apple</organization> | <organization>Apple</organization> | |||
<address> | <address> | |||
<email>eomara@apple.com</email> | <email>eomara@apple.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author initials="J." surname="Uberti" fullname="Justin Uberti"> | <author initials="J." surname="Uberti" fullname="Justin Uberti"> | |||
<organization>Fixie.ai</organization> | <organization>Fixie.ai</organization> | |||
<address> | <address> | |||
<email>justin@fixie.ai</email> | <email>justin@fixie.ai</email> | |||
skipping to change at line 47 ¶ | skipping to change at line 42 ¶ | |||
<address> | <address> | |||
<email>rlb@ipv.sx</email> | <email>rlb@ipv.sx</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author initials="Y." surname="Fablet" fullname="Youenn Fablet"> | <author initials="Y." surname="Fablet" fullname="Youenn Fablet"> | |||
<organization>Apple</organization> | <organization>Apple</organization> | |||
<address> | <address> | |||
<email>youenn@apple.com</email> | <email>youenn@apple.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<date year="2024" month="August"/> | ||||
<date year="2024" month="July" day="17"/> | ||||
<area>Applications and Real-Time</area> | <area>Applications and Real-Time</area> | |||
<workgroup>sframe</workgroup> | <workgroup>sframe</workgroup> | |||
<keyword>security</keyword> <keyword>real-time media encryption</keyword> <k | <keyword>security</keyword> | |||
eyword>end-to-end encryption</keyword> | <keyword>real-time media encryption</keyword> | |||
<keyword>end-to-end encryption</keyword> | ||||
<abstract> | <abstract> | |||
<?line 70?> | ||||
<t>This document describes the Secure Frame (SFrame) end-to-end encryption and | <t>This document describes the Secure Frame (SFrame) end-to-end encryption and | |||
authentication mechanism for media frames in a multiparty conference call, in | authentication mechanism for media frames in a multiparty conference call, in | |||
which central media servers (Selective Forwarding Units or SFUs) can access the | which central media servers (Selective Forwarding Units or SFUs) can access the | |||
media metadata needed to make forwarding decisions without having access to the | media metadata needed to make forwarding decisions without having access to the | |||
actual media.</t> | actual media.</t> | |||
<t>This mechanism differs from the Secure Real-Time Protocol (SRTP) in tha | ||||
<t>This mechanism differs from the Secure Real-Time Protocol (SRTP) in that | t | |||
it is independent of RTP (thus compatible with non-RTP media transport) and can | 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> | be applied to whole media frames in order to be more bandwidth efficient.</t> | |||
</abstract> | </abstract> | |||
</front> | </front> | |||
<middle> | <middle> | |||
<?line 82?> | <section anchor="introduction"> | |||
<name>Introduction</name> | ||||
<section anchor="introduction"><name>Introduction</name> | <t>Modern multiparty video call systems use Selective Forwarding Unit (SFU | |||
) | ||||
<t>Modern multiparty video call systems use Selective Forwarding Unit (SFU) | ||||
servers to efficiently route media streams to call endpoints based on factors su ch | servers to efficiently route media streams to call endpoints based on factors su ch | |||
as available bandwidth, desired video size, codec support, and other factors. An | as available bandwidth, desired video size, codec support, and other factors. An | |||
SFU typically does not need access to the media content of the conference, | SFU typically does not need access to the media content of the conference, | |||
which allows the media to be encrypted "end to end" so that it cannot be | which allows the media to be encrypted "end to end" so that it cannot be | |||
decrypted by the SFU. In order for the SFU to work properly, though, it usually | decrypted by the SFU. In order for the SFU to work properly, though, it usually | |||
needs to be able to access RTP metadata and RTCP feedback messages, which is not | needs to be able to access RTP metadata and RTCP feedback messages, which is not | |||
possible if all RTP/RTCP traffic is end-to-end encrypted.</t> | possible if all RTP/RTCP traffic is end-to-end encrypted.</t> | |||
<t>As such, two layers of encryption and authentication are required:</t> | ||||
<t>As such, two layers of encryption and authentication are required:</t> | <ol spacing="normal" type="1"><li> | |||
<t>Hop-by-hop (HBH) encryption of media, metadata, and feedback messag | ||||
<t><list style="numbers" type="1"> | es | |||
<t>Hop-by-hop (HBH) encryption of media, metadata, and feedback messages | ||||
between the endpoints and SFU</t> | between the endpoints and SFU</t> | |||
<t>End-to-end (E2E) encryption (E2EE) of media between the endpoints</t> | </li> | |||
</list></t> | <li> | |||
<t>End-to-end (E2E) encryption (E2EE) of media between the endpoints</ | ||||
<t>The Secure Real-Time Protocol (SRTP) is already widely used for HBH encryptio | t> | |||
n | </li> | |||
</ol> | ||||
<t>The Secure Real-Time Protocol (SRTP) is already widely used for HBH enc | ||||
ryption | ||||
<xref target="RFC3711"/>. The SRTP "double encryption" scheme defines a way to d o E2E | <xref target="RFC3711"/>. The SRTP "double encryption" scheme defines a way to d o E2E | |||
encryption in SRTP <xref target="RFC8723"/>. Unfortunately, this scheme has poor efficiency | encryption in SRTP <xref target="RFC8723"/>. Unfortunately, this scheme has poor efficiency | |||
and high complexity, and its entanglement with RTP makes it unworkable in | and high complexity, and its entanglement with RTP makes it unworkable in | |||
several realistic SFU scenarios.</t> | several realistic SFU scenarios.</t> | |||
<t>This document proposes a new E2EE protection scheme known as SFrame, | ||||
<t>This document proposes a new E2EE protection scheme known as SFrame, | ||||
specifically designed to work in group conference calls with SFUs. SFrame is a | specifically designed to work in group conference calls with SFUs. SFrame is a | |||
general encryption framing that can be used to protect media payloads, agnostic | general encryption framing that can be used to protect media payloads, agnostic | |||
of transport.</t> | of transport.</t> | |||
</section> | ||||
</section> | <section anchor="terminology"> | |||
<section anchor="terminology"><name>Terminology</name> | <name>Terminology</name> | |||
<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | ||||
<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUI | "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bc | |||
RED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | p14>", | |||
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECO | "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", | |||
MMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be i | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are | |||
nterpreted as | to be | |||
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and | interpreted as described in BCP 14 <xref target="RFC2119"/> <xref | |||
only when, they | target="RFC8174"/> when, and only when, they appear in all capitals, as | |||
appear in all capitals, as shown here.</t> | shown here.</t> | |||
<?line -18?> | ||||
<dl> | <dl> | |||
<dt>MAC:</dt> | <dt>MAC:</dt> | |||
<dd> | <dd> | |||
<t>Message Authentication Code</t> | <t>Message Authentication Code</t> | |||
</dd> | </dd> | |||
<dt>E2EE:</dt> | <dt>E2EE:</dt> | |||
<dd> | <dd> | |||
<t>End-to-End Encryption</t> | <t>End-to-End Encryption</t> | |||
</dd> | </dd> | |||
<dt>HBH:</dt> | <dt>HBH:</dt> | |||
<dd> | <dd> | |||
<t>Hop-by-Hop</t> | <t>Hop-by-Hop</t> | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
<t>We use "Selective Forwarding Unit (SFU)" and "media stream" in a less f | ||||
<t>We use "Selective Forwarding Unit (SFU)" and "media stream" in a less formal | ormal sense | |||
sense | ||||
than in <xref target="RFC7656"/>. An SFU is a selective switching function for media | than in <xref target="RFC7656"/>. An SFU is a selective switching function for media | |||
payloads, and a media stream is a sequence of media payloads, | payloads, and a media stream is a sequence of media payloads, | |||
regardless of whether those media payloads are transported over RTP or some | regardless of whether those media payloads are transported over RTP or some | |||
other protocol.</t> | other protocol.</t> | |||
</section> | ||||
</section> | <section anchor="goals"> | |||
<section anchor="goals"><name>Goals</name> | <name>Goals</name> | |||
<t>SFrame is designed to be a suitable E2EE protection scheme for conferen | ||||
<t>SFrame is designed to be a suitable E2EE protection scheme for conference cal | ce call | |||
l | ||||
media in a broad range of scenarios, as outlined by the following goals:</t> | media in a broad range of scenarios, as outlined by the following goals:</t> | |||
<ol spacing="normal" type="1"><li> | ||||
<t><list style="numbers" type="1"> | <t>Provide a secure E2EE mechanism for audio and video in conference c | |||
<t>Provide a secure E2EE mechanism for audio and video in conference calls | alls | |||
that can be used with arbitrary SFU servers.</t> | that can be used with arbitrary SFU servers.</t> | |||
<t>Decouple media encryption from key management to allow SFrame to be used | </li> | |||
<li> | ||||
<t>Decouple media encryption from key management to allow SFrame to be | ||||
used | ||||
with an arbitrary key management system.</t> | with an arbitrary key management system.</t> | |||
<t>Minimize packet expansion to allow successful conferencing in as many | </li> | |||
<li> | ||||
<t>Minimize packet expansion to allow successful conferencing in as ma | ||||
ny | ||||
network conditions as possible.</t> | network conditions as possible.</t> | |||
<t>Decouple the media encryption framework from the underlying transport, | </li> | |||
<li> | ||||
<t>Decouple the media encryption framework from the underlying transpo | ||||
rt, | ||||
allowing use in non-RTP scenarios, e.g., WebTransport | allowing use in non-RTP scenarios, e.g., WebTransport | |||
<xref target="I-D.ietf-webtrans-overview"/>.</t> | <xref target="I-D.ietf-webtrans-overview"/>.</t> | |||
<t>When used with RTP and its associated error-resilience mechanisms, i.e., RT | </li> | |||
X | <li> | |||
<t>When used with RTP and its associated error-resilience mechanisms, | ||||
i.e., RTX | ||||
and Forward Error Correction (FEC), require no special handling for RTX and FEC packets.</t> | and Forward Error Correction (FEC), require no special handling for RTX and FEC packets.</t> | |||
<t>Minimize the changes needed in SFU servers.</t> | </li> | |||
<t>Minimize the changes needed in endpoints.</t> | <li> | |||
<t>Work with the most popular audio and video codecs used in conferencing | <t>Minimize the changes needed in SFU servers.</t> | |||
</li> | ||||
<li> | ||||
<t>Minimize the changes needed in endpoints.</t> | ||||
</li> | ||||
<li> | ||||
<t>Work with the most popular audio and video codecs used in conferenc | ||||
ing | ||||
scenarios.</t> | scenarios.</t> | |||
</list></t> | </li> | |||
</ol> | ||||
</section> | </section> | |||
<section anchor="sframe"><name>SFrame</name> | <section anchor="sframe"> | |||
<name>SFrame</name> | ||||
<t>This document defines an encryption mechanism that provides effective E2EE, | <t>This document defines an encryption mechanism that provides effective E | |||
2EE, | ||||
is simple to implement, has no dependencies on RTP, and minimizes | is simple to implement, has no dependencies on RTP, and minimizes | |||
encryption bandwidth overhead. This section describes how the mechanism | encryption bandwidth overhead. This section describes how the mechanism | |||
works and includes details of how applications utilize SFrame for media protecti on | works and includes details of how applications utilize SFrame for media protecti on | |||
as well as the actual mechanics of E2EE for protecting media.</t> | as well as the actual mechanics of E2EE for protecting media.</t> | |||
<section anchor="application-context"> | ||||
<section anchor="application-context"><name>Application Context</name> | <name>Application Context</name> | |||
<t>SFrame is a general encryption framing, intended to be used as an E2E | ||||
<t>SFrame is a general encryption framing, intended to be used as an E2EE | E | |||
layer over an underlying HBH-encrypted transport such as SRTP or QUIC | layer over an underlying HBH-encrypted transport such as SRTP or QUIC | |||
<xref target="RFC3711"/><xref target="I-D.ietf-moq-transport"/>.</t> | <xref target="RFC3711"/><xref target="I-D.ietf-moq-transport"/>.</t> | |||
<t>The scale at which SFrame encryption is applied to media determines t | ||||
<t>The scale at which SFrame encryption is applied to media determines the overa | he overall | |||
ll | ||||
amount of overhead that SFrame adds to the media stream as well as the | amount of overhead that SFrame adds to the media stream as well as the | |||
engineering complexity involved in integrating SFrame into a particular | engineering complexity involved in integrating SFrame into a particular | |||
environment. Two patterns are common: using SFrame to encrypt either whole | environment. Two patterns are common: using SFrame to encrypt either whole | |||
media frames (per frame) or individual transport-level media payloads | media frames (per frame) or individual transport-level media payloads | |||
(per packet).</t> | (per packet).</t> | |||
<t>For example, <xref target="media-stack"/> shows a typical media sende | ||||
<t>For example, <xref target="media-stack"/> shows a typical media sender stack | r stack that takes media | |||
that takes media | ||||
from some source, encodes it into frames, divides those frames into media | from some source, encodes it into frames, divides those frames into media | |||
packets, and then sends those payloads in SRTP packets. The receiver stack | packets, and then sends those payloads in SRTP packets. The receiver stack | |||
performs the reverse operations, reassembling frames from SRTP packets and | performs the reverse operations, reassembling frames from SRTP packets and | |||
decoding. Arrows indicate two different ways that SFrame protection could be | decoding. Arrows indicate two different ways that SFrame protection could be | |||
integrated into this media stack: to encrypt whole frames or individual media | integrated into this media stack: to encrypt whole frames or individual media | |||
packets.</t> | packets.</t> | |||
<t>Applying SFrame per frame in this system offers higher efficiency but | ||||
<t>Applying SFrame per frame in this system offers higher efficiency but may | may | |||
require a more complex integration in environments where depacketization relies | require a more complex integration in environments where depacketization relies | |||
on the content of media packets. Applying SFrame per packet avoids this | on the content of media packets. Applying SFrame per packet avoids this | |||
complexity at the cost of higher bandwidth consumption. Some quantitative | complexity at the cost of higher bandwidth consumption. Some quantitative | |||
discussion of these trade-offs is provided in <xref target="overhead-analysis"/> .</t> | discussion of these trade-offs is provided in <xref target="overhead-analysis"/> .</t> | |||
<t>As noted above, however, SFrame is a general media encapsulation and | ||||
<t>As noted above, however, SFrame is a general media encapsulation and can be | can be | |||
applied in other scenarios. The important thing is that the sender and | applied in other scenarios. The important thing is that the sender and | |||
receivers of an SFrame-encrypted object agree on that object's semantics. | receivers of an SFrame-encrypted object agree on that object's semantics. | |||
SFrame does not provide this agreement; it must be arranged by the application.< /t> | SFrame does not provide this agreement; it must be arranged by the application.< /t> | |||
<figure anchor="media-stack"> | ||||
<figure title="Two Options for Integrating SFrame in a Typical Media Stack" anch | <name>Two Options for Integrating SFrame in a Typical Media Stack</nam | |||
or="media-stack"><artset><artwork type="svg"><svg xmlns="http://www.w3.org/2000 | e> | |||
/svg" version="1.1" height="576" width="584" viewBox="0 0 584 576" class="diagra | <artset> | |||
m" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap= | <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version= | |||
"round"> | "1.1" height="576" width="584" viewBox="0 0 584 576" class="diagram" text-anchor | |||
<path d="M 24,112 L 24,144" fill="none" stroke="black"/> | ="middle" font-family="monospace" font-size="13px" stroke-linecap="round"> | |||
<path d="M 24,432 L 24,464" fill="none" stroke="black"/> | <path d="M 24,112 L 24,144" fill="none" stroke="black"/> | |||
<path d="M 56,32 L 56,240" fill="none" stroke="black"/> | <path d="M 24,432 L 24,464" fill="none" stroke="black"/> | |||
<path d="M 56,352 L 56,560" fill="none" stroke="black"/> | <path d="M 56,32 L 56,240" fill="none" stroke="black"/> | |||
<path d="M 80,64 L 80,128" fill="none" stroke="black"/> | <path d="M 56,352 L 56,560" fill="none" stroke="black"/> | |||
<path d="M 80,464 L 80,528" fill="none" stroke="black"/> | <path d="M 80,64 L 80,128" fill="none" stroke="black"/> | |||
<path d="M 152,64 L 152,128" fill="none" stroke="black"/> | <path d="M 80,464 L 80,528" fill="none" stroke="black"/> | |||
<path d="M 152,464 L 152,528" fill="none" stroke="black"/> | <path d="M 152,64 L 152,128" fill="none" stroke="black"/> | |||
<path d="M 184,104 L 184,144" fill="none" stroke="black"/> | <path d="M 152,464 L 152,528" fill="none" stroke="black"/> | |||
<path d="M 184,208 L 184,384" fill="none" stroke="black"/> | <path d="M 184,104 L 184,144" fill="none" stroke="black"/> | |||
<path d="M 184,448 L 184,488" fill="none" stroke="black"/> | <path d="M 184,208 L 184,384" fill="none" stroke="black"/> | |||
<path d="M 208,64 L 208,128" fill="none" stroke="black"/> | <path d="M 184,448 L 184,488" fill="none" stroke="black"/> | |||
<path d="M 208,464 L 208,528" fill="none" stroke="black"/> | <path d="M 208,64 L 208,128" fill="none" stroke="black"/> | |||
<path d="M 320,64 L 320,128" fill="none" stroke="black"/> | <path d="M 208,464 L 208,528" fill="none" stroke="black"/> | |||
<path d="M 320,464 L 320,528" fill="none" stroke="black"/> | <path d="M 320,64 L 320,128" fill="none" stroke="black"/> | |||
<path d="M 344,104 L 344,144" fill="none" stroke="black"/> | <path d="M 320,464 L 320,528" fill="none" stroke="black"/> | |||
<path d="M 344,208 L 344,384" fill="none" stroke="black"/> | <path d="M 344,104 L 344,144" fill="none" stroke="black"/> | |||
<path d="M 352,448 L 352,488" fill="none" stroke="black"/> | <path d="M 344,208 L 344,384" fill="none" stroke="black"/> | |||
<path d="M 376,64 L 376,128" fill="none" stroke="black"/> | <path d="M 352,448 L 352,488" fill="none" stroke="black"/> | |||
<path d="M 376,464 L 376,528" fill="none" stroke="black"/> | <path d="M 376,64 L 376,128" fill="none" stroke="black"/> | |||
<path d="M 424,136 L 424,272" fill="none" stroke="black"/> | <path d="M 376,464 L 376,528" fill="none" stroke="black"/> | |||
<path d="M 424,320 L 424,456" fill="none" stroke="black"/> | <path d="M 424,136 L 424,272" fill="none" stroke="black"/> | |||
<path d="M 472,64 L 472,128" fill="none" stroke="black"/> | <path d="M 424,320 L 424,456" fill="none" stroke="black"/> | |||
<path d="M 472,464 L 472,528" fill="none" stroke="black"/> | <path d="M 472,64 L 472,128" fill="none" stroke="black"/> | |||
<path d="M 496,32 L 496,88" fill="none" stroke="black"/> | <path d="M 472,464 L 472,528" fill="none" stroke="black"/> | |||
<path d="M 496,104 L 496,240" fill="none" stroke="black"/> | <path d="M 496,32 L 496,88" fill="none" stroke="black"/> | |||
<path d="M 496,352 L 496,488" fill="none" stroke="black"/> | <path d="M 496,104 L 496,240" fill="none" stroke="black"/> | |||
<path d="M 496,504 L 496,560" fill="none" stroke="black"/> | <path d="M 496,352 L 496,488" fill="none" stroke="black"/> | |||
<path d="M 504,272 L 504,320" fill="none" stroke="black"/> | <path d="M 496,504 L 496,560" fill="none" stroke="black"/> | |||
<path d="M 560,96 L 560,264" fill="none" stroke="black"/> | <path d="M 504,272 L 504,320" fill="none" stroke="black"/> | |||
<path d="M 560,320 L 560,496" fill="none" stroke="black"/> | <path d="M 560,96 L 560,264" fill="none" stroke="black"/> | |||
<path d="M 576,272 L 576,320" fill="none" stroke="black"/> | <path d="M 560,320 L 560,496" fill="none" stroke="black"/> | |||
<path d="M 56,32 L 496,32" fill="none" stroke="black"/> | <path d="M 576,272 L 576,320" fill="none" stroke="black"/> | |||
<path d="M 80,64 L 152,64" fill="none" stroke="black"/> | <path d="M 56,32 L 496,32" fill="none" stroke="black"/> | |||
<path d="M 208,64 L 320,64" fill="none" stroke="black"/> | <path d="M 80,64 L 152,64" fill="none" stroke="black"/> | |||
<path d="M 376,64 L 472,64" fill="none" stroke="black"/> | <path d="M 208,64 L 320,64" fill="none" stroke="black"/> | |||
<path d="M 160,96 L 200,96" fill="none" stroke="black"/> | <path d="M 376,64 L 472,64" fill="none" stroke="black"/> | |||
<path d="M 328,96 L 368,96" fill="none" stroke="black"/> | <path d="M 160,96 L 200,96" fill="none" stroke="black"/> | |||
<path d="M 480,96 L 560,96" fill="none" stroke="black"/> | <path d="M 328,96 L 368,96" fill="none" stroke="black"/> | |||
<path d="M 80,128 L 152,128" fill="none" stroke="black"/> | <path d="M 480,96 L 560,96" fill="none" stroke="black"/> | |||
<path d="M 208,128 L 320,128" fill="none" stroke="black"/> | <path d="M 80,128 L 152,128" fill="none" stroke="black"/> | |||
<path d="M 376,128 L 472,128" fill="none" stroke="black"/> | <path d="M 208,128 L 320,128" fill="none" stroke="black"/> | |||
<path d="M 56,240 L 176,240" fill="none" stroke="black"/> | <path d="M 376,128 L 472,128" fill="none" stroke="black"/> | |||
<path d="M 192,240 L 336,240" fill="none" stroke="black"/> | <path d="M 56,240 L 176,240" fill="none" stroke="black"/> | |||
<path d="M 352,240 L 416,240" fill="none" stroke="black"/> | <path d="M 192,240 L 336,240" fill="none" stroke="black"/> | |||
<path d="M 432,240 L 496,240" fill="none" stroke="black"/> | <path d="M 352,240 L 416,240" fill="none" stroke="black"/> | |||
<path d="M 504,272 L 576,272" fill="none" stroke="black"/> | <path d="M 432,240 L 496,240" fill="none" stroke="black"/> | |||
<path d="M 184,304 L 216,304" fill="none" stroke="black"/> | <path d="M 504,272 L 576,272" fill="none" stroke="black"/> | |||
<path d="M 320,304 L 344,304" fill="none" stroke="black"/> | <path d="M 184,304 L 216,304" fill="none" stroke="black"/> | |||
<path d="M 504,320 L 576,320" fill="none" stroke="black"/> | <path d="M 320,304 L 344,304" fill="none" stroke="black"/> | |||
<path d="M 56,352 L 176,352" fill="none" stroke="black"/> | <path d="M 504,320 L 576,320" fill="none" stroke="black"/> | |||
<path d="M 192,352 L 336,352" fill="none" stroke="black"/> | <path d="M 56,352 L 176,352" fill="none" stroke="black"/> | |||
<path d="M 352,352 L 416,352" fill="none" stroke="black"/> | <path d="M 192,352 L 336,352" fill="none" stroke="black"/> | |||
<path d="M 432,352 L 496,352" fill="none" stroke="black"/> | <path d="M 352,352 L 416,352" fill="none" stroke="black"/> | |||
<path d="M 80,464 L 152,464" fill="none" stroke="black"/> | <path d="M 432,352 L 496,352" fill="none" stroke="black"/> | |||
<path d="M 208,464 L 320,464" fill="none" stroke="black"/> | <path d="M 80,464 L 152,464" fill="none" stroke="black"/> | |||
<path d="M 376,464 L 472,464" fill="none" stroke="black"/> | <path d="M 208,464 L 320,464" fill="none" stroke="black"/> | |||
<path d="M 160,496 L 200,496" fill="none" stroke="black"/> | <path d="M 376,464 L 472,464" fill="none" stroke="black"/> | |||
<path d="M 328,496 L 368,496" fill="none" stroke="black"/> | <path d="M 160,496 L 200,496" fill="none" stroke="black"/> | |||
<path d="M 480,496 L 560,496" fill="none" stroke="black"/> | <path d="M 328,496 L 368,496" fill="none" stroke="black"/> | |||
<path d="M 80,528 L 152,528" fill="none" stroke="black"/> | <path d="M 480,496 L 560,496" fill="none" stroke="black"/> | |||
<path d="M 208,528 L 320,528" fill="none" stroke="black"/> | <path d="M 80,528 L 152,528" fill="none" stroke="black"/> | |||
<path d="M 376,528 L 472,528" fill="none" stroke="black"/> | <path d="M 208,528 L 320,528" fill="none" stroke="black"/> | |||
<path d="M 56,560 L 496,560" fill="none" stroke="black"/> | <path d="M 376,528 L 472,528" fill="none" stroke="black"/> | |||
<path d="M 24,464 L 40,496" fill="none" stroke="black"/> | <path d="M 56,560 L 496,560" fill="none" stroke="black"/> | |||
<path d="M 24,432 L 40,464" fill="none" stroke="black"/> | <path d="M 24,464 L 40,496" fill="none" stroke="black"/> | |||
<path d="M 24,144 L 40,176" fill="none" stroke="black"/> | <path d="M 24,432 L 40,464" fill="none" stroke="black"/> | |||
<path d="M 24,112 L 40,144" fill="none" stroke="black"/> | <path d="M 24,144 L 40,176" fill="none" stroke="black"/> | |||
<path d="M 8,144 L 24,112" fill="none" stroke="black"/> | <path d="M 24,112 L 40,144" fill="none" stroke="black"/> | |||
<path d="M 8,176 L 24,144" fill="none" stroke="black"/> | <path d="M 8,144 L 24,112" fill="none" stroke="black"/> | |||
<path d="M 8,464 L 24,432" fill="none" stroke="black"/> | <path d="M 8,176 L 24,144" fill="none" stroke="black"/> | |||
<path d="M 8,496 L 24,464" fill="none" stroke="black"/> | <path d="M 8,464 L 24,432" fill="none" stroke="black"/> | |||
<path d="M 24,80 C 15.16936,80 8,87.16936 8,96" fill="none" stroke="black"/> | <path d="M 8,496 L 24,464" fill="none" stroke="black"/> | |||
<path d="M 24,80 C 32.83064,80 40,87.16936 40,96" fill="none" stroke="black"/> | <path d="M 24,80 C 15.16936,80 8,87.16936 8,96" fill="none" stro | |||
<path d="M 24,112 C 15.16936,112 8,104.83064 8,96" fill="none" stroke="black"/> | ke="black"/> | |||
<path d="M 24,112 C 32.83064,112 40,104.83064 40,96" fill="none" stroke="black"/ | <path d="M 24,80 C 32.83064,80 40,87.16936 40,96" fill="none" st | |||
> | roke="black"/> | |||
<path d="M 24,400 C 15.16936,400 8,407.16936 8,416" fill="none" stroke="black"/> | <path d="M 24,112 C 15.16936,112 8,104.83064 8,96" fill="none" s | |||
<path d="M 24,400 C 32.83064,400 40,407.16936 40,416" fill="none" stroke="black" | troke="black"/> | |||
/> | <path d="M 24,112 C 32.83064,112 40,104.83064 40,96" fill="none" | |||
<path d="M 24,432 C 15.16936,432 8,424.83064 8,416" fill="none" stroke="black"/> | stroke="black"/> | |||
<path d="M 24,432 C 32.83064,432 40,424.83064 40,416" fill="none" stroke="black" | <path d="M 24,400 C 15.16936,400 8,407.16936 8,416" fill="none" | |||
/> | stroke="black"/> | |||
<polygon class="arrowhead" points="568,264 556,258.4 556,269.6" fill="black" tra | <path d="M 24,400 C 32.83064,400 40,407.16936 40,416" fill="none | |||
nsform="rotate(90,560,264)"/> | " stroke="black"/> | |||
<polygon class="arrowhead" points="488,496 476,490.4 476,501.6" fill="black" tra | <path d="M 24,432 C 15.16936,432 8,424.83064 8,416" fill="none" | |||
nsform="rotate(180,480,496)"/> | stroke="black"/> | |||
<polygon class="arrowhead" points="432,456 420,450.4 420,461.6" fill="black" tra | <path d="M 24,432 C 32.83064,432 40,424.83064 40,416" fill="none | |||
nsform="rotate(90,424,456)"/> | " stroke="black"/> | |||
<polygon class="arrowhead" points="432,136 420,130.4 420,141.6" fill="black" tra | <polygon class="arrowhead" points="568,264 556,258.4 556,269.6" | |||
nsform="rotate(270,424,136)"/> | fill="black" transform="rotate(90,560,264)"/> | |||
<polygon class="arrowhead" points="376,96 364,90.4 364,101.6" fill="black" trans | <polygon class="arrowhead" points="488,496 476,490.4 476,501.6" | |||
form="rotate(0,368,96)"/> | fill="black" transform="rotate(180,480,496)"/> | |||
<polygon class="arrowhead" points="360,488 348,482.4 348,493.6" fill="black" tra | <polygon class="arrowhead" points="432,456 420,450.4 420,461.6" | |||
nsform="rotate(90,352,488)"/> | fill="black" transform="rotate(90,424,456)"/> | |||
<polygon class="arrowhead" points="352,384 340,378.4 340,389.6" fill="black" tra | <polygon class="arrowhead" points="432,136 420,130.4 420,141.6" | |||
nsform="rotate(90,344,384)"/> | fill="black" transform="rotate(270,424,136)"/> | |||
<polygon class="arrowhead" points="352,208 340,202.4 340,213.6" fill="black" tra | <polygon class="arrowhead" points="376,96 364,90.4 364,101.6" fi | |||
nsform="rotate(270,344,208)"/> | ll="black" transform="rotate(0,368,96)"/> | |||
<polygon class="arrowhead" points="352,104 340,98.4 340,109.6" fill="black" tran | <polygon class="arrowhead" points="360,488 348,482.4 348,493.6" | |||
sform="rotate(270,344,104)"/> | fill="black" transform="rotate(90,352,488)"/> | |||
<polygon class="arrowhead" points="336,496 324,490.4 324,501.6" fill="black" tra | <polygon class="arrowhead" points="352,384 340,378.4 340,389.6" | |||
nsform="rotate(180,328,496)"/> | fill="black" transform="rotate(90,344,384)"/> | |||
<polygon class="arrowhead" points="208,96 196,90.4 196,101.6" fill="black" trans | <polygon class="arrowhead" points="352,208 340,202.4 340,213.6" | |||
form="rotate(0,200,96)"/> | fill="black" transform="rotate(270,344,208)"/> | |||
<polygon class="arrowhead" points="192,488 180,482.4 180,493.6" fill="black" tra | <polygon class="arrowhead" points="352,104 340,98.4 340,109.6" f | |||
nsform="rotate(90,184,488)"/> | ill="black" transform="rotate(270,344,104)"/> | |||
<polygon class="arrowhead" points="192,384 180,378.4 180,389.6" fill="black" tra | <polygon class="arrowhead" points="336,496 324,490.4 324,501.6" | |||
nsform="rotate(90,184,384)"/> | fill="black" transform="rotate(180,328,496)"/> | |||
<polygon class="arrowhead" points="192,208 180,202.4 180,213.6" fill="black" tra | <polygon class="arrowhead" points="208,96 196,90.4 196,101.6" fi | |||
nsform="rotate(270,184,208)"/> | ll="black" transform="rotate(0,200,96)"/> | |||
<polygon class="arrowhead" points="192,104 180,98.4 180,109.6" fill="black" tran | <polygon class="arrowhead" points="192,488 180,482.4 180,493.6" | |||
sform="rotate(270,184,104)"/> | fill="black" transform="rotate(90,184,488)"/> | |||
<polygon class="arrowhead" points="168,496 156,490.4 156,501.6" fill="black" tra | <polygon class="arrowhead" points="192,384 180,378.4 180,389.6" | |||
nsform="rotate(180,160,496)"/> | fill="black" transform="rotate(90,184,384)"/> | |||
<g class="text"> | <polygon class="arrowhead" points="192,208 180,202.4 180,213.6" | |||
<text x="424" y="84">HBH</text> | fill="black" transform="rotate(270,184,208)"/> | |||
<text x="116" y="100">Encode</text> | <polygon class="arrowhead" points="192,104 180,98.4 180,109.6" f | |||
<text x="264" y="100">Packetize</text> | ill="black" transform="rotate(270,184,104)"/> | |||
<text x="424" y="100">Protect</text> | <polygon class="arrowhead" points="168,496 156,490.4 156,501.6" | |||
<text x="180" y="164">SFrame</text> | fill="black" transform="rotate(180,160,496)"/> | |||
<text x="340" y="164">SFrame</text> | <g class="text"> | |||
<text x="184" y="180">Protect</text> | <text x="424" y="84">HBH</text> | |||
<text x="344" y="180">Protect</text> | <text x="116" y="100">Encode</text> | |||
<text x="24" y="196">Alice</text> | <text x="264" y="100">Packetize</text> | |||
<text x="156" y="196">(per</text> | <text x="424" y="100">Protect</text> | |||
<text x="204" y="196">frame)</text> | <text x="180" y="164">SFrame</text> | |||
<text x="316" y="196">(per</text> | <text x="340" y="164">SFrame</text> | |||
<text x="368" y="196">packet)</text> | <text x="184" y="180">Protect</text> | |||
<text x="248" y="292">E2E</text> | <text x="344" y="180">Protect</text> | |||
<text x="280" y="292">Key</text> | <text x="24" y="196">Alice</text> | |||
<text x="416" y="292">HBH</text> | <text x="156" y="196">(per</text> | |||
<text x="448" y="292">Key</text> | <text x="204" y="196">frame)</text> | |||
<text x="536" y="292">Media</text> | <text x="316" y="196">(per</text> | |||
<text x="268" y="308">Management</text> | <text x="368" y="196">packet)</text> | |||
<text x="436" y="308">Management</text> | <text x="248" y="292">E2E</text> | |||
<text x="540" y="308">Server</text> | <text x="280" y="292">Key</text> | |||
<text x="180" y="404">SFrame</text> | <text x="416" y="292">HBH</text> | |||
<text x="348" y="404">SFrame</text> | <text x="448" y="292">Key</text> | |||
<text x="184" y="420">Unprotect</text> | <text x="536" y="292">Media</text> | |||
<text x="352" y="420">Unprotect</text> | <text x="268" y="308">Management</text> | |||
<text x="156" y="436">(per</text> | <text x="436" y="308">Management</text> | |||
<text x="204" y="436">frame)</text> | <text x="540" y="308">Server</text> | |||
<text x="324" y="436">(per</text> | <text x="180" y="404">SFrame</text> | |||
<text x="376" y="436">packet)</text> | <text x="348" y="404">SFrame</text> | |||
<text x="424" y="484">HBH</text> | <text x="184" y="420">Unprotect</text> | |||
<text x="116" y="500">Decode</text> | <text x="352" y="420">Unprotect</text> | |||
<text x="264" y="500">Depacketize</text> | <text x="156" y="436">(per</text> | |||
<text x="424" y="500">Unprotect</text> | <text x="204" y="436">frame)</text> | |||
<text x="24" y="516">Bob</text> | <text x="324" y="436">(per</text> | |||
</g> | <text x="376" y="436">packet)</text> | |||
</svg> | <text x="424" y="484">HBH</text> | |||
</artwork><artwork type="ascii-art"><![CDATA[ | <text x="116" y="500">Decode</text> | |||
<text x="264" y="500">Depacketize</text> | ||||
<text x="424" y="500">Unprotect</text> | ||||
<text x="24" y="516">Bob</text> | ||||
</g> | ||||
</svg> | ||||
</artwork> | ||||
<artwork type="ascii-art"><![CDATA[ | ||||
+------------------------------------------------------+ | +------------------------------------------------------+ | |||
| | | | | | |||
| +--------+ +-------------+ +-----------+ | | | +--------+ +-------------+ +-----------+ | | |||
.-. | | | | | | HBH | | | .-. | | | | | | HBH | | | |||
| | | | Encode |----->| Packetize |----->| Protect |----------+ | | | | | Encode |----->| Packetize |----->| Protect |----------+ | |||
'+' | | | ^ | | ^ | | | | | '+' | | | ^ | | ^ | | | | | |||
/|\ | +--------+ | +-------------+ | +-----------+ | | | /|\ | +--------+ | +-------------+ | +-----------+ | | | |||
/ + \ | | | ^ | | | / + \ | | | ^ | | | |||
/ \ | SFrame SFrame | | | | / \ | SFrame SFrame | | | | |||
/ \ | Protect Protect | | | | / \ | Protect Protect | | | | |||
skipping to change at line 372 ¶ | skipping to change at line 365 ¶ | |||
| | | Unprotect Unprotect | | | | | | | Unprotect Unprotect | | | | |||
'+' | (per frame) (per packet) | | | | '+' | (per frame) (per packet) | | | | |||
/|\ | | | V | | | /|\ | | | V | | | |||
/ + \ | +--------+ | +-------------+ | +-----------+ | | | / + \ | +--------+ | +-------------+ | +-----------+ | | | |||
/ \ | | | V | | V | HBH | | | | / \ | | | V | | V | HBH | | | | |||
/ \ | | Decode |<-----| Depacketize |<-----| Unprotect |<---------+ | / \ | | Decode |<-----| Depacketize |<-----| Unprotect |<---------+ | |||
Bob | | | | | | | | | Bob | | | | | | | | | |||
| +--------+ +-------------+ +-----------+ | | | +--------+ +-------------+ +-----------+ | | |||
| | | | | | |||
+------------------------------------------------------+ | +------------------------------------------------------+ | |||
]]></artwork></artset></figure> | ]]></artwork> | |||
</artset> | ||||
<t>Like SRTP, SFrame does not define how the keys used for SFrame are exchanged | </figure> | |||
by | <t>Like SRTP, SFrame does not define how the keys used for SFrame are ex | |||
changed by | ||||
the parties in the conference. Keys for SFrame might be distributed over an | the parties in the conference. Keys for SFrame might be distributed over an | |||
existing E2E-secure channel (see <xref target="sender-keys"/>) or derived from a n E2E-secure | existing E2E-secure channel (see <xref target="sender-keys"/>) or derived from a n E2E-secure | |||
shared secret (see <xref target="mls"/>). The key management system <bcp14>MUST </bcp14> ensure that each | shared secret (see <xref target="mls"/>). The key management system <bcp14>MUST </bcp14> ensure that each | |||
key used for encrypting media is used by exactly one media sender in order to | key used for encrypting media is used by exactly one media sender in order to | |||
avoid reuse of nonces.</t> | avoid reuse of nonces.</t> | |||
</section> | ||||
</section> | <section anchor="sframe-ciphertext"> | |||
<section anchor="sframe-ciphertext"><name>SFrame Ciphertext</name> | <name>SFrame Ciphertext</name> | |||
<t>An SFrame ciphertext comprises an SFrame header followed by the outpu | ||||
<t>An SFrame ciphertext comprises an SFrame header followed by the output of an | t of an | |||
Authenticated Encryption with Associated Data (AEAD) encryption of the plaintext <xref target="RFC5116"/>, with the header provided as additional | Authenticated Encryption with Associated Data (AEAD) encryption of the plaintext <xref target="RFC5116"/>, with the header provided as additional | |||
authenticated data (AAD).</t> | authenticated data (AAD).</t> | |||
<t>The SFrame header is a variable-length structure described in detail | ||||
<t>The SFrame header is a variable-length structure described in detail in | in | |||
<xref target="sframe-header"/>. The structure of the encrypted data and authent ication tag | <xref target="sframe-header"/>. The structure of the encrypted data and authent ication tag | |||
are determined by the AEAD algorithm in use.</t> | are determined by the AEAD algorithm in use.</t> | |||
<figure anchor="sframe-ciphertext-struct"> | ||||
<figure title="Structure of an SFrame Ciphertext" anchor="sframe-ciphertext-stru | <name>Structure of an SFrame Ciphertext</name> | |||
ct"><artset><artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version | <artset> | |||
="1.1" height="320" width="512" viewBox="0 0 512 320" class="diagram" text-ancho | <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version= | |||
r="middle" font-family="monospace" font-size="13px" stroke-linecap="round"> | "1.1" height="320" width="512" viewBox="0 0 512 320" class="diagram" text-anchor | |||
<path d="M 8,64 L 8,304" fill="none" stroke="black"/> | ="middle" font-family="monospace" font-size="13px" stroke-linecap="round"> | |||
<path d="M 32,32 L 32,256" fill="none" stroke="black"/> | <path d="M 8,64 L 8,304" fill="none" stroke="black"/> | |||
<path d="M 48,32 L 48,64" fill="none" stroke="black"/> | <path d="M 32,32 L 32,256" fill="none" stroke="black"/> | |||
<path d="M 88,32 L 88,64" fill="none" stroke="black"/> | <path d="M 48,32 L 48,64" fill="none" stroke="black"/> | |||
<path d="M 104,32 L 104,64" fill="none" stroke="black"/> | <path d="M 88,32 L 88,64" fill="none" stroke="black"/> | |||
<path d="M 144,32 L 144,64" fill="none" stroke="black"/> | <path d="M 104,32 L 104,64" fill="none" stroke="black"/> | |||
<path d="M 312,32 L 312,64" fill="none" stroke="black"/> | <path d="M 144,32 L 144,64" fill="none" stroke="black"/> | |||
<path d="M 480,32 L 480,256" fill="none" stroke="black"/> | <path d="M 312,32 L 312,64" fill="none" stroke="black"/> | |||
<path d="M 504,32 L 504,304" fill="none" stroke="black"/> | <path d="M 480,32 L 480,256" fill="none" stroke="black"/> | |||
<path d="M 32,32 L 504,32" fill="none" stroke="black"/> | <path d="M 504,32 L 504,304" fill="none" stroke="black"/> | |||
<path d="M 8,64 L 480,64" fill="none" stroke="black"/> | <path d="M 32,32 L 504,32" fill="none" stroke="black"/> | |||
<path d="M 8,224 L 504,224" fill="none" stroke="black"/> | <path d="M 8,64 L 480,64" fill="none" stroke="black"/> | |||
<path d="M 32,256 L 480,256" fill="none" stroke="black"/> | <path d="M 8,224 L 504,224" fill="none" stroke="black"/> | |||
<path d="M 8,304 L 32,304" fill="none" stroke="black"/> | <path d="M 32,256 L 480,256" fill="none" stroke="black"/> | |||
<path d="M 480,304 L 504,304" fill="none" stroke="black"/> | <path d="M 8,304 L 32,304" fill="none" stroke="black"/> | |||
<polygon class="arrowhead" points="496,224 484,218.4 484,229.6" fill="black" tra | <path d="M 480,304 L 504,304" fill="none" stroke="black"/> | |||
nsform="rotate(180,488,224)"/> | <polygon class="arrowhead" points="496,224 484,218.4 484,229.6" | |||
<polygon class="arrowhead" points="496,32 484,26.4 484,37.6" fill="black" transf | fill="black" transform="rotate(180,488,224)"/> | |||
orm="rotate(180,488,32)"/> | <polygon class="arrowhead" points="496,32 484,26.4 484,37.6" fil | |||
<polygon class="arrowhead" points="32,224 20,218.4 20,229.6" fill="black" transf | l="black" transform="rotate(180,488,32)"/> | |||
orm="rotate(0,24,224)"/> | <polygon class="arrowhead" points="32,224 20,218.4 20,229.6" fil | |||
<polygon class="arrowhead" points="32,64 20,58.4 20,69.6" fill="black" transform | l="black" transform="rotate(0,24,224)"/> | |||
="rotate(0,24,64)"/> | <polygon class="arrowhead" points="32,64 20,58.4 20,69.6" fill=" | |||
<g class="text"> | black" transform="rotate(0,24,64)"/> | |||
<text x="40" y="52">K</text> | <g class="text"> | |||
<text x="68" y="52">KLEN</text> | <text x="40" y="52">K</text> | |||
<text x="96" y="52">C</text> | <text x="68" y="52">KLEN</text> | |||
<text x="124" y="52">CLEN</text> | <text x="96" y="52">C</text> | |||
<text x="216" y="52">Key</text> | <text x="124" y="52">CLEN</text> | |||
<text x="244" y="52">ID</text> | <text x="216" y="52">Key</text> | |||
<text x="392" y="52">Counter</text> | <text x="244" y="52">ID</text> | |||
<text x="224" y="148">Encrypted</text> | <text x="392" y="52">Counter</text> | |||
<text x="284" y="148">Data</text> | <text x="224" y="148">Encrypted</text> | |||
<text x="228" y="244">Authentication</text> | <text x="284" y="148">Data</text> | |||
<text x="304" y="244">Tag</text> | <text x="228" y="244">Authentication</text> | |||
<text x="80" y="308">Encrypted</text> | <text x="304" y="244">Tag</text> | |||
<text x="152" y="308">Portion</text> | <text x="80" y="308">Encrypted</text> | |||
<text x="352" y="308">Authenticated</text> | <text x="152" y="308">Portion</text> | |||
<text x="440" y="308">Portion</text> | <text x="352" y="308">Authenticated</text> | |||
</g> | <text x="440" y="308">Portion</text> | |||
</svg> | </g> | |||
</artwork><artwork type="ascii-art"><![CDATA[ | </svg> | |||
</artwork> | ||||
<artwork type="ascii-art"><![CDATA[ | ||||
+-+----+-+----+--------------------+--------------------+<-+ | +-+----+-+----+--------------------+--------------------+<-+ | |||
|K|KLEN|C|CLEN| Key ID | Counter | | | |K|KLEN|C|CLEN| Key ID | Counter | | | |||
+->+-+----+-+----+--------------------+--------------------+ | | +->+-+----+-+----+--------------------+--------------------+ | | |||
| | | | | | | | | | |||
| | | | | | | | | | |||
| | | | | | | | | | |||
| | | | | | | | | | |||
| | Encrypted Data | | | | | Encrypted Data | | | |||
| | | | | | | | | | |||
| | | | | | | | | | |||
| | | | | | | | | | |||
| | | | | | | | | | |||
+->+-------------------------------------------------------+<-+ | +->+-------------------------------------------------------+<-+ | |||
| | Authentication Tag | | | | | Authentication Tag | | | |||
| +-------------------------------------------------------+ | | | +-------------------------------------------------------+ | | |||
| | | | | | |||
| | | | | | |||
+--- Encrypted Portion Authenticated Portion ---+ | +--- Encrypted Portion Authenticated Portion ---+ | |||
]]></artwork></artset></figure> | ]]></artwork> | |||
</artset> | ||||
<t>When SFrame is applied per packet, the payload of each packet will be an SFra | </figure> | |||
me | <t>When SFrame is applied per packet, the payload of each packet will be | |||
an SFrame | ||||
ciphertext. When SFrame is applied per frame, the SFrame ciphertext | ciphertext. When SFrame is applied per frame, the SFrame ciphertext | |||
representing an encrypted frame will span several packets, with the header | representing an encrypted frame will span several packets, with the header | |||
appearing in the first packet and the authentication tag in the last packet. | appearing in the first packet and the authentication tag in the last packet. | |||
It is the responsibility of the application to reassemble an encrypted frame fro m | It is the responsibility of the application to reassemble an encrypted frame fro m | |||
individual packets, accounting for packet loss and reordering as necessary.</t> | individual packets, accounting for packet loss and reordering as necessary.</t> | |||
</section> | ||||
</section> | <section anchor="sframe-header"> | |||
<section anchor="sframe-header"><name>SFrame Header</name> | <name>SFrame Header</name> | |||
<t>The SFrame header specifies two values from which encryption paramete | ||||
<t>The SFrame header specifies two values from which encryption parameters are | rs are | |||
derived:</t> | derived:</t> | |||
<ul spacing="normal"> | ||||
<t><list style="symbols"> | <li> | |||
<t>A Key ID (KID) that determines which encryption key should be used</t> | <t>A Key ID (KID) that determines which encryption key should be use | |||
<t>A Counter (CTR) that is used to construct the nonce for the encryption</t> | d</t> | |||
</list></t> | </li> | |||
<li> | ||||
<t>Applications <bcp14>MUST</bcp14> ensure that each (KID, CTR) combination is u | <t>A Counter (CTR) that is used to construct the nonce for the encry | |||
sed for exactly | ption</t> | |||
</li> | ||||
</ul> | ||||
<t>Applications <bcp14>MUST</bcp14> ensure that each (KID, CTR) combinat | ||||
ion is used for exactly | ||||
one SFrame encryption operation. A typical approach to achieve this guarantee is | one SFrame encryption operation. A typical approach to achieve this guarantee is | |||
outlined in <xref target="header-value-uniqueness"/>.</t> | outlined in <xref target="header-value-uniqueness"/>.</t> | |||
<figure anchor="fig-sframe-header"> | ||||
<figure title="SFrame Header" anchor="fig-sframe-header"><artset><artwork type= | <name>SFrame Header</name> | |||
"svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="160" width=" | <artset> | |||
352" viewBox="0 0 352 160" class="diagram" text-anchor="middle" font-family="mon | <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version= | |||
ospace" font-size="13px" stroke-linecap="round"> | "1.1" height="160" width="352" viewBox="0 0 352 160" class="diagram" text-anchor | |||
<path d="M 8,112 L 8,144" fill="none" stroke="black"/> | ="middle" font-family="monospace" font-size="13px" stroke-linecap="round"> | |||
<path d="M 24,112 L 24,144" fill="none" stroke="black"/> | <path d="M 8,112 L 8,144" fill="none" stroke="black"/> | |||
<path d="M 72,112 L 72,144" fill="none" stroke="black"/> | <path d="M 24,112 L 24,144" fill="none" stroke="black"/> | |||
<path d="M 88,112 L 88,144" fill="none" stroke="black"/> | <path d="M 72,112 L 72,144" fill="none" stroke="black"/> | |||
<path d="M 136,112 L 136,144" fill="none" stroke="black"/> | <path d="M 88,112 L 88,144" fill="none" stroke="black"/> | |||
<path d="M 240,112 L 240,144" fill="none" stroke="black"/> | <path d="M 136,112 L 136,144" fill="none" stroke="black"/> | |||
<path d="M 344,112 L 344,144" fill="none" stroke="black"/> | <path d="M 240,112 L 240,144" fill="none" stroke="black"/> | |||
<path d="M 24,64 L 56,64" fill="none" stroke="black"/> | <path d="M 344,112 L 344,144" fill="none" stroke="black"/> | |||
<path d="M 88,64 L 120,64" fill="none" stroke="black"/> | <path d="M 24,64 L 56,64" fill="none" stroke="black"/> | |||
<path d="M 8,112 L 344,112" fill="none" stroke="black"/> | <path d="M 88,64 L 120,64" fill="none" stroke="black"/> | |||
<path d="M 8,144 L 344,144" fill="none" stroke="black"/> | <path d="M 8,112 L 344,112" fill="none" stroke="black"/> | |||
<path d="M 24,64 C 15.16936,64 8,71.16936 8,80" fill="none" stroke="black"/> | <path d="M 8,144 L 344,144" fill="none" stroke="black"/> | |||
<path d="M 56,64 C 64.83064,64 72,56.83064 72,48" fill="none" stroke="black"/> | <path d="M 24,64 C 15.16936,64 8,71.16936 8,80" fill="none" stro | |||
<path d="M 88,64 C 79.16936,64 72,56.83064 72,48" fill="none" stroke="black"/> | ke="black"/> | |||
<path d="M 120,64 C 128.83064,64 136,71.16936 136,80" fill="none" stroke="black" | <path d="M 56,64 C 64.83064,64 72,56.83064 72,48" fill="none" st | |||
/> | roke="black"/> | |||
<g class="text"> | <path d="M 88,64 C 79.16936,64 72,56.83064 72,48" fill="none" st | |||
<text x="52" y="36">Config</text> | roke="black"/> | |||
<text x="100" y="36">Byte</text> | <path d="M 120,64 C 128.83064,64 136,71.16936 136,80" fill="none | |||
<text x="16" y="100">0</text> | " stroke="black"/> | |||
<text x="32" y="100">1</text> | <g class="text"> | |||
<text x="48" y="100">2</text> | <text x="52" y="36">Config</text> | |||
<text x="64" y="100">3</text> | <text x="100" y="36">Byte</text> | |||
<text x="80" y="100">4</text> | <text x="16" y="100">0</text> | |||
<text x="96" y="100">5</text> | <text x="32" y="100">1</text> | |||
<text x="112" y="100">6</text> | <text x="48" y="100">2</text> | |||
<text x="128" y="100">7</text> | <text x="64" y="100">3</text> | |||
<text x="16" y="132">X</text> | <text x="80" y="100">4</text> | |||
<text x="48" y="132">K</text> | <text x="96" y="100">5</text> | |||
<text x="80" y="132">Y</text> | <text x="112" y="100">6</text> | |||
<text x="112" y="132">C</text> | <text x="128" y="100">7</text> | |||
<text x="188" y="132">KID...</text> | <text x="16" y="132">X</text> | |||
<text x="292" y="132">CTR...</text> | <text x="48" y="132">K</text> | |||
</g> | <text x="80" y="132">Y</text> | |||
</svg> | <text x="112" y="132">C</text> | |||
</artwork><artwork type="ascii-art"><![CDATA[ | <text x="188" y="132">KID...</text> | |||
<text x="292" y="132">CTR...</text> | ||||
</g> | ||||
</svg> | ||||
</artwork> | ||||
<artwork type="ascii-art"><![CDATA[ | ||||
Config Byte | Config Byte | |||
| | | | |||
.-----' '-----. | .-----' '-----. | |||
| | | | | | |||
0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
+-+-+-+-+-+-+-+-+------------+------------+ | +-+-+-+-+-+-+-+-+------------+------------+ | |||
|X| K |Y| C | KID... | CTR... | | |X| K |Y| C | KID... | CTR... | | |||
+-+-+-+-+-+-+-+-+------------+------------+ | +-+-+-+-+-+-+-+-+------------+------------+ | |||
]]></artwork></artset></figure> | ]]></artwork> | |||
</artset> | ||||
<t>The SFrame header has the overall structure shown in <xref target="fig-sframe | </figure> | |||
-header"/>. The | <t>The SFrame header has the overall structure shown in <xref target="fi | |||
g-sframe-header"/>. The | ||||
first byte is a "config byte", with the following fields:</t> | first byte is a "config byte", with the following fields:</t> | |||
<dl> | ||||
<dl> | <dt>Extended KID Flag (X, 1 bit):</dt> | |||
<dt>Extended KID Flag (X, 1 bit):</dt> | <dd> | |||
<dd> | <t>Indicates if the K field contains the KID or the KID length.</t> | |||
<t>Indicates if the K field contains the KID or the KID length.</t> | </dd> | |||
</dd> | <dt>KID or KID Length (K, 3 bits):</dt> | |||
<dt>KID or KID Length (K, 3 bits):</dt> | <dd> | |||
<dd> | <t>If the X flag is set to 0, this field contains the KID. If the X | |||
<t>If the X flag is set to 0, this field contains the KID. If the X flag is | flag is | |||
set to 1, then it contains the length of the KID, minus one.</t> | set to 1, then it contains the length of the KID, minus one.</t> | |||
</dd> | </dd> | |||
<dt>Extended CTR Flag (Y, 1 bit):</dt> | <dt>Extended CTR Flag (Y, 1 bit):</dt> | |||
<dd> | <dd> | |||
<t>Indicates if the C field contains the CTR or the CTR length.</t> | <t>Indicates if the C field contains the CTR or the CTR length.</t> | |||
</dd> | </dd> | |||
<dt>CTR or CTR Length (C, 3 bits):</dt> | <dt>CTR or CTR Length (C, 3 bits):</dt> | |||
<dd> | <dd> | |||
<t>This field contains the CTR if the Y flag is set to 0, or the CTR | <t>This field contains the CTR if the Y flag is set to 0, or the CTR | |||
length, minus one, if set to 1.</t> | length, minus one, if set to 1.</t> | |||
</dd> | </dd> | |||
</dl> | </dl> | |||
<t>The KID and CTR fields are encoded as compact unsigned integers in | ||||
<t>The KID and CTR fields are encoded as compact unsigned integers in | ||||
network (big-endian) byte order. If the value of one of these fields is in the | network (big-endian) byte order. If the value of one of these fields is in the | |||
range 0-7, then the value is carried in the corresponding bits of the config | range 0-7, then the value is carried in the corresponding bits of the config | |||
byte (K or C) and the corresponding flag (X or Y) is set to zero. Otherwise, | byte (K or C) and the corresponding flag (X or Y) is set to zero. Otherwise, | |||
the value <bcp14>MUST</bcp14> be encoded with the minimum number of bytes requir ed and | the value <bcp14>MUST</bcp14> be encoded with the minimum number of bytes requir ed and | |||
appended after the config byte, with the KID first and CTR second. | appended after the config byte, with the KID first and CTR second. | |||
The header field (K or C) is set to the number of bytes in the encoded value, | The header field (K or C) is set to the number of bytes in the encoded value, | |||
minus one. The value 000 represents a length of 1, 001 a length of 2, etc. | minus one. The value 000 represents a length of 1, 001 a length of 2, etc. | |||
This allows a 3-bit length field to represent the value lengths 1-8.</t> | This allows a 3-bit length field to represent the value lengths 1-8.</t> | |||
<t>The SFrame header can thus take one of the four forms shown in | ||||
<t>The SFrame header can thus take one of the four forms shown in | ||||
<xref target="fig-sframe-header-cases"/>, depending on which of the X and Y flag s are set.</t> | <xref target="fig-sframe-header-cases"/>, depending on which of the X and Y flag s are set.</t> | |||
<figure anchor="fig-sframe-header-cases"> | ||||
<figure title="Forms of Encoded SFrame Header" anchor="fig-sframe-header-cases"> | <name>Forms of Encoded SFrame Header</name> | |||
<artset><artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1. | <artset> | |||
1" height="336" width="544" viewBox="0 0 544 336" class="diagram" text-anchor="m | <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version= | |||
iddle" font-family="monospace" font-size="13px" stroke-linecap="round"> | "1.1" height="336" width="544" viewBox="0 0 544 336" class="diagram" text-anchor | |||
<path d="M 8,48 L 8,80" fill="none" stroke="black"/> | ="middle" font-family="monospace" font-size="13px" stroke-linecap="round"> | |||
<path d="M 8,128 L 8,160" fill="none" stroke="black"/> | <path d="M 8,48 L 8,80" fill="none" stroke="black"/> | |||
<path d="M 8,208 L 8,240" fill="none" stroke="black"/> | <path d="M 8,128 L 8,160" fill="none" stroke="black"/> | |||
<path d="M 8,288 L 8,320" fill="none" stroke="black"/> | <path d="M 8,208 L 8,240" fill="none" stroke="black"/> | |||
<path d="M 24,48 L 24,80" fill="none" stroke="black"/> | <path d="M 8,288 L 8,320" fill="none" stroke="black"/> | |||
<path d="M 24,128 L 24,160" fill="none" stroke="black"/> | <path d="M 24,48 L 24,80" fill="none" stroke="black"/> | |||
<path d="M 24,208 L 24,240" fill="none" stroke="black"/> | <path d="M 24,128 L 24,160" fill="none" stroke="black"/> | |||
<path d="M 24,288 L 24,320" fill="none" stroke="black"/> | <path d="M 24,208 L 24,240" fill="none" stroke="black"/> | |||
<path d="M 72,48 L 72,80" fill="none" stroke="black"/> | <path d="M 24,288 L 24,320" fill="none" stroke="black"/> | |||
<path d="M 72,128 L 72,160" fill="none" stroke="black"/> | <path d="M 72,48 L 72,80" fill="none" stroke="black"/> | |||
<path d="M 72,192 L 72,240" fill="none" stroke="black"/> | <path d="M 72,128 L 72,160" fill="none" stroke="black"/> | |||
<path d="M 72,272 L 72,320" fill="none" stroke="black"/> | <path d="M 72,192 L 72,240" fill="none" stroke="black"/> | |||
<path d="M 88,48 L 88,80" fill="none" stroke="black"/> | <path d="M 72,272 L 72,320" fill="none" stroke="black"/> | |||
<path d="M 88,128 L 88,160" fill="none" stroke="black"/> | <path d="M 88,48 L 88,80" fill="none" stroke="black"/> | |||
<path d="M 88,208 L 88,240" fill="none" stroke="black"/> | <path d="M 88,128 L 88,160" fill="none" stroke="black"/> | |||
<path d="M 88,288 L 88,320" fill="none" stroke="black"/> | <path d="M 88,208 L 88,240" fill="none" stroke="black"/> | |||
<path d="M 136,48 L 136,80" fill="none" stroke="black"/> | <path d="M 88,288 L 88,320" fill="none" stroke="black"/> | |||
<path d="M 136,128 L 136,160" fill="none" stroke="black"/> | <path d="M 136,48 L 136,80" fill="none" stroke="black"/> | |||
<path d="M 136,208 L 136,240" fill="none" stroke="black"/> | <path d="M 136,128 L 136,160" fill="none" stroke="black"/> | |||
<path d="M 136,288 L 136,320" fill="none" stroke="black"/> | <path d="M 136,208 L 136,240" fill="none" stroke="black"/> | |||
<path d="M 336,128 L 336,160" fill="none" stroke="black"/> | <path d="M 136,288 L 136,320" fill="none" stroke="black"/> | |||
<path d="M 336,208 L 336,240" fill="none" stroke="black"/> | <path d="M 336,128 L 336,160" fill="none" stroke="black"/> | |||
<path d="M 336,288 L 336,320" fill="none" stroke="black"/> | <path d="M 336,208 L 336,240" fill="none" stroke="black"/> | |||
<path d="M 536,288 L 536,320" fill="none" stroke="black"/> | <path d="M 336,288 L 336,320" fill="none" stroke="black"/> | |||
<path d="M 8,48 L 136,48" fill="none" stroke="black"/> | <path d="M 536,288 L 536,320" fill="none" stroke="black"/> | |||
<path d="M 8,80 L 136,80" fill="none" stroke="black"/> | <path d="M 8,48 L 136,48" fill="none" stroke="black"/> | |||
<path d="M 8,128 L 336,128" fill="none" stroke="black"/> | <path d="M 8,80 L 136,80" fill="none" stroke="black"/> | |||
<path d="M 8,160 L 336,160" fill="none" stroke="black"/> | <path d="M 8,128 L 336,128" fill="none" stroke="black"/> | |||
<path d="M 8,208 L 336,208" fill="none" stroke="black"/> | <path d="M 8,160 L 336,160" fill="none" stroke="black"/> | |||
<path d="M 8,240 L 336,240" fill="none" stroke="black"/> | <path d="M 8,208 L 336,208" fill="none" stroke="black"/> | |||
<path d="M 8,288 L 536,288" fill="none" stroke="black"/> | <path d="M 8,240 L 336,240" fill="none" stroke="black"/> | |||
<path d="M 8,320 L 536,320" fill="none" stroke="black"/> | <path d="M 8,288 L 536,288" fill="none" stroke="black"/> | |||
<g class="text"> | <path d="M 8,320 L 536,320" fill="none" stroke="black"/> | |||
<text x="16" y="36">KID</text> | <g class="text"> | |||
<text x="40" y="36"><</text> | <text x="16" y="36">KID</text> | |||
<text x="60" y="36">8,</text> | <text x="40" y="36"><</text> | |||
<text x="88" y="36">CTR</text> | <text x="60" y="36">8,</text> | |||
<text x="112" y="36"><</text> | <text x="88" y="36">CTR</text> | |||
<text x="132" y="36">8:</text> | <text x="112" y="36"><</text> | |||
<text x="16" y="68">0</text> | <text x="132" y="36">8:</text> | |||
<text x="48" y="68">KID</text> | <text x="16" y="68">0</text> | |||
<text x="80" y="68">0</text> | <text x="48" y="68">KID</text> | |||
<text x="112" y="68">CTR</text> | <text x="80" y="68">0</text> | |||
<text x="16" y="116">KID</text> | <text x="112" y="68">CTR</text> | |||
<text x="40" y="116"><</text> | <text x="16" y="116">KID</text> | |||
<text x="60" y="116">8,</text> | <text x="40" y="116"><</text> | |||
<text x="88" y="116">CTR</text> | <text x="60" y="116">8,</text> | |||
<text x="116" y="116">>=</text> | <text x="88" y="116">CTR</text> | |||
<text x="140" y="116">8:</text> | <text x="116" y="116">>=</text> | |||
<text x="16" y="148">0</text> | <text x="140" y="116">8:</text> | |||
<text x="48" y="148">KID</text> | <text x="16" y="148">0</text> | |||
<text x="80" y="148">1</text> | <text x="48" y="148">KID</text> | |||
<text x="108" y="148">CLEN</text> | <text x="80" y="148">1</text> | |||
<text x="180" y="148">CTR...</text> | <text x="108" y="148">CLEN</text> | |||
<text x="264" y="148">(length=CLEN)</text> | <text x="180" y="148">CTR...</text> | |||
<text x="16" y="196">KID</text> | <text x="264" y="148">(length=CLEN)</text> | |||
<text x="44" y="196">>=</text> | <text x="16" y="196">KID</text> | |||
<text x="64" y="196">8</text> | <text x="44" y="196">>=</text> | |||
<text x="96" y="196">CTR</text> | <text x="64" y="196">8</text> | |||
<text x="120" y="196"><</text> | <text x="96" y="196">CTR</text> | |||
<text x="140" y="196">8:</text> | <text x="120" y="196"><</text> | |||
<text x="16" y="228">1</text> | <text x="140" y="196">8:</text> | |||
<text x="44" y="228">KLEN</text> | <text x="16" y="228">1</text> | |||
<text x="80" y="228">0</text> | <text x="44" y="228">KLEN</text> | |||
<text x="112" y="228">CTR</text> | <text x="80" y="228">0</text> | |||
<text x="180" y="228">KID...</text> | <text x="112" y="228">CTR</text> | |||
<text x="264" y="228">(length=KLEN)</text> | <text x="180" y="228">KID...</text> | |||
<text x="16" y="276">KID</text> | <text x="264" y="228">(length=KLEN)</text> | |||
<text x="44" y="276">>=</text> | <text x="16" y="276">KID</text> | |||
<text x="64" y="276">8</text> | <text x="44" y="276">>=</text> | |||
<text x="96" y="276">CTR</text> | <text x="64" y="276">8</text> | |||
<text x="124" y="276">>=</text> | <text x="96" y="276">CTR</text> | |||
<text x="148" y="276">8:</text> | <text x="124" y="276">>=</text> | |||
<text x="16" y="308">1</text> | <text x="148" y="276">8:</text> | |||
<text x="44" y="308">KLEN</text> | <text x="16" y="308">1</text> | |||
<text x="80" y="308">1</text> | <text x="44" y="308">KLEN</text> | |||
<text x="108" y="308">CLEN</text> | <text x="80" y="308">1</text> | |||
<text x="180" y="308">KID...</text> | <text x="108" y="308">CLEN</text> | |||
<text x="264" y="308">(length=KLEN)</text> | <text x="180" y="308">KID...</text> | |||
<text x="380" y="308">CTR...</text> | <text x="264" y="308">(length=KLEN)</text> | |||
<text x="464" y="308">(length=CLEN)</text> | <text x="380" y="308">CTR...</text> | |||
</g> | <text x="464" y="308">(length=CLEN)</text> | |||
</svg> | </g> | |||
</artwork><artwork type="ascii-art"><![CDATA[ | </svg> | |||
</artwork> | ||||
<artwork type="ascii-art"><![CDATA[ | ||||
KID < 8, CTR < 8: | KID < 8, CTR < 8: | |||
+-+-----+-+-----+ | +-+-----+-+-----+ | |||
|0| KID |0| CTR | | |0| KID |0| CTR | | |||
+-+-----+-+-----+ | +-+-----+-+-----+ | |||
KID < 8, CTR >= 8: | KID < 8, CTR >= 8: | |||
+-+-----+-+-----+------------------------+ | +-+-----+-+-----+------------------------+ | |||
|0| KID |1|CLEN | CTR... (length=CLEN) | | |0| KID |1|CLEN | CTR... (length=CLEN) | | |||
+-+-----+-+-----+------------------------+ | +-+-----+-+-----+------------------------+ | |||
KID >= 8, CTR < 8: | KID >= 8, CTR < 8: | |||
+-+-----+-+-----+------------------------+ | +-+-----+-+-----+------------------------+ | |||
|1|KLEN |0| CTR | KID... (length=KLEN) | | |1|KLEN |0| CTR | KID... (length=KLEN) | | |||
+-+-----+-+-----+------------------------+ | +-+-----+-+-----+------------------------+ | |||
KID >= 8, CTR >= 8: | KID >= 8, CTR >= 8: | |||
+-+-----+-+-----+------------------------+------------------------+ | +-+-----+-+-----+------------------------+------------------------+ | |||
|1|KLEN |1|CLEN | KID... (length=KLEN) | CTR... (length=CLEN) | | |1|KLEN |1|CLEN | KID... (length=KLEN) | CTR... (length=CLEN) | | |||
+-+-----+-+-----+------------------------+------------------------+ | +-+-----+-+-----+------------------------+------------------------+ | |||
]]></artwork></artset></figure> | ]]></artwork> | |||
</artset> | ||||
</section> | </figure> | |||
<section anchor="encryption-schema"><name>Encryption Schema</name> | </section> | |||
<section anchor="encryption-schema"> | ||||
<t>SFrame encryption uses an AEAD encryption algorithm and hash function defined | <name>Encryption Schema</name> | |||
by | <t>SFrame encryption uses an AEAD encryption algorithm and hash function | |||
defined by | ||||
the cipher suite in use (see <xref target="cipher-suites"/>). We will refer to the following | the cipher suite in use (see <xref target="cipher-suites"/>). We will refer to the following | |||
aspects of the AEAD and the hash algorithm below:</t> | aspects of the AEAD and the hash algorithm below:</t> | |||
<ul spacing="normal"> | ||||
<t><list style="symbols"> | <li> | |||
<t><spanx style="verb">AEAD.Encrypt</spanx> and <spanx style="verb">AEAD.Decry | <t><tt>AEAD.Encrypt</tt> and <tt>AEAD.Decrypt</tt> - The encryption | |||
pt</spanx> - The encryption and decryption functions | and decryption functions | |||
for the AEAD. We follow the convention of RFC 5116 <xref target="RFC5116"/> and consider | for the AEAD. We follow the convention of RFC 5116 <xref target="RFC5116"/> and consider | |||
the authentication tag part of the ciphertext produced by <spanx style="verb">AE AD.Encrypt</spanx> (as | the authentication tag part of the ciphertext produced by <tt>AEAD.Encrypt</tt> (as | |||
opposed to a separate field as in SRTP <xref target="RFC3711"/>).</t> | opposed to a separate field as in SRTP <xref target="RFC3711"/>).</t> | |||
<t><spanx style="verb">AEAD.Nk</spanx> - The size in bytes of a key for the en | </li> | |||
cryption algorithm</t> | <li> | |||
<t><spanx style="verb">AEAD.Nn</spanx> - The size in bytes of a nonce for the | <t><tt>AEAD.Nk</tt> - The size in bytes of a key for the encryption | |||
encryption algorithm</t> | algorithm</t> | |||
<t><spanx style="verb">AEAD.Nt</spanx> - The overhead in bytes of the encrypti | </li> | |||
on algorithm (typically the | <li> | |||
<t><tt>AEAD.Nn</tt> - The size in bytes of a nonce for the encryptio | ||||
n algorithm</t> | ||||
</li> | ||||
<li> | ||||
<t><tt>AEAD.Nt</tt> - The overhead in bytes of the encryption algori | ||||
thm (typically the | ||||
size of a "tag" that is added to the plaintext)</t> | size of a "tag" that is added to the plaintext)</t> | |||
<t><spanx style="verb">AEAD.Nka</spanx> - For cipher suites using the compound | </li> | |||
AEAD described in | <li> | |||
<t><tt>AEAD.Nka</tt> - For cipher suites using the compound AEAD des | ||||
cribed in | ||||
<xref target="aes-ctr-with-sha2"/>, the size in bytes of a key for the underlyin g encryption | <xref target="aes-ctr-with-sha2"/>, the size in bytes of a key for the underlyin g encryption | |||
algorithm</t> | algorithm</t> | |||
<t><spanx style="verb">Hash.Nh</spanx> - The size in bytes of the output of th | </li> | |||
e hash function</t> | <li> | |||
</list></t> | <t><tt>Hash.Nh</tt> - The size in bytes of the output of the hash fu | |||
nction</t> | ||||
<section anchor="key-selection"><name>Key Selection</name> | </li> | |||
</ul> | ||||
<t>Each SFrame encryption or decryption operation is premised on a single secret | <section anchor="key-selection"> | |||
<spanx style="verb">base_key</spanx>, which is labeled with an integer KID value | <name>Key Selection</name> | |||
signaled in the SFrame | <t>Each SFrame encryption or decryption operation is premised on a sin | |||
gle secret | ||||
<tt>base_key</tt>, which is labeled with an integer KID value signaled in the SF | ||||
rame | ||||
header.</t> | header.</t> | |||
<t>The sender and receivers need to agree on which <tt>base_key</tt> s | ||||
<t>The sender and receivers need to agree on which <spanx style="verb">base_key< | hould be used for a given | |||
/spanx> should be used for a given | KID. Moreover, senders and receivers need to agree on whether a <tt>base_key</t | |||
KID. Moreover, senders and receivers need to agree on whether a <spanx style="v | t> will be used | |||
erb">base_key</spanx> will be used | for encryption or decryption only. The process for provisioning <tt>base_key</tt | |||
for encryption or decryption only. The process for provisioning <spanx style="ve | > values and their KID | |||
rb">base_key</spanx> values and their KID | ||||
values is beyond the scope of this specification, but its security properties wi ll | values is beyond the scope of this specification, but its security properties wi ll | |||
bound the assurances that SFrame provides. For example, if SFrame is used to | bound the assurances that SFrame provides. For example, if SFrame is used to | |||
provide E2E security against intermediary media nodes, then SFrame keys need to | provide E2E security against intermediary media nodes, then SFrame keys need to | |||
be negotiated in a way that does not make them accessible to these intermediarie s.</t> | be negotiated in a way that does not make them accessible to these intermediarie s.</t> | |||
<t>For each known KID value, the client stores the corresponding symme | ||||
<t>For each known KID value, the client stores the corresponding symmetric key | tric key | |||
<spanx style="verb">base_key</spanx>. For keys that can be used for encryption, | <tt>base_key</tt>. For keys that can be used for encryption, the client also st | |||
the client also stores | ores | |||
the next CTR value to be used when encrypting (initially 0).</t> | the next CTR value to be used when encrypting (initially 0).</t> | |||
<t>When encrypting a plaintext, the application specifies which KID is | ||||
<t>When encrypting a plaintext, the application specifies which KID is to be use | to be used, | |||
d, | ||||
and the CTR value is incremented after successful encryption. When decrypting, | and the CTR value is incremented after successful encryption. When decrypting, | |||
the <spanx style="verb">base_key</spanx> for decryption is selected from the ava ilable keys using the KID | the <tt>base_key</tt> for decryption is selected from the available keys using t he KID | |||
value in the SFrame header.</t> | value in the SFrame header.</t> | |||
<t>A given <tt>base_key</tt> <bcp14>MUST NOT</bcp14> be used for encry | ||||
<t>A given <spanx style="verb">base_key</spanx> <bcp14>MUST NOT</bcp14> be used | ption by multiple senders. Such reuse | |||
for encryption by multiple senders. Such reuse | ||||
would result in multiple encrypted frames being generated with the same (key, | would result in multiple encrypted frames being generated with the same (key, | |||
nonce) pair, which harms the protections provided by many AEAD algorithms. | nonce) pair, which harms the protections provided by many AEAD algorithms. | |||
Implementations <bcp14>MUST</bcp14> mark each <spanx style="verb">base_key</span x> as usable for encryption or decryption, | Implementations <bcp14>MUST</bcp14> mark each <tt>base_key</tt> as usable for en cryption or decryption, | |||
never both.</t> | never both.</t> | |||
<t>Note that the set of available keys might change over the lifetime | ||||
<t>Note that the set of available keys might change over the lifetime of a | of a | |||
real-time session. In such cases, the client will need to manage key usage to | real-time session. In such cases, the client will need to manage key usage to | |||
avoid media loss due to a key being used to encrypt before all receivers are | avoid media loss due to a key being used to encrypt before all receivers are | |||
able to use it to decrypt. For example, an application may make decryption-only | able to use it to decrypt. For example, an application may make decryption-only | |||
keys available immediately, but delay the use of keys for encryption until (a) | keys available immediately, but delay the use of keys for encryption until (a) | |||
all receivers have acknowledged receipt of the new key, or (b) a timeout expires .</t> | all receivers have acknowledged receipt of the new key, or (b) a timeout expires .</t> | |||
</section> | ||||
</section> | <section anchor="key-derivation"> | |||
<section anchor="key-derivation"><name>Key Derivation</name> | <name>Key Derivation</name> | |||
<t>SFrame encryption and decryption use a key and salt derived from th | ||||
<t>SFrame encryption and decryption use a key and salt derived from the <spanx s | e <tt>base_key</tt> | |||
tyle="verb">base_key</spanx> | associated with a KID. Given a <tt>base_key</tt> value, the key and salt are de | |||
associated with a KID. Given a <spanx style="verb">base_key</spanx> value, the | rived | |||
key and salt are derived | ||||
using HMAC-based Key Derivation Function (HKDF) <xref target="RFC5869"/> as foll ows:</t> | using HMAC-based Key Derivation Function (HKDF) <xref target="RFC5869"/> as foll ows:</t> | |||
<sourcecode type="pseudocode"><![CDATA[ | ||||
<figure><sourcecode type="pseudocode"><![CDATA[ | ||||
def derive_key_salt(KID, base_key): | def derive_key_salt(KID, base_key): | |||
sframe_secret = HKDF-Extract("", base_key) | sframe_secret = HKDF-Extract("", base_key) | |||
sframe_key_label = "SFrame 1.0 Secret key " + KID + cipher_suite | sframe_key_label = "SFrame 1.0 Secret key " + KID + cipher_suite | |||
sframe_key = | sframe_key = | |||
HKDF-Expand(sframe_secret, sframe_key_label, AEAD.Nk) | HKDF-Expand(sframe_secret, sframe_key_label, AEAD.Nk) | |||
sframe_salt_label = "SFrame 1.0 Secret salt " + KID + cipher_suite | sframe_salt_label = "SFrame 1.0 Secret salt " + KID + cipher_suite | |||
sframe_salt = | sframe_salt = | |||
HKDF-Expand(sframe_secret, sframe_salt_label, AEAD.Nn) | HKDF-Expand(sframe_secret, sframe_salt_label, AEAD.Nn) | |||
return sframe_key, sframe_salt | return sframe_key, sframe_salt | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<t>In the derivation of <tt>sframe_secret</tt>:</t> | ||||
<t>In the derivation of <spanx style="verb">sframe_secret</spanx>:</t> | <ul spacing="normal"> | |||
<li> | ||||
<t><list style="symbols"> | <t>The <tt>+</tt> operator represents concatenation of byte string | |||
<t>The <spanx style="verb">+</spanx> operator represents concatenation of byte | s.</t> | |||
strings.</t> | </li> | |||
<t>The KID value is encoded as an 8-byte big-endian integer, not the compresse | <li> | |||
d | <t>The KID value is encoded as an 8-byte big-endian integer, not t | |||
he compressed | ||||
form used in the SFrame header.</t> | form used in the SFrame header.</t> | |||
<t>The <spanx style="verb">cipher_suite</spanx> value is a 2-byte big-endian i | </li> | |||
nteger representing the | <li> | |||
<t>The <tt>cipher_suite</tt> value is a 2-byte big-endian integer | ||||
representing the | ||||
cipher suite in use (see <xref target="sframe-cipher-suites"/>).</t> | cipher suite in use (see <xref target="sframe-cipher-suites"/>).</t> | |||
</list></t> | </li> | |||
</ul> | ||||
<t>The hash function used for HKDF is determined by the cipher suite in use.</t> | <t>The hash function used for HKDF is determined by the cipher suite i | |||
n use.</t> | ||||
</section> | </section> | |||
<section anchor="encryption"><name>Encryption</name> | <section anchor="encryption"> | |||
<name>Encryption</name> | ||||
<t>SFrame encryption uses the AEAD encryption algorithm for the cipher suite in | <t>SFrame encryption uses the AEAD encryption algorithm for the cipher | |||
use. | suite in use. | |||
The key for the encryption is the <spanx style="verb">sframe_key</spanx>. The n | The key for the encryption is the <tt>sframe_key</tt>. The nonce is formed by f | |||
once is formed by first XORing | irst XORing | |||
the <spanx style="verb">sframe_salt</spanx> with the current CTR value, and then | the <tt>sframe_salt</tt> with the current CTR value, and then encoding the resul | |||
encoding the result as a big-endian integer of | t as a big-endian integer of | |||
length <spanx style="verb">AEAD.Nn</spanx>.</t> | length <tt>AEAD.Nn</tt>.</t> | |||
<t>The encryptor forms an SFrame header using the CTR and KID values p | ||||
<t>The encryptor forms an SFrame header using the CTR and KID values provided. | rovided. | |||
The encoded header is provided as AAD to the AEAD encryption operation, together | The encoded header is provided as AAD to the AEAD encryption operation, together | |||
with application-provided metadata about the encrypted media (see <xref target=" metadata"/>).</t> | with application-provided metadata about the encrypted media (see <xref target=" metadata"/>).</t> | |||
<sourcecode type="pseudocode"><![CDATA[ | ||||
<figure><sourcecode type="pseudocode"><![CDATA[ | ||||
def encrypt(CTR, KID, metadata, plaintext): | def encrypt(CTR, KID, metadata, plaintext): | |||
sframe_key, sframe_salt = key_store[KID] | sframe_key, sframe_salt = key_store[KID] | |||
# encode_big_endian(x, n) produces an n-byte string encoding the | # encode_big_endian(x, n) produces an n-byte string encoding the | |||
# integer x in big-endian byte order. | # integer x in big-endian byte order. | |||
ctr = encode_big_endian(CTR, AEAD.Nn) | ctr = encode_big_endian(CTR, AEAD.Nn) | |||
nonce = xor(sframe_salt, CTR) | nonce = xor(sframe_salt, CTR) | |||
# encode_sframe_header produces a byte string encoding the | # encode_sframe_header produces a byte string encoding the | |||
# provided KID and CTR values into an SFrame header. | # provided KID and CTR values into an SFrame header. | |||
header = encode_sframe_header(CTR, KID) | header = encode_sframe_header(CTR, KID) | |||
aad = header + metadata | aad = header + metadata | |||
ciphertext = AEAD.Encrypt(sframe_key, nonce, aad, plaintext) | ciphertext = AEAD.Encrypt(sframe_key, nonce, aad, plaintext) | |||
return header + ciphertext | return header + ciphertext | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<t>For example, the metadata input to encryption allows for frame meta | ||||
<t>For example, the metadata input to encryption allows for frame metadata to be | data to be | |||
authenticated when SFrame is applied per frame. After encoding the frame and | authenticated when SFrame is applied per frame. After encoding the frame and | |||
before packetizing it, the necessary media metadata will be moved out of the | before packetizing it, the necessary media metadata will be moved out of the | |||
encoded frame buffer to be sent in some channel visible to the SFU (e.g., an | encoded frame buffer to be sent in some channel visible to the SFU (e.g., an | |||
RTP header extension).</t> | RTP header extension).</t> | |||
<figure> | ||||
<figure title="Encrypting an SFrame Ciphertext"><artset><artwork type="svg"><sv | <name>Encrypting an SFrame Ciphertext</name> | |||
g xmlns="http://www.w3.org/2000/svg" version="1.1" height="608" width="416" view | <artset> | |||
Box="0 0 416 608" class="diagram" text-anchor="middle" font-family="monospace" f | <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" versio | |||
ont-size="13px" stroke-linecap="round"> | n="1.1" height="608" width="416" viewBox="0 0 416 608" class="diagram" text-anch | |||
<path d="M 40,224 L 40,480" fill="none" stroke="black"/> | or="middle" font-family="monospace" font-size="13px" stroke-linecap="round"> | |||
<path d="M 64,176 L 64,272" fill="none" stroke="black"/> | <path d="M 40,224 L 40,480" fill="none" stroke="black"/> | |||
<path d="M 96,160 L 96,288" fill="none" stroke="black"/> | <path d="M 64,176 L 64,272" fill="none" stroke="black"/> | |||
<path d="M 128,320 L 128,352" fill="none" stroke="black"/> | <path d="M 96,160 L 96,288" fill="none" stroke="black"/> | |||
<path d="M 144,160 L 144,288" fill="none" stroke="black"/> | <path d="M 128,320 L 128,352" fill="none" stroke="black"/> | |||
<path d="M 168,176 L 168,208" fill="none" stroke="black"/> | <path d="M 144,160 L 144,288" fill="none" stroke="black"/> | |||
<path d="M 168,464 L 168,592" fill="none" stroke="black"/> | <path d="M 168,176 L 168,208" fill="none" stroke="black"/> | |||
<path d="M 192,352 L 192,384" fill="none" stroke="black"/> | <path d="M 168,464 L 168,592" fill="none" stroke="black"/> | |||
<path d="M 264,320 L 264,352" fill="none" stroke="black"/> | <path d="M 192,352 L 192,384" fill="none" stroke="black"/> | |||
<path d="M 280,32 L 280,128" fill="none" stroke="black"/> | <path d="M 264,320 L 264,352" fill="none" stroke="black"/> | |||
<path d="M 296,464 L 296,592" fill="none" stroke="black"/> | <path d="M 280,32 L 280,128" fill="none" stroke="black"/> | |||
<path d="M 320,208 L 320,240" fill="none" stroke="black"/> | <path d="M 296,464 L 296,592" fill="none" stroke="black"/> | |||
<path d="M 344,128 L 344,400" fill="none" stroke="black"/> | <path d="M 320,208 L 320,240" fill="none" stroke="black"/> | |||
<path d="M 344,432 L 344,528" fill="none" stroke="black"/> | <path d="M 344,128 L 344,400" fill="none" stroke="black"/> | |||
<path d="M 408,32 L 408,128" fill="none" stroke="black"/> | <path d="M 344,432 L 344,528" fill="none" stroke="black"/> | |||
<path d="M 280,32 L 408,32" fill="none" stroke="black"/> | <path d="M 408,32 L 408,128" fill="none" stroke="black"/> | |||
<path d="M 280,128 L 408,128" fill="none" stroke="black"/> | <path d="M 280,32 L 408,32" fill="none" stroke="black"/> | |||
<path d="M 96,160 L 144,160" fill="none" stroke="black"/> | <path d="M 280,128 L 408,128" fill="none" stroke="black"/> | |||
<path d="M 144,176 L 192,176" fill="none" stroke="black"/> | <path d="M 96,160 L 144,160" fill="none" stroke="black"/> | |||
<path d="M 296,176 L 336,176" fill="none" stroke="black"/> | <path d="M 144,176 L 192,176" fill="none" stroke="black"/> | |||
<path d="M 168,208 L 192,208" fill="none" stroke="black"/> | <path d="M 296,176 L 336,176" fill="none" stroke="black"/> | |||
<path d="M 304,208 L 320,208" fill="none" stroke="black"/> | <path d="M 168,208 L 192,208" fill="none" stroke="black"/> | |||
<path d="M 40,224 L 64,224" fill="none" stroke="black"/> | <path d="M 304,208 L 320,208" fill="none" stroke="black"/> | |||
<path d="M 96,224 L 144,224" fill="none" stroke="black"/> | <path d="M 40,224 L 64,224" fill="none" stroke="black"/> | |||
<path d="M 144,240 L 336,240" fill="none" stroke="black"/> | <path d="M 96,224 L 144,224" fill="none" stroke="black"/> | |||
<path d="M 96,288 L 144,288" fill="none" stroke="black"/> | <path d="M 144,240 L 336,240" fill="none" stroke="black"/> | |||
<path d="M 128,320 L 264,320" fill="none" stroke="black"/> | <path d="M 96,288 L 144,288" fill="none" stroke="black"/> | |||
<path d="M 128,352 L 264,352" fill="none" stroke="black"/> | <path d="M 128,320 L 264,320" fill="none" stroke="black"/> | |||
<path d="M 40,384 L 336,384" fill="none" stroke="black"/> | <path d="M 128,352 L 264,352" fill="none" stroke="black"/> | |||
<path d="M 168,464 L 296,464" fill="none" stroke="black"/> | <path d="M 40,384 L 336,384" fill="none" stroke="black"/> | |||
<path d="M 40,480 L 160,480" fill="none" stroke="black"/> | <path d="M 168,464 L 296,464" fill="none" stroke="black"/> | |||
<path d="M 168,496 L 296,496" fill="none" stroke="black"/> | <path d="M 40,480 L 160,480" fill="none" stroke="black"/> | |||
<path d="M 304,528 L 344,528" fill="none" stroke="black"/> | <path d="M 168,496 L 296,496" fill="none" stroke="black"/> | |||
<path d="M 168,592 L 296,592" fill="none" stroke="black"/> | <path d="M 304,528 L 344,528" fill="none" stroke="black"/> | |||
<path d="M 80,160 C 71.16936,160 64,167.16936 64,176" fill="none" stroke="black" | <path d="M 168,592 L 296,592" fill="none" stroke="black"/> | |||
/> | <path d="M 80,160 C 71.16936,160 64,167.16936 64,176" fill="no | |||
<path d="M 80,288 C 71.16936,288 64,280.83064 64,272" fill="none" stroke="black" | ne" stroke="black"/> | |||
/> | <path d="M 80,288 C 71.16936,288 64,280.83064 64,272" fill="no | |||
<polygon class="arrowhead" points="344,384 332,378.4 332,389.6" fill="black" tra | ne" stroke="black"/> | |||
nsform="rotate(0,336,384)"/> | <polygon class="arrowhead" points="344,384 332,378.4 332,389.6 | |||
<polygon class="arrowhead" points="344,240 332,234.4 332,245.6" fill="black" tra | " fill="black" transform="rotate(0,336,384)"/> | |||
nsform="rotate(0,336,240)"/> | <polygon class="arrowhead" points="344,240 332,234.4 332,245.6 | |||
<polygon class="arrowhead" points="344,176 332,170.4 332,181.6" fill="black" tra | " fill="black" transform="rotate(0,336,240)"/> | |||
nsform="rotate(0,336,176)"/> | <polygon class="arrowhead" points="344,176 332,170.4 332,181.6 | |||
<polygon class="arrowhead" points="312,528 300,522.4 300,533.6" fill="black" tra | " fill="black" transform="rotate(0,336,176)"/> | |||
nsform="rotate(180,304,528)"/> | <polygon class="arrowhead" points="312,528 300,522.4 300,533.6 | |||
<polygon class="arrowhead" points="200,208 188,202.4 188,213.6" fill="black" tra | " fill="black" transform="rotate(180,304,528)"/> | |||
nsform="rotate(0,192,208)"/> | <polygon class="arrowhead" points="200,208 188,202.4 188,213.6 | |||
<polygon class="arrowhead" points="200,176 188,170.4 188,181.6" fill="black" tra | " fill="black" transform="rotate(0,192,208)"/> | |||
nsform="rotate(0,192,176)"/> | <polygon class="arrowhead" points="200,176 188,170.4 188,181.6 | |||
<polygon class="arrowhead" points="168,480 156,474.4 156,485.6" fill="black" tra | " fill="black" transform="rotate(0,192,176)"/> | |||
nsform="rotate(0,160,480)"/> | <polygon class="arrowhead" points="168,480 156,474.4 156,485.6 | |||
<g class="text"> | " fill="black" transform="rotate(0,160,480)"/> | |||
<text x="344" y="84">plaintext</text> | <g class="text"> | |||
<text x="244" y="180">sframe_key</text> | <text x="344" y="84">plaintext</text> | |||
<text x="368" y="180">Key</text> | <text x="244" y="180">sframe_key</text> | |||
<text x="28" y="196">Header</text> | <text x="368" y="180">Key</text> | |||
<text x="120" y="196">KID</text> | <text x="28" y="196">Header</text> | |||
<text x="248" y="212">sframe_salt</text> | <text x="120" y="196">KID</text> | |||
<text x="376" y="244">Nonce</text> | <text x="248" y="212">sframe_salt</text> | |||
<text x="120" y="260">CTR</text> | <text x="376" y="244">Nonce</text> | |||
<text x="196" y="340">metadata</text> | <text x="120" y="260">CTR</text> | |||
<text x="368" y="388">AAD</text> | <text x="196" y="340">metadata</text> | |||
<text x="348" y="420">AEAD.Encrypt</text> | <text x="368" y="388">AAD</text> | |||
<text x="188" y="452">SFrame</text> | <text x="348" y="420">AEAD.Encrypt</text> | |||
<text x="260" y="452">Ciphertext</text> | <text x="188" y="452">SFrame</text> | |||
<text x="204" y="484">SFrame</text> | <text x="260" y="452">Ciphertext</text> | |||
<text x="260" y="484">Header</text> | <text x="204" y="484">SFrame</text> | |||
<text x="236" y="548">ciphertext</text> | <text x="260" y="484">Header</text> | |||
</g> | <text x="236" y="548">ciphertext</text> | |||
</svg> | </g> | |||
</artwork><artwork type="ascii-art"><![CDATA[ | </svg> | |||
</artwork> | ||||
<artwork type="ascii-art"><![CDATA[ | ||||
+---------------+ | +---------------+ | |||
| | | | | | |||
| | | | | | |||
| plaintext | | | plaintext | | |||
| | | | | | |||
| | | | | | |||
+-------+-------+ | +-------+-------+ | |||
| | | | |||
.- +-----+ | | .- +-----+ | | |||
| | +--+--> sframe_key ----->| Key | | | +--+--> sframe_key ----->| Key | |||
skipping to change at line 890 ¶ | skipping to change at line 897 ¶ | |||
| SFrame Ciphertext | | | SFrame Ciphertext | | |||
| +---------------+ | | | +---------------+ | | |||
+-------------->| SFrame Header | | | +-------------->| SFrame Header | | | |||
+---------------+ | | +---------------+ | | |||
| | | | | | | | |||
| |<----+ | | |<----+ | |||
| ciphertext | | | ciphertext | | |||
| | | | | | |||
| | | | | | |||
+---------------+ | +---------------+ | |||
]]></artwork></artset></figure> | ]]></artwork> | |||
</artset> | ||||
</section> | </figure> | |||
<section anchor="decryption"><name>Decryption</name> | </section> | |||
<section anchor="decryption"> | ||||
<t>Before decrypting, a receiver needs to assemble a full SFrame ciphertext. Whe | <name>Decryption</name> | |||
n | <t>Before decrypting, a receiver needs to assemble a full SFrame ciphe | |||
rtext. When | ||||
an SFrame ciphertext is fragmented into multiple parts for transport (e.g., | an SFrame ciphertext is fragmented into multiple parts for transport (e.g., | |||
a whole encrypted frame sent in multiple SRTP packets), the receiving client | a whole encrypted frame sent in multiple SRTP packets), the receiving client | |||
collects all the fragments of the ciphertext, using appropriate sequencing | collects all the fragments of the ciphertext, using appropriate sequencing | |||
and start/end markers in the transport. Once all of the required fragments are | and start/end markers in the transport. Once all of the required fragments are | |||
available, the client reassembles them into the SFrame ciphertext and passes | available, the client reassembles them into the SFrame ciphertext and passes | |||
the ciphertext to SFrame for decryption.</t> | the ciphertext to SFrame for decryption.</t> | |||
<t>The KID field in the SFrame header is used to find the right key an | ||||
<t>The KID field in the SFrame header is used to find the right key and salt for | d salt for | |||
the encrypted frame, and the CTR field is used to construct the nonce. The SFram e | the encrypted frame, and the CTR field is used to construct the nonce. The SFram e | |||
decryption procedure is as follows:</t> | decryption procedure is as follows:</t> | |||
<sourcecode type="pseudocode"><![CDATA[ | ||||
<figure><sourcecode type="pseudocode"><![CDATA[ | ||||
def decrypt(metadata, sframe_ciphertext): | def decrypt(metadata, sframe_ciphertext): | |||
KID, CTR, header, ciphertext = parse_ciphertext(sframe_ciphertext) | KID, CTR, header, ciphertext = parse_ciphertext(sframe_ciphertext) | |||
sframe_key, sframe_salt = key_store[KID] | sframe_key, sframe_salt = key_store[KID] | |||
ctr = encode_big_endian(CTR, AEAD.Nn) | ctr = encode_big_endian(CTR, AEAD.Nn) | |||
nonce = xor(sframe_salt, ctr) | nonce = xor(sframe_salt, ctr) | |||
aad = header + metadata | aad = header + metadata | |||
return AEAD.Decrypt(sframe_key, nonce, aad, ciphertext) | return AEAD.Decrypt(sframe_key, nonce, aad, ciphertext) | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<t>If a ciphertext fails to decrypt because there is no key available | ||||
<t>If a ciphertext fails to decrypt because there is no key available for the KI | for the KID | |||
D | ||||
in the SFrame header, the client <bcp14>MAY</bcp14> buffer the ciphertext and re try decryption | in the SFrame header, the client <bcp14>MAY</bcp14> buffer the ciphertext and re try decryption | |||
once a key with that KID is received. If a ciphertext fails to decrypt for any | once a key with that KID is received. If a ciphertext fails to decrypt for any | |||
other reason, the client <bcp14>MUST</bcp14> discard the ciphertext. Invalid cip hertexts <bcp14>SHOULD</bcp14> be | other reason, the client <bcp14>MUST</bcp14> discard the ciphertext. Invalid cip hertexts <bcp14>SHOULD</bcp14> be | |||
discarded in a way that is indistinguishable (to an external observer) from havi ng | discarded in a way that is indistinguishable (to an external observer) from havi ng | |||
processed a valid ciphertext. In other words, the SFrame decrypt operation | processed a valid ciphertext. In other words, the SFrame decrypt operation | |||
should take the same amount of time regardless of whether decryption succeeds or fails.</t> | should take the same amount of time regardless of whether decryption succeeds or fails.</t> | |||
<figure> | ||||
<figure title="Decrypting an SFrame Ciphertext"><artset><artwork type="svg"><sv | <name>Decrypting an SFrame Ciphertext</name> | |||
g xmlns="http://www.w3.org/2000/svg" version="1.1" height="640" width="384" view | <artset> | |||
Box="0 0 384 640" class="diagram" text-anchor="middle" font-family="monospace" f | <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" versio | |||
ont-size="13px" stroke-linecap="round"> | n="1.1" height="640" width="384" viewBox="0 0 384 640" class="diagram" text-anch | |||
<path d="M 8,64 L 8,432" fill="none" stroke="black"/> | or="middle" font-family="monospace" font-size="13px" stroke-linecap="round"> | |||
<path d="M 32,224 L 32,320" fill="none" stroke="black"/> | <path d="M 8,64 L 8,432" fill="none" stroke="black"/> | |||
<path d="M 64,208 L 64,336" fill="none" stroke="black"/> | <path d="M 32,224 L 32,320" fill="none" stroke="black"/> | |||
<path d="M 96,368 L 96,400" fill="none" stroke="black"/> | <path d="M 64,208 L 64,336" fill="none" stroke="black"/> | |||
<path d="M 112,208 L 112,336" fill="none" stroke="black"/> | <path d="M 96,368 L 96,400" fill="none" stroke="black"/> | |||
<path d="M 136,48 L 136,176" fill="none" stroke="black"/> | <path d="M 112,208 L 112,336" fill="none" stroke="black"/> | |||
<path d="M 136,224 L 136,256" fill="none" stroke="black"/> | <path d="M 136,48 L 136,176" fill="none" stroke="black"/> | |||
<path d="M 160,400 L 160,432" fill="none" stroke="black"/> | <path d="M 136,224 L 136,256" fill="none" stroke="black"/> | |||
<path d="M 232,368 L 232,400" fill="none" stroke="black"/> | <path d="M 160,400 L 160,432" fill="none" stroke="black"/> | |||
<path d="M 248,512 L 248,608" fill="none" stroke="black"/> | <path d="M 232,368 L 232,400" fill="none" stroke="black"/> | |||
<path d="M 264,48 L 264,176" fill="none" stroke="black"/> | <path d="M 248,512 L 248,608" fill="none" stroke="black"/> | |||
<path d="M 288,256 L 288,288" fill="none" stroke="black"/> | <path d="M 264,48 L 264,176" fill="none" stroke="black"/> | |||
<path d="M 312,112 L 312,448" fill="none" stroke="black"/> | <path d="M 288,256 L 288,288" fill="none" stroke="black"/> | |||
<path d="M 312,496 L 312,504" fill="none" stroke="black"/> | <path d="M 312,112 L 312,448" fill="none" stroke="black"/> | |||
<path d="M 376,512 L 376,608" fill="none" stroke="black"/> | <path d="M 312,496 L 312,504" fill="none" stroke="black"/> | |||
<path d="M 136,48 L 264,48" fill="none" stroke="black"/> | <path d="M 376,512 L 376,608" fill="none" stroke="black"/> | |||
<path d="M 8,64 L 128,64" fill="none" stroke="black"/> | <path d="M 136,48 L 264,48" fill="none" stroke="black"/> | |||
<path d="M 136,80 L 264,80" fill="none" stroke="black"/> | <path d="M 8,64 L 128,64" fill="none" stroke="black"/> | |||
<path d="M 272,112 L 312,112" fill="none" stroke="black"/> | <path d="M 136,80 L 264,80" fill="none" stroke="black"/> | |||
<path d="M 136,176 L 264,176" fill="none" stroke="black"/> | <path d="M 272,112 L 312,112" fill="none" stroke="black"/> | |||
<path d="M 64,208 L 112,208" fill="none" stroke="black"/> | <path d="M 136,176 L 264,176" fill="none" stroke="black"/> | |||
<path d="M 112,224 L 160,224" fill="none" stroke="black"/> | <path d="M 64,208 L 112,208" fill="none" stroke="black"/> | |||
<path d="M 264,224 L 304,224" fill="none" stroke="black"/> | <path d="M 112,224 L 160,224" fill="none" stroke="black"/> | |||
<path d="M 136,256 L 160,256" fill="none" stroke="black"/> | <path d="M 264,224 L 304,224" fill="none" stroke="black"/> | |||
<path d="M 272,256 L 288,256" fill="none" stroke="black"/> | <path d="M 136,256 L 160,256" fill="none" stroke="black"/> | |||
<path d="M 8,272 L 24,272" fill="none" stroke="black"/> | <path d="M 272,256 L 288,256" fill="none" stroke="black"/> | |||
<path d="M 64,272 L 112,272" fill="none" stroke="black"/> | <path d="M 8,272 L 24,272" fill="none" stroke="black"/> | |||
<path d="M 112,288 L 304,288" fill="none" stroke="black"/> | <path d="M 64,272 L 112,272" fill="none" stroke="black"/> | |||
<path d="M 64,336 L 112,336" fill="none" stroke="black"/> | <path d="M 112,288 L 304,288" fill="none" stroke="black"/> | |||
<path d="M 96,368 L 232,368" fill="none" stroke="black"/> | <path d="M 64,336 L 112,336" fill="none" stroke="black"/> | |||
<path d="M 96,400 L 232,400" fill="none" stroke="black"/> | <path d="M 96,368 L 232,368" fill="none" stroke="black"/> | |||
<path d="M 8,432 L 304,432" fill="none" stroke="black"/> | <path d="M 96,400 L 232,400" fill="none" stroke="black"/> | |||
<path d="M 248,512 L 376,512" fill="none" stroke="black"/> | <path d="M 8,432 L 304,432" fill="none" stroke="black"/> | |||
<path d="M 248,608 L 376,608" fill="none" stroke="black"/> | <path d="M 248,512 L 376,512" fill="none" stroke="black"/> | |||
<path d="M 48,208 C 39.16936,208 32,215.16936 32,224" fill="none" stroke="black" | <path d="M 248,608 L 376,608" fill="none" stroke="black"/> | |||
/> | <path d="M 48,208 C 39.16936,208 32,215.16936 32,224" fill="no | |||
<path d="M 48,336 C 39.16936,336 32,328.83064 32,320" fill="none" stroke="black" | ne" stroke="black"/> | |||
/> | <path d="M 48,336 C 39.16936,336 32,328.83064 32,320" fill="no | |||
<polygon class="arrowhead" points="320,504 308,498.4 308,509.6" fill="black" tra | ne" stroke="black"/> | |||
nsform="rotate(90,312,504)"/> | <polygon class="arrowhead" points="320,504 308,498.4 308,509.6 | |||
<polygon class="arrowhead" points="312,432 300,426.4 300,437.6" fill="black" tra | " fill="black" transform="rotate(90,312,504)"/> | |||
nsform="rotate(0,304,432)"/> | <polygon class="arrowhead" points="312,432 300,426.4 300,437.6 | |||
<polygon class="arrowhead" points="312,288 300,282.4 300,293.6" fill="black" tra | " fill="black" transform="rotate(0,304,432)"/> | |||
nsform="rotate(0,304,288)"/> | <polygon class="arrowhead" points="312,288 300,282.4 300,293.6 | |||
<polygon class="arrowhead" points="312,224 300,218.4 300,229.6" fill="black" tra | " fill="black" transform="rotate(0,304,288)"/> | |||
nsform="rotate(0,304,224)"/> | <polygon class="arrowhead" points="312,224 300,218.4 300,229.6 | |||
<polygon class="arrowhead" points="168,256 156,250.4 156,261.6" fill="black" tra | " fill="black" transform="rotate(0,304,224)"/> | |||
nsform="rotate(0,160,256)"/> | <polygon class="arrowhead" points="168,256 156,250.4 156,261.6 | |||
<polygon class="arrowhead" points="168,224 156,218.4 156,229.6" fill="black" tra | " fill="black" transform="rotate(0,160,256)"/> | |||
nsform="rotate(0,160,224)"/> | <polygon class="arrowhead" points="168,224 156,218.4 156,229.6 | |||
<polygon class="arrowhead" points="32,272 20,266.4 20,277.6" fill="black" transf | " fill="black" transform="rotate(0,160,224)"/> | |||
orm="rotate(0,24,272)"/> | <polygon class="arrowhead" points="32,272 20,266.4 20,277.6" f | |||
<g class="text"> | ill="black" transform="rotate(0,24,272)"/> | |||
<text x="156" y="36">SFrame</text> | <g class="text"> | |||
<text x="228" y="36">Ciphertext</text> | <text x="156" y="36">SFrame</text> | |||
<text x="172" y="68">SFrame</text> | <text x="228" y="36">Ciphertext</text> | |||
<text x="228" y="68">Header</text> | <text x="172" y="68">SFrame</text> | |||
<text x="204" y="132">ciphertext</text> | <text x="228" y="68">Header</text> | |||
<text x="212" y="228">sframe_key</text> | <text x="204" y="132">ciphertext</text> | |||
<text x="336" y="228">Key</text> | <text x="212" y="228">sframe_key</text> | |||
<text x="88" y="244">KID</text> | <text x="336" y="228">Key</text> | |||
<text x="216" y="260">sframe_salt</text> | <text x="88" y="244">KID</text> | |||
<text x="344" y="292">Nonce</text> | <text x="216" y="260">sframe_salt</text> | |||
<text x="88" y="308">CTR</text> | <text x="344" y="292">Nonce</text> | |||
<text x="164" y="388">metadata</text> | <text x="88" y="308">CTR</text> | |||
<text x="336" y="436">AAD</text> | <text x="164" y="388">metadata</text> | |||
<text x="316" y="468">AEAD.Decrypt</text> | <text x="336" y="436">AAD</text> | |||
<text x="312" y="484">|</text> | <text x="316" y="468">AEAD.Decrypt</text> | |||
<text x="312" y="564">plaintext</text> | <text x="312" y="484">|</text> | |||
</g> | <text x="312" y="564">plaintext</text> | |||
</svg> | </g> | |||
</artwork><artwork type="ascii-art"><![CDATA[ | </svg> | |||
</artwork> | ||||
<artwork type="ascii-art"><![CDATA[ | ||||
SFrame Ciphertext | SFrame Ciphertext | |||
+---------------+ | +---------------+ | |||
+---------------| SFrame Header | | +---------------| SFrame Header | | |||
| +---------------+ | | +---------------+ | |||
| | | | | | | | |||
| | |-----+ | | | |-----+ | |||
| | ciphertext | | | | | ciphertext | | | |||
| | | | | | | | | | |||
| | | | | | | | | | |||
| +---------------+ | | | +---------------+ | | |||
skipping to change at line 1029 ¶ | skipping to change at line 1037 ¶ | |||
AEAD.Decrypt | AEAD.Decrypt | |||
| | | | |||
V | V | |||
+---------------+ | +---------------+ | |||
| | | | | | |||
| | | | | | |||
| plaintext | | | plaintext | | |||
| | | | | | |||
| | | | | | |||
+---------------+ | +---------------+ | |||
]]></artwork></artset></figure> | ]]></artwork> | |||
</artset> | ||||
</section> | </figure> | |||
</section> | </section> | |||
<section anchor="cipher-suites"><name>Cipher Suites</name> | </section> | |||
<section anchor="cipher-suites"> | ||||
<t>Each SFrame session uses a single cipher suite that specifies the following | <name>Cipher Suites</name> | |||
<t>Each SFrame session uses a single cipher suite that specifies the fol | ||||
lowing | ||||
primitives:</t> | primitives:</t> | |||
<ul spacing="normal"> | ||||
<t><list style="symbols"> | <li> | |||
<t>A hash function used for key derivation</t> | <t>A hash function used for key derivation</t> | |||
<t>An AEAD encryption algorithm <xref target="RFC5116"></xref> used for frame | </li> | |||
encryption, optionally | <li> | |||
<t>An AEAD encryption algorithm <xref target="RFC5116"/> used for fr | ||||
ame encryption, optionally | ||||
with a truncated authentication tag</t> | with a truncated authentication tag</t> | |||
</list></t> | </li> | |||
</ul> | ||||
<t>This document defines the following cipher suites, with the constants defined | <t>This document defines the following cipher suites, with the constants | |||
in | defined in | |||
<xref target="encryption-schema"/>:</t> | <xref target="encryption-schema"/>:</t> | |||
<table anchor="cipher-suite-constants"> | ||||
<texttable title="SFrame Cipher Suite Constants" anchor="cipher-suite-constants" | <name>SFrame Cipher Suite Constants</name> | |||
> | <thead> | |||
<ttcol align='left'>Name</ttcol> | <tr> | |||
<ttcol align='left'>Nh</ttcol> | <th align="left">Name</th> | |||
<ttcol align='left'>Nka</ttcol> | <th align="left">Nh</th> | |||
<ttcol align='left'>Nk</ttcol> | <th align="left">Nka</th> | |||
<ttcol align='left'>Nn</ttcol> | <th align="left">Nk</th> | |||
<ttcol align='left'>Nt</ttcol> | <th align="left">Nn</th> | |||
<c><spanx style="verb">AES_128_CTR_HMAC_SHA256_80</spanx></c> | <th align="left">Nt</th> | |||
<c>32</c> | </tr> | |||
<c>16</c> | </thead> | |||
<c>48</c> | <tbody> | |||
<c>12</c> | <tr> | |||
<c>10</c> | <td align="left"> | |||
<c><spanx style="verb">AES_128_CTR_HMAC_SHA256_64</spanx></c> | <tt>AES_128_CTR_HMAC_SHA256_80</tt></td> | |||
<c>32</c> | <td align="left">32</td> | |||
<c>16</c> | <td align="left">16</td> | |||
<c>48</c> | <td align="left">48</td> | |||
<c>12</c> | <td align="left">12</td> | |||
<c>8</c> | <td align="left">10</td> | |||
<c><spanx style="verb">AES_128_CTR_HMAC_SHA256_32</spanx></c> | </tr> | |||
<c>32</c> | <tr> | |||
<c>16</c> | <td align="left"> | |||
<c>48</c> | <tt>AES_128_CTR_HMAC_SHA256_64</tt></td> | |||
<c>12</c> | <td align="left">32</td> | |||
<c>4</c> | <td align="left">16</td> | |||
<c><spanx style="verb">AES_128_GCM_SHA256_128</spanx></c> | <td align="left">48</td> | |||
<c>32</c> | <td align="left">12</td> | |||
<c>n/a</c> | <td align="left">8</td> | |||
<c>16</c> | </tr> | |||
<c>12</c> | <tr> | |||
<c>16</c> | <td align="left"> | |||
<c><spanx style="verb">AES_256_GCM_SHA512_128</spanx></c> | <tt>AES_128_CTR_HMAC_SHA256_32</tt></td> | |||
<c>64</c> | <td align="left">32</td> | |||
<c>n/a</c> | <td align="left">16</td> | |||
<c>32</c> | <td align="left">48</td> | |||
<c>12</c> | <td align="left">12</td> | |||
<c>16</c> | <td align="left">4</td> | |||
</texttable> | </tr> | |||
<tr> | ||||
<t>Numeric identifiers for these cipher suites are defined in the IANA registry | <td align="left"> | |||
<tt>AES_128_GCM_SHA256_128</tt></td> | ||||
<td align="left">32</td> | ||||
<td align="left">n/a</td> | ||||
<td align="left">16</td> | ||||
<td align="left">12</td> | ||||
<td align="left">16</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left"> | ||||
<tt>AES_256_GCM_SHA512_128</tt></td> | ||||
<td align="left">64</td> | ||||
<td align="left">n/a</td> | ||||
<td align="left">32</td> | ||||
<td align="left">12</td> | ||||
<td align="left">16</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>Numeric identifiers for these cipher suites are defined in the IANA r | ||||
egistry | ||||
created in <xref target="sframe-cipher-suites"/>.</t> | created in <xref target="sframe-cipher-suites"/>.</t> | |||
<t>In the suite names, the length of the authentication tag is indicated | ||||
<t>In the suite names, the length of the authentication tag is indicated by | by | |||
the last value: "_128" indicates a 128-bit tag, "_80" indicates | the last value: "_128" indicates a 128-bit tag, "_80" indicates | |||
an 80-bit tag, "_64" indicates a 64-bit tag, and "_32" indicates a | an 80-bit tag, "_64" indicates a 64-bit tag, and "_32" indicates a | |||
32-bit tag.</t> | 32-bit tag.</t> | |||
<t>In a session that uses multiple media streams, different cipher suite | ||||
<t>In a session that uses multiple media streams, different cipher suites might | s might be | |||
be | ||||
configured for different media streams. For example, in order to conserve | configured for different media streams. For example, in order to conserve | |||
bandwidth, a session might use a cipher suite with 80-bit tags for video frames | bandwidth, a session might use a cipher suite with 80-bit tags for video frames | |||
and another cipher suite with 32-bit tags for audio frames.</t> | and another cipher suite with 32-bit tags for audio frames.</t> | |||
<section anchor="aes-ctr-with-sha2"> | ||||
<section anchor="aes-ctr-with-sha2"><name>AES-CTR with SHA2</name> | <name>AES-CTR with SHA2</name> | |||
<t>In order to allow very short tag sizes, we define a synthetic AEAD | ||||
<t>In order to allow very short tag sizes, we define a synthetic AEAD function | function | |||
using the authenticated counter mode of AES together with HMAC for | using the authenticated counter mode of AES together with HMAC for | |||
authentication. We use an encrypt-then-MAC approach, as in SRTP <xref target="R FC3711"/>.</t> | authentication. We use an encrypt-then-MAC approach, as in SRTP <xref target="R FC3711"/>.</t> | |||
<t>Before encryption or decryption, encryption and authentication subk | ||||
<t>Before encryption or decryption, encryption and authentication subkeys are | eys are | |||
derived from the single AEAD key. The overall length of the AEAD key is <spanx | derived from the single AEAD key. The overall length of the AEAD key is <tt>Nka | |||
style="verb">Nka + | + | |||
Nh</spanx>, where <spanx style="verb">Nka</spanx> represents the key size for th | Nh</tt>, where <tt>Nka</tt> represents the key size for the AES block cipher in | |||
e AES block cipher in use and <spanx style="verb">Nh</spanx> | use and <tt>Nh</tt> | |||
represents the output size of the hash function (as in <xref target="encryption -schema"/>). | represents the output size of the hash function (as in <xref target="encryption -schema"/>). | |||
The encryption subkey comprises the first <spanx style="verb">Nka</spanx> bytes | The encryption subkey comprises the first <tt>Nka</tt> bytes and the authenticat | |||
and the authentication | ion | |||
subkey comprises the remaining <spanx style="verb">Nh</spanx> bytes.</t> | subkey comprises the remaining <tt>Nh</tt> bytes.</t> | |||
<sourcecode type="pseudocode"><![CDATA[ | ||||
<figure><sourcecode type="pseudocode"><![CDATA[ | ||||
def derive_subkeys(sframe_key): | def derive_subkeys(sframe_key): | |||
# The encryption key comprises the first Nka bytes | # The encryption key comprises the first Nka bytes | |||
enc_key = sframe_key[..Nka] | enc_key = sframe_key[..Nka] | |||
# The authentication key comprises Nh remaining bytes | # The authentication key comprises Nh remaining bytes | |||
auth_key = sframe_key[Nka..] | auth_key = sframe_key[Nka..] | |||
return enc_key, auth_key | return enc_key, auth_key | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<t>The AEAD encryption and decryption functions are then composed of i | ||||
<t>The AEAD encryption and decryption functions are then composed of individual | ndividual | |||
calls to the CTR encrypt function and HMAC. The resulting MAC value is truncate d | calls to the CTR encrypt function and HMAC. The resulting MAC value is truncate d | |||
to a number of bytes <spanx style="verb">Nt</spanx> fixed by the cipher suite.</ | to a number of bytes <tt>Nt</tt> fixed by the cipher suite.</t> | |||
t> | <sourcecode type="pseudocode"><![CDATA[ | |||
<figure><sourcecode type="pseudocode"><![CDATA[ | ||||
def truncate(tag, n): | def truncate(tag, n): | |||
# Take the first `n` bytes of `tag` | # Take the first `n` bytes of `tag` | |||
return tag[..n] | return tag[..n] | |||
def compute_tag(auth_key, nonce, aad, ct): | def compute_tag(auth_key, nonce, aad, ct): | |||
aad_len = encode_big_endian(len(aad), 8) | aad_len = encode_big_endian(len(aad), 8) | |||
ct_len = encode_big_endian(len(ct), 8) | ct_len = encode_big_endian(len(ct), 8) | |||
tag_len = encode_big_endian(Nt, 8) | tag_len = encode_big_endian(Nt, 8) | |||
auth_data = aad_len + ct_len + tag_len + nonce + aad + ct | auth_data = aad_len + ct_len + tag_len + nonce + aad + ct | |||
tag = HMAC(auth_key, auth_data) | tag = HMAC(auth_key, auth_data) | |||
skipping to change at line 1157 ¶ | skipping to change at line 1181 ¶ | |||
def AEAD.Decrypt(key, nonce, aad, ct): | def AEAD.Decrypt(key, nonce, aad, ct): | |||
inner_ct, tag = split_ct(ct, tag_len) | inner_ct, tag = split_ct(ct, tag_len) | |||
enc_key, auth_key = derive_subkeys(key) | enc_key, auth_key = derive_subkeys(key) | |||
candidate_tag = compute_tag(auth_key, nonce, aad, inner_ct) | candidate_tag = compute_tag(auth_key, nonce, aad, inner_ct) | |||
if !constant_time_equal(tag, candidate_tag): | if !constant_time_equal(tag, candidate_tag): | |||
raise Exception("Authentication Failure") | raise Exception("Authentication Failure") | |||
initial_counter = nonce + 0x00000000 # append four zero bytes | initial_counter = nonce + 0x00000000 # append four zero bytes | |||
return AES-CTR.Decrypt(enc_key, initial_counter, inner_ct) | return AES-CTR.Decrypt(enc_key, initial_counter, inner_ct) | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
</section> | ||||
</section> | </section> | |||
</section> | </section> | |||
</section> | <section anchor="key-management"> | |||
<section anchor="key-management"><name>Key Management</name> | <name>Key Management</name> | |||
<t>SFrame must be integrated with an E2E key management framework to excha | ||||
<t>SFrame must be integrated with an E2E key management framework to exchange an | nge and | |||
d | ||||
rotate the keys used for SFrame encryption. The key management | rotate the keys used for SFrame encryption. The key management | |||
framework provides the following functions:</t> | framework provides the following functions:</t> | |||
<ul spacing="normal"> | ||||
<t><list style="symbols"> | <li> | |||
<t>Provisioning KID / <spanx style="verb">base_key</spanx> mappings to partici | <t>Provisioning KID / <tt>base_key</tt> mappings to participating clie | |||
pating clients</t> | nts</t> | |||
<t>Updating the above data as clients join or leave</t> | </li> | |||
</list></t> | <li> | |||
<t>Updating the above data as clients join or leave</t> | ||||
<t>It is the responsibility of the application to provide the key management | </li> | |||
</ul> | ||||
<t>It is the responsibility of the application to provide the key manageme | ||||
nt | ||||
framework, as described in <xref target="key-management-framework"/>.</t> | framework, as described in <xref target="key-management-framework"/>.</t> | |||
<section anchor="sender-keys"> | ||||
<section anchor="sender-keys"><name>Sender Keys</name> | <name>Sender Keys</name> | |||
<t>If the participants in a call have a preexisting E2E-secure channel, | ||||
<t>If the participants in a call have a preexisting E2E-secure channel, they can | they can | |||
use it to distribute SFrame keys. Each client participating in a call generates | use it to distribute SFrame keys. Each client participating in a call generates | |||
a fresh <spanx style="verb">base_key</spanx> value that it will use to encrypt m edia. The client then uses | a fresh <tt>base_key</tt> value that it will use to encrypt media. The client th en uses | |||
the E2E-secure channel to send their encryption key to the other participants.</ t> | the E2E-secure channel to send their encryption key to the other participants.</ t> | |||
<t>In this scheme, it is assumed that receivers have a signal outside of | ||||
<t>In this scheme, it is assumed that receivers have a signal outside of SFrame | SFrame for | |||
for | ||||
which client has sent a given frame (e.g., an RTP synchronization source (SSRC)) . SFrame KID | which client has sent a given frame (e.g., an RTP synchronization source (SSRC)) . SFrame KID | |||
values are then used to distinguish between versions of the sender's <spanx styl | values are then used to distinguish between versions of the sender's <tt>base_ke | |||
e="verb">base_key</spanx>.</t> | y</tt>.</t> | |||
<t>KID values in this scheme have two parts: a "key generation" and a "r | ||||
<t>KID values in this scheme have two parts: a "key generation" and a "ratchet s | atchet step". | |||
tep". | ||||
Both are unsigned integers that begin at zero. The key generation increments | Both are unsigned integers that begin at zero. The key generation increments | |||
each time the sender distributes a new key to receivers. The ratchet step is | each time the sender distributes a new key to receivers. The ratchet step is | |||
incremented each time the sender ratchets their key forward for forward secrecy: </t> | incremented each time the sender ratchets their key forward for forward secrecy: </t> | |||
<sourcecode type="pseudocode"><![CDATA[ | ||||
<figure><sourcecode type="pseudocode"><![CDATA[ | ||||
base_key[i+1] = HKDF-Expand( | base_key[i+1] = HKDF-Expand( | |||
HKDF-Extract("", base_key[i]), | HKDF-Extract("", base_key[i]), | |||
"SFrame 1.0 Ratchet", CipherSuite.Nh) | "SFrame 1.0 Ratchet", CipherSuite.Nh) | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<t>For compactness, we do not send the whole ratchet step. Instead, we | ||||
<t>For compactness, we do not send the whole ratchet step. Instead, we send onl | send only | |||
y | its low-order <tt>R</tt> bits, where <tt>R</tt> is a value set by the applicatio | |||
its low-order <spanx style="verb">R</spanx> bits, where <spanx style="verb">R</s | n. Different | |||
panx> is a value set by the application. Different | senders may use different values of <tt>R</tt>, but each receiver of a given sen | |||
senders may use different values of <spanx style="verb">R</spanx>, but each rece | der | |||
iver of a given sender | needs to know what value of <tt>R</tt> is used by the sender so that they can re | |||
needs to know what value of <spanx style="verb">R</spanx> is used by the sender | cognize | |||
so that they can recognize | when they need to ratchet (vs. expecting a new key). <tt>R</tt> effectively def | |||
when they need to ratchet (vs. expecting a new key). <spanx style="verb">R</spa | ines a | |||
nx> effectively defines a | reordering window, since no more than 2<sup><tt>R</tt></sup> ratchet steps can b | |||
reordering window, since no more than 2<sup><spanx style="verb">R</spanx></sup> | e | |||
ratchet steps can be | active at a given time. The key generation is sent in the remaining <tt>64 - R< | |||
active at a given time. The key generation is sent in the remaining <spanx styl | /tt> | |||
e="verb">64 - R</spanx> | ||||
bits of the KID.</t> | bits of the KID.</t> | |||
<sourcecode type="pseudocode"><![CDATA[ | ||||
<figure><sourcecode type="pseudocode"><![CDATA[ | ||||
KID = (key_generation << R) + (ratchet_step % (1 << R)) | KID = (key_generation << R) + (ratchet_step % (1 << R)) | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<figure anchor="sender-keys-kid"> | ||||
<figure title="Structure of a KID in the Sender Keys Scheme" anchor="sender-keys | <name>Structure of a KID in the Sender Keys Scheme</name> | |||
-kid"><artset><artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" versi | <artset> | |||
on="1.1" height="112" width="280" viewBox="0 0 280 112" class="diagram" text-anc | <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version= | |||
hor="middle" font-family="monospace" font-size="13px" stroke-linecap="round"> | "1.1" height="112" width="280" viewBox="0 0 280 112" class="diagram" text-anchor | |||
<path d="M 8,64 L 8,96" fill="none" stroke="black"/> | ="middle" font-family="monospace" font-size="13px" stroke-linecap="round"> | |||
<path d="M 152,64 L 152,96" fill="none" stroke="black"/> | <path d="M 8,64 L 8,96" fill="none" stroke="black"/> | |||
<path d="M 272,64 L 272,96" fill="none" stroke="black"/> | <path d="M 152,64 L 152,96" fill="none" stroke="black"/> | |||
<path d="M 16,48 L 144,48" fill="none" stroke="black"/> | <path d="M 272,64 L 272,96" fill="none" stroke="black"/> | |||
<path d="M 160,48 L 264,48" fill="none" stroke="black"/> | <path d="M 16,48 L 144,48" fill="none" stroke="black"/> | |||
<path d="M 8,64 L 272,64" fill="none" stroke="black"/> | <path d="M 160,48 L 264,48" fill="none" stroke="black"/> | |||
<path d="M 8,96 L 272,96" fill="none" stroke="black"/> | <path d="M 8,64 L 272,64" fill="none" stroke="black"/> | |||
<polygon class="arrowhead" points="272,48 260,42.4 260,53.6" fill="black" transf | <path d="M 8,96 L 272,96" fill="none" stroke="black"/> | |||
orm="rotate(0,264,48)"/> | <polygon class="arrowhead" points="272,48 260,42.4 260,53.6" fil | |||
<polygon class="arrowhead" points="168,48 156,42.4 156,53.6" fill="black" transf | l="black" transform="rotate(0,264,48)"/> | |||
orm="rotate(180,160,48)"/> | <polygon class="arrowhead" points="168,48 156,42.4 156,53.6" fil | |||
<polygon class="arrowhead" points="152,48 140,42.4 140,53.6" fill="black" transf | l="black" transform="rotate(180,160,48)"/> | |||
orm="rotate(0,144,48)"/> | <polygon class="arrowhead" points="152,48 140,42.4 140,53.6" fil | |||
<polygon class="arrowhead" points="24,48 12,42.4 12,53.6" fill="black" transform | l="black" transform="rotate(0,144,48)"/> | |||
="rotate(180,16,48)"/> | <polygon class="arrowhead" points="24,48 12,42.4 12,53.6" fill=" | |||
<g class="text"> | black" transform="rotate(180,16,48)"/> | |||
<text x="60" y="36">64-R</text> | <g class="text"> | |||
<text x="100" y="36">bits</text> | <text x="60" y="36">64-R</text> | |||
<text x="192" y="36">R</text> | <text x="100" y="36">bits</text> | |||
<text x="220" y="36">bits</text> | <text x="192" y="36">R</text> | |||
<text x="32" y="84">Key</text> | <text x="220" y="36">bits</text> | |||
<text x="92" y="84">Generation</text> | <text x="32" y="84">Key</text> | |||
<text x="192" y="84">Ratchet</text> | <text x="92" y="84">Generation</text> | |||
<text x="244" y="84">Step</text> | <text x="192" y="84">Ratchet</text> | |||
</g> | <text x="244" y="84">Step</text> | |||
</svg> | </g> | |||
</artwork><artwork type="ascii-art"><![CDATA[ | </svg> | |||
</artwork> | ||||
<artwork type="ascii-art"><![CDATA[ | ||||
64-R bits R bits | 64-R bits R bits | |||
<---------------> <------------> | <---------------> <------------> | |||
+-----------------+--------------+ | +-----------------+--------------+ | |||
| Key Generation | Ratchet Step | | | Key Generation | Ratchet Step | | |||
+-----------------+--------------+ | +-----------------+--------------+ | |||
]]></artwork></artset></figure> | ]]></artwork> | |||
</artset> | ||||
<t>The sender signals such a ratchet step update by sending with a KID value in | </figure> | |||
<t>The sender signals such a ratchet step update by sending with a KID v | ||||
alue in | ||||
which the ratchet step has been incremented. A receiver who receives from a | which the ratchet step has been incremented. A receiver who receives from a | |||
sender with a new KID computes the new key as above. The old key may be kept | sender with a new KID computes the new key as above. The old key may be kept | |||
for some time to allow for out-of-order delivery, but should be deleted | for some time to allow for out-of-order delivery, but should be deleted | |||
promptly.</t> | promptly.</t> | |||
<t>If a new participant joins in the middle of a session, they will need | ||||
<t>If a new participant joins in the middle of a session, they will need to rece | to receive | |||
ive | ||||
from each sender (a) the current sender key for that sender and (b) the current | from each sender (a) the current sender key for that sender and (b) the current | |||
KID value for the sender. Evicting a participant requires each sender to send | KID value for the sender. Evicting a participant requires each sender to send | |||
a fresh sender key to all receivers.</t> | a fresh sender key to all receivers.</t> | |||
<t>It is the application's responsibility to decide when sender keys are | ||||
<t>It is the application's responsibility to decide when sender keys are updated | updated. A sender | |||
. A sender | key may be updated by sending a new <tt>base_key</tt> (updating the key generati | |||
key may be updated by sending a new <spanx style="verb">base_key</spanx> (updati | on) or | |||
ng the key generation) or | by hashing the current <tt>base_key</tt> (updating the ratchet step). Ratchetin | |||
by hashing the current <spanx style="verb">base_key</spanx> (updating the ratche | g the | |||
t step). Ratcheting the | ||||
key forward is useful when adding new receivers to an SFrame-based interaction, | key forward is useful when adding new receivers to an SFrame-based interaction, | |||
since it ensures that the new receivers can't decrypt any media encrypted before | since it ensures that the new receivers can't decrypt any media encrypted before | |||
they were added. If a sender wishes to assure the opposite property when | they were added. If a sender wishes to assure the opposite property when | |||
removing a receiver (i.e., ensuring that the receiver can't decrypt media after | removing a receiver (i.e., ensuring that the receiver can't decrypt media after | |||
they are removed), then the sender will need to distribute a new sender key.</t> | they are removed), then the sender will need to distribute a new sender key.</t> | |||
</section> | ||||
</section> | <section anchor="mls"> | |||
<section anchor="mls"><name>MLS</name> | <name>MLS</name> | |||
<t>The Messaging Layer Security (MLS) protocol provides group authentica | ||||
<t>The Messaging Layer Security (MLS) protocol provides group authenticated key | ted key | |||
exchange <xref target="MLS-ARCH"/> <xref target="MLS-PROTO"/>. In | exchange <xref target="I-D.ietf-mls-architecture"/> <xref target="RFC9420"/>. I | |||
n | ||||
principle, it could be used to instantiate the sender key scheme above, but it | principle, it could be used to instantiate the sender key scheme above, but it | |||
can also be used more efficiently directly.</t> | can also be used more efficiently directly.</t> | |||
<t>MLS creates a linear sequence of keys, each of which is shared among | ||||
<t>MLS creates a linear sequence of keys, each of which is shared among the memb | the members | |||
ers | ||||
of a group at a given point in time. When a member joins or leaves the group, a | of a group at a given point in time. When a member joins or leaves the group, a | |||
new key is produced that is known only to the augmented or reduced group. Each | new key is produced that is known only to the augmented or reduced group. Each | |||
step in the lifetime of the group is known as an "epoch", and each member of the | step in the lifetime of the group is known as an "epoch", and each member of the | |||
group is assigned an "index" that is constant for the time they are in the | group is assigned an "index" that is constant for the time they are in the | |||
group.</t> | group.</t> | |||
<t>To generate keys and nonces for SFrame, we use the MLS exporter funct | ||||
<t>To generate keys and nonces for SFrame, we use the MLS exporter function to | ion to | |||
generate a <spanx style="verb">base_key</spanx> value for each MLS epoch. Each | generate a <tt>base_key</tt> value for each MLS epoch. Each member of the group | |||
member of the group is | is | |||
assigned a set of KID values so that each member has a unique <spanx style="verb | assigned a set of KID values so that each member has a unique <tt>sframe_key</tt | |||
">sframe_key</spanx> and | > and | |||
<spanx style="verb">sframe_salt</spanx> that it uses to encrypt with. Senders m | <tt>sframe_salt</tt> that it uses to encrypt with. Senders may choose any KID v | |||
ay choose any KID value | alue | |||
within their assigned set of KID values, e.g., to allow a single sender to send | within their assigned set of KID values, e.g., to allow a single sender to send | |||
multiple, uncoordinated outbound media streams.</t> | multiple, uncoordinated outbound media streams.</t> | |||
<sourcecode type="pseudocode"><![CDATA[ | ||||
<figure><sourcecode type="pseudocode"><![CDATA[ | ||||
base_key = MLS-Exporter("SFrame 1.0 Base Key", "", AEAD.Nk) | base_key = MLS-Exporter("SFrame 1.0 Base Key", "", AEAD.Nk) | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<t>For compactness, we do not send the whole epoch number. Instead, we | ||||
<t>For compactness, we do not send the whole epoch number. Instead, we send onl | send only | |||
y | its low-order <tt>E</tt> bits, where <tt>E</tt> is a value set by the applicatio | |||
its low-order <spanx style="verb">E</spanx> bits, where <spanx style="verb">E</s | n. <tt>E</tt> | |||
panx> is a value set by the application. <spanx style="verb">E</spanx> | effectively defines a reordering window, since no more than 2<sup><tt>E</tt></su | |||
effectively defines a reordering window, since no more than 2<sup><spanx style=" | p> | |||
verb">E</spanx></sup> | ||||
epochs can be active at a given time. To handle rollover of the epoch counter, | epochs can be active at a given time. To handle rollover of the epoch counter, | |||
receivers <bcp14>MUST</bcp14> remove an old epoch when a new epoch with the same low-order | receivers <bcp14>MUST</bcp14> remove an old epoch when a new epoch with the same low-order | |||
E bits is introduced.</t> | E bits is introduced.</t> | |||
<t>Let <tt>S</tt> be the number of bits required to encode a member inde | ||||
<t>Let <spanx style="verb">S</spanx> be the number of bits required to encode a | x in the group, | |||
member index in the group, | i.e., the smallest value such that <tt>group_size <= (1 << S)</tt>. Th | |||
i.e., the smallest value such that <spanx style="verb">group_size <= (1 <& | e sender index | |||
lt; S)</spanx>. The sender index | is encoded in the <tt>S</tt> bits above the epoch. The remaining <tt>64 - S - E | |||
is encoded in the <spanx style="verb">S</spanx> bits above the epoch. The remai | </tt> bits of | |||
ning <spanx style="verb">64 - S - E</spanx> bits of | the KID value are a <tt>context</tt> value chosen by the sender (<tt>context</tt | |||
the KID value are a <spanx style="verb">context</spanx> value chosen by the send | > value <tt>0</tt> will | |||
er (<spanx style="verb">context</spanx> value <spanx style="verb">0</spanx> will | ||||
produce the shortest encoded KID).</t> | produce the shortest encoded KID).</t> | |||
<sourcecode type="pseudocode"><![CDATA[ | ||||
<figure><sourcecode type="pseudocode"><![CDATA[ | ||||
KID = (context << (S + E)) + (sender_index << E) + (epoch % (1 << E)) | KID = (context << (S + E)) + (sender_index << E) + (epoch % (1 << E)) | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<figure anchor="mls-kid"> | ||||
<figure title="Structure of a KID for an MLS Sender" anchor="mls-kid"><artset><a | <name>Structure of a KID for an MLS Sender</name> | |||
rtwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height= | <artset> | |||
"112" width="264" viewBox="0 0 264 112" class="diagram" text-anchor="middle" fon | <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version= | |||
t-family="monospace" font-size="13px" stroke-linecap="round"> | "1.1" height="112" width="264" viewBox="0 0 264 112" class="diagram" text-anchor | |||
<path d="M 8,64 L 8,96" fill="none" stroke="black"/> | ="middle" font-family="monospace" font-size="13px" stroke-linecap="round"> | |||
<path d="M 120,64 L 120,96" fill="none" stroke="black"/> | <path d="M 8,64 L 8,96" fill="none" stroke="black"/> | |||
<path d="M 192,64 L 192,96" fill="none" stroke="black"/> | <path d="M 120,64 L 120,96" fill="none" stroke="black"/> | |||
<path d="M 256,64 L 256,96" fill="none" stroke="black"/> | <path d="M 192,64 L 192,96" fill="none" stroke="black"/> | |||
<path d="M 16,48 L 112,48" fill="none" stroke="black"/> | <path d="M 256,64 L 256,96" fill="none" stroke="black"/> | |||
<path d="M 128,48 L 184,48" fill="none" stroke="black"/> | <path d="M 16,48 L 112,48" fill="none" stroke="black"/> | |||
<path d="M 200,48 L 256,48" fill="none" stroke="black"/> | <path d="M 128,48 L 184,48" fill="none" stroke="black"/> | |||
<path d="M 8,64 L 256,64" fill="none" stroke="black"/> | <path d="M 200,48 L 256,48" fill="none" stroke="black"/> | |||
<path d="M 8,96 L 256,96" fill="none" stroke="black"/> | <path d="M 8,64 L 256,64" fill="none" stroke="black"/> | |||
<polygon class="arrowhead" points="264,48 252,42.4 252,53.6" fill="black" transf | <path d="M 8,96 L 256,96" fill="none" stroke="black"/> | |||
orm="rotate(0,256,48)"/> | <polygon class="arrowhead" points="264,48 252,42.4 252,53.6" fil | |||
<polygon class="arrowhead" points="208,48 196,42.4 196,53.6" fill="black" transf | l="black" transform="rotate(0,256,48)"/> | |||
orm="rotate(180,200,48)"/> | <polygon class="arrowhead" points="208,48 196,42.4 196,53.6" fil | |||
<polygon class="arrowhead" points="192,48 180,42.4 180,53.6" fill="black" transf | l="black" transform="rotate(180,200,48)"/> | |||
orm="rotate(0,184,48)"/> | <polygon class="arrowhead" points="192,48 180,42.4 180,53.6" fil | |||
<polygon class="arrowhead" points="136,48 124,42.4 124,53.6" fill="black" transf | l="black" transform="rotate(0,184,48)"/> | |||
orm="rotate(180,128,48)"/> | <polygon class="arrowhead" points="136,48 124,42.4 124,53.6" fil | |||
<polygon class="arrowhead" points="120,48 108,42.4 108,53.6" fill="black" transf | l="black" transform="rotate(180,128,48)"/> | |||
orm="rotate(0,112,48)"/> | <polygon class="arrowhead" points="120,48 108,42.4 108,53.6" fil | |||
<polygon class="arrowhead" points="24,48 12,42.4 12,53.6" fill="black" transform | l="black" transform="rotate(0,112,48)"/> | |||
="rotate(180,16,48)"/> | <polygon class="arrowhead" points="24,48 12,42.4 12,53.6" fill=" | |||
<g class="text"> | black" transform="rotate(180,16,48)"/> | |||
<text x="44" y="36">64-S-E</text> | <g class="text"> | |||
<text x="92" y="36">bits</text> | <text x="44" y="36">64-S-E</text> | |||
<text x="136" y="36">S</text> | <text x="92" y="36">bits</text> | |||
<text x="164" y="36">bits</text> | <text x="136" y="36">S</text> | |||
<text x="208" y="36">E</text> | <text x="164" y="36">bits</text> | |||
<text x="236" y="36">bits</text> | <text x="208" y="36">E</text> | |||
<text x="48" y="84">Context</text> | <text x="236" y="36">bits</text> | |||
<text x="92" y="84">ID</text> | <text x="48" y="84">Context</text> | |||
<text x="152" y="84">Index</text> | <text x="92" y="84">ID</text> | |||
<text x="224" y="84">Epoch</text> | <text x="152" y="84">Index</text> | |||
</g> | <text x="224" y="84">Epoch</text> | |||
</svg> | </g> | |||
</artwork><artwork type="ascii-art"><![CDATA[ | </svg> | |||
</artwork> | ||||
<artwork type="ascii-art"><![CDATA[ | ||||
64-S-E bits S bits E bits | 64-S-E bits S bits E bits | |||
<-----------> <------> <------> | <-----------> <------> <------> | |||
+-------------+--------+-------+ | +-------------+--------+-------+ | |||
| Context ID | Index | Epoch | | | Context ID | Index | Epoch | | |||
+-------------+--------+-------+ | +-------------+--------+-------+ | |||
]]></artwork></artset></figure> | ]]></artwork> | |||
</artset> | ||||
<t>Once an SFrame stack has been provisioned with the <spanx style="verb">sframe | </figure> | |||
_epoch_secret</spanx> for an | <t>Once an SFrame stack has been provisioned with the <tt>sframe_epoch_s | |||
ecret</tt> for an | ||||
epoch, it can compute the required KID values on demand (as well as the | epoch, it can compute the required KID values on demand (as well as the | |||
resulting SFrame keys/nonces derived from the <spanx style="verb">base_key</span x> and KID) as it needs | resulting SFrame keys/nonces derived from the <tt>base_key</tt> and KID) as it n eeds | |||
to encrypt or decrypt for a given member.</t> | to encrypt or decrypt for a given member.</t> | |||
<figure anchor="mls-evolution"> | ||||
<figure title="An Example Sequence of KIDs for an MLS-based SFrame | <name>An Example Sequence of KIDs for an MLS-based SFrame Session (E=4 | |||
Session (E=4; S=6, Allowing for 64 Group Members)" anchor="mls-evolution"><artse | ; S=6, Allowing for 64 Group Members)</name> | |||
t><artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" hei | <artset> | |||
ght="448" width="472" viewBox="0 0 472 448" class="diagram" text-anchor="middle" | <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version= | |||
font-family="monospace" font-size="13px" stroke-linecap="round"> | "1.1" height="448" width="472" viewBox="0 0 472 448" class="diagram" text-anchor | |||
<path d="M 80,48 L 80,416" fill="none" stroke="black"/> | ="middle" font-family="monospace" font-size="13px" stroke-linecap="round"> | |||
<path d="M 104,80 L 104,144" fill="none" stroke="black"/> | <path d="M 80,48 L 80,416" fill="none" stroke="black"/> | |||
<path d="M 104,192 L 104,224" fill="none" stroke="black"/> | <path d="M 104,80 L 104,144" fill="none" stroke="black"/> | |||
<path d="M 104,352 L 104,384" fill="none" stroke="black"/> | <path d="M 104,192 L 104,224" fill="none" stroke="black"/> | |||
<path d="M 216,272 L 216,304" fill="none" stroke="black"/> | <path d="M 104,352 L 104,384" fill="none" stroke="black"/> | |||
<path d="M 80,80 L 120,80" fill="none" stroke="black"/> | <path d="M 216,272 L 216,304" fill="none" stroke="black"/> | |||
<path d="M 200,80 L 224,80" fill="none" stroke="black"/> | <path d="M 80,80 L 120,80" fill="none" stroke="black"/> | |||
<path d="M 104,112 L 120,112" fill="none" stroke="black"/> | <path d="M 200,80 L 224,80" fill="none" stroke="black"/> | |||
<path d="M 200,112 L 224,112" fill="none" stroke="black"/> | <path d="M 104,112 L 120,112" fill="none" stroke="black"/> | |||
<path d="M 104,144 L 120,144" fill="none" stroke="black"/> | <path d="M 200,112 L 224,112" fill="none" stroke="black"/> | |||
<path d="M 208,144 L 224,144" fill="none" stroke="black"/> | <path d="M 104,144 L 120,144" fill="none" stroke="black"/> | |||
<path d="M 80,192 L 120,192" fill="none" stroke="black"/> | <path d="M 208,144 L 224,144" fill="none" stroke="black"/> | |||
<path d="M 200,192 L 224,192" fill="none" stroke="black"/> | <path d="M 80,192 L 120,192" fill="none" stroke="black"/> | |||
<path d="M 104,224 L 120,224" fill="none" stroke="black"/> | <path d="M 200,192 L 224,192" fill="none" stroke="black"/> | |||
<path d="M 200,224 L 224,224" fill="none" stroke="black"/> | <path d="M 104,224 L 120,224" fill="none" stroke="black"/> | |||
<path d="M 80,272 L 120,272" fill="none" stroke="black"/> | <path d="M 200,224 L 224,224" fill="none" stroke="black"/> | |||
<path d="M 200,272 L 240,272" fill="none" stroke="black"/> | <path d="M 80,272 L 120,272" fill="none" stroke="black"/> | |||
<path d="M 352,272 L 368,272" fill="none" stroke="black"/> | <path d="M 200,272 L 240,272" fill="none" stroke="black"/> | |||
<path d="M 216,304 L 240,304" fill="none" stroke="black"/> | <path d="M 352,272 L 368,272" fill="none" stroke="black"/> | |||
<path d="M 352,304 L 368,304" fill="none" stroke="black"/> | <path d="M 216,304 L 240,304" fill="none" stroke="black"/> | |||
<path d="M 80,352 L 120,352" fill="none" stroke="black"/> | <path d="M 352,304 L 368,304" fill="none" stroke="black"/> | |||
<path d="M 208,352 L 224,352" fill="none" stroke="black"/> | <path d="M 80,352 L 120,352" fill="none" stroke="black"/> | |||
<path d="M 104,384 L 120,384" fill="none" stroke="black"/> | <path d="M 208,352 L 224,352" fill="none" stroke="black"/> | |||
<path d="M 208,384 L 224,384" fill="none" stroke="black"/> | <path d="M 104,384 L 120,384" fill="none" stroke="black"/> | |||
<polygon class="arrowhead" points="376,304 364,298.4 364,309.6" fill="black" tra | <path d="M 208,384 L 224,384" fill="none" stroke="black"/> | |||
nsform="rotate(0,368,304)"/> | <polygon class="arrowhead" points="376,304 364,298.4 364,309.6" | |||
<polygon class="arrowhead" points="376,272 364,266.4 364,277.6" fill="black" tra | fill="black" transform="rotate(0,368,304)"/> | |||
nsform="rotate(0,368,272)"/> | <polygon class="arrowhead" points="376,272 364,266.4 364,277.6" | |||
<polygon class="arrowhead" points="248,304 236,298.4 236,309.6" fill="black" tra | fill="black" transform="rotate(0,368,272)"/> | |||
nsform="rotate(0,240,304)"/> | <polygon class="arrowhead" points="248,304 236,298.4 236,309.6" | |||
<polygon class="arrowhead" points="248,272 236,266.4 236,277.6" fill="black" tra | fill="black" transform="rotate(0,240,304)"/> | |||
nsform="rotate(0,240,272)"/> | <polygon class="arrowhead" points="248,272 236,266.4 236,277.6" | |||
<polygon class="arrowhead" points="232,384 220,378.4 220,389.6" fill="black" tra | fill="black" transform="rotate(0,240,272)"/> | |||
nsform="rotate(0,224,384)"/> | <polygon class="arrowhead" points="232,384 220,378.4 220,389.6" | |||
<polygon class="arrowhead" points="232,352 220,346.4 220,357.6" fill="black" tra | fill="black" transform="rotate(0,224,384)"/> | |||
nsform="rotate(0,224,352)"/> | <polygon class="arrowhead" points="232,352 220,346.4 220,357.6" | |||
<polygon class="arrowhead" points="232,224 220,218.4 220,229.6" fill="black" tra | fill="black" transform="rotate(0,224,352)"/> | |||
nsform="rotate(0,224,224)"/> | <polygon class="arrowhead" points="232,224 220,218.4 220,229.6" | |||
<polygon class="arrowhead" points="232,192 220,186.4 220,197.6" fill="black" tra | fill="black" transform="rotate(0,224,224)"/> | |||
nsform="rotate(0,224,192)"/> | <polygon class="arrowhead" points="232,192 220,186.4 220,197.6" | |||
<polygon class="arrowhead" points="232,144 220,138.4 220,149.6" fill="black" tra | fill="black" transform="rotate(0,224,192)"/> | |||
nsform="rotate(0,224,144)"/> | <polygon class="arrowhead" points="232,144 220,138.4 220,149.6" | |||
<polygon class="arrowhead" points="232,112 220,106.4 220,117.6" fill="black" tra | fill="black" transform="rotate(0,224,144)"/> | |||
nsform="rotate(0,224,112)"/> | <polygon class="arrowhead" points="232,112 220,106.4 220,117.6" | |||
<polygon class="arrowhead" points="232,80 220,74.4 220,85.6" fill="black" transf | fill="black" transform="rotate(0,224,112)"/> | |||
orm="rotate(0,224,80)"/> | <polygon class="arrowhead" points="232,80 220,74.4 220,85.6" fil | |||
<g class="text"> | l="black" transform="rotate(0,224,80)"/> | |||
<text x="32" y="36">...</text> | <g class="text"> | |||
<text x="24" y="84">Epoch</text> | <text x="32" y="36">...</text> | |||
<text x="60" y="84">14</text> | <text x="24" y="84">Epoch</text> | |||
<text x="160" y="84">index=3</text> | <text x="60" y="84">14</text> | |||
<text x="248" y="84">KID</text> | <text x="160" y="84">index=3</text> | |||
<text x="272" y="84">=</text> | <text x="248" y="84">KID</text> | |||
<text x="300" y="84">0x3e</text> | <text x="272" y="84">=</text> | |||
<text x="160" y="116">index=7</text> | <text x="300" y="84">0x3e</text> | |||
<text x="248" y="116">KID</text> | <text x="160" y="116">index=7</text> | |||
<text x="272" y="116">=</text> | <text x="248" y="116">KID</text> | |||
<text x="300" y="116">0x7e</text> | <text x="272" y="116">=</text> | |||
<text x="164" y="148">index=20</text> | <text x="300" y="116">0x7e</text> | |||
<text x="248" y="148">KID</text> | <text x="164" y="148">index=20</text> | |||
<text x="272" y="148">=</text> | <text x="248" y="148">KID</text> | |||
<text x="304" y="148">0x14e</text> | <text x="272" y="148">=</text> | |||
<text x="24" y="196">Epoch</text> | <text x="304" y="148">0x14e</text> | |||
<text x="60" y="196">15</text> | <text x="24" y="196">Epoch</text> | |||
<text x="160" y="196">index=3</text> | <text x="60" y="196">15</text> | |||
<text x="248" y="196">KID</text> | <text x="160" y="196">index=3</text> | |||
<text x="272" y="196">=</text> | <text x="248" y="196">KID</text> | |||
<text x="300" y="196">0x3f</text> | <text x="272" y="196">=</text> | |||
<text x="160" y="228">index=5</text> | <text x="300" y="196">0x3f</text> | |||
<text x="248" y="228">KID</text> | <text x="160" y="228">index=5</text> | |||
<text x="272" y="228">=</text> | <text x="248" y="228">KID</text> | |||
<text x="300" y="228">0x5f</text> | <text x="272" y="228">=</text> | |||
<text x="24" y="276">Epoch</text> | <text x="300" y="228">0x5f</text> | |||
<text x="60" y="276">16</text> | <text x="24" y="276">Epoch</text> | |||
<text x="160" y="276">index=2</text> | <text x="60" y="276">16</text> | |||
<text x="280" y="276">context</text> | <text x="160" y="276">index=2</text> | |||
<text x="320" y="276">=</text> | <text x="280" y="276">context</text> | |||
<text x="336" y="276">2</text> | <text x="320" y="276">=</text> | |||
<text x="392" y="276">KID</text> | <text x="336" y="276">2</text> | |||
<text x="416" y="276">=</text> | <text x="392" y="276">KID</text> | |||
<text x="448" y="276">0x820</text> | <text x="416" y="276">=</text> | |||
<text x="280" y="308">context</text> | <text x="448" y="276">0x820</text> | |||
<text x="320" y="308">=</text> | <text x="280" y="308">context</text> | |||
<text x="336" y="308">3</text> | <text x="320" y="308">=</text> | |||
<text x="392" y="308">KID</text> | <text x="336" y="308">3</text> | |||
<text x="416" y="308">=</text> | <text x="392" y="308">KID</text> | |||
<text x="448" y="308">0xc20</text> | <text x="416" y="308">=</text> | |||
<text x="24" y="356">Epoch</text> | <text x="448" y="308">0xc20</text> | |||
<text x="60" y="356">17</text> | <text x="24" y="356">Epoch</text> | |||
<text x="164" y="356">index=33</text> | <text x="60" y="356">17</text> | |||
<text x="248" y="356">KID</text> | <text x="164" y="356">index=33</text> | |||
<text x="272" y="356">=</text> | <text x="248" y="356">KID</text> | |||
<text x="304" y="356">0x211</text> | <text x="272" y="356">=</text> | |||
<text x="164" y="388">index=51</text> | <text x="304" y="356">0x211</text> | |||
<text x="248" y="388">KID</text> | <text x="164" y="388">index=51</text> | |||
<text x="272" y="388">=</text> | <text x="248" y="388">KID</text> | |||
<text x="304" y="388">0x331</text> | <text x="272" y="388">=</text> | |||
<text x="32" y="436">...</text> | <text x="304" y="388">0x331</text> | |||
</g> | <text x="32" y="436">...</text> | |||
</svg> | </g> | |||
</artwork><artwork type="ascii-art"><![CDATA[ | </svg> | |||
</artwork> | ||||
<artwork type="ascii-art"><![CDATA[ | ||||
... | ... | |||
| | | | |||
| | | | |||
Epoch 14 +--+-- index=3 ---> KID = 0x3e | Epoch 14 +--+-- index=3 ---> KID = 0x3e | |||
| | | | | | |||
| +-- index=7 ---> KID = 0x7e | | +-- index=7 ---> KID = 0x7e | |||
| | | | | | |||
| +-- index=20 --> KID = 0x14e | | +-- index=20 --> KID = 0x14e | |||
| | | | |||
| | | | |||
skipping to change at line 1465 ¶ | skipping to change at line 1485 ¶ | |||
| | | | | | |||
| +--> context = 3 --> KID = 0xc20 | | +--> context = 3 --> KID = 0xc20 | |||
| | | | |||
| | | | |||
Epoch 17 +--+-- index=33 --> KID = 0x211 | Epoch 17 +--+-- index=33 --> KID = 0x211 | |||
| | | | | | |||
| +-- index=51 --> KID = 0x331 | | +-- index=51 --> KID = 0x331 | |||
| | | | |||
| | | | |||
... | ... | |||
]]></artwork></artset></figure> | ]]></artwork> | |||
</artset> | ||||
</section> | </figure> | |||
</section> | </section> | |||
<section anchor="media-considerations"><name>Media Considerations</name> | </section> | |||
<section anchor="media-considerations"> | ||||
<section anchor="selective-forwarding-units"><name>Selective Forwarding Units</n | <name>Media Considerations</name> | |||
ame> | <section anchor="selective-forwarding-units"> | |||
<name>Selective Forwarding Units</name> | ||||
<t>SFUs (e.g., those described in <xref section="3.7" sectionFormat="of" target= | <t>SFUs (e.g., those described in <xref section="3.7" sectionFormat="of" | |||
"RFC7667"/>) receive the media streams from each participant and select which | target="RFC7667"/>) receive the media streams from each participant and select | |||
which | ||||
ones should be forwarded to each of the other participants. There are several | ones should be forwarded to each of the other participants. There are several | |||
approaches for stream selection, but in general, the SFU needs to access | approaches for stream selection, but in general, the SFU needs to access | |||
metadata associated with each frame and modify the RTP information of the incomi ng | metadata associated with each frame and modify the RTP information of the incomi ng | |||
packets when they are transmitted to the received participants.</t> | packets when they are transmitted to the received participants.</t> | |||
<t>This section describes how these normal SFU modes of operation intera | ||||
<t>This section describes how these normal SFU modes of operation interact with | ct with the | |||
the | ||||
E2EE provided by SFrame.</t> | E2EE provided by SFrame.</t> | |||
<section anchor="rtp-stream-reuse"> | ||||
<section anchor="rtp-stream-reuse"><name>RTP Stream Reuse</name> | <name>RTP Stream Reuse</name> | |||
<t>The SFU may choose to send only a certain number of streams based o | ||||
<t>The SFU may choose to send only a certain number of streams based on the voic | n the voice | |||
e | ||||
activity of the participants. To avoid the overhead involved in establishing new | activity of the participants. To avoid the overhead involved in establishing new | |||
transport streams, the SFU may decide to reuse previously existing streams or | transport streams, the SFU may decide to reuse previously existing streams or | |||
even pre-allocate a predefined number of streams and choose in each moment in | even pre-allocate a predefined number of streams and choose in each moment in | |||
time which participant media will be sent through it.</t> | time which participant media will be sent through it.</t> | |||
<t>This means that the same transport-level stream (e.g., an RTP strea | ||||
<t>This means that the same transport-level stream (e.g., an RTP stream defined | m defined | |||
by either SSRC or Media Identification (MID)) may carry media from different | by either SSRC or Media Identification (MID)) may carry media from different | |||
streams of different participants. Because each participant uses a different key | streams of different participants. Because each participant uses a different key | |||
to encrypt their media, the receiver will be able to verify the sender of the | to encrypt their media, the receiver will be able to verify the sender of the | |||
media within the RTP stream at any given point in time. Thus the receiver will | media within the RTP stream at any given point in time. Thus the receiver will | |||
correctly associate the media with the sender indicated by the authenticated | correctly associate the media with the sender indicated by the authenticated | |||
SFrame KID value, irrespective of how the SFU transmits the media to the client. </t> | SFrame KID value, irrespective of how the SFU transmits the media to the client. </t> | |||
<t>Note that in order to prevent impersonation by a malicious particip | ||||
<t>Note that in order to prevent impersonation by a malicious participant (not t | ant (not the | |||
he | ||||
SFU), a mechanism based on digital signature would be required. SFrame does not | SFU), a mechanism based on digital signature would be required. SFrame does not | |||
protect against such attacks.</t> | protect against such attacks.</t> | |||
</section> | ||||
</section> | <section anchor="simulcast"> | |||
<section anchor="simulcast"><name>Simulcast</name> | <name>Simulcast</name> | |||
<t>When using simulcast, the same input image will produce N different | ||||
<t>When using simulcast, the same input image will produce N different encoded | encoded | |||
frames (one per simulcast layer), which would be processed independently by the | frames (one per simulcast layer), which would be processed independently by the | |||
frame encryptor and assigned an unique CTR value for each.</t> | frame encryptor and assigned an unique CTR value for each.</t> | |||
</section> | ||||
</section> | <section anchor="scalable-video-coding-svc"> | |||
<section anchor="scalable-video-coding-svc"><name>Scalable Video Coding (SVC)</n | <name>Scalable Video Coding (SVC)</name> | |||
ame> | <t>In both temporal and spatial scalability, the SFU may choose to dro | |||
p layers in | ||||
<t>In both temporal and spatial scalability, the SFU may choose to drop layers i | ||||
n | ||||
order to match a certain bitrate or to forward specific media sizes or frames pe r | order to match a certain bitrate or to forward specific media sizes or frames pe r | |||
second. In order to support the SFU selectively removing layers, the sender <bcp 14>MUST</bcp14> | second. In order to support the SFU selectively removing layers, the sender <bcp 14>MUST</bcp14> | |||
encapsulate each layer in a different SFrame ciphertext.</t> | encapsulate each layer in a different SFrame ciphertext.</t> | |||
</section> | ||||
</section> | </section> | |||
</section> | <section anchor="video-key-frames"> | |||
<section anchor="video-key-frames"><name>Video Key Frames</name> | <name>Video Key Frames</name> | |||
<t>Forward security and post-compromise security require that the E2EE k | ||||
<t>Forward security and post-compromise security require that the E2EE keys (bas | eys (base keys) | |||
e keys) | ||||
are updated any time a participant joins or leaves the call.</t> | are updated any time a participant joins or leaves the call.</t> | |||
<t>The key exchange happens asynchronously and on a different path than | ||||
<t>The key exchange happens asynchronously and on a different path than the SFU | the SFU signaling | |||
signaling | ||||
and media. So it may happen that when a new participant joins the call and the | and media. So it may happen that when a new participant joins the call and the | |||
SFU side requests a key frame, the sender generates the E2EE frame | SFU side requests a key frame, the sender generates the E2EE frame | |||
with a key that is not known by the receiver, so it will be discarded. When the sender | with a key that is not known by the receiver, so it will be discarded. When the sender | |||
updates his sending key with the new key, it will send it in a non-key frame, so | updates his sending key with the new key, it will send it in a non-key frame, so | |||
the receiver will be able to decrypt it, but not decode it.</t> | the receiver will be able to decrypt it, but not decode it.</t> | |||
<t>The new receiver will then re-request a key frame, but due to sender | ||||
<t>The new receiver will then re-request a key frame, but due to sender and SFU | and SFU | |||
policies, that new key frame could take some time to be generated.</t> | policies, that new key frame could take some time to be generated.</t> | |||
<t>If the sender sends a key frame after the new E2EE key is in use, the | ||||
<t>If the sender sends a key frame after the new E2EE key is in use, the time | time | |||
required for the new participant to display the video is minimized.</t> | required for the new participant to display the video is minimized.</t> | |||
<t>Note that this issue does not arise for media streams that do not hav | ||||
<t>Note that this issue does not arise for media streams that do not have | e | |||
dependencies among frames, e.g., audio streams. In these streams, each frame is | dependencies among frames, e.g., audio streams. In these streams, each frame is | |||
independently decodable, so a frame never depends on another frame that might be | independently decodable, so a frame never depends on another frame that might be | |||
on the other side of a key rotation.</t> | on the other side of a key rotation.</t> | |||
</section> | ||||
</section> | <section anchor="partial-decoding"> | |||
<section anchor="partial-decoding"><name>Partial Decoding</name> | <name>Partial Decoding</name> | |||
<t>Some codecs support partial decoding, where individual packets can be | ||||
<t>Some codecs support partial decoding, where individual packets can be decoded | decoded | |||
without waiting for the full frame to arrive. When SFrame is applied per frame, | without waiting for the full frame to arrive. When SFrame is applied per frame, | |||
partial decoding is not possible because the decoder cannot access data until an entire | partial decoding is not possible because the decoder cannot access data until an entire | |||
frame has arrived and has been decrypted.</t> | frame has arrived and has been decrypted.</t> | |||
</section> | ||||
</section> | </section> | |||
</section> | <section anchor="security-considerations"> | |||
<section anchor="security-considerations"><name>Security Considerations</name> | <name>Security Considerations</name> | |||
<section anchor="no-header-confidentiality"> | ||||
<section anchor="no-header-confidentiality"><name>No Header Confidentiality</nam | <name>No Header Confidentiality</name> | |||
e> | <t>SFrame provides integrity protection to the SFrame header (the KID an | |||
d | ||||
<t>SFrame provides integrity protection to the SFrame header (the KID and | ||||
CTR values), but it does not provide confidentiality protection. Parties that | CTR values), but it does not provide confidentiality protection. Parties that | |||
can observe the SFrame header may learn, for example, which parties are sending | can observe the SFrame header may learn, for example, which parties are sending | |||
SFrame payloads (from KID values) and at what rates (from CTR values). In cases | SFrame payloads (from KID values) and at what rates (from CTR values). In cases | |||
where SFrame is used for end-to-end security on top of hop-by-hop protections | where SFrame is used for end-to-end security on top of hop-by-hop protections | |||
(e.g., running over SRTP as described in <xref target="sframe-over-rtp"/>), the hop-by-hop security | (e.g., running over SRTP as described in <xref target="sframe-over-rtp"/>), the hop-by-hop security | |||
mechanisms provide confidentiality protection of the SFrame header between hops. </t> | mechanisms provide confidentiality protection of the SFrame header between hops. </t> | |||
</section> | ||||
</section> | <section anchor="no-per-sender-authentication"> | |||
<section anchor="no-per-sender-authentication"><name>No Per-Sender Authenticatio | <name>No Per-Sender Authentication</name> | |||
n</name> | <t>SFrame does not provide per-sender authentication of media data. Any | |||
sender in | ||||
<t>SFrame does not provide per-sender authentication of media data. Any sender | ||||
in | ||||
a session can send media that will be associated with any other sender. This is | a session can send media that will be associated with any other sender. This is | |||
because SFrame uses symmetric encryption to protect media data, so that any | because SFrame uses symmetric encryption to protect media data, so that any | |||
receiver also has the keys required to encrypt packets for the sender.</t> | receiver also has the keys required to encrypt packets for the sender.</t> | |||
</section> | ||||
</section> | <section anchor="key-management-1"> | |||
<section anchor="key-management-1"><name>Key Management</name> | <name>Key Management</name> | |||
<t>The specifics of key management are beyond the scope of this document | ||||
<t>The specifics of key management are beyond the scope of this document. Howeve | . However, every client | |||
r, every client | ||||
<bcp14>SHOULD</bcp14> change their keys when new clients join or leave the call for forward | <bcp14>SHOULD</bcp14> change their keys when new clients join or leave the call for forward | |||
secrecy and post-compromise security.</t> | secrecy and post-compromise security.</t> | |||
</section> | ||||
</section> | <section anchor="replay"> | |||
<section anchor="replay"><name>Replay</name> | <name>Replay</name> | |||
<t>The handling of replay is out of the scope of this document. However, | ||||
<t>The handling of replay is out of the scope of this document. However, senders | senders | |||
<bcp14>MUST</bcp14> reject requests to encrypt multiple times with the same key and nonce | <bcp14>MUST</bcp14> reject requests to encrypt multiple times with the same key and nonce | |||
since several AEAD algorithms fail badly in such cases (see, e.g., <xref section ="5.1.1" sectionFormat="of" target="RFC5116"/>).</t> | since several AEAD algorithms fail badly in such cases (see, e.g., <xref section ="5.1.1" sectionFormat="of" target="RFC5116"/>).</t> | |||
</section> | ||||
</section> | <section anchor="risks-due-to-short-tags"> | |||
<section anchor="risks-due-to-short-tags"><name>Risks Due to Short Tags</name> | <name>Risks Due to Short Tags</name> | |||
<t>The SFrame cipher suites based on AES-CTR allow for the use of short | ||||
<t>The SFrame cipher suites based on AES-CTR allow for the use of short | ||||
authentication tags, which bring a higher risk that an attacker will be | authentication tags, which bring a higher risk that an attacker will be | |||
able to cause an SFrame receiver to accept an SFrame ciphertext of the | able to cause an SFrame receiver to accept an SFrame ciphertext of the | |||
attacker's choosing.</t> | attacker's choosing.</t> | |||
<t>Assuming that the authentication properties of the cipher suite are r | ||||
<t>Assuming that the authentication properties of the cipher suite are robust, t | obust, the | |||
he | ||||
only attack that an attacker can mount is an attempt to find an acceptable | only attack that an attacker can mount is an attempt to find an acceptable | |||
(ciphertext, tag) combination through brute force. Such a brute-force attack | (ciphertext, tag) combination through brute force. Such a brute-force attack | |||
will have an expected success rate of the following form:</t> | will have an expected success rate of the following form:</t> | |||
<t><tt> | ||||
<t><spanx style="verb"> | ||||
attacker_success_rate = attempts_per_second / 2^(8*Nt) | attacker_success_rate = attempts_per_second / 2^(8*Nt) | |||
</spanx></t> | </tt></t> | |||
<t>For example, a gigabit Ethernet connection is able to transmit roughl | ||||
<t>For example, a gigabit Ethernet connection is able to transmit roughly 2<sup> | y 2<sup>20</sup> | |||
20</sup> | ||||
packets per second. If an attacker saturated such a link with guesses against a | packets per second. If an attacker saturated such a link with guesses against a | |||
32-bit authentication tag (<spanx style="verb">Nt=4</spanx>), then the attacker would succeed on average | 32-bit authentication tag (<tt>Nt=4</tt>), then the attacker would succeed on av erage | |||
roughly once every 2<sup>12</sup> seconds, or about once an hour.</t> | roughly once every 2<sup>12</sup> seconds, or about once an hour.</t> | |||
<t>In a typical SFrame usage in a real-time media application, there are | ||||
<t>In a typical SFrame usage in a real-time media application, there are a few | a few | |||
approaches to mitigating this risk:</t> | approaches to mitigating this risk:</t> | |||
<ul spacing="normal"> | ||||
<t><list style="symbols"> | <li> | |||
<t>Receivers only accept SFrame ciphertexts over HBH-secure channels (e.g., SR | <t>Receivers only accept SFrame ciphertexts over HBH-secure channels | |||
TP | (e.g., SRTP | |||
security associations or QUIC connections). If this is the case, only an | security associations or QUIC connections). If this is the case, only an | |||
entity that is part of such a channel can mount the above attack.</t> | entity that is part of such a channel can mount the above attack.</t> | |||
<t>The expected packet rate for a media stream is very predictable (and typica | </li> | |||
lly | <li> | |||
<t>The expected packet rate for a media stream is very predictable ( | ||||
and typically | ||||
far lower than the above example). On the one hand, attacks at this rate will | far lower than the above example). On the one hand, attacks at this rate will | |||
succeed even less often than the high-rate attack described above. On the | succeed even less often than the high-rate attack described above. On the | |||
other hand, the application may use an elevated packet arrival rate as a | other hand, the application may use an elevated packet arrival rate as a | |||
signal of a brute-force attack. This latter approach is common in other | signal of a brute-force attack. This latter approach is common in other | |||
settings, e.g., mitigating brute-force attacks on passwords.</t> | settings, e.g., mitigating brute-force attacks on passwords.</t> | |||
<t>Media applications typically do not provide feedback to media senders as to | </li> | |||
<li> | ||||
<t>Media applications typically do not provide feedback to media sen | ||||
ders as to | ||||
which media packets failed to decrypt. When media-quality feedback | which media packets failed to decrypt. When media-quality feedback | |||
mechanisms are used, decryption failures will typically appear as packet | mechanisms are used, decryption failures will typically appear as packet | |||
losses, but only at an aggregate level.</t> | losses, but only at an aggregate level.</t> | |||
<t>Anti-replay mechanisms (see <xref target="replay"/>) prevent the attacker f | </li> | |||
rom reusing | <li> | |||
<t>Anti-replay mechanisms (see <xref target="replay"/>) prevent the | ||||
attacker from reusing | ||||
valid ciphertexts (either observed or guessed by the attacker). A receiver | valid ciphertexts (either observed or guessed by the attacker). A receiver | |||
applying anti-replay controls will only accept one valid plaintext per CTR | applying anti-replay controls will only accept one valid plaintext per CTR | |||
value. Since the CTR value is covered by SFrame authentication, an attacker | value. Since the CTR value is covered by SFrame authentication, an attacker | |||
has to do a fresh search for a valid tag for every forged ciphertext, even if | has to do a fresh search for a valid tag for every forged ciphertext, even if | |||
the encrypted content is unchanged. In other words, when the above brute-force | the encrypted content is unchanged. In other words, when the above brute-force | |||
attack succeeds, it only allows the attacker to send a single SFrame | attack succeeds, it only allows the attacker to send a single SFrame | |||
ciphertext; the ciphertext cannot be reused because either it will have the | ciphertext; the ciphertext cannot be reused because either it will have the | |||
same CTR value and be discarded as a replay, or else it will have a different | same CTR value and be discarded as a replay, or else it will have a different | |||
CTR value and its tag will no longer be valid.</t> | CTR value and its tag will no longer be valid.</t> | |||
</list></t> | </li> | |||
</ul> | ||||
<t>Nonetheless, without these mitigations, an application that makes use of shor | <t>Nonetheless, without these mitigations, an application that makes use | |||
t | of short | |||
tags will be at heightened risk of forgery attacks. In many cases, it is | tags will be at heightened risk of forgery attacks. In many cases, it is | |||
simpler to use full-size tags and tolerate slightly higher bandwidth usage | simpler to use full-size tags and tolerate slightly higher bandwidth usage | |||
rather than to add the additional defenses necessary to safely use short tags.</ t> | rather than to add the additional defenses necessary to safely use short tags.</ t> | |||
</section> | ||||
</section> | </section> | |||
</section> | <section anchor="iana-considerations"> | |||
<section anchor="iana-considerations"><name>IANA Considerations</name> | <name>IANA Considerations</name> | |||
<t>IANA has created a new registry called "SFrame Cipher Suites" (<xref ta | ||||
<t>IANA has created a new registry called "SFrame Cipher Suites" (<xref target=" | rget="sframe-cipher-suites"/>) | |||
sframe-cipher-suites"/>) | ||||
under the "SFrame" group registry heading.</t> | under the "SFrame" group registry heading.</t> | |||
<section anchor="sframe-cipher-suites"> | ||||
<section anchor="sframe-cipher-suites"><name>SFrame Cipher Suites</name> | <name>SFrame Cipher Suites</name> | |||
<t>The "SFrame Cipher Suites" registry lists identifiers for SFrame ciph | ||||
<t>The "SFrame Cipher Suites" registry lists identifiers for SFrame cipher suite | er suites as defined in | |||
s as defined in | ||||
<xref target="cipher-suites"/>. The cipher suite field is two bytes wide, so th e valid cipher | <xref target="cipher-suites"/>. The cipher suite field is two bytes wide, so th e valid cipher | |||
suites are in the range 0x0000 to 0xFFFF. Except as noted below, assignments ar e made | suites are in the range 0x0000 to 0xFFFF. Except as noted below, assignments ar e made | |||
via the Specification Required policy <xref target="RFC8126"/>.</t> | via the Specification Required policy <xref target="RFC8126"/>.</t> | |||
<t>The registration template is as follows:</t> | ||||
<t>The registration template is as follows:</t> | <ul spacing="normal"> | |||
<li> | ||||
<t><list style="symbols"> | <t>Value: The numeric value of the cipher suite</t> | |||
<t>Value: The numeric value of the cipher suite</t> | </li> | |||
<t>Name: The name of the cipher suite</t> | <li> | |||
<t>Recommended: Whether support for this cipher suite is recommended by the IE | <t>Name: The name of the cipher suite</t> | |||
TF. | </li> | |||
Valid values are "Y", "N", and "D" as described in <xref section="17.1" sectionF | <li> | |||
ormat="of" target="MLS-PROTO"/>. The default value of the "Recommended" column i | <t>Recommended: Whether support for this cipher suite is recommended | |||
s "N". Setting the | by the IETF. | |||
Valid values are "Y", "N", and "D" as described in <xref section="17.1" sectionF | ||||
ormat="of" target="RFC9420"/>. The default value of the "Recommended" column is | ||||
"N". Setting the | ||||
Recommended item to "Y" or "D", or changing an item whose current value is "Y" | Recommended item to "Y" or "D", or changing an item whose current value is "Y" | |||
or "D", requires Standards Action <xref target="RFC8126"/>.</t> | or "D", requires Standards Action <xref target="RFC8126"/>.</t> | |||
<t>Reference: The document where this cipher suite is defined</t> | </li> | |||
<t>Change Controller: Who is authorized to update the row in the registry</t> | <li> | |||
</list></t> | <t>Reference: The document where this cipher suite is defined</t> | |||
</li> | ||||
<t>Initial contents:</t> | <li> | |||
<t>Change Controller: Who is authorized to update the row in the reg | ||||
<texttable title="SFrame Cipher Suites" anchor="iana-cipher-suites"> | istry</t> | |||
<ttcol align='left'>Value</ttcol> | </li> | |||
<ttcol align='left'>Name</ttcol> | </ul> | |||
<ttcol align='left'>R</ttcol> | <t>Initial contents:</t> | |||
<ttcol align='left'>Reference</ttcol> | <table anchor="iana-cipher-suites"> | |||
<ttcol align='left'>Change Controller</ttcol> | <name>SFrame Cipher Suites</name> | |||
<c>0x0000</c> | <thead> | |||
<c>Reserved</c> | <tr> | |||
<c>-</c> | <th align="left">Value</th> | |||
<c>RFC 9605</c> | <th align="left">Name</th> | |||
<c>IETF</c> | <th align="left">R</th> | |||
<c>0x0001</c> | <th align="left">Reference</th> | |||
<c><spanx style="verb">AES_128_CTR_HMAC_SHA256_80</spanx></c> | <th align="left">Change Controller</th> | |||
<c>Y</c> | </tr> | |||
<c>RFC 9605</c> | </thead> | |||
<c>IETF</c> | <tbody> | |||
<c>0x0002</c> | <tr> | |||
<c><spanx style="verb">AES_128_CTR_HMAC_SHA256_64</spanx></c> | <td align="left">0x0000</td> | |||
<c>Y</c> | <td align="left">Reserved</td> | |||
<c>RFC 9605</c> | <td align="left">-</td> | |||
<c>IETF</c> | <td align="left">RFC 9605</td> | |||
<c>0x0003</c> | <td align="left">IETF</td> | |||
<c><spanx style="verb">AES_128_CTR_HMAC_SHA256_32</spanx></c> | </tr> | |||
<c>Y</c> | <tr> | |||
<c>RFC 9605</c> | <td align="left">0x0001</td> | |||
<c>IETF</c> | <td align="left"> | |||
<c>0x0004</c> | <tt>AES_128_CTR_HMAC_SHA256_80</tt></td> | |||
<c><spanx style="verb">AES_128_GCM_SHA256_128</spanx></c> | <td align="left">Y</td> | |||
<c>Y</c> | <td align="left">RFC 9605</td> | |||
<c>RFC 9605</c> | <td align="left">IETF</td> | |||
<c>IETF</c> | </tr> | |||
<c>0x0005</c> | <tr> | |||
<c><spanx style="verb">AES_256_GCM_SHA512_128</spanx></c> | <td align="left">0x0002</td> | |||
<c>Y</c> | <td align="left"> | |||
<c>RFC 9605</c> | <tt>AES_128_CTR_HMAC_SHA256_64</tt></td> | |||
<c>IETF</c> | <td align="left">Y</td> | |||
<c>0xF000 - 0xFFFF</c> | <td align="left">RFC 9605</td> | |||
<c>Reserved for Private Use</c> | <td align="left">IETF</td> | |||
<c>-</c> | </tr> | |||
<c>RFC 9605</c> | <tr> | |||
<c>IETF</c> | <td align="left">0x0003</td> | |||
</texttable> | <td align="left"> | |||
<tt>AES_128_CTR_HMAC_SHA256_32</tt></td> | ||||
</section> | <td align="left">Y</td> | |||
</section> | <td align="left">RFC 9605</td> | |||
<section anchor="application-responsibilities"><name>Application Responsibilitie | <td align="left">IETF</td> | |||
s</name> | </tr> | |||
<tr> | ||||
<t>To use SFrame, an application needs to define the inputs to the SFrame | <td align="left">0x0004</td> | |||
<td align="left"> | ||||
<tt>AES_128_GCM_SHA256_128</tt></td> | ||||
<td align="left">Y</td> | ||||
<td align="left">RFC 9605</td> | ||||
<td align="left">IETF</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">0x0005</td> | ||||
<td align="left"> | ||||
<tt>AES_256_GCM_SHA512_128</tt></td> | ||||
<td align="left">Y</td> | ||||
<td align="left">RFC 9605</td> | ||||
<td align="left">IETF</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">0xF000 - 0xFFFF</td> | ||||
<td align="left">Reserved for Private Use</td> | ||||
<td align="left">-</td> | ||||
<td align="left">RFC 9605</td> | ||||
<td align="left">IETF</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
</section> | ||||
</section> | ||||
<section anchor="application-responsibilities"> | ||||
<name>Application Responsibilities</name> | ||||
<t>To use SFrame, an application needs to define the inputs to the SFrame | ||||
encryption and decryption operations, and how SFrame ciphertexts are delivered | encryption and decryption operations, and how SFrame ciphertexts are delivered | |||
from sender to receiver (including any fragmentation and reassembly). In this | from sender to receiver (including any fragmentation and reassembly). In this | |||
section, we lay out additional requirements that an application must meet in | section, we lay out additional requirements that an application must meet in | |||
order for SFrame to operate securely.</t> | order for SFrame to operate securely.</t> | |||
<t>In general, an application using SFrame is responsible for configuring | ||||
<t>In general, an application using SFrame is responsible for configuring SFrame | SFrame. | |||
. | ||||
The application must first define when SFrame is applied at all. When SFrame is | The application must first define when SFrame is applied at all. When SFrame is | |||
applied, the application must define which cipher suite is to be used. If new | applied, the application must define which cipher suite is to be used. If new | |||
versions of SFrame are defined in the future, it will be the application's respo nsibility | versions of SFrame are defined in the future, it will be the application's respo nsibility | |||
to determine which version should be used.</t> | to determine which version should be used.</t> | |||
<t>This division of responsibilities is similar to the way other media par | ||||
<t>This division of responsibilities is similar to the way other media parameter | ameters | |||
s | ||||
(e.g., codecs) are typically handled in media applications, in the sense that | (e.g., codecs) are typically handled in media applications, in the sense that | |||
they are set up in some signaling protocol and not described in the media. | they are set up in some signaling protocol and not described in the media. | |||
Applications might find it useful to extend the protocols used for negotiating | Applications might find it useful to extend the protocols used for negotiating | |||
other media parameters (e.g., Session Description Protocol (SDP) <xref target="R FC8866"/>) to also negotiate parameters for | other media parameters (e.g., Session Description Protocol (SDP) <xref target="R FC8866"/>) to also negotiate parameters for | |||
SFrame.</t> | SFrame.</t> | |||
<section anchor="header-value-uniqueness"> | ||||
<section anchor="header-value-uniqueness"><name>Header Value Uniqueness</name> | <name>Header Value Uniqueness</name> | |||
<t>Applications <bcp14>MUST</bcp14> ensure that each (<tt>base_key</tt>, | ||||
<t>Applications <bcp14>MUST</bcp14> ensure that each (<spanx style="verb">base_k | KID, CTR) combination is used | |||
ey</spanx>, KID, CTR) combination is used | ||||
for at most one SFrame encryption operation. This ensures that the (key, nonce) | for at most one SFrame encryption operation. This ensures that the (key, nonce) | |||
pairs used by the underlying AEAD algorithm are never reused. Typically this is | pairs used by the underlying AEAD algorithm are never reused. Typically this is | |||
done by assigning each sender a KID or set of KIDs, then having each sender use | done by assigning each sender a KID or set of KIDs, then having each sender use | |||
the CTR field as a monotonic counter, incrementing for each plaintext that is | the CTR field as a monotonic counter, incrementing for each plaintext that is | |||
encrypted. In addition to its simplicity, this scheme minimizes overhead by | encrypted. In addition to its simplicity, this scheme minimizes overhead by | |||
keeping CTR values as small as possible.</t> | keeping CTR values as small as possible.</t> | |||
<t>In applications where an SFrame context might be written to persisten | ||||
<t>In applications where an SFrame context might be written to persistent storag | t storage, | |||
e, | ||||
this context needs to include the last-used CTR value. When the context is used | this context needs to include the last-used CTR value. When the context is used | |||
later, the application should use the stored CTR value to determine the next CTR | later, the application should use the stored CTR value to determine the next CTR | |||
value to be used in an encryption operation, and then write the next CTR value | value to be used in an encryption operation, and then write the next CTR value | |||
back to storage before using the CTR value for encryption. Storing the CTR | back to storage before using the CTR value for encryption. Storing the CTR | |||
value before usage (vs. after) helps ensure that a storage failure will not | value before usage (vs. after) helps ensure that a storage failure will not | |||
cause reuse of the same (<spanx style="verb">base_key</spanx>, KID, CTR) combina | cause reuse of the same (<tt>base_key</tt>, KID, CTR) combination.</t> | |||
tion.</t> | </section> | |||
<section anchor="key-management-framework"> | ||||
</section> | <name>Key Management Framework</name> | |||
<section anchor="key-management-framework"><name>Key Management Framework</name> | <t>The application is responsible for provisioning SFrame with a mapping | |||
of KID values to | ||||
<t>The application is responsible for provisioning SFrame with a mapping of KID | <tt>base_key</tt> values and the resulting keys and salts. More importantly, th | |||
values to | e | |||
<spanx style="verb">base_key</spanx> values and the resulting keys and salts. M | ||||
ore importantly, the | ||||
application specifies which KID values are used for which purposes (e.g., by | application specifies which KID values are used for which purposes (e.g., by | |||
which senders). An application's KID assignment strategy <bcp14>MUST</bcp14> be structured to | which senders). An application's KID assignment strategy <bcp14>MUST</bcp14> be structured to | |||
assure the non-reuse properties discussed in <xref target="header-value-uniquene ss"/>.</t> | assure the non-reuse properties discussed in <xref target="header-value-uniquene ss"/>.</t> | |||
<t>The application is also responsible for defining a rotation schedule | ||||
<t>The application is also responsible for defining a rotation schedule for keys | for keys. For | |||
. For | ||||
example, one application might have an ephemeral group for every call and keep | example, one application might have an ephemeral group for every call and keep | |||
rotating keys when endpoints join or leave the call, while another application | rotating keys when endpoints join or leave the call, while another application | |||
could have a persistent group that can be used for multiple calls and simply | could have a persistent group that can be used for multiple calls and simply | |||
derives ephemeral symmetric keys for a specific call.</t> | derives ephemeral symmetric keys for a specific call.</t> | |||
<t>It should be noted that KID values are not encrypted by SFrame and ar | ||||
<t>It should be noted that KID values are not encrypted by SFrame and are thus | e thus | |||
visible to any application-layer intermediaries that might handle an SFrame | visible to any application-layer intermediaries that might handle an SFrame | |||
ciphertext. If there are application semantics included in KID values, then | ciphertext. If there are application semantics included in KID values, then | |||
this information would be exposed to intermediaries. For example, in the scheme | this information would be exposed to intermediaries. For example, in the scheme | |||
of <xref target="sender-keys"/>, the number of ratchet steps per sender is expos ed, and in | of <xref target="sender-keys"/>, the number of ratchet steps per sender is expos ed, and in | |||
the scheme of <xref target="mls"/>, the number of epochs and the MLS sender ID o f the SFrame | the scheme of <xref target="mls"/>, the number of epochs and the MLS sender ID o f the SFrame | |||
sender are exposed.</t> | sender are exposed.</t> | |||
</section> | ||||
</section> | <section anchor="anti-replay"> | |||
<section anchor="anti-replay"><name>Anti-Replay</name> | <name>Anti-Replay</name> | |||
<t>It is the responsibility of the application to handle anti-replay. Re | ||||
<t>It is the responsibility of the application to handle anti-replay. Replay by | play by network | |||
network | ||||
attackers is assumed to be prevented by network-layer facilities (e.g., TLS, SRT P). | attackers is assumed to be prevented by network-layer facilities (e.g., TLS, SRT P). | |||
As mentioned in <xref target="replay"/>, senders <bcp14>MUST</bcp14> reject requ ests to encrypt multiple times | As mentioned in <xref target="replay"/>, senders <bcp14>MUST</bcp14> reject requ ests to encrypt multiple times | |||
with the same key and nonce.</t> | with the same key and nonce.</t> | |||
<t>It is not mandatory to implement anti-replay on the receiver side. Re | ||||
<t>It is not mandatory to implement anti-replay on the receiver side. Receivers | ceivers <bcp14>MAY</bcp14> | |||
<bcp14>MAY</bcp14> | ||||
apply time- or counter-based anti-replay mitigations. For example, <xref sectio n="3.3.2" sectionFormat="of" target="RFC3711"/> specifies a counter-based anti-r eplay mitigation, which | apply time- or counter-based anti-replay mitigations. For example, <xref sectio n="3.3.2" sectionFormat="of" target="RFC3711"/> specifies a counter-based anti-r eplay mitigation, which | |||
could be adapted to use with SFrame, using the CTR field as the counter.</t> | could be adapted to use with SFrame, using the CTR field as the counter.</t> | |||
</section> | ||||
</section> | <section anchor="metadata"> | |||
<section anchor="metadata"><name>Metadata</name> | <name>Metadata</name> | |||
<t>The <tt>metadata</tt> input to SFrame operations is an opaque byte st | ||||
<t>The <spanx style="verb">metadata</spanx> input to SFrame operations is an opa | ring specified by the application. As | |||
que byte string specified by the application. As | ||||
such, the application needs to define what information should go in the | such, the application needs to define what information should go in the | |||
<spanx style="verb">metadata</spanx> input and ensure that it is provided to the encryption and decryption | <tt>metadata</tt> input and ensure that it is provided to the encryption and dec ryption | |||
functions at the appropriate points. A receiver <bcp14>MUST NOT</bcp14> use SFr ame-authenticated | functions at the appropriate points. A receiver <bcp14>MUST NOT</bcp14> use SFr ame-authenticated | |||
metadata until after the SFrame decrypt function has authenticated it, unless | metadata until after the SFrame decrypt function has authenticated it, unless | |||
the purpose of such usage is to prepare an SFrame ciphertext for SFrame | the purpose of such usage is to prepare an SFrame ciphertext for SFrame | |||
decryption. Essentially, metadata may be used "upstream of SFrame" in a | decryption. Essentially, metadata may be used "upstream of SFrame" in a | |||
processing pipeline, but only to prepare for SFrame decryption.</t> | processing pipeline, but only to prepare for SFrame decryption.</t> | |||
<t>For example, consider an application where SFrame is used to encrypt | ||||
<t>For example, consider an application where SFrame is used to encrypt audio | audio | |||
frames that are sent over SRTP, with some application data included in the RTP | frames that are sent over SRTP, with some application data included in the RTP | |||
header extension. Suppose the application also includes this application data in | header extension. Suppose the application also includes this application data in | |||
the SFrame metadata, so that the SFU is allowed to read, but not modify, the | the SFrame metadata, so that the SFU is allowed to read, but not modify, the | |||
application data. A receiver can use the application data in the RTP header | application data. A receiver can use the application data in the RTP header | |||
extension as part of the standard SRTP decryption process since this is | extension as part of the standard SRTP decryption process since this is | |||
required to recover the SFrame ciphertext carried in the SRTP payload. However, | required to recover the SFrame ciphertext carried in the SRTP payload. However, | |||
the receiver <bcp14>MUST NOT</bcp14> use the application data for other purposes before SFrame | the receiver <bcp14>MUST NOT</bcp14> use the application data for other purposes before SFrame | |||
decryption has authenticated the application data.</t> | decryption has authenticated the application data.</t> | |||
</section> | ||||
</section> | </section> | |||
</section> | ||||
</middle> | </middle> | |||
<back> | <back> | |||
<displayreference target="RFC9420" to="MLS-PROTO"/> | ||||
<references title='Normative References' anchor="sec-normative-references"> | <displayreference target="I-D.ietf-webtrans-overview" to="WEBTRANSPORT"/> | |||
<displayreference target="I-D.ietf-moq-transport" to="MOQ-TRANSPORT"/> | ||||
<reference anchor="RFC2119"> | <displayreference target="I-D.ietf-mls-architecture" to="MLS-ARCH"/> | |||
<front> | <displayreference target="I-D.gouaillard-avtcore-codec-agn-rtp-payload" to=" | |||
<title>Key words for use in RFCs to Indicate Requirement Levels</title> | RTP-PAYLOAD"/> | |||
<author fullname="S. Bradner" initials="S." surname="Bradner"/> | <references> | |||
<date month="March" year="1997"/> | <name>References</name> | |||
<abstract> | <references anchor="sec-normative-references"> | |||
<t>In many standards track documents several words are used to signify the | <name>Normative References</name> | |||
requirements in the specification. These words are often capitalized. This docu | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2 | |||
ment defines these words as they should be interpreted in IETF documents. This d | 119.xml"/> | |||
ocument specifies an Internet Best Current Practices for the Internet Community, | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | |||
and requests discussion and suggestions for improvements.</t> | 174.xml"/> | |||
</abstract> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5 | |||
</front> | 116.xml"/> | |||
<seriesInfo name="BCP" value="14"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5 | |||
<seriesInfo name="RFC" value="2119"/> | 869.xml"/> | |||
<seriesInfo name="DOI" value="10.17487/RFC2119"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9 | |||
</reference> | 420.xml"/> | |||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
<reference anchor="RFC8174"> | 126.xml"/> | |||
<front> | </references> | |||
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title> | <references anchor="sec-informative-references"> | |||
<author fullname="B. Leiba" initials="B." surname="Leiba"/> | <name>Informative References</name> | |||
<date month="May" year="2017"/> | <reference anchor="TestVectors" target="https://github.com/sframe-wg/sfr | |||
<abstract> | ame/blob/025d568/test-vectors/test-vectors.json"> | |||
<t>RFC 2119 specifies common key words that may be used in protocol specif | <front> | |||
ications. This document aims to reduce the ambiguity by clarifying that only UPP | <title>SFrame Test Vectors</title> | |||
ERCASE usage of the key words have the defined special meanings.</t> | <author> | |||
</abstract> | <organization/> | |||
</front> | </author> | |||
<seriesInfo name="BCP" value="14"/> | <date year="2023" month="September"/> | |||
<seriesInfo name="RFC" value="8174"/> | </front> | |||
<seriesInfo name="DOI" value="10.17487/RFC8174"/> | <refcontent>commit 025d568</refcontent> | |||
</reference> | </reference> | |||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3 | ||||
<reference anchor="RFC5116"> | 711.xml"/> | |||
<front> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | |||
<title>An Interface and Algorithms for Authenticated Encryption</title> | 723.xml"/> | |||
<author fullname="D. McGrew" initials="D." surname="McGrew"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7 | |||
<date month="January" year="2008"/> | 656.xml"/> | |||
<abstract> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D. | |||
<t>This document defines algorithms for Authenticated Encryption with Asso | ietf-webtrans-overview.xml"/> | |||
ciated Data (AEAD), and defines a uniform interface and a registry for such algo | <reference anchor="I-D.ietf-moq-transport" target="https://datatracker.i | |||
rithms. The interface and registry can be used as an application-independent set | etf.org/doc/html/draft-ietf-moq-transport-05"> | |||
of cryptoalgorithm suites. This approach provides advantages in efficiency and | <front> | |||
security, and promotes the reuse of crypto implementations. [STANDARDS-TRACK]</t | <title>Media over QUIC Transport</title> | |||
> | <author fullname="Luke Curley" initials="L." surname="Curley"> | |||
</abstract> | <organization>Discord</organization> | |||
</front> | </author> | |||
<seriesInfo name="RFC" value="5116"/> | <author fullname="Kirill Pugin" initials="K." surname="Pugin"> | |||
<seriesInfo name="DOI" value="10.17487/RFC5116"/> | <organization>Meta</organization> | |||
</reference> | </author> | |||
<author fullname="Suhas Nandakumar" initials="S." surname="Nandakuma | ||||
<reference anchor="RFC5869"> | r"> | |||
<front> | <organization>Cisco</organization> | |||
<title>HMAC-based Extract-and-Expand Key Derivation Function (HKDF)</title> | </author> | |||
<author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/> | <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev"> | |||
<author fullname="P. Eronen" initials="P." surname="Eronen"/> | <organization>Google</organization> | |||
<date month="May" year="2010"/> | </author> | |||
<abstract> | <author fullname="Ian Swett" initials="I." surname="Swett" role="edi | |||
<t>This document specifies a simple Hashed Message Authentication Code (HM | tor"> | |||
AC)-based key derivation function (HKDF), which can be used as a building block | <organization>Google</organization> | |||
in various protocols and applications. The key derivation function (KDF) is inte | </author> | |||
nded to support a wide range of applications and requirements, and is conservati | <date day="8" month="July" year="2024"/> | |||
ve in its use of cryptographic hash functions. This document is not an Internet | </front> | |||
Standards Track specification; it is published for informational purposes.</t> | <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-05"/ | |||
</abstract> | > | |||
</front> | </reference> | |||
<seriesInfo name="RFC" value="5869"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D. | |||
<seriesInfo name="DOI" value="10.17487/RFC5869"/> | ietf-mls-architecture.xml"/> | |||
</reference> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7 | |||
667.xml"/> | ||||
<reference anchor="MLS-PROTO"> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | |||
<front> | 866.xml"/> | |||
<title>The Messaging Layer Security (MLS) Protocol</title> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6 | |||
<author fullname="R. Barnes" initials="R." surname="Barnes"/> | 716.xml"/> | |||
<author fullname="B. Beurdouche" initials="B." surname="Beurdouche"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D. | |||
<author fullname="R. Robert" initials="R." surname="Robert"/> | gouaillard-avtcore-codec-agn-rtp-payload.xml"/> | |||
<author fullname="J. Millican" initials="J." surname="Millican"/> | </references> | |||
<author fullname="E. Omara" initials="E." surname="Omara"/> | ||||
<author fullname="K. Cohn-Gordon" initials="K." surname="Cohn-Gordon"/> | ||||
<date month="July" year="2023"/> | ||||
<abstract> | ||||
<t>Messaging applications are increasingly making use of end-to-end securi | ||||
ty mechanisms to ensure that messages are only accessible to the communicating e | ||||
ndpoints, and not to any servers involved in delivering messages. Establishing k | ||||
eys to provide such protections is challenging for group chat settings, in which | ||||
more than two clients need to agree on a key but may not be online at the same | ||||
time. In this document, we specify a key establishment protocol that provides ef | ||||
ficient asynchronous group key establishment with forward secrecy (FS) and post- | ||||
compromise security (PCS) for groups in size ranging from two to thousands.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="9420"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC9420"/> | ||||
</reference> | ||||
<reference anchor="RFC8126"> | ||||
<front> | ||||
<title>Guidelines for Writing an IANA Considerations Section in RFCs</title> | ||||
<author fullname="M. Cotton" initials="M." surname="Cotton"/> | ||||
<author fullname="B. Leiba" initials="B." surname="Leiba"/> | ||||
<author fullname="T. Narten" initials="T." surname="Narten"/> | ||||
<date month="June" year="2017"/> | ||||
<abstract> | ||||
<t>Many protocols make use of points of extensibility that use constants t | ||||
o identify various protocol parameters. To ensure that the values in these field | ||||
s do not have conflicting uses and to promote interoperability, their allocation | ||||
s are often coordinated by a central record keeper. For IETF protocols, that rol | ||||
e is filled by the Internet Assigned Numbers Authority (IANA).</t> | ||||
<t>To make assignments in a given registry prudently, guidance describing | ||||
the conditions under which new values should be assigned, as well as when and ho | ||||
w modifications to existing values can be made, is needed. This document defines | ||||
a framework for the documentation of these guidelines by specification authors, | ||||
in order to assure that the provided guidance for the IANA Considerations is cl | ||||
ear and addresses the various issues that are likely in the operation of a regis | ||||
try.</t> | ||||
<t>This is the third edition of this document; it obsoletes RFC 5226.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="BCP" value="26"/> | ||||
<seriesInfo name="RFC" value="8126"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8126"/> | ||||
</reference> | ||||
</references> | ||||
<references title='Informative References' anchor="sec-informative-reference | ||||
s"> | ||||
<reference anchor="TestVectors" target="https://github.com/sframe-wg/sframe/blob | ||||
/025d568/test-vectors/test-vectors.json"> | ||||
<front> | ||||
<title>SFrame Test Vectors</title> | ||||
<author > | ||||
<organization></organization> | ||||
</author> | ||||
<date year="2023" month="September"/> | ||||
</front> | ||||
<refcontent>commit 025d568</refcontent></reference> | ||||
<reference anchor="RFC3711"> | ||||
<front> | ||||
<title>The Secure Real-time Transport Protocol (SRTP)</title> | ||||
<author fullname="M. Baugher" initials="M." surname="Baugher"/> | ||||
<author fullname="D. McGrew" initials="D." surname="McGrew"/> | ||||
<author fullname="M. Naslund" initials="M." surname="Naslund"/> | ||||
<author fullname="E. Carrara" initials="E." surname="Carrara"/> | ||||
<author fullname="K. Norrman" initials="K." surname="Norrman"/> | ||||
<date month="March" year="2004"/> | ||||
<abstract> | ||||
<t>This document describes the Secure Real-time Transport Protocol (SRTP), | ||||
a profile of the Real-time Transport Protocol (RTP), which can provide confiden | ||||
tiality, message authentication, and replay protection to the RTP traffic and to | ||||
the control traffic for RTP, the Real-time Transport Control Protocol (RTCP). [ | ||||
STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="3711"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC3711"/> | ||||
</reference> | ||||
<reference anchor="RFC8723"> | ||||
<front> | ||||
<title>Double Encryption Procedures for the Secure Real-Time Transport Proto | ||||
col (SRTP)</title> | ||||
<author fullname="C. Jennings" initials="C." surname="Jennings"/> | ||||
<author fullname="P. Jones" initials="P." surname="Jones"/> | ||||
<author fullname="R. Barnes" initials="R." surname="Barnes"/> | ||||
<author fullname="A.B. Roach" initials="A.B." surname="Roach"/> | ||||
<date month="April" year="2020"/> | ||||
<abstract> | ||||
<t>In some conferencing scenarios, it is desirable for an intermediary to | ||||
be able to manipulate some parameters in Real-time Transport Protocol (RTP) pack | ||||
ets, while still providing strong end-to-end security guarantees. This document | ||||
defines a cryptographic transform for the Secure Real-time Transport Protocol (S | ||||
RTP) that uses two separate but related cryptographic operations to provide hop- | ||||
by-hop and end-to-end security guarantees. Both the end-to-end and hop-by-hop cr | ||||
yptographic algorithms can utilize an authenticated encryption with associated d | ||||
ata (AEAD) algorithm or take advantage of future SRTP transforms with different | ||||
properties.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8723"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8723"/> | ||||
</reference> | ||||
<reference anchor="RFC7656"> | ||||
<front> | ||||
<title>A Taxonomy of Semantics and Mechanisms for Real-Time Transport Protoc | ||||
ol (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 Prot | ||||
ocol (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 relati | ||||
onships.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="7656"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC7656"/> | ||||
</reference> | ||||
<reference anchor="I-D.ietf-webtrans-overview"> | ||||
<front> | ||||
<title>The WebTransport Protocol Framework</title> | ||||
<author fullname="Victor Vasiliev" initials="V." surname="Vasiliev"> | ||||
<organization>Google</organization> | ||||
</author> | ||||
<date day="4" month="March" year="2024"/> | ||||
<abstract> | ||||
<t> The WebTransport Protocol Framework enables clients constrained by | ||||
the Web security model to communicate with a remote server using a | ||||
secure multiplexed transport. It consists of a set of individual | ||||
protocols that are safe to expose to untrusted applications, combined | ||||
with an abstract model that allows them to be used interchangeably. | ||||
This document defines the overall requirements on the protocols used | ||||
in WebTransport, as well as the common features of the protocols, | ||||
support for some of which may be optional. | ||||
</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="Internet-Draft" value="draft-ietf-webtrans-overview-07"/> | ||||
</reference> | ||||
<reference anchor="I-D.ietf-moq-transport"> | ||||
<front> | ||||
<title>Media over QUIC Transport</title> | ||||
<author fullname="Luke Curley" initials="L." surname="Curley"> | ||||
<organization>Discord</organization> | ||||
</author> | ||||
<author fullname="Kirill Pugin" initials="K." surname="Pugin"> | ||||
<organization>Meta</organization> | ||||
</author> | ||||
<author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar"> | ||||
<organization>Cisco</organization> | ||||
</author> | ||||
<author fullname="Victor Vasiliev" initials="V." surname="Vasiliev"> | ||||
<organization>Google</organization> | ||||
</author> | ||||
<author fullname="Ian Swett" initials="I." surname="Swett"> | ||||
<organization>Google</organization> | ||||
</author> | ||||
<date day="8" month="July" year="2024"/> | ||||
<abstract> | ||||
<t> This document defines the core behavior for Media over QUIC Transp | ||||
ort | ||||
(MOQT), a media transport protocol designed to operate over QUIC and | ||||
WebTransport, which have similar functionality. MOQT allows a | ||||
producer of media to publish data and have it consumed via | ||||
subscription by a multiplicity of endpoints. It supports | ||||
intermediate content distribution networks and is designed for high | ||||
scale and low latency distribution. | ||||
</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-05"/> | ||||
</reference> | ||||
<reference anchor="MLS-ARCH"> | ||||
<front> | ||||
<title>The Messaging Layer Security (MLS) Architecture</title> | ||||
<author fullname="Benjamin Beurdouche" initials="B." surname="Beurdouche"> | ||||
<organization>Inria & Mozilla</organization> | ||||
</author> | ||||
<author fullname="Eric Rescorla" initials="E." surname="Rescorla"> | ||||
<organization>Windy Hill Systems, LLC</organization> | ||||
</author> | ||||
<author fullname="Emad Omara" initials="E." surname="Omara"> | ||||
</author> | ||||
<author fullname="Srinivas Inguva" initials="S." surname="Inguva"> | ||||
</author> | ||||
<author fullname="Alan Duric" initials="A." surname="Duric"> | ||||
<organization>Wire</organization> | ||||
</author> | ||||
<date day="8" month="July" year="2024"/> | ||||
<abstract> | ||||
<t> The Messaging Layer Security (MLS) protocol (I-D.ietf-mls-protocol | ||||
) | ||||
provides a Group Key Agreement protocol for messaging applications. | ||||
MLS is meant to protect against eavesdropping, tampering, message | ||||
forgery, and provide Forward Secrecy (FS) and Post-Compromise | ||||
Security (PCS). | ||||
This document describes the architecture for using MLS in a general | ||||
secure group messaging infrastructure and defines the security goals | ||||
for MLS. It provides guidance on building a group messaging system | ||||
and discusses security and privacy tradeoffs offered by multiple | ||||
security mechanisms that are part of the MLS protocol (e.g., | ||||
frequency of public encryption key rotation). The document also | ||||
provides guidance for parts of the infrastructure that are not | ||||
standardized by MLS and are instead left to the application. | ||||
While the recommendations of this document are not mandatory to | ||||
follow in order to interoperate at the protocol level, they affect | ||||
the overall security guarantees that are achieved by a messaging | ||||
application. This is especially true in the case of active | ||||
adversaries that are able to compromise clients, the delivery | ||||
service, or the authentication service. | ||||
</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="Internet-Draft" value="draft-ietf-mls-architecture-14"/> | ||||
</reference> | ||||
<reference anchor="RFC7667"> | ||||
<front> | ||||
<title>RTP Topologies</title> | ||||
<author fullname="M. Westerlund" initials="M." surname="Westerlund"/> | ||||
<author fullname="S. Wenger" initials="S." surname="Wenger"/> | ||||
<date month="November" year="2015"/> | ||||
<abstract> | ||||
<t>This document discusses point-to-point and multi-endpoint topologies us | ||||
ed in environments based on the Real-time Transport Protocol (RTP). In particula | ||||
r, centralized topologies commonly employed in the video conferencing industry a | ||||
re mapped to the RTP terminology.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="7667"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC7667"/> | ||||
</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 intend | ||||
ed for describing multimedia sessions for the purposes of session announcement, | ||||
session invitation, and other forms of multimedia session initiation. This docum | ||||
ent obsoletes RFC 4566.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8866"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8866"/> | ||||
</reference> | ||||
<reference anchor="RFC6716"> | ||||
<front> | ||||
<title>Definition of the Opus Audio Codec</title> | ||||
<author fullname="JM. Valin" initials="JM." surname="Valin"/> | ||||
<author fullname="K. Vos" initials="K." surname="Vos"/> | ||||
<author fullname="T. Terriberry" initials="T." surname="Terriberry"/> | ||||
<date month="September" year="2012"/> | ||||
<abstract> | ||||
<t>This document defines the Opus interactive speech and audio codec. Opus | ||||
is designed to handle a wide range of interactive audio applications, including | ||||
Voice over IP, videoconferencing, in-game chat, and even live, distributed musi | ||||
c performances. It scales from low bitrate narrowband speech at 6 kbit/s to very | ||||
high quality stereo music at 510 kbit/s. Opus uses both Linear Prediction (LP) | ||||
and the Modified Discrete Cosine Transform (MDCT) to achieve good compression of | ||||
both speech and music. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="6716"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC6716"/> | ||||
</reference> | ||||
<reference anchor="I-D.gouaillard-avtcore-codec-agn-rtp-payload"> | ||||
<front> | ||||
<title>Codec agnostic RTP payload format for video</title> | ||||
<author fullname="Sergio Garcia Murillo" initials="S. G." surname="Murillo | ||||
"> | ||||
<organization>CoSMo Software</organization> | ||||
</author> | ||||
<author fullname="Youenn Fablet" initials="Y." surname="Fablet"> | ||||
<organization>Apple Inc.</organization> | ||||
</author> | ||||
<author fullname="Dr. Alex Gouaillard" initials="A." surname="Gouaillard"> | ||||
<organization>CoSMo Software</organization> | ||||
</author> | ||||
<date day="9" month="March" year="2021"/> | ||||
<abstract> | ||||
<t> RTP Media Chains usually rely on piping encoder output directly to | ||||
packetizers. Media packetization formats often support a specific | ||||
codec format and optimize RTP packets generation accordingly. | ||||
With the development of Selective Forward Unit (SFU) solutions, that | ||||
do not process media content server side, the need for media content | ||||
processing at the origin and at the destination has arised. | ||||
RTP Media Chains used e.g. in WebRTC solutions are increasingly | ||||
relying on application-specific transforms that sit in-between | ||||
encoder and packetizer on one end and in-between depacketizer and | ||||
decoder on the other end. This use case has become so important, | ||||
that the W3C is standardizing the capacity to access encoded content | ||||
with the [WebRTCInsertableStreams] API proposal. An extremely | ||||
popular use case is application level end-to-end encryption of media | ||||
content, using for instance [SFrame]. | ||||
Whatever the modification applied to the media content, RTP | ||||
packetizers can no longer expect to use packetization formats that | ||||
mandate media content to be in a specific codec format. | ||||
In the extreme cases like encryption, where the RTP Payload is made | ||||
completely opaque to the SFUs, some extra mechanism must also be | ||||
added for them to be able to route the packets without depending on | ||||
RTP payload or payload headers. | ||||
The traditionnal process of creating a new RTP Payload specification | ||||
per content would not be practical as we would need to make a new one | ||||
for each codec-transform pair. | ||||
This document describes a solution, which provides the following | ||||
features in the case the encoded content has been modified before | ||||
reaching the packetizer: - a paylaod agnostic RTP packetization | ||||
format that can be used on any media content, - a negotiation | ||||
mechanism for the above format and the inner payload, Both of the | ||||
above mechanism are backward compatible with most of (S)RTP/RTCP | ||||
mechanisms used for bandwidth estimation and congestion control in | ||||
RTP/SRTP/webrtc, including but not limited to SSRC, RED, FEC, RTX, | ||||
NACK, SR/RR, REMB, transport-wide-CC, TMBR, .... It as illustrated by | ||||
existing implementations in chrome, safari, and Medooze. | ||||
This document also describes a solution to allow SFUs to continue | ||||
performing packet routing on top of this generic RTP packetization | ||||
format. | ||||
This document complements the SFrame (media encryption), and | ||||
Dependency Descriptor (AV1 payload annex) documents to provide an | ||||
End-to-End-Encryption solution that would sit on top of SRTP/Webrtc, | ||||
use SFUs on the media back-end, and leverage W3C APIs in the browser. | ||||
A high level description of such system will be provided as an | ||||
informational I-D in the SFrame WG and then cited here. | ||||
</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="Internet-Draft" value="draft-gouaillard-avtcore-codec-agn-r | ||||
tp-payload-01"/> | ||||
</reference> | ||||
</references> | </references> | |||
<?line 1180?> | <section anchor="example-api"> | |||
<name>Example API</name> | ||||
<section anchor="example-api"><name>Example API</name> | <t><strong>This section is not normative.</strong></t> | |||
<t>This section describes a notional API that an SFrame implementation mig | ||||
<t><strong>This section is not normative.</strong></t> | ht | |||
<t>This section describes a notional API that an SFrame implementation might | ||||
expose. The core concept is an "SFrame context", within which KID values are | expose. The core concept is an "SFrame context", within which KID values are | |||
meaningful. In the key management scheme described in <xref target="sender-keys "/>, each | meaningful. In the key management scheme described in <xref target="sender-keys "/>, each | |||
sender has a different context; in the scheme described in <xref target="mls"/>, all senders | sender has a different context; in the scheme described in <xref target="mls"/>, all senders | |||
share the same context.</t> | share the same context.</t> | |||
<t>An SFrame context stores mappings from KID values to "key contexts", wh | ||||
<t>An SFrame context stores mappings from KID values to "key contexts", which ar | ich are | |||
e | ||||
different depending on whether the KID is to be used for sending or receiving | different depending on whether the KID is to be used for sending or receiving | |||
(an SFrame key should never be used for both operations). A key context tracks | (an SFrame key should never be used for both operations). A key context tracks | |||
the key and salt associated to the KID, and the current CTR value. A key | the key and salt associated to the KID, and the current CTR value. A key | |||
context to be used for sending also tracks the next CTR value to be used.</t> | context to be used for sending also tracks the next CTR value to be used.</t> | |||
<t>The primary operations on an SFrame context are as follows:</t> | ||||
<t>The primary operations on an SFrame context are as follows:</t> | <ul spacing="normal"> | |||
<li> | ||||
<t><list style="symbols"> | <t><strong>Create an SFrame context:</strong> The context is initializ | |||
<t><strong>Create an SFrame context:</strong> The context is initialized with | ed with a cipher suite and | |||
a cipher suite and | ||||
no KID mappings.</t> | no KID mappings.</t> | |||
<t><strong>Add a key for sending:</strong> The key and salt are derived from t | </li> | |||
he base key and | <li> | |||
<t><strong>Add a key for sending:</strong> The key and salt are derive | ||||
d from the base key and | ||||
used to initialize a send context, together with a zero CTR value.</t> | used to initialize a send context, together with a zero CTR value.</t> | |||
<t><strong>Add a key for receiving:</strong> The key and salt are derived from | </li> | |||
the base key and | <li> | |||
<t><strong>Add a key for receiving:</strong> The key and salt are deri | ||||
ved from the base key and | ||||
used to initialize a send context.</t> | used to initialize a send context.</t> | |||
<t><strong>Encrypt a plaintext:</strong> Encrypt a given plaintext using the k | </li> | |||
ey for a given KID, | <li> | |||
<t><strong>Encrypt a plaintext:</strong> Encrypt a given plaintext usi | ||||
ng the key for a given KID, | ||||
including the specified metadata.</t> | including the specified metadata.</t> | |||
<t><strong>Decrypt an SFrame ciphertext:</strong> Decrypt an SFrame ciphertext | </li> | |||
with the KID | <li> | |||
<t><strong>Decrypt an SFrame ciphertext:</strong> Decrypt an SFrame ci | ||||
phertext with the KID | ||||
and CTR values specified in the SFrame header, and the provided metadata.</t> | and CTR values specified in the SFrame header, and the provided metadata.</t> | |||
</list></t> | </li> | |||
</ul> | ||||
<t><xref target="rust-api"/> shows an example of the types of structures and met | <t><xref target="rust-api"/> shows an example of the types of structures a | |||
hods that could | nd methods that could | |||
be used to create an SFrame API in Rust.</t> | be used to create an SFrame API in Rust.</t> | |||
<figure anchor="rust-api"> | ||||
<figure title="An Example SFrame API" anchor="rust-api"><sourcecode type="rust"> | <name>An Example SFrame API</name> | |||
<![CDATA[ | <sourcecode type="rust"><![CDATA[ | |||
type KeyId = u64; | type KeyId = u64; | |||
type Counter = u64; | type Counter = u64; | |||
type CipherSuite = u16; | type CipherSuite = u16; | |||
struct SendKeyContext { | struct SendKeyContext { | |||
key: Vec<u8>, | key: Vec<u8>, | |||
salt: Vec<u8>, | salt: Vec<u8>, | |||
next_counter: Counter, | next_counter: Counter, | |||
} | } | |||
skipping to change at line 2269 ¶ | skipping to change at line 1971 ¶ | |||
} | } | |||
trait SFrameContextMethods { | trait SFrameContextMethods { | |||
fn create(cipher_suite: CipherSuite) -> Self; | fn create(cipher_suite: CipherSuite) -> Self; | |||
fn add_send_key(&self, kid: KeyId, base_key: &[u8]); | fn add_send_key(&self, kid: KeyId, base_key: &[u8]); | |||
fn add_recv_key(&self, kid: KeyId, base_key: &[u8]); | fn add_recv_key(&self, kid: KeyId, base_key: &[u8]); | |||
fn encrypt(&mut self, kid: KeyId, metadata: &[u8], | fn encrypt(&mut self, kid: KeyId, metadata: &[u8], | |||
plaintext: &[u8]) -> Vec<u8>; | plaintext: &[u8]) -> Vec<u8>; | |||
fn decrypt(&self, metadata: &[u8], ciphertext: &[u8]) -> Vec<u8>; | fn decrypt(&self, metadata: &[u8], ciphertext: &[u8]) -> Vec<u8>; | |||
} | } | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
</figure> | ||||
</section> | </section> | |||
<section anchor="overhead-analysis"><name>Overhead Analysis</name> | <section anchor="overhead-analysis"> | |||
<name>Overhead Analysis</name> | ||||
<t>Any use of SFrame will impose overhead in terms of the amount of bandwidth | <t>Any use of SFrame will impose overhead in terms of the amount of bandwi | |||
dth | ||||
necessary to transmit a given media stream. Exactly how much overhead will be a dded | necessary to transmit a given media stream. Exactly how much overhead will be a dded | |||
depends on several factors:</t> | depends on several factors:</t> | |||
<ul spacing="normal"> | ||||
<t><list style="symbols"> | <li> | |||
<t>The number of senders involved in a conference (length of KID)</t> | <t>The number of senders involved in a conference (length of KID)</t> | |||
<t>The duration of the conference (length of CTR)</t> | </li> | |||
<t>The cipher suite in use (length of authentication tag)</t> | <li> | |||
<t>Whether SFrame is used to encrypt packets, whole frames, or some other unit | <t>The duration of the conference (length of CTR)</t> | |||
</t> | </li> | |||
</list></t> | <li> | |||
<t>The cipher suite in use (length of authentication tag)</t> | ||||
<t>Overall, the overhead rate in kilobits per second can be estimated as:</t> | </li> | |||
<li> | ||||
<t><spanx style="verb"> | <t>Whether SFrame is used to encrypt packets, whole frames, or some ot | |||
her unit</t> | ||||
</li> | ||||
</ul> | ||||
<t>Overall, the overhead rate in kilobits per second can be estimated as:< | ||||
/t> | ||||
<t><tt> | ||||
OverheadKbps = (1 + |CTR| + |KID| + |TAG|) * 8 * CTPerSecond / 1024 | OverheadKbps = (1 + |CTR| + |KID| + |TAG|) * 8 * CTPerSecond / 1024 | |||
</spanx></t> | </tt></t> | |||
<t>Here the constant value <tt>1</tt> reflects the fixed SFrame header; <t | ||||
<t>Here the constant value <spanx style="verb">1</spanx> reflects the fixed SFra | t>|CTR|</tt> and | |||
me header; <spanx style="verb">|CTR|</spanx> and | <tt>|KID|</tt> reflect the lengths of those fields; <tt>|TAG|</tt> reflects the | |||
<spanx style="verb">|KID|</spanx> reflect the lengths of those fields; <spanx st | cipher | |||
yle="verb">|TAG|</spanx> reflects the cipher | overhead; and <tt>CTPerSecond</tt> reflects the number of SFrame ciphertexts | |||
overhead; and <spanx style="verb">CTPerSecond</spanx> reflects the number of SFr | ||||
ame ciphertexts | ||||
sent per second (e.g., packets or frames per second).</t> | sent per second (e.g., packets or frames per second).</t> | |||
<t>In the remainder of this section, we compute overhead estimates for a c | ||||
<t>In the remainder of this section, we compute overhead estimates for a collect | ollection | |||
ion | ||||
of common scenarios.</t> | of common scenarios.</t> | |||
<section anchor="assumptions"> | ||||
<section anchor="assumptions"><name>Assumptions</name> | <name>Assumptions</name> | |||
<t>In the below calculations, we make conservative assumptions about SFr | ||||
<t>In the below calculations, we make conservative assumptions about SFrame | ame | |||
overhead so that the overhead amounts we compute here are likely to be an upper | overhead so that the overhead amounts we compute here are likely to be an upper | |||
bound of those seen in practice.</t> | bound of those seen in practice.</t> | |||
<table anchor="analysis-assumptions"> | ||||
<texttable title="Overhead Analysis Assumptions" anchor="analysis-assumptions"> | <name>Overhead Analysis Assumptions</name> | |||
<ttcol align='left'>Field</ttcol> | <thead> | |||
<ttcol align='right'>Bytes</ttcol> | <tr> | |||
<ttcol align='left'>Explanation</ttcol> | <th align="left">Field</th> | |||
<c>Config byte</c> | <th align="right">Bytes</th> | |||
<c>1</c> | <th align="left">Explanation</th> | |||
<c>Fixed</c> | </tr> | |||
<c>Key ID (KID)</c> | </thead> | |||
<c>2</c> | <tbody> | |||
<c>>255 senders; or MLS epoch (E=4) and >16 senders</c> | <tr> | |||
<c>Counter (CTR)</c> | <td align="left">Config byte</td> | |||
<c>3</c> | <td align="right">1</td> | |||
<c>More than 24 hours of media in common cases</c> | <td align="left">Fixed</td> | |||
<c>Cipher overhead</c> | </tr> | |||
<c>16</c> | <tr> | |||
<c>Full authentication tag (longest defined here)</c> | <td align="left">Key ID (KID)</td> | |||
</texttable> | <td align="right">2</td> | |||
<td align="left">>255 senders; or MLS epoch (E=4) and >16 se | ||||
<t>In total, then, we assume that each SFrame encryption will add 22 bytes of | nders</td> | |||
</tr> | ||||
<tr> | ||||
<td align="left">Counter (CTR)</td> | ||||
<td align="right">3</td> | ||||
<td align="left">More than 24 hours of media in common cases</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">Cipher overhead</td> | ||||
<td align="right">16</td> | ||||
<td align="left">Full authentication tag (longest defined here)</t | ||||
d> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>In total, then, we assume that each SFrame encryption will add 22 byt | ||||
es of | ||||
overhead.</t> | overhead.</t> | |||
<t>We consider two scenarios: applying SFrame per frame and per packet. | ||||
<t>We consider two scenarios: applying SFrame per frame and per packet. In each | In each | |||
scenario, we compute the SFrame overhead in absolute terms (kbps) and as a | scenario, we compute the SFrame overhead in absolute terms (kbps) and as a | |||
percentage of the base bandwidth.</t> | percentage of the base bandwidth.</t> | |||
</section> | ||||
</section> | <section anchor="audio"> | |||
<section anchor="audio"><name>Audio</name> | <name>Audio</name> | |||
<t>In audio streams, there is typically a one-to-one relationship betwee | ||||
<t>In audio streams, there is typically a one-to-one relationship between frames | n frames | |||
and packets, so the overhead is the same whether one uses SFrame at a per-packet | and packets, so the overhead is the same whether one uses SFrame at a per-packet | |||
or per-frame level.</t> | or per-frame level.</t> | |||
<t><xref target="audio-overhead"/> considers three scenarios that are ba | ||||
<t><xref target="audio-overhead"/> considers three scenarios that are based on r | sed on recommended configurations | |||
ecommended configurations | ||||
of the Opus codec <xref target="RFC6716"/> (where "fps" stands for "frames per s econd"):</t> | of the Opus codec <xref target="RFC6716"/> (where "fps" stands for "frames per s econd"):</t> | |||
<table anchor="audio-overhead"> | ||||
<texttable title="SFrame Overhead for Audio Streams" anchor="audio-overhead"> | <name>SFrame Overhead for Audio Streams</name> | |||
<ttcol align='left'>Scenario</ttcol> | <thead> | |||
<ttcol align='center'>Frame length</ttcol> | <tr> | |||
<ttcol align='center'>fps</ttcol> | <th align="left">Scenario</th> | |||
<ttcol align='center'>Base kbps</ttcol> | <th align="center">Frame length</th> | |||
<ttcol align='center'>Overhead kbps</ttcol> | <th align="center">fps</th> | |||
<ttcol align='center'>Overhead %</ttcol> | <th align="center">Base kbps</th> | |||
<c>Narrow-band speech</c> | <th align="center">Overhead kbps</th> | |||
<c>120 ms</c> | <th align="center">Overhead %</th> | |||
<c>8.3</c> | </tr> | |||
<c>8</c> | </thead> | |||
<c>1.4</c> | <tbody> | |||
<c>17.9%</c> | <tr> | |||
<c>Full-band speech</c> | <td align="left">Narrow-band speech</td> | |||
<c>20 ms</c> | <td align="center">120 ms</td> | |||
<c>50</c> | <td align="center">8.3</td> | |||
<c>32</c> | <td align="center">8</td> | |||
<c>8.6</c> | <td align="center">1.4</td> | |||
<c>26.9%</c> | <td align="center">17.9%</td> | |||
<c>Full-band stereo music</c> | </tr> | |||
<c>10 ms</c> | <tr> | |||
<c>100</c> | <td align="left">Full-band speech</td> | |||
<c>128</c> | <td align="center">20 ms</td> | |||
<c>17.2</c> | <td align="center">50</td> | |||
<c>13.4%</c> | <td align="center">32</td> | |||
</texttable> | <td align="center">8.6</td> | |||
<td align="center">26.9%</td> | ||||
</section> | </tr> | |||
<section anchor="video"><name>Video</name> | <tr> | |||
<td align="left">Full-band stereo music</td> | ||||
<t>Video frames can be larger than an MTU and thus are commonly split across | <td align="center">10 ms</td> | |||
multiple frames. <xref target="video-overhead-per-frame"/> and <xref target="vi | <td align="center">100</td> | |||
deo-overhead-per-packet"/> | <td align="center">128</td> | |||
<td align="center">17.2</td> | ||||
<td align="center">13.4%</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
</section> | ||||
<section anchor="video"> | ||||
<name>Video</name> | ||||
<t>Video frames can be larger than an MTU and thus are commonly split ac | ||||
ross | ||||
multiple frames. Tables <xref target="video-overhead-per-frame" format="counter | ||||
"/> | ||||
and <xref target="video-overhead-per-packet" format="counter"/> | ||||
show the estimated overhead of encrypting a video stream, where SFrame is | show the estimated overhead of encrypting a video stream, where SFrame is | |||
applied per frame and per packet, respectively. The choices of resolution, | applied per frame and per packet, respectively. The choices of resolution, | |||
frames per second, and bandwidth roughly reflect the capabilities of | frames per second, and bandwidth roughly reflect the capabilities of | |||
modern video codecs across a range from very low to very high quality.</t> | modern video codecs across a range from very low to very high quality.</t> | |||
<table anchor="video-overhead-per-frame"> | ||||
<texttable title="SFrame Overhead for a Video Stream Encrypted per Frame" anchor | <name>SFrame Overhead for a Video Stream Encrypted per Frame</name> | |||
="video-overhead-per-frame"> | <thead> | |||
<ttcol align='left'>Scenario</ttcol> | <tr> | |||
<ttcol align='center'>fps</ttcol> | <th align="left">Scenario</th> | |||
<ttcol align='center'>Base kbps</ttcol> | <th align="center">fps</th> | |||
<ttcol align='center'>Overhead kbps</ttcol> | <th align="center">Base kbps</th> | |||
<ttcol align='center'>Overhead %</ttcol> | <th align="center">Overhead kbps</th> | |||
<c>426 x 240</c> | <th align="center">Overhead %</th> | |||
<c>7.5</c> | </tr> | |||
<c>45</c> | </thead> | |||
<c>1.3</c> | <tbody> | |||
<c>2.9%</c> | <tr> | |||
<c>640 x 360</c> | <td align="left">426 x 240</td> | |||
<c>15</c> | <td align="center">7.5</td> | |||
<c>200</c> | <td align="center">45</td> | |||
<c>2.6</c> | <td align="center">1.3</td> | |||
<c>1.3%</c> | <td align="center">2.9%</td> | |||
<c>640 x 360</c> | </tr> | |||
<c>30</c> | <tr> | |||
<c>400</c> | <td align="left">640 x 360</td> | |||
<c>5.2</c> | <td align="center">15</td> | |||
<c>1.3%</c> | <td align="center">200</td> | |||
<c>1280 x 720</c> | <td align="center">2.6</td> | |||
<c>30</c> | <td align="center">1.3%</td> | |||
<c>1500</c> | </tr> | |||
<c>5.2</c> | <tr> | |||
<c>0.3%</c> | <td align="left">640 x 360</td> | |||
<c>1920 x 1080</c> | <td align="center">30</td> | |||
<c>60</c> | <td align="center">400</td> | |||
<c>7200</c> | <td align="center">5.2</td> | |||
<c>10.3</c> | <td align="center">1.3%</td> | |||
<c>0.1%</c> | </tr> | |||
</texttable> | <tr> | |||
<td align="left">1280 x 720</td> | ||||
<texttable title="SFrame Overhead for a Video Stream Encrypted per Packet" ancho | <td align="center">30</td> | |||
r="video-overhead-per-packet"> | <td align="center">1500</td> | |||
<ttcol align='left'>Scenario</ttcol> | <td align="center">5.2</td> | |||
<ttcol align='center'>fps</ttcol> | <td align="center">0.3%</td> | |||
<ttcol align='center'>Packets per Second (pps)</ttcol> | </tr> | |||
<ttcol align='center'>Base kbps</ttcol> | <tr> | |||
<ttcol align='center'>Overhead kbps</ttcol> | <td align="left">1920 x 1080</td> | |||
<ttcol align='center'>Overhead %</ttcol> | <td align="center">60</td> | |||
<c>426 x 240</c> | <td align="center">7200</td> | |||
<c>7.5</c> | <td align="center">10.3</td> | |||
<c>7.5</c> | <td align="center">0.1%</td> | |||
<c>45</c> | </tr> | |||
<c>1.3</c> | </tbody> | |||
<c>2.9%</c> | </table> | |||
<c>640 x 360</c> | <table anchor="video-overhead-per-packet"> | |||
<c>15</c> | <name>SFrame Overhead for a Video Stream Encrypted per Packet</name> | |||
<c>30</c> | <thead> | |||
<c>200</c> | <tr> | |||
<c>5.2</c> | <th align="left">Scenario</th> | |||
<c>2.6%</c> | <th align="center">fps</th> | |||
<c>640 x 360</c> | <th align="center">Packets per Second (pps)</th> | |||
<c>30</c> | <th align="center">Base kbps</th> | |||
<c>60</c> | <th align="center">Overhead kbps</th> | |||
<c>400</c> | <th align="center">Overhead %</th> | |||
<c>10.3</c> | </tr> | |||
<c>2.6%</c> | </thead> | |||
<c>1280 x 720</c> | <tbody> | |||
<c>30</c> | <tr> | |||
<c>180</c> | <td align="left">426 x 240</td> | |||
<c>1500</c> | <td align="center">7.5</td> | |||
<c>30.9</c> | <td align="center">7.5</td> | |||
<c>2.1%</c> | <td align="center">45</td> | |||
<c>1920 x 1080</c> | <td align="center">1.3</td> | |||
<c>60</c> | <td align="center">2.9%</td> | |||
<c>780</c> | </tr> | |||
<c>7200</c> | <tr> | |||
<c>134.1</c> | <td align="left">640 x 360</td> | |||
<c>1.9%</c> | <td align="center">15</td> | |||
</texttable> | <td align="center">30</td> | |||
<td align="center">200</td> | ||||
<t>In the per-frame case, the SFrame percentage overhead approaches zero as the | <td align="center">5.2</td> | |||
<td align="center">2.6%</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">640 x 360</td> | ||||
<td align="center">30</td> | ||||
<td align="center">60</td> | ||||
<td align="center">400</td> | ||||
<td align="center">10.3</td> | ||||
<td align="center">2.6%</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">1280 x 720</td> | ||||
<td align="center">30</td> | ||||
<td align="center">180</td> | ||||
<td align="center">1500</td> | ||||
<td align="center">30.9</td> | ||||
<td align="center">2.1%</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">1920 x 1080</td> | ||||
<td align="center">60</td> | ||||
<td align="center">780</td> | ||||
<td align="center">7200</td> | ||||
<td align="center">134.1</td> | ||||
<td align="center">1.9%</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>In the per-frame case, the SFrame percentage overhead approaches zero | ||||
as the | ||||
quality of the video improves since bandwidth is driven more by picture size | quality of the video improves since bandwidth is driven more by picture size | |||
than frame rate. In the per-packet case, the SFrame percentage overhead | than frame rate. In the per-packet case, the SFrame percentage overhead | |||
approaches the ratio between the SFrame overhead per packet and the MTU (here 22 | approaches the ratio between the SFrame overhead per packet and the MTU (here 22 | |||
bytes of SFrame overhead divided by an assumed 1200-byte MTU, or about 1.8%).</t > | bytes of SFrame overhead divided by an assumed 1200-byte MTU, or about 1.8%).</t > | |||
</section> | ||||
</section> | <section anchor="conferences"> | |||
<section anchor="conferences"><name>Conferences</name> | <name>Conferences</name> | |||
<t>Real conferences usually involve several audio and video streams. Th | ||||
<t>Real conferences usually involve several audio and video streams. The overhe | e overhead | |||
ad | ||||
of SFrame in such a conference is the aggregate of the overhead across all the | of SFrame in such a conference is the aggregate of the overhead across all the | |||
individual streams. Thus, while SFrame incurs a large percentage overhead on an | individual streams. Thus, while SFrame incurs a large percentage overhead on an | |||
audio stream, if the conference also involves a video stream, then the audio | audio stream, if the conference also involves a video stream, then the audio | |||
overhead is likely negligible relative to the overall bandwidth of the | overhead is likely negligible relative to the overall bandwidth of the | |||
conference.</t> | conference.</t> | |||
<t>For example, <xref target="conference-overhead"/> shows the overhead | ||||
<t>For example, <xref target="conference-overhead"/> shows the overhead estimate | estimates for a two-person | |||
s for a two-person | ||||
conference where one person is sending low-quality media and the other is | conference where one person is sending low-quality media and the other is | |||
sending high-quality media. (And we assume that SFrame is applied per frame.) The | sending high-quality media. (And we assume that SFrame is applied per frame.) The | |||
video streams dominate the bandwidth at the SFU, so the total bandwidth overhead | video streams dominate the bandwidth at the SFU, so the total bandwidth overhead | |||
is only around 1%.</t> | is only around 1%.</t> | |||
<table anchor="conference-overhead"> | ||||
<texttable title="SFrame Overhead for a Two-Person Conference" anchor="conferenc | <name>SFrame Overhead for a Two-Person Conference</name> | |||
e-overhead"> | <thead> | |||
<ttcol align='left'>Stream</ttcol> | <tr> | |||
<ttcol align='center'>Base Kbps</ttcol> | <th align="left">Stream</th> | |||
<ttcol align='center'>Overhead Kbps</ttcol> | <th align="center">Base Kbps</th> | |||
<ttcol align='center'>Overhead %</ttcol> | <th align="center">Overhead Kbps</th> | |||
<c>Participant 1 audio</c> | <th align="center">Overhead %</th> | |||
<c>8</c> | </tr> | |||
<c>1.4</c> | </thead> | |||
<c>17.9%</c> | <tbody> | |||
<c>Participant 1 video</c> | <tr> | |||
<c>45</c> | <td align="left">Participant 1 audio</td> | |||
<c>1.3</c> | <td align="center">8</td> | |||
<c>2.9%</c> | <td align="center">1.4</td> | |||
<c>Participant 2 audio</c> | <td align="center">17.9%</td> | |||
<c>32</c> | </tr> | |||
<c>9</c> | <tr> | |||
<c>26.9%</c> | <td align="left">Participant 1 video</td> | |||
<c>Participant 2 video</c> | <td align="center">45</td> | |||
<c>1500</c> | <td align="center">1.3</td> | |||
<c>5</c> | <td align="center">2.9%</td> | |||
<c>0.3%</c> | </tr> | |||
<c>Total at SFU</c> | <tr> | |||
<c>1585</c> | <td align="left">Participant 2 audio</td> | |||
<c>16.5</c> | <td align="center">32</td> | |||
<c>1.0%</c> | <td align="center">9</td> | |||
</texttable> | <td align="center">26.9%</td> | |||
</tr> | ||||
</section> | <tr> | |||
<section anchor="sframe-over-rtp"><name>SFrame over RTP</name> | <td align="left">Participant 2 video</td> | |||
<td align="center">1500</td> | ||||
<t>SFrame is a generic encapsulation format, but many of the applications in whi | <td align="center">5</td> | |||
ch | <td align="center">0.3%</td> | |||
</tr> | ||||
<tr> | ||||
<td align="left">Total at SFU</td> | ||||
<td align="center">1585</td> | ||||
<td align="center">16.5</td> | ||||
<td align="center">1.0%</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
</section> | ||||
<section anchor="sframe-over-rtp"> | ||||
<name>SFrame over RTP</name> | ||||
<t>SFrame is a generic encapsulation format, but many of the application | ||||
s in which | ||||
it is likely to be integrated are based on RTP. This section discusses how an | it is likely to be integrated are based on RTP. This section discusses how an | |||
integration between SFrame and RTP could be done, and some of the challenges | integration between SFrame and RTP could be done, and some of the challenges | |||
that would need to be overcome.</t> | that would need to be overcome.</t> | |||
<t>As discussed in <xref target="application-context"/>, there are two n | ||||
<t>As discussed in <xref target="application-context"/>, there are two natural p | atural patterns for | |||
atterns for | ||||
integrating SFrame into an application: applying SFrame per frame or per packet. | integrating SFrame into an application: applying SFrame per frame or per packet. | |||
In RTP-based applications, applying SFrame per packet means that the payload of | In RTP-based applications, applying SFrame per packet means that the payload of | |||
each RTP packet will be an SFrame ciphertext, starting with an SFrame header, as | each RTP packet will be an SFrame ciphertext, starting with an SFrame header, as | |||
shown in <xref target="sframe-packet"/>. Applying SFrame per frame means that d ifferent | shown in <xref target="sframe-packet"/>. Applying SFrame per frame means that d ifferent | |||
RTP payloads will have different formats: The first payload of a frame will | RTP payloads will have different formats: The first payload of a frame will | |||
contain the SFrame headers, and subsequent payloads will contain further chunks | contain the SFrame headers, and subsequent payloads will contain further chunks | |||
of the ciphertext, as shown in <xref target="sframe-multi-packet"/>.</t> | of the ciphertext, as shown in <xref target="sframe-multi-packet"/>.</t> | |||
<t>In order for these media payloads to be properly interpreted by recei | ||||
<t>In order for these media payloads to be properly interpreted by receivers, | vers, | |||
receivers will need to be configured to know which of the above schemes the | receivers will need to be configured to know which of the above schemes the | |||
sender has applied to a given sequence of RTP packets. SFrame does not provide | sender has applied to a given sequence of RTP packets. SFrame does not provide | |||
a mechanism for distributing this configuration information. In applications | a mechanism for distributing this configuration information. In applications | |||
that use SDP for negotiating RTP media streams <xref target="RFC8866"/>, an appr opriate | that use SDP for negotiating RTP media streams <xref target="RFC8866"/>, an appr opriate | |||
extension to SDP could provide this function.</t> | extension to SDP could provide this function.</t> | |||
<t>Applying SFrame per frame also requires that packetization and depack | ||||
<t>Applying SFrame per frame also requires that packetization and depacketizatio | etization | |||
n | ||||
be done in a generic manner that does not depend on the media content of the | be done in a generic manner that does not depend on the media content of the | |||
packets, since the content being packetized or depacketized will be opaque | packets, since the content being packetized or depacketized will be opaque | |||
ciphertext (except for the SFrame header). In order for such a generic | ciphertext (except for the SFrame header). In order for such a generic | |||
packetization scheme to work interoperably, one would have to be defined, e.g., | packetization scheme to work interoperably, one would have to be defined, e.g., | |||
as proposed in <xref target="I-D.gouaillard-avtcore-codec-agn-rtp-payload"/>.</t > | as proposed in <xref target="I-D.gouaillard-avtcore-codec-agn-rtp-payload"/>.</t > | |||
<figure anchor="sframe-packet"> | ||||
<figure title="SRTP Packet with SFrame-Protected Payload" anchor="sframe-packet" | <name>SRTP Packet with SFrame-Protected Payload</name> | |||
><artset><artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1 | <artset> | |||
.1" height="384" width="576" viewBox="0 0 576 384" class="diagram" text-anchor=" | <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version= | |||
middle" font-family="monospace" font-size="13px" stroke-linecap="round"> | "1.1" height="384" width="552" viewBox="0 0 552 384" class="diagram" text-anchor | |||
<path d="M 8,208 L 8,368" fill="none" stroke="black"/> | ="middle" font-family="monospace" font-size="13px" stroke-linecap="round"> | |||
<path d="M 32,32 L 32,336" fill="none" stroke="black"/> | <path d="M 8,208 L 8,368" fill="none" stroke="black"/> | |||
<path d="M 64,32 L 64,64" fill="none" stroke="black"/> | <path d="M 32,32 L 32,336" fill="none" stroke="black"/> | |||
<path d="M 80,32 L 80,64" fill="none" stroke="black"/> | <path d="M 64,32 L 64,64" fill="none" stroke="black"/> | |||
<path d="M 96,32 L 96,64" fill="none" stroke="black"/> | <path d="M 80,32 L 80,64" fill="none" stroke="black"/> | |||
<path d="M 160,32 L 160,64" fill="none" stroke="black"/> | <path d="M 96,32 L 96,64" fill="none" stroke="black"/> | |||
<path d="M 176,32 L 176,64" fill="none" stroke="black"/> | <path d="M 160,32 L 160,64" fill="none" stroke="black"/> | |||
<path d="M 200,208 L 200,240" fill="none" stroke="black"/> | <path d="M 176,32 L 176,64" fill="none" stroke="black"/> | |||
<path d="M 288,32 L 288,64" fill="none" stroke="black"/> | <path d="M 192,208 L 192,240" fill="none" stroke="black"/> | |||
<path d="M 544,32 L 544,336" fill="none" stroke="black"/> | <path d="M 272,32 L 272,64" fill="none" stroke="black"/> | |||
<path d="M 568,32 L 568,368" fill="none" stroke="black"/> | <path d="M 520,32 L 520,336" fill="none" stroke="black"/> | |||
<path d="M 32,32 L 568,32" fill="none" stroke="black"/> | <path d="M 544,32 L 544,368" fill="none" stroke="black"/> | |||
<path d="M 32,64 L 544,64" fill="none" stroke="black"/> | <path d="M 32,32 L 544,32" fill="none" stroke="black"/> | |||
<path d="M 32,96 L 544,96" fill="none" stroke="black"/> | <path d="M 32,64 L 520,64" fill="none" stroke="black"/> | |||
<path d="M 32,126 L 544,126" fill="none" stroke="black"/><path d="M 32,130 L 544 | <path d="M 32,96 L 520,96" fill="none" stroke="black"/> | |||
,130" fill="none" stroke="black"/> | <path d="M 32,126 L 520,126" fill="none" stroke="black"/> | |||
<path d="M 32,176 L 544,176" fill="none" stroke="black"/> | <path d="M 32,130 L 520,130" fill="none" stroke="black"/> | |||
<path d="M 8,208 L 544,208" fill="none" stroke="black"/> | <path d="M 32,176 L 520,176" fill="none" stroke="black"/> | |||
<path d="M 32,240 L 200,240" fill="none" stroke="black"/> | <path d="M 8,208 L 520,208" fill="none" stroke="black"/> | |||
<path d="M 8,304 L 568,304" fill="none" stroke="black"/> | <path d="M 32,240 L 192,240" fill="none" stroke="black"/> | |||
<path d="M 32,336 L 544,336" fill="none" stroke="black"/> | <path d="M 8,304 L 544,304" fill="none" stroke="black"/> | |||
<path d="M 8,368 L 32,368" fill="none" stroke="black"/> | <path d="M 32,336 L 520,336" fill="none" stroke="black"/> | |||
<path d="M 544,368 L 568,368" fill="none" stroke="black"/> | <path d="M 8,368 L 32,368" fill="none" stroke="black"/> | |||
<polygon class="arrowhead" points="560,304 548,298.4 548,309.6" fill="black" tra | <path d="M 520,368 L 544,368" fill="none" stroke="black"/> | |||
nsform="rotate(180,552,304)"/> | <polygon class="arrowhead" points="536,304 524,298.4 524,309.6" | |||
<polygon class="arrowhead" points="560,32 548,26.4 548,37.6" fill="black" transf | fill="black" transform="rotate(180,528,304)"/> | |||
orm="rotate(180,552,32)"/> | <polygon class="arrowhead" points="536,32 524,26.4 524,37.6" fil | |||
<polygon class="arrowhead" points="32,304 20,298.4 20,309.6" fill="black" transf | l="black" transform="rotate(180,528,32)"/> | |||
orm="rotate(0,24,304)"/> | <polygon class="arrowhead" points="32,304 20,298.4 20,309.6" fil | |||
<polygon class="arrowhead" points="32,208 20,202.4 20,213.6" fill="black" transf | l="black" transform="rotate(0,24,304)"/> | |||
orm="rotate(0,24,208)"/> | <polygon class="arrowhead" points="32,208 20,202.4 20,213.6" fil | |||
<g class="text"> | l="black" transform="rotate(0,24,208)"/> | |||
<text x="48" y="52">V=2</text> | <g class="text"> | |||
<text x="72" y="52">P</text> | <text x="48" y="52">V=2</text> | |||
<text x="88" y="52">X</text> | <text x="72" y="52">P</text> | |||
<text x="124" y="52">CC</text> | <text x="88" y="52">X</text> | |||
<text x="168" y="52">M</text> | <text x="124" y="52">CC</text> | |||
<text x="228" y="52">PT</text> | <text x="168" y="52">M</text> | |||
<text x="380" y="52">sequence</text> | <text x="228" y="52">PT</text> | |||
<text x="444" y="52">number</text> | <text x="364" y="52">sequence</text> | |||
<text x="288" y="84">timestamp</text> | <text x="428" y="52">number</text> | |||
<text x="184" y="116">synchronization</text> | <text x="280" y="84">timestamp</text> | |||
<text x="276" y="116">source</text> | <text x="176" y="116">synchronization</text> | |||
<text x="332" y="116">(SSRC)</text> | <text x="268" y="116">source</text> | |||
<text x="404" y="116">identifier</text> | <text x="324" y="116">(SSRC)</text> | |||
<text x="180" y="148">contributing</text> | <text x="396" y="116">identifier</text> | |||
<text x="260" y="148">source</text> | <text x="172" y="148">contributing</text> | |||
<text x="316" y="148">(CSRC)</text> | <text x="252" y="148">source</text> | |||
<text x="392" y="148">identifiers</text> | <text x="308" y="148">(CSRC)</text> | |||
<text x="300" y="164">....</text> | <text x="384" y="148">identifiers</text> | |||
<text x="200" y="196">RTP</text> | <text x="292" y="164">....</text> | |||
<text x="268" y="196">extension(s)</text> | <text x="192" y="196">RTP</text> | |||
<text x="364" y="196">(OPTIONAL)</text> | <text x="260" y="196">extension(s)</text> | |||
<text x="84" y="228">SFrame</text> | <text x="356" y="196">(OPTIONAL)</text> | |||
<text x="140" y="228">header</text> | <text x="76" y="228">SFrame</text> | |||
<text x="140" y="276">SFrame</text> | <text x="132" y="228">header</text> | |||
<text x="208" y="276">encrypted</text> | <text x="132" y="276">SFrame</text> | |||
<text x="264" y="276">and</text> | <text x="200" y="276">encrypted</text> | |||
<text x="336" y="276">authenticated</text> | <text x="256" y="276">and</text> | |||
<text x="424" y="276">payload</text> | <text x="328" y="276">authenticated</text> | |||
<text x="212" y="324">SRTP</text> | <text x="416" y="276">payload</text> | |||
<text x="292" y="324">authentication</text> | <text x="204" y="324">SRTP</text> | |||
<text x="368" y="324">tag</text> | <text x="284" y="324">authentication</text> | |||
<text x="60" y="372">SRTP</text> | <text x="360" y="324">tag</text> | |||
<text x="120" y="372">Encrypted</text> | <text x="60" y="372">SRTP</text> | |||
<text x="192" y="372">Portion</text> | <text x="120" y="372">Encrypted</text> | |||
<text x="340" y="372">SRTP</text> | <text x="192" y="372">Portion</text> | |||
<text x="416" y="372">Authenticated</text> | <text x="316" y="372">SRTP</text> | |||
<text x="504" y="372">Portion</text> | <text x="392" y="372">Authenticated</text> | |||
</g> | <text x="480" y="372">Portion</text> | |||
</svg> | </g> | |||
</artwork><artwork type="ascii-art"><![CDATA[ | </svg> | |||
+---+-+-+-------+-+-------------+-------------------------------+<-+ | </artwork> | |||
|V=2|P|X| CC |M| PT | sequence number | | | <artwork type="ascii-art"><![CDATA[ | |||
+---+-+-+-------+-+-------------+-------------------------------+ | | +---+-+-+-------+-+-----------+------------------------------+<-+ | |||
| timestamp | | | |V=2|P|X| CC |M| PT | sequence number | | | |||
+---------------------------------------------------------------+ | | +---+-+-+-------+-+-----------+------------------------------+ | | |||
| synchronization source (SSRC) identifier | | | | timestamp | | | |||
+===============================================================+ | | +------------------------------------------------------------+ | | |||
| contributing source (CSRC) identifiers | | | | synchronization source (SSRC) identifier | | | |||
| .... | | | +============================================================+ | | |||
+---------------------------------------------------------------+ | | | contributing source (CSRC) identifiers | | | |||
| RTP extension(s) (OPTIONAL) | | | | .... | | | |||
+->+--------------------+------------------------------------------+ | | +------------------------------------------------------------+ | | |||
| | SFrame header | | | | | RTP extension(s) (OPTIONAL) | | | |||
| +--------------------+ | | | +->+-------------------+----------------------------------------+ | | |||
| | | | | | | SFrame header | | | | |||
| | SFrame encrypted and authenticated payload | | | | +-------------------+ | | | |||
| | | | | | | | | | |||
+->+---------------------------------------------------------------+<-+ | | | SFrame encrypted and authenticated payload | | | |||
| | SRTP authentication tag | | | | | | | | |||
| +---------------------------------------------------------------+ | | +->+------------------------------------------------------------+<-+ | |||
| | | | | SRTP authentication tag | | | |||
+--- SRTP Encrypted Portion SRTP Authenticated Portion ---+ | | +------------------------------------------------------------+ | | |||
]]></artwork></artset></figure> | | | | |||
+--- SRTP Encrypted Portion SRTP Authenticated Portion ---+ | ||||
<figure title="Encryption Flow with per-Frame Encryption for RTP" anchor="sframe | ]]></artwork> | |||
-multi-packet"><artset><artwork type="svg"><svg xmlns="http://www.w3.org/2000/s | </artset> | |||
vg" version="1.1" height="624" width="504" viewBox="0 0 504 624" class="diagram" | </figure> | |||
text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="r | <figure anchor="sframe-multi-packet"> | |||
ound"> | <name>Encryption Flow with per-Frame Encryption for RTP</name> | |||
<path d="M 8,192 L 8,224" fill="none" stroke="black"/> | <artset> | |||
<path d="M 8,512 L 8,608" fill="none" stroke="black"/> | <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version= | |||
<path d="M 32,32 L 32,64" fill="none" stroke="black"/> | "1.1" height="624" width="504" viewBox="0 0 504 624" class="diagram" text-anchor | |||
<path d="M 32,232 L 32,504" fill="none" stroke="black"/> | ="middle" font-family="monospace" font-size="13px" stroke-linecap="round"> | |||
<path d="M 72,464 L 72,504" fill="none" stroke="black"/> | <path d="M 8,192 L 8,224" fill="none" stroke="black"/> | |||
<path d="M 96,64 L 96,184" fill="none" stroke="black"/> | <path d="M 8,512 L 8,608" fill="none" stroke="black"/> | |||
<path d="M 136,512 L 136,608" fill="none" stroke="black"/> | <path d="M 32,32 L 32,64" fill="none" stroke="black"/> | |||
<path d="M 168,32 L 168,64" fill="none" stroke="black"/> | <path d="M 32,232 L 32,504" fill="none" stroke="black"/> | |||
<path d="M 192,32 L 192,128" fill="none" stroke="black"/> | <path d="M 72,464 L 72,504" fill="none" stroke="black"/> | |||
<path d="M 192,288 L 192,400" fill="none" stroke="black"/> | <path d="M 96,64 L 96,184" fill="none" stroke="black"/> | |||
<path d="M 192,512 L 192,608" fill="none" stroke="black"/> | <path d="M 136,512 L 136,608" fill="none" stroke="black"/> | |||
<path d="M 256,128 L 256,184" fill="none" stroke="black"/> | <path d="M 168,32 L 168,64" fill="none" stroke="black"/> | |||
<path d="M 256,232 L 256,280" fill="none" stroke="black"/> | <path d="M 192,32 L 192,128" fill="none" stroke="black"/> | |||
<path d="M 256,400 L 256,416" fill="none" stroke="black"/> | <path d="M 192,288 L 192,400" fill="none" stroke="black"/> | |||
<path d="M 256,448 L 256,504" fill="none" stroke="black"/> | <path d="M 192,512 L 192,608" fill="none" stroke="black"/> | |||
<path d="M 320,32 L 320,128" fill="none" stroke="black"/> | <path d="M 256,128 L 256,184" fill="none" stroke="black"/> | |||
<path d="M 320,192 L 320,224" fill="none" stroke="black"/> | <path d="M 256,232 L 256,280" fill="none" stroke="black"/> | |||
<path d="M 320,288 L 320,400" fill="none" stroke="black"/> | <path d="M 256,400 L 256,416" fill="none" stroke="black"/> | |||
<path d="M 320,512 L 320,608" fill="none" stroke="black"/> | <path d="M 256,448 L 256,504" fill="none" stroke="black"/> | |||
<path d="M 368,512 L 368,608" fill="none" stroke="black"/> | <path d="M 320,32 L 320,128" fill="none" stroke="black"/> | |||
<path d="M 432,464 L 432,504" fill="none" stroke="black"/> | <path d="M 320,192 L 320,224" fill="none" stroke="black"/> | |||
<path d="M 496,512 L 496,608" fill="none" stroke="black"/> | <path d="M 320,288 L 320,400" fill="none" stroke="black"/> | |||
<path d="M 32,32 L 168,32" fill="none" stroke="black"/> | <path d="M 320,512 L 320,608" fill="none" stroke="black"/> | |||
<path d="M 192,32 L 320,32" fill="none" stroke="black"/> | <path d="M 368,512 L 368,608" fill="none" stroke="black"/> | |||
<path d="M 32,64 L 168,64" fill="none" stroke="black"/> | <path d="M 432,464 L 432,504" fill="none" stroke="black"/> | |||
<path d="M 192,128 L 320,128" fill="none" stroke="black"/> | <path d="M 496,512 L 496,608" fill="none" stroke="black"/> | |||
<path d="M 8,192 L 320,192" fill="none" stroke="black"/> | <path d="M 32,32 L 168,32" fill="none" stroke="black"/> | |||
<path d="M 8,224 L 320,224" fill="none" stroke="black"/> | <path d="M 192,32 L 320,32" fill="none" stroke="black"/> | |||
<path d="M 192,288 L 320,288" fill="none" stroke="black"/> | <path d="M 32,64 L 168,64" fill="none" stroke="black"/> | |||
<path d="M 192,400 L 320,400" fill="none" stroke="black"/> | <path d="M 192,128 L 320,128" fill="none" stroke="black"/> | |||
<path d="M 72,464 L 328,464" fill="none" stroke="black"/> | <path d="M 8,192 L 320,192" fill="none" stroke="black"/> | |||
<path d="M 360,464 L 432,464" fill="none" stroke="black"/> | <path d="M 8,224 L 320,224" fill="none" stroke="black"/> | |||
<path d="M 8,512 L 136,512" fill="none" stroke="black"/> | <path d="M 192,288 L 320,288" fill="none" stroke="black"/> | |||
<path d="M 192,512 L 320,512" fill="none" stroke="black"/> | <path d="M 192,400 L 320,400" fill="none" stroke="black"/> | |||
<path d="M 368,512 L 496,512" fill="none" stroke="black"/> | <path d="M 72,464 L 328,464" fill="none" stroke="black"/> | |||
<path d="M 8,544 L 136,544" fill="none" stroke="black"/> | <path d="M 360,464 L 432,464" fill="none" stroke="black"/> | |||
<path d="M 8,608 L 136,608" fill="none" stroke="black"/> | <path d="M 8,512 L 136,512" fill="none" stroke="black"/> | |||
<path d="M 192,608 L 320,608" fill="none" stroke="black"/> | <path d="M 192,512 L 320,512" fill="none" stroke="black"/> | |||
<path d="M 368,608 L 496,608" fill="none" stroke="black"/> | <path d="M 368,512 L 496,512" fill="none" stroke="black"/> | |||
<polygon class="arrowhead" points="440,504 428,498.4 428,509.6" fill="black" tra | <path d="M 8,544 L 136,544" fill="none" stroke="black"/> | |||
nsform="rotate(90,432,504)"/> | <path d="M 8,608 L 136,608" fill="none" stroke="black"/> | |||
<polygon class="arrowhead" points="264,504 252,498.4 252,509.6" fill="black" tra | <path d="M 192,608 L 320,608" fill="none" stroke="black"/> | |||
nsform="rotate(90,256,504)"/> | <path d="M 368,608 L 496,608" fill="none" stroke="black"/> | |||
<polygon class="arrowhead" points="264,280 252,274.4 252,285.6" fill="black" tra | <polygon class="arrowhead" points="440,504 428,498.4 428,509.6" | |||
nsform="rotate(90,256,280)"/> | fill="black" transform="rotate(90,432,504)"/> | |||
<polygon class="arrowhead" points="264,184 252,178.4 252,189.6" fill="black" tra | <polygon class="arrowhead" points="264,504 252,498.4 252,509.6" | |||
nsform="rotate(90,256,184)"/> | fill="black" transform="rotate(90,256,504)"/> | |||
<polygon class="arrowhead" points="104,184 92,178.4 92,189.6" fill="black" trans | <polygon class="arrowhead" points="264,280 252,274.4 252,285.6" | |||
form="rotate(90,96,184)"/> | fill="black" transform="rotate(90,256,280)"/> | |||
<polygon class="arrowhead" points="80,504 68,498.4 68,509.6" fill="black" transf | <polygon class="arrowhead" points="264,184 252,178.4 252,189.6" | |||
orm="rotate(90,72,504)"/> | fill="black" transform="rotate(90,256,184)"/> | |||
<polygon class="arrowhead" points="40,504 28,498.4 28,509.6" fill="black" transf | <polygon class="arrowhead" points="104,184 92,178.4 92,189.6" fi | |||
orm="rotate(90,32,504)"/> | ll="black" transform="rotate(90,96,184)"/> | |||
<g class="text"> | <polygon class="arrowhead" points="80,504 68,498.4 68,509.6" fil | |||
<text x="64" y="52">frame</text> | l="black" transform="rotate(90,72,504)"/> | |||
<text x="124" y="52">metadata</text> | <polygon class="arrowhead" points="40,504 28,498.4 28,509.6" fil | |||
<text x="256" y="84">frame</text> | l="black" transform="rotate(90,32,504)"/> | |||
<text x="132" y="212">SFrame</text> | <g class="text"> | |||
<text x="192" y="212">Encrypt</text> | <text x="64" y="52">frame</text> | |||
<text x="256" y="340">encrypted</text> | <text x="124" y="52">metadata</text> | |||
<text x="256" y="356">frame</text> | <text x="256" y="84">frame</text> | |||
<text x="208" y="436">generic</text> | <text x="132" y="212">SFrame</text> | |||
<text x="256" y="436">RTP</text> | <text x="192" y="212">Encrypt</text> | |||
<text x="312" y="436">packetize</text> | <text x="256" y="340">encrypted</text> | |||
<text x="344" y="468">...</text> | <text x="256" y="356">frame</text> | |||
<text x="44" y="532">SFrame</text> | <text x="208" y="436">generic</text> | |||
<text x="100" y="532">header</text> | <text x="256" y="436">RTP</text> | |||
<text x="240" y="564">payload</text> | <text x="312" y="436">packetize</text> | |||
<text x="288" y="564">2/N</text> | <text x="344" y="468">...</text> | |||
<text x="344" y="564">...</text> | <text x="44" y="532">SFrame</text> | |||
<text x="416" y="564">payload</text> | <text x="100" y="532">header</text> | |||
<text x="464" y="564">N/N</text> | <text x="240" y="564">payload</text> | |||
<text x="56" y="580">payload</text> | <text x="288" y="564">2/N</text> | |||
<text x="104" y="580">1/N</text> | <text x="344" y="564">...</text> | |||
</g> | <text x="416" y="564">payload</text> | |||
</svg> | <text x="464" y="564">N/N</text> | |||
</artwork><artwork type="ascii-art"><![CDATA[ | <text x="56" y="580">payload</text> | |||
<text x="104" y="580">1/N</text> | ||||
</g> | ||||
</svg> | ||||
</artwork> | ||||
<artwork type="ascii-art"><![CDATA[ | ||||
+----------------+ +---------------+ | +----------------+ +---------------+ | |||
| frame metadata | | | | | frame metadata | | | | |||
+-------+--------+ | | | +-------+--------+ | | | |||
| | frame | | | | frame | | |||
| | | | | | | | |||
| | | | | | | | |||
| +-------+-------+ | | +-------+-------+ | |||
| | | | | | |||
| | | | | | |||
V V | V V | |||
skipping to change at line 2729 ¶ | skipping to change at line 2505 ¶ | |||
| +----------------------+--------.....--------+ | | +----------------------+--------.....--------+ | |||
| | | | | | | | | | |||
V V V V | V V V V | |||
+---------------+ +---------------+ +---------------+ | +---------------+ +---------------+ +---------------+ | |||
| SFrame header | | | | | | | SFrame header | | | | | | |||
+---------------+ | | | | | +---------------+ | | | | | |||
| | | payload 2/N | ... | payload N/N | | | | | payload 2/N | ... | payload N/N | | |||
| payload 1/N | | | | | | | payload 1/N | | | | | | |||
| | | | | | | | | | | | | | |||
+---------------+ +---------------+ +---------------+ | +---------------+ +---------------+ +---------------+ | |||
]]></artwork></artset></figure> | ]]></artwork> | |||
</artset> | ||||
</section> | </figure> | |||
</section> | </section> | |||
<section anchor="test-vectors"><name>Test Vectors</name> | </section> | |||
<section anchor="test-vectors"> | ||||
<t>This section provides a set of test vectors that implementations can use to | <name>Test Vectors</name> | |||
<t>This section provides a set of test vectors that implementations can us | ||||
e to | ||||
verify that they correctly implement SFrame encryption and decryption. In | verify that they correctly implement SFrame encryption and decryption. In | |||
addition to test vectors for the overall process of SFrame | addition to test vectors for the overall process of SFrame | |||
encryption/decryption, we also provide test vectors for header | encryption/decryption, we also provide test vectors for header | |||
encoding/decoding, and for AEAD encryption/decryption using the AES-CTR | encoding/decoding, and for AEAD encryption/decryption using the AES-CTR | |||
construction defined in <xref target="aes-ctr-with-sha2"/>.</t> | construction defined in <xref target="aes-ctr-with-sha2"/>.</t> | |||
<t>All values are either numeric or byte strings. Numeric values are repr | ||||
<t>All values are either numeric or byte strings. Numeric values are represente | esented | |||
d | as hex values, prefixed with <tt>0x</tt>. Byte strings are represented in hex | |||
as hex values, prefixed with <spanx style="verb">0x</spanx>. Byte strings are r | ||||
epresented in hex | ||||
encoding.</t> | encoding.</t> | |||
<t>Line breaks and whitespace within values are inserted to conform to the | ||||
<t>Line breaks and whitespace within values are inserted to conform to the width | width | |||
requirements of the RFC format. They should be removed before use.</t> | requirements of the RFC format. They should be removed before use.</t> | |||
<t>These test vectors are also available in JSON format at <xref target="T | ||||
<t>These test vectors are also available in JSON format at <xref target="TestVec | estVectors"/>. In the | |||
tors"/>. In the | ||||
JSON test vectors, numeric values are JSON numbers and byte string values are | JSON test vectors, numeric values are JSON numbers and byte string values are | |||
JSON strings containing the hex encoding of the byte strings.</t> | JSON strings containing the hex encoding of the byte strings.</t> | |||
<section anchor="header-encodingdecoding"> | ||||
<section anchor="header-encodingdecoding"><name>Header Encoding/Decoding</name> | <name>Header Encoding/Decoding</name> | |||
<t>For each case, we provide:</t> | ||||
<t>For each case, we provide:</t> | <ul spacing="normal"> | |||
<li> | ||||
<t><list style="symbols"> | <t><tt>kid</tt>: A KID value</t> | |||
<t><spanx style="verb">kid</spanx>: A KID value</t> | </li> | |||
<t><spanx style="verb">ctr</spanx>: A CTR value</t> | <li> | |||
<t><spanx style="verb">header</spanx>: An encoded SFrame header</t> | <t><tt>ctr</tt>: A CTR value</t> | |||
</list></t> | </li> | |||
<li> | ||||
<t>An implementation should verify that:</t> | <t><tt>header</tt>: An encoded SFrame header</t> | |||
</li> | ||||
<t><list style="symbols"> | </ul> | |||
<t>Encoding a header with the KID and CTR results in the provided header value | <t>An implementation should verify that:</t> | |||
</t> | <ul spacing="normal"> | |||
<t>Decoding the provided header value results in the provided KID and CTR valu | <li> | |||
es</t> | <t>Encoding a header with the KID and CTR results in the provided he | |||
</list></t> | ader value</t> | |||
</li> | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | <li> | |||
<t>Decoding the provided header value results in the provided KID an | ||||
d CTR values</t> | ||||
</li> | ||||
</ul> | ||||
<sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000000 | kid: 0x0000000000000000 | |||
ctr: 0x0000000000000000 | ctr: 0x0000000000000000 | |||
header: 00 | header: 00 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000000 | kid: 0x0000000000000000 | |||
ctr: 0x0000000000000001 | ctr: 0x0000000000000001 | |||
header: 01 | header: 01 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000000 | kid: 0x0000000000000000 | |||
ctr: 0x00000000000000ff | ctr: 0x00000000000000ff | |||
header: 08ff | header: 08ff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000000 | kid: 0x0000000000000000 | |||
ctr: 0x0000000000000100 | ctr: 0x0000000000000100 | |||
header: 090100 | header: 090100 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000000 | kid: 0x0000000000000000 | |||
ctr: 0x000000000000ffff | ctr: 0x000000000000ffff | |||
header: 09ffff | header: 09ffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000000 | kid: 0x0000000000000000 | |||
ctr: 0x0000000000010000 | ctr: 0x0000000000010000 | |||
header: 0a010000 | header: 0a010000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000000 | kid: 0x0000000000000000 | |||
ctr: 0x0000000000ffffff | ctr: 0x0000000000ffffff | |||
header: 0affffff | header: 0affffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000000 | kid: 0x0000000000000000 | |||
ctr: 0x0000000001000000 | ctr: 0x0000000001000000 | |||
header: 0b01000000 | header: 0b01000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000000 | kid: 0x0000000000000000 | |||
ctr: 0x00000000ffffffff | ctr: 0x00000000ffffffff | |||
header: 0bffffffff | header: 0bffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000000 | kid: 0x0000000000000000 | |||
ctr: 0x0000000100000000 | ctr: 0x0000000100000000 | |||
header: 0c0100000000 | header: 0c0100000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000000 | kid: 0x0000000000000000 | |||
ctr: 0x000000ffffffffff | ctr: 0x000000ffffffffff | |||
header: 0cffffffffff | header: 0cffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000000 | kid: 0x0000000000000000 | |||
ctr: 0x0000010000000000 | ctr: 0x0000010000000000 | |||
header: 0d010000000000 | header: 0d010000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000000 | kid: 0x0000000000000000 | |||
ctr: 0x0000ffffffffffff | ctr: 0x0000ffffffffffff | |||
header: 0dffffffffffff | header: 0dffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000000 | kid: 0x0000000000000000 | |||
ctr: 0x0001000000000000 | ctr: 0x0001000000000000 | |||
header: 0e01000000000000 | header: 0e01000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000000 | kid: 0x0000000000000000 | |||
ctr: 0x00ffffffffffffff | ctr: 0x00ffffffffffffff | |||
header: 0effffffffffffff | header: 0effffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000000 | kid: 0x0000000000000000 | |||
ctr: 0x0100000000000000 | ctr: 0x0100000000000000 | |||
header: 0f0100000000000000 | header: 0f0100000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000000 | kid: 0x0000000000000000 | |||
ctr: 0xffffffffffffffff | ctr: 0xffffffffffffffff | |||
header: 0fffffffffffffffff | header: 0fffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000001 | kid: 0x0000000000000001 | |||
ctr: 0x0000000000000000 | ctr: 0x0000000000000000 | |||
header: 10 | header: 10 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000001 | kid: 0x0000000000000001 | |||
ctr: 0x0000000000000001 | ctr: 0x0000000000000001 | |||
header: 11 | header: 11 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000001 | kid: 0x0000000000000001 | |||
ctr: 0x00000000000000ff | ctr: 0x00000000000000ff | |||
header: 18ff | header: 18ff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000001 | kid: 0x0000000000000001 | |||
ctr: 0x0000000000000100 | ctr: 0x0000000000000100 | |||
header: 190100 | header: 190100 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000001 | kid: 0x0000000000000001 | |||
ctr: 0x000000000000ffff | ctr: 0x000000000000ffff | |||
header: 19ffff | header: 19ffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000001 | kid: 0x0000000000000001 | |||
ctr: 0x0000000000010000 | ctr: 0x0000000000010000 | |||
header: 1a010000 | header: 1a010000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000001 | kid: 0x0000000000000001 | |||
ctr: 0x0000000000ffffff | ctr: 0x0000000000ffffff | |||
header: 1affffff | header: 1affffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000001 | kid: 0x0000000000000001 | |||
ctr: 0x0000000001000000 | ctr: 0x0000000001000000 | |||
header: 1b01000000 | header: 1b01000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000001 | kid: 0x0000000000000001 | |||
ctr: 0x00000000ffffffff | ctr: 0x00000000ffffffff | |||
header: 1bffffffff | header: 1bffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000001 | kid: 0x0000000000000001 | |||
ctr: 0x0000000100000000 | ctr: 0x0000000100000000 | |||
header: 1c0100000000 | header: 1c0100000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000001 | kid: 0x0000000000000001 | |||
ctr: 0x000000ffffffffff | ctr: 0x000000ffffffffff | |||
header: 1cffffffffff | header: 1cffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000001 | kid: 0x0000000000000001 | |||
ctr: 0x0000010000000000 | ctr: 0x0000010000000000 | |||
header: 1d010000000000 | header: 1d010000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000001 | kid: 0x0000000000000001 | |||
ctr: 0x0000ffffffffffff | ctr: 0x0000ffffffffffff | |||
header: 1dffffffffffff | header: 1dffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000001 | kid: 0x0000000000000001 | |||
ctr: 0x0001000000000000 | ctr: 0x0001000000000000 | |||
header: 1e01000000000000 | header: 1e01000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000001 | kid: 0x0000000000000001 | |||
ctr: 0x00ffffffffffffff | ctr: 0x00ffffffffffffff | |||
header: 1effffffffffffff | header: 1effffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000001 | kid: 0x0000000000000001 | |||
ctr: 0x0100000000000000 | ctr: 0x0100000000000000 | |||
header: 1f0100000000000000 | header: 1f0100000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000001 | kid: 0x0000000000000001 | |||
ctr: 0xffffffffffffffff | ctr: 0xffffffffffffffff | |||
header: 1fffffffffffffffff | header: 1fffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000000000ff | kid: 0x00000000000000ff | |||
ctr: 0x0000000000000000 | ctr: 0x0000000000000000 | |||
header: 80ff | header: 80ff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000000000ff | kid: 0x00000000000000ff | |||
ctr: 0x0000000000000001 | ctr: 0x0000000000000001 | |||
header: 81ff | header: 81ff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000000000ff | kid: 0x00000000000000ff | |||
ctr: 0x00000000000000ff | ctr: 0x00000000000000ff | |||
header: 88ffff | header: 88ffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000000000ff | kid: 0x00000000000000ff | |||
ctr: 0x0000000000000100 | ctr: 0x0000000000000100 | |||
header: 89ff0100 | header: 89ff0100 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000000000ff | kid: 0x00000000000000ff | |||
ctr: 0x000000000000ffff | ctr: 0x000000000000ffff | |||
header: 89ffffff | header: 89ffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000000000ff | kid: 0x00000000000000ff | |||
ctr: 0x0000000000010000 | ctr: 0x0000000000010000 | |||
header: 8aff010000 | header: 8aff010000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000000000ff | kid: 0x00000000000000ff | |||
ctr: 0x0000000000ffffff | ctr: 0x0000000000ffffff | |||
header: 8affffffff | header: 8affffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000000000ff | kid: 0x00000000000000ff | |||
ctr: 0x0000000001000000 | ctr: 0x0000000001000000 | |||
header: 8bff01000000 | header: 8bff01000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000000000ff | kid: 0x00000000000000ff | |||
ctr: 0x00000000ffffffff | ctr: 0x00000000ffffffff | |||
header: 8bffffffffff | header: 8bffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000000000ff | kid: 0x00000000000000ff | |||
ctr: 0x0000000100000000 | ctr: 0x0000000100000000 | |||
header: 8cff0100000000 | header: 8cff0100000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000000000ff | kid: 0x00000000000000ff | |||
ctr: 0x000000ffffffffff | ctr: 0x000000ffffffffff | |||
header: 8cffffffffffff | header: 8cffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000000000ff | kid: 0x00000000000000ff | |||
ctr: 0x0000010000000000 | ctr: 0x0000010000000000 | |||
header: 8dff010000000000 | header: 8dff010000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000000000ff | kid: 0x00000000000000ff | |||
ctr: 0x0000ffffffffffff | ctr: 0x0000ffffffffffff | |||
header: 8dffffffffffffff | header: 8dffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000000000ff | kid: 0x00000000000000ff | |||
ctr: 0x0001000000000000 | ctr: 0x0001000000000000 | |||
header: 8eff01000000000000 | header: 8eff01000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000000000ff | kid: 0x00000000000000ff | |||
ctr: 0x00ffffffffffffff | ctr: 0x00ffffffffffffff | |||
header: 8effffffffffffffff | header: 8effffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000000000ff | kid: 0x00000000000000ff | |||
ctr: 0x0100000000000000 | ctr: 0x0100000000000000 | |||
header: 8fff0100000000000000 | header: 8fff0100000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000000000ff | kid: 0x00000000000000ff | |||
ctr: 0xffffffffffffffff | ctr: 0xffffffffffffffff | |||
header: 8fffffffffffffffffff | header: 8fffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000100 | kid: 0x0000000000000100 | |||
ctr: 0x0000000000000000 | ctr: 0x0000000000000000 | |||
header: 900100 | header: 900100 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000100 | kid: 0x0000000000000100 | |||
ctr: 0x0000000000000001 | ctr: 0x0000000000000001 | |||
header: 910100 | header: 910100 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000100 | kid: 0x0000000000000100 | |||
ctr: 0x00000000000000ff | ctr: 0x00000000000000ff | |||
header: 980100ff | header: 980100ff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000100 | kid: 0x0000000000000100 | |||
ctr: 0x0000000000000100 | ctr: 0x0000000000000100 | |||
header: 9901000100 | header: 9901000100 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000100 | kid: 0x0000000000000100 | |||
ctr: 0x000000000000ffff | ctr: 0x000000000000ffff | |||
header: 990100ffff | header: 990100ffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000100 | kid: 0x0000000000000100 | |||
ctr: 0x0000000000010000 | ctr: 0x0000000000010000 | |||
header: 9a0100010000 | header: 9a0100010000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000100 | kid: 0x0000000000000100 | |||
ctr: 0x0000000000ffffff | ctr: 0x0000000000ffffff | |||
header: 9a0100ffffff | header: 9a0100ffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000100 | kid: 0x0000000000000100 | |||
ctr: 0x0000000001000000 | ctr: 0x0000000001000000 | |||
header: 9b010001000000 | header: 9b010001000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000100 | kid: 0x0000000000000100 | |||
ctr: 0x00000000ffffffff | ctr: 0x00000000ffffffff | |||
header: 9b0100ffffffff | header: 9b0100ffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000100 | kid: 0x0000000000000100 | |||
ctr: 0x0000000100000000 | ctr: 0x0000000100000000 | |||
header: 9c01000100000000 | header: 9c01000100000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000100 | kid: 0x0000000000000100 | |||
ctr: 0x000000ffffffffff | ctr: 0x000000ffffffffff | |||
header: 9c0100ffffffffff | header: 9c0100ffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000100 | kid: 0x0000000000000100 | |||
ctr: 0x0000010000000000 | ctr: 0x0000010000000000 | |||
header: 9d0100010000000000 | header: 9d0100010000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000100 | kid: 0x0000000000000100 | |||
ctr: 0x0000ffffffffffff | ctr: 0x0000ffffffffffff | |||
header: 9d0100ffffffffffff | header: 9d0100ffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000100 | kid: 0x0000000000000100 | |||
ctr: 0x0001000000000000 | ctr: 0x0001000000000000 | |||
header: 9e010001000000000000 | header: 9e010001000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000100 | kid: 0x0000000000000100 | |||
ctr: 0x00ffffffffffffff | ctr: 0x00ffffffffffffff | |||
header: 9e0100ffffffffffffff | header: 9e0100ffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000100 | kid: 0x0000000000000100 | |||
ctr: 0x0100000000000000 | ctr: 0x0100000000000000 | |||
header: 9f01000100000000000000 | header: 9f01000100000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000000100 | kid: 0x0000000000000100 | |||
ctr: 0xffffffffffffffff | ctr: 0xffffffffffffffff | |||
header: 9f0100ffffffffffffffff | header: 9f0100ffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000000000ffff | kid: 0x000000000000ffff | |||
ctr: 0x0000000000000000 | ctr: 0x0000000000000000 | |||
header: 90ffff | header: 90ffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000000000ffff | kid: 0x000000000000ffff | |||
ctr: 0x0000000000000001 | ctr: 0x0000000000000001 | |||
header: 91ffff | header: 91ffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000000000ffff | kid: 0x000000000000ffff | |||
ctr: 0x00000000000000ff | ctr: 0x00000000000000ff | |||
header: 98ffffff | header: 98ffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000000000ffff | kid: 0x000000000000ffff | |||
ctr: 0x0000000000000100 | ctr: 0x0000000000000100 | |||
header: 99ffff0100 | header: 99ffff0100 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000000000ffff | kid: 0x000000000000ffff | |||
ctr: 0x000000000000ffff | ctr: 0x000000000000ffff | |||
header: 99ffffffff | header: 99ffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000000000ffff | kid: 0x000000000000ffff | |||
ctr: 0x0000000000010000 | ctr: 0x0000000000010000 | |||
header: 9affff010000 | header: 9affff010000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000000000ffff | kid: 0x000000000000ffff | |||
ctr: 0x0000000000ffffff | ctr: 0x0000000000ffffff | |||
header: 9affffffffff | header: 9affffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000000000ffff | kid: 0x000000000000ffff | |||
ctr: 0x0000000001000000 | ctr: 0x0000000001000000 | |||
header: 9bffff01000000 | header: 9bffff01000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000000000ffff | kid: 0x000000000000ffff | |||
ctr: 0x00000000ffffffff | ctr: 0x00000000ffffffff | |||
header: 9bffffffffffff | header: 9bffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000000000ffff | kid: 0x000000000000ffff | |||
ctr: 0x0000000100000000 | ctr: 0x0000000100000000 | |||
header: 9cffff0100000000 | header: 9cffff0100000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000000000ffff | kid: 0x000000000000ffff | |||
ctr: 0x000000ffffffffff | ctr: 0x000000ffffffffff | |||
header: 9cffffffffffffff | header: 9cffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000000000ffff | kid: 0x000000000000ffff | |||
ctr: 0x0000010000000000 | ctr: 0x0000010000000000 | |||
header: 9dffff010000000000 | header: 9dffff010000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000000000ffff | kid: 0x000000000000ffff | |||
ctr: 0x0000ffffffffffff | ctr: 0x0000ffffffffffff | |||
header: 9dffffffffffffffff | header: 9dffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000000000ffff | kid: 0x000000000000ffff | |||
ctr: 0x0001000000000000 | ctr: 0x0001000000000000 | |||
header: 9effff01000000000000 | header: 9effff01000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000000000ffff | kid: 0x000000000000ffff | |||
ctr: 0x00ffffffffffffff | ctr: 0x00ffffffffffffff | |||
header: 9effffffffffffffffff | header: 9effffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000000000ffff | kid: 0x000000000000ffff | |||
ctr: 0x0100000000000000 | ctr: 0x0100000000000000 | |||
header: 9fffff0100000000000000 | header: 9fffff0100000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000000000ffff | kid: 0x000000000000ffff | |||
ctr: 0xffffffffffffffff | ctr: 0xffffffffffffffff | |||
header: 9fffffffffffffffffffff | header: 9fffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000010000 | kid: 0x0000000000010000 | |||
ctr: 0x0000000000000000 | ctr: 0x0000000000000000 | |||
header: a0010000 | header: a0010000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000010000 | kid: 0x0000000000010000 | |||
ctr: 0x0000000000000001 | ctr: 0x0000000000000001 | |||
header: a1010000 | header: a1010000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000010000 | kid: 0x0000000000010000 | |||
ctr: 0x00000000000000ff | ctr: 0x00000000000000ff | |||
header: a8010000ff | header: a8010000ff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000010000 | kid: 0x0000000000010000 | |||
ctr: 0x0000000000000100 | ctr: 0x0000000000000100 | |||
header: a90100000100 | header: a90100000100 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000010000 | kid: 0x0000000000010000 | |||
ctr: 0x000000000000ffff | ctr: 0x000000000000ffff | |||
header: a9010000ffff | header: a9010000ffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000010000 | kid: 0x0000000000010000 | |||
ctr: 0x0000000000010000 | ctr: 0x0000000000010000 | |||
header: aa010000010000 | header: aa010000010000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000010000 | kid: 0x0000000000010000 | |||
ctr: 0x0000000000ffffff | ctr: 0x0000000000ffffff | |||
header: aa010000ffffff | header: aa010000ffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000010000 | kid: 0x0000000000010000 | |||
ctr: 0x0000000001000000 | ctr: 0x0000000001000000 | |||
header: ab01000001000000 | header: ab01000001000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000010000 | kid: 0x0000000000010000 | |||
ctr: 0x00000000ffffffff | ctr: 0x00000000ffffffff | |||
header: ab010000ffffffff | header: ab010000ffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000010000 | kid: 0x0000000000010000 | |||
ctr: 0x0000000100000000 | ctr: 0x0000000100000000 | |||
header: ac0100000100000000 | header: ac0100000100000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000010000 | kid: 0x0000000000010000 | |||
ctr: 0x000000ffffffffff | ctr: 0x000000ffffffffff | |||
header: ac010000ffffffffff | header: ac010000ffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000010000 | kid: 0x0000000000010000 | |||
ctr: 0x0000010000000000 | ctr: 0x0000010000000000 | |||
header: ad010000010000000000 | header: ad010000010000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000010000 | kid: 0x0000000000010000 | |||
ctr: 0x0000ffffffffffff | ctr: 0x0000ffffffffffff | |||
header: ad010000ffffffffffff | header: ad010000ffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000010000 | kid: 0x0000000000010000 | |||
ctr: 0x0001000000000000 | ctr: 0x0001000000000000 | |||
header: ae01000001000000000000 | header: ae01000001000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000010000 | kid: 0x0000000000010000 | |||
ctr: 0x00ffffffffffffff | ctr: 0x00ffffffffffffff | |||
header: ae010000ffffffffffffff | header: ae010000ffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000010000 | kid: 0x0000000000010000 | |||
ctr: 0x0100000000000000 | ctr: 0x0100000000000000 | |||
header: af0100000100000000000000 | header: af0100000100000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000010000 | kid: 0x0000000000010000 | |||
ctr: 0xffffffffffffffff | ctr: 0xffffffffffffffff | |||
header: af010000ffffffffffffffff | header: af010000ffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000ffffff | kid: 0x0000000000ffffff | |||
ctr: 0x0000000000000000 | ctr: 0x0000000000000000 | |||
header: a0ffffff | header: a0ffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000ffffff | kid: 0x0000000000ffffff | |||
ctr: 0x0000000000000001 | ctr: 0x0000000000000001 | |||
header: a1ffffff | header: a1ffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000ffffff | kid: 0x0000000000ffffff | |||
ctr: 0x00000000000000ff | ctr: 0x00000000000000ff | |||
header: a8ffffffff | header: a8ffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000ffffff | kid: 0x0000000000ffffff | |||
ctr: 0x0000000000000100 | ctr: 0x0000000000000100 | |||
header: a9ffffff0100 | header: a9ffffff0100 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000ffffff | kid: 0x0000000000ffffff | |||
ctr: 0x000000000000ffff | ctr: 0x000000000000ffff | |||
header: a9ffffffffff | header: a9ffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000ffffff | kid: 0x0000000000ffffff | |||
ctr: 0x0000000000010000 | ctr: 0x0000000000010000 | |||
header: aaffffff010000 | header: aaffffff010000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000ffffff | kid: 0x0000000000ffffff | |||
ctr: 0x0000000000ffffff | ctr: 0x0000000000ffffff | |||
header: aaffffffffffff | header: aaffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000ffffff | kid: 0x0000000000ffffff | |||
ctr: 0x0000000001000000 | ctr: 0x0000000001000000 | |||
header: abffffff01000000 | header: abffffff01000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000ffffff | kid: 0x0000000000ffffff | |||
ctr: 0x00000000ffffffff | ctr: 0x00000000ffffffff | |||
header: abffffffffffffff | header: abffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000ffffff | kid: 0x0000000000ffffff | |||
ctr: 0x0000000100000000 | ctr: 0x0000000100000000 | |||
header: acffffff0100000000 | header: acffffff0100000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000ffffff | kid: 0x0000000000ffffff | |||
ctr: 0x000000ffffffffff | ctr: 0x000000ffffffffff | |||
header: acffffffffffffffff | header: acffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000ffffff | kid: 0x0000000000ffffff | |||
ctr: 0x0000010000000000 | ctr: 0x0000010000000000 | |||
header: adffffff010000000000 | header: adffffff010000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000ffffff | kid: 0x0000000000ffffff | |||
ctr: 0x0000ffffffffffff | ctr: 0x0000ffffffffffff | |||
header: adffffffffffffffffff | header: adffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000ffffff | kid: 0x0000000000ffffff | |||
ctr: 0x0001000000000000 | ctr: 0x0001000000000000 | |||
header: aeffffff01000000000000 | header: aeffffff01000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000ffffff | kid: 0x0000000000ffffff | |||
ctr: 0x00ffffffffffffff | ctr: 0x00ffffffffffffff | |||
header: aeffffffffffffffffffff | header: aeffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000ffffff | kid: 0x0000000000ffffff | |||
ctr: 0x0100000000000000 | ctr: 0x0100000000000000 | |||
header: afffffff0100000000000000 | header: afffffff0100000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000000ffffff | kid: 0x0000000000ffffff | |||
ctr: 0xffffffffffffffff | ctr: 0xffffffffffffffff | |||
header: afffffffffffffffffffffff | header: afffffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000001000000 | kid: 0x0000000001000000 | |||
ctr: 0x0000000000000000 | ctr: 0x0000000000000000 | |||
header: b001000000 | header: b001000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000001000000 | kid: 0x0000000001000000 | |||
ctr: 0x0000000000000001 | ctr: 0x0000000000000001 | |||
header: b101000000 | header: b101000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000001000000 | kid: 0x0000000001000000 | |||
ctr: 0x00000000000000ff | ctr: 0x00000000000000ff | |||
header: b801000000ff | header: b801000000ff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000001000000 | kid: 0x0000000001000000 | |||
ctr: 0x0000000000000100 | ctr: 0x0000000000000100 | |||
header: b9010000000100 | header: b9010000000100 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000001000000 | kid: 0x0000000001000000 | |||
ctr: 0x000000000000ffff | ctr: 0x000000000000ffff | |||
header: b901000000ffff | header: b901000000ffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000001000000 | kid: 0x0000000001000000 | |||
ctr: 0x0000000000010000 | ctr: 0x0000000000010000 | |||
header: ba01000000010000 | header: ba01000000010000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000001000000 | kid: 0x0000000001000000 | |||
ctr: 0x0000000000ffffff | ctr: 0x0000000000ffffff | |||
header: ba01000000ffffff | header: ba01000000ffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000001000000 | kid: 0x0000000001000000 | |||
ctr: 0x0000000001000000 | ctr: 0x0000000001000000 | |||
header: bb0100000001000000 | header: bb0100000001000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000001000000 | kid: 0x0000000001000000 | |||
ctr: 0x00000000ffffffff | ctr: 0x00000000ffffffff | |||
header: bb01000000ffffffff | header: bb01000000ffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000001000000 | kid: 0x0000000001000000 | |||
ctr: 0x0000000100000000 | ctr: 0x0000000100000000 | |||
header: bc010000000100000000 | header: bc010000000100000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000001000000 | kid: 0x0000000001000000 | |||
ctr: 0x000000ffffffffff | ctr: 0x000000ffffffffff | |||
header: bc01000000ffffffffff | header: bc01000000ffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000001000000 | kid: 0x0000000001000000 | |||
ctr: 0x0000010000000000 | ctr: 0x0000010000000000 | |||
header: bd01000000010000000000 | header: bd01000000010000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000001000000 | kid: 0x0000000001000000 | |||
ctr: 0x0000ffffffffffff | ctr: 0x0000ffffffffffff | |||
header: bd01000000ffffffffffff | header: bd01000000ffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000001000000 | kid: 0x0000000001000000 | |||
ctr: 0x0001000000000000 | ctr: 0x0001000000000000 | |||
header: be0100000001000000000000 | header: be0100000001000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000001000000 | kid: 0x0000000001000000 | |||
ctr: 0x00ffffffffffffff | ctr: 0x00ffffffffffffff | |||
header: be01000000ffffffffffffff | header: be01000000ffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000001000000 | kid: 0x0000000001000000 | |||
ctr: 0x0100000000000000 | ctr: 0x0100000000000000 | |||
header: bf010000000100000000000000 | header: bf010000000100000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000001000000 | kid: 0x0000000001000000 | |||
ctr: 0xffffffffffffffff | ctr: 0xffffffffffffffff | |||
header: bf01000000ffffffffffffffff | header: bf01000000ffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000ffffffff | kid: 0x00000000ffffffff | |||
ctr: 0x0000000000000000 | ctr: 0x0000000000000000 | |||
header: b0ffffffff | header: b0ffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000ffffffff | kid: 0x00000000ffffffff | |||
ctr: 0x0000000000000001 | ctr: 0x0000000000000001 | |||
header: b1ffffffff | header: b1ffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000ffffffff | kid: 0x00000000ffffffff | |||
ctr: 0x00000000000000ff | ctr: 0x00000000000000ff | |||
header: b8ffffffffff | header: b8ffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000ffffffff | kid: 0x00000000ffffffff | |||
ctr: 0x0000000000000100 | ctr: 0x0000000000000100 | |||
header: b9ffffffff0100 | header: b9ffffffff0100 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000ffffffff | kid: 0x00000000ffffffff | |||
ctr: 0x000000000000ffff | ctr: 0x000000000000ffff | |||
header: b9ffffffffffff | header: b9ffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000ffffffff | kid: 0x00000000ffffffff | |||
ctr: 0x0000000000010000 | ctr: 0x0000000000010000 | |||
header: baffffffff010000 | header: baffffffff010000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000ffffffff | kid: 0x00000000ffffffff | |||
ctr: 0x0000000000ffffff | ctr: 0x0000000000ffffff | |||
header: baffffffffffffff | header: baffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000ffffffff | kid: 0x00000000ffffffff | |||
ctr: 0x0000000001000000 | ctr: 0x0000000001000000 | |||
header: bbffffffff01000000 | header: bbffffffff01000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000ffffffff | kid: 0x00000000ffffffff | |||
ctr: 0x00000000ffffffff | ctr: 0x00000000ffffffff | |||
header: bbffffffffffffffff | header: bbffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000ffffffff | kid: 0x00000000ffffffff | |||
ctr: 0x0000000100000000 | ctr: 0x0000000100000000 | |||
header: bcffffffff0100000000 | header: bcffffffff0100000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000ffffffff | kid: 0x00000000ffffffff | |||
ctr: 0x000000ffffffffff | ctr: 0x000000ffffffffff | |||
header: bcffffffffffffffffff | header: bcffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000ffffffff | kid: 0x00000000ffffffff | |||
ctr: 0x0000010000000000 | ctr: 0x0000010000000000 | |||
header: bdffffffff010000000000 | header: bdffffffff010000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000ffffffff | kid: 0x00000000ffffffff | |||
ctr: 0x0000ffffffffffff | ctr: 0x0000ffffffffffff | |||
header: bdffffffffffffffffffff | header: bdffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000ffffffff | kid: 0x00000000ffffffff | |||
ctr: 0x0001000000000000 | ctr: 0x0001000000000000 | |||
header: beffffffff01000000000000 | header: beffffffff01000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000ffffffff | kid: 0x00000000ffffffff | |||
ctr: 0x00ffffffffffffff | ctr: 0x00ffffffffffffff | |||
header: beffffffffffffffffffffff | header: beffffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000ffffffff | kid: 0x00000000ffffffff | |||
ctr: 0x0100000000000000 | ctr: 0x0100000000000000 | |||
header: bfffffffff0100000000000000 | header: bfffffffff0100000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00000000ffffffff | kid: 0x00000000ffffffff | |||
ctr: 0xffffffffffffffff | ctr: 0xffffffffffffffff | |||
header: bfffffffffffffffffffffffff | header: bfffffffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000100000000 | kid: 0x0000000100000000 | |||
ctr: 0x0000000000000000 | ctr: 0x0000000000000000 | |||
header: c00100000000 | header: c00100000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000100000000 | kid: 0x0000000100000000 | |||
ctr: 0x0000000000000001 | ctr: 0x0000000000000001 | |||
header: c10100000000 | header: c10100000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000100000000 | kid: 0x0000000100000000 | |||
ctr: 0x00000000000000ff | ctr: 0x00000000000000ff | |||
header: c80100000000ff | header: c80100000000ff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000100000000 | kid: 0x0000000100000000 | |||
ctr: 0x0000000000000100 | ctr: 0x0000000000000100 | |||
header: c901000000000100 | header: c901000000000100 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000100000000 | kid: 0x0000000100000000 | |||
ctr: 0x000000000000ffff | ctr: 0x000000000000ffff | |||
header: c90100000000ffff | header: c90100000000ffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000100000000 | kid: 0x0000000100000000 | |||
ctr: 0x0000000000010000 | ctr: 0x0000000000010000 | |||
header: ca0100000000010000 | header: ca0100000000010000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000100000000 | kid: 0x0000000100000000 | |||
ctr: 0x0000000000ffffff | ctr: 0x0000000000ffffff | |||
header: ca0100000000ffffff | header: ca0100000000ffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000100000000 | kid: 0x0000000100000000 | |||
ctr: 0x0000000001000000 | ctr: 0x0000000001000000 | |||
header: cb010000000001000000 | header: cb010000000001000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000100000000 | kid: 0x0000000100000000 | |||
ctr: 0x00000000ffffffff | ctr: 0x00000000ffffffff | |||
header: cb0100000000ffffffff | header: cb0100000000ffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000100000000 | kid: 0x0000000100000000 | |||
ctr: 0x0000000100000000 | ctr: 0x0000000100000000 | |||
header: cc01000000000100000000 | header: cc01000000000100000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000100000000 | kid: 0x0000000100000000 | |||
ctr: 0x000000ffffffffff | ctr: 0x000000ffffffffff | |||
header: cc0100000000ffffffffff | header: cc0100000000ffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000100000000 | kid: 0x0000000100000000 | |||
ctr: 0x0000010000000000 | ctr: 0x0000010000000000 | |||
header: cd0100000000010000000000 | header: cd0100000000010000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000100000000 | kid: 0x0000000100000000 | |||
ctr: 0x0000ffffffffffff | ctr: 0x0000ffffffffffff | |||
header: cd0100000000ffffffffffff | header: cd0100000000ffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000100000000 | kid: 0x0000000100000000 | |||
ctr: 0x0001000000000000 | ctr: 0x0001000000000000 | |||
header: ce010000000001000000000000 | header: ce010000000001000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000100000000 | kid: 0x0000000100000000 | |||
ctr: 0x00ffffffffffffff | ctr: 0x00ffffffffffffff | |||
header: ce0100000000ffffffffffffff | header: ce0100000000ffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000100000000 | kid: 0x0000000100000000 | |||
ctr: 0x0100000000000000 | ctr: 0x0100000000000000 | |||
header: cf01000000000100000000000000 | header: cf01000000000100000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000000100000000 | kid: 0x0000000100000000 | |||
ctr: 0xffffffffffffffff | ctr: 0xffffffffffffffff | |||
header: cf0100000000ffffffffffffffff | header: cf0100000000ffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000ffffffffff | kid: 0x000000ffffffffff | |||
ctr: 0x0000000000000000 | ctr: 0x0000000000000000 | |||
header: c0ffffffffff | header: c0ffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000ffffffffff | kid: 0x000000ffffffffff | |||
ctr: 0x0000000000000001 | ctr: 0x0000000000000001 | |||
header: c1ffffffffff | header: c1ffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000ffffffffff | kid: 0x000000ffffffffff | |||
ctr: 0x00000000000000ff | ctr: 0x00000000000000ff | |||
header: c8ffffffffffff | header: c8ffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000ffffffffff | kid: 0x000000ffffffffff | |||
ctr: 0x0000000000000100 | ctr: 0x0000000000000100 | |||
header: c9ffffffffff0100 | header: c9ffffffffff0100 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000ffffffffff | kid: 0x000000ffffffffff | |||
ctr: 0x000000000000ffff | ctr: 0x000000000000ffff | |||
header: c9ffffffffffffff | header: c9ffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000ffffffffff | kid: 0x000000ffffffffff | |||
ctr: 0x0000000000010000 | ctr: 0x0000000000010000 | |||
header: caffffffffff010000 | header: caffffffffff010000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000ffffffffff | kid: 0x000000ffffffffff | |||
ctr: 0x0000000000ffffff | ctr: 0x0000000000ffffff | |||
header: caffffffffffffffff | header: caffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000ffffffffff | kid: 0x000000ffffffffff | |||
ctr: 0x0000000001000000 | ctr: 0x0000000001000000 | |||
header: cbffffffffff01000000 | header: cbffffffffff01000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000ffffffffff | kid: 0x000000ffffffffff | |||
ctr: 0x00000000ffffffff | ctr: 0x00000000ffffffff | |||
header: cbffffffffffffffffff | header: cbffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000ffffffffff | kid: 0x000000ffffffffff | |||
ctr: 0x0000000100000000 | ctr: 0x0000000100000000 | |||
header: ccffffffffff0100000000 | header: ccffffffffff0100000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000ffffffffff | kid: 0x000000ffffffffff | |||
ctr: 0x000000ffffffffff | ctr: 0x000000ffffffffff | |||
header: ccffffffffffffffffffff | header: ccffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000ffffffffff | kid: 0x000000ffffffffff | |||
ctr: 0x0000010000000000 | ctr: 0x0000010000000000 | |||
header: cdffffffffff010000000000 | header: cdffffffffff010000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000ffffffffff | kid: 0x000000ffffffffff | |||
ctr: 0x0000ffffffffffff | ctr: 0x0000ffffffffffff | |||
header: cdffffffffffffffffffffff | header: cdffffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000ffffffffff | kid: 0x000000ffffffffff | |||
ctr: 0x0001000000000000 | ctr: 0x0001000000000000 | |||
header: ceffffffffff01000000000000 | header: ceffffffffff01000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000ffffffffff | kid: 0x000000ffffffffff | |||
ctr: 0x00ffffffffffffff | ctr: 0x00ffffffffffffff | |||
header: ceffffffffffffffffffffffff | header: ceffffffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000ffffffffff | kid: 0x000000ffffffffff | |||
ctr: 0x0100000000000000 | ctr: 0x0100000000000000 | |||
header: cfffffffffff0100000000000000 | header: cfffffffffff0100000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x000000ffffffffff | kid: 0x000000ffffffffff | |||
ctr: 0xffffffffffffffff | ctr: 0xffffffffffffffff | |||
header: cfffffffffffffffffffffffffff | header: cfffffffffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000010000000000 | kid: 0x0000010000000000 | |||
ctr: 0x0000000000000000 | ctr: 0x0000000000000000 | |||
header: d0010000000000 | header: d0010000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000010000000000 | kid: 0x0000010000000000 | |||
ctr: 0x0000000000000001 | ctr: 0x0000000000000001 | |||
header: d1010000000000 | header: d1010000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000010000000000 | kid: 0x0000010000000000 | |||
ctr: 0x00000000000000ff | ctr: 0x00000000000000ff | |||
header: d8010000000000ff | header: d8010000000000ff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000010000000000 | kid: 0x0000010000000000 | |||
ctr: 0x0000000000000100 | ctr: 0x0000000000000100 | |||
header: d90100000000000100 | header: d90100000000000100 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000010000000000 | kid: 0x0000010000000000 | |||
ctr: 0x000000000000ffff | ctr: 0x000000000000ffff | |||
header: d9010000000000ffff | header: d9010000000000ffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000010000000000 | kid: 0x0000010000000000 | |||
ctr: 0x0000000000010000 | ctr: 0x0000000000010000 | |||
header: da010000000000010000 | header: da010000000000010000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000010000000000 | kid: 0x0000010000000000 | |||
ctr: 0x0000000000ffffff | ctr: 0x0000000000ffffff | |||
header: da010000000000ffffff | header: da010000000000ffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000010000000000 | kid: 0x0000010000000000 | |||
ctr: 0x0000000001000000 | ctr: 0x0000000001000000 | |||
header: db01000000000001000000 | header: db01000000000001000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000010000000000 | kid: 0x0000010000000000 | |||
ctr: 0x00000000ffffffff | ctr: 0x00000000ffffffff | |||
header: db010000000000ffffffff | header: db010000000000ffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000010000000000 | kid: 0x0000010000000000 | |||
ctr: 0x0000000100000000 | ctr: 0x0000000100000000 | |||
header: dc0100000000000100000000 | header: dc0100000000000100000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000010000000000 | kid: 0x0000010000000000 | |||
ctr: 0x000000ffffffffff | ctr: 0x000000ffffffffff | |||
header: dc010000000000ffffffffff | header: dc010000000000ffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000010000000000 | kid: 0x0000010000000000 | |||
ctr: 0x0000010000000000 | ctr: 0x0000010000000000 | |||
header: dd010000000000010000000000 | header: dd010000000000010000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000010000000000 | kid: 0x0000010000000000 | |||
ctr: 0x0000ffffffffffff | ctr: 0x0000ffffffffffff | |||
header: dd010000000000ffffffffffff | header: dd010000000000ffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000010000000000 | kid: 0x0000010000000000 | |||
ctr: 0x0001000000000000 | ctr: 0x0001000000000000 | |||
header: de01000000000001000000000000 | header: de01000000000001000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000010000000000 | kid: 0x0000010000000000 | |||
ctr: 0x00ffffffffffffff | ctr: 0x00ffffffffffffff | |||
header: de010000000000ffffffffffffff | header: de010000000000ffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000010000000000 | kid: 0x0000010000000000 | |||
ctr: 0x0100000000000000 | ctr: 0x0100000000000000 | |||
header: df0100000000000100000000000000 | header: df0100000000000100000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000010000000000 | kid: 0x0000010000000000 | |||
ctr: 0xffffffffffffffff | ctr: 0xffffffffffffffff | |||
header: df010000000000ffffffffffffffff | header: df010000000000ffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000ffffffffffff | kid: 0x0000ffffffffffff | |||
ctr: 0x0000000000000000 | ctr: 0x0000000000000000 | |||
header: d0ffffffffffff | header: d0ffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000ffffffffffff | kid: 0x0000ffffffffffff | |||
ctr: 0x0000000000000001 | ctr: 0x0000000000000001 | |||
header: d1ffffffffffff | header: d1ffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000ffffffffffff | kid: 0x0000ffffffffffff | |||
ctr: 0x00000000000000ff | ctr: 0x00000000000000ff | |||
header: d8ffffffffffffff | header: d8ffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000ffffffffffff | kid: 0x0000ffffffffffff | |||
ctr: 0x0000000000000100 | ctr: 0x0000000000000100 | |||
header: d9ffffffffffff0100 | header: d9ffffffffffff0100 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000ffffffffffff | kid: 0x0000ffffffffffff | |||
ctr: 0x000000000000ffff | ctr: 0x000000000000ffff | |||
header: d9ffffffffffffffff | header: d9ffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000ffffffffffff | kid: 0x0000ffffffffffff | |||
ctr: 0x0000000000010000 | ctr: 0x0000000000010000 | |||
header: daffffffffffff010000 | header: daffffffffffff010000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000ffffffffffff | kid: 0x0000ffffffffffff | |||
ctr: 0x0000000000ffffff | ctr: 0x0000000000ffffff | |||
header: daffffffffffffffffff | header: daffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000ffffffffffff | kid: 0x0000ffffffffffff | |||
ctr: 0x0000000001000000 | ctr: 0x0000000001000000 | |||
header: dbffffffffffff01000000 | header: dbffffffffffff01000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000ffffffffffff | kid: 0x0000ffffffffffff | |||
ctr: 0x00000000ffffffff | ctr: 0x00000000ffffffff | |||
header: dbffffffffffffffffffff | header: dbffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000ffffffffffff | kid: 0x0000ffffffffffff | |||
ctr: 0x0000000100000000 | ctr: 0x0000000100000000 | |||
header: dcffffffffffff0100000000 | header: dcffffffffffff0100000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000ffffffffffff | kid: 0x0000ffffffffffff | |||
ctr: 0x000000ffffffffff | ctr: 0x000000ffffffffff | |||
header: dcffffffffffffffffffffff | header: dcffffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000ffffffffffff | kid: 0x0000ffffffffffff | |||
ctr: 0x0000010000000000 | ctr: 0x0000010000000000 | |||
header: ddffffffffffff010000000000 | header: ddffffffffffff010000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000ffffffffffff | kid: 0x0000ffffffffffff | |||
ctr: 0x0000ffffffffffff | ctr: 0x0000ffffffffffff | |||
header: ddffffffffffffffffffffffff | header: ddffffffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000ffffffffffff | kid: 0x0000ffffffffffff | |||
ctr: 0x0001000000000000 | ctr: 0x0001000000000000 | |||
header: deffffffffffff01000000000000 | header: deffffffffffff01000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000ffffffffffff | kid: 0x0000ffffffffffff | |||
ctr: 0x00ffffffffffffff | ctr: 0x00ffffffffffffff | |||
header: deffffffffffffffffffffffffff | header: deffffffffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000ffffffffffff | kid: 0x0000ffffffffffff | |||
ctr: 0x0100000000000000 | ctr: 0x0100000000000000 | |||
header: dfffffffffffff0100000000000000 | header: dfffffffffffff0100000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0000ffffffffffff | kid: 0x0000ffffffffffff | |||
ctr: 0xffffffffffffffff | ctr: 0xffffffffffffffff | |||
header: dfffffffffffffffffffffffffffff | header: dfffffffffffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0001000000000000 | kid: 0x0001000000000000 | |||
ctr: 0x0000000000000000 | ctr: 0x0000000000000000 | |||
header: e001000000000000 | header: e001000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0001000000000000 | kid: 0x0001000000000000 | |||
ctr: 0x0000000000000001 | ctr: 0x0000000000000001 | |||
header: e101000000000000 | header: e101000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0001000000000000 | kid: 0x0001000000000000 | |||
ctr: 0x00000000000000ff | ctr: 0x00000000000000ff | |||
header: e801000000000000ff | header: e801000000000000ff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0001000000000000 | kid: 0x0001000000000000 | |||
ctr: 0x0000000000000100 | ctr: 0x0000000000000100 | |||
header: e9010000000000000100 | header: e9010000000000000100 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0001000000000000 | kid: 0x0001000000000000 | |||
ctr: 0x000000000000ffff | ctr: 0x000000000000ffff | |||
header: e901000000000000ffff | header: e901000000000000ffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0001000000000000 | kid: 0x0001000000000000 | |||
ctr: 0x0000000000010000 | ctr: 0x0000000000010000 | |||
header: ea01000000000000010000 | header: ea01000000000000010000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0001000000000000 | kid: 0x0001000000000000 | |||
ctr: 0x0000000000ffffff | ctr: 0x0000000000ffffff | |||
header: ea01000000000000ffffff | header: ea01000000000000ffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0001000000000000 | kid: 0x0001000000000000 | |||
ctr: 0x0000000001000000 | ctr: 0x0000000001000000 | |||
header: eb0100000000000001000000 | header: eb0100000000000001000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0001000000000000 | kid: 0x0001000000000000 | |||
ctr: 0x00000000ffffffff | ctr: 0x00000000ffffffff | |||
header: eb01000000000000ffffffff | header: eb01000000000000ffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0001000000000000 | kid: 0x0001000000000000 | |||
ctr: 0x0000000100000000 | ctr: 0x0000000100000000 | |||
header: ec010000000000000100000000 | header: ec010000000000000100000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0001000000000000 | kid: 0x0001000000000000 | |||
ctr: 0x000000ffffffffff | ctr: 0x000000ffffffffff | |||
header: ec01000000000000ffffffffff | header: ec01000000000000ffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0001000000000000 | kid: 0x0001000000000000 | |||
ctr: 0x0000010000000000 | ctr: 0x0000010000000000 | |||
header: ed01000000000000010000000000 | header: ed01000000000000010000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0001000000000000 | kid: 0x0001000000000000 | |||
ctr: 0x0000ffffffffffff | ctr: 0x0000ffffffffffff | |||
header: ed01000000000000ffffffffffff | header: ed01000000000000ffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0001000000000000 | kid: 0x0001000000000000 | |||
ctr: 0x0001000000000000 | ctr: 0x0001000000000000 | |||
header: ee0100000000000001000000000000 | header: ee0100000000000001000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0001000000000000 | kid: 0x0001000000000000 | |||
ctr: 0x00ffffffffffffff | ctr: 0x00ffffffffffffff | |||
header: ee01000000000000ffffffffffffff | header: ee01000000000000ffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0001000000000000 | kid: 0x0001000000000000 | |||
ctr: 0x0100000000000000 | ctr: 0x0100000000000000 | |||
header: ef010000000000000100000000000000 | header: ef010000000000000100000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0001000000000000 | kid: 0x0001000000000000 | |||
ctr: 0xffffffffffffffff | ctr: 0xffffffffffffffff | |||
header: ef01000000000000ffffffffffffffff | header: ef01000000000000ffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00ffffffffffffff | kid: 0x00ffffffffffffff | |||
ctr: 0x0000000000000000 | ctr: 0x0000000000000000 | |||
header: e0ffffffffffffff | header: e0ffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00ffffffffffffff | kid: 0x00ffffffffffffff | |||
ctr: 0x0000000000000001 | ctr: 0x0000000000000001 | |||
header: e1ffffffffffffff | header: e1ffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00ffffffffffffff | kid: 0x00ffffffffffffff | |||
ctr: 0x00000000000000ff | ctr: 0x00000000000000ff | |||
header: e8ffffffffffffffff | header: e8ffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00ffffffffffffff | kid: 0x00ffffffffffffff | |||
ctr: 0x0000000000000100 | ctr: 0x0000000000000100 | |||
header: e9ffffffffffffff0100 | header: e9ffffffffffffff0100 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00ffffffffffffff | kid: 0x00ffffffffffffff | |||
ctr: 0x000000000000ffff | ctr: 0x000000000000ffff | |||
header: e9ffffffffffffffffff | header: e9ffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00ffffffffffffff | kid: 0x00ffffffffffffff | |||
ctr: 0x0000000000010000 | ctr: 0x0000000000010000 | |||
header: eaffffffffffffff010000 | header: eaffffffffffffff010000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00ffffffffffffff | kid: 0x00ffffffffffffff | |||
ctr: 0x0000000000ffffff | ctr: 0x0000000000ffffff | |||
header: eaffffffffffffffffffff | header: eaffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00ffffffffffffff | kid: 0x00ffffffffffffff | |||
ctr: 0x0000000001000000 | ctr: 0x0000000001000000 | |||
header: ebffffffffffffff01000000 | header: ebffffffffffffff01000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00ffffffffffffff | kid: 0x00ffffffffffffff | |||
ctr: 0x00000000ffffffff | ctr: 0x00000000ffffffff | |||
header: ebffffffffffffffffffffff | header: ebffffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00ffffffffffffff | kid: 0x00ffffffffffffff | |||
ctr: 0x0000000100000000 | ctr: 0x0000000100000000 | |||
header: ecffffffffffffff0100000000 | header: ecffffffffffffff0100000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00ffffffffffffff | kid: 0x00ffffffffffffff | |||
ctr: 0x000000ffffffffff | ctr: 0x000000ffffffffff | |||
header: ecffffffffffffffffffffffff | header: ecffffffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00ffffffffffffff | kid: 0x00ffffffffffffff | |||
ctr: 0x0000010000000000 | ctr: 0x0000010000000000 | |||
header: edffffffffffffff010000000000 | header: edffffffffffffff010000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00ffffffffffffff | kid: 0x00ffffffffffffff | |||
ctr: 0x0000ffffffffffff | ctr: 0x0000ffffffffffff | |||
header: edffffffffffffffffffffffffff | header: edffffffffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00ffffffffffffff | kid: 0x00ffffffffffffff | |||
ctr: 0x0001000000000000 | ctr: 0x0001000000000000 | |||
header: eeffffffffffffff01000000000000 | header: eeffffffffffffff01000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00ffffffffffffff | kid: 0x00ffffffffffffff | |||
ctr: 0x00ffffffffffffff | ctr: 0x00ffffffffffffff | |||
header: eeffffffffffffffffffffffffffff | header: eeffffffffffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00ffffffffffffff | kid: 0x00ffffffffffffff | |||
ctr: 0x0100000000000000 | ctr: 0x0100000000000000 | |||
header: efffffffffffffff0100000000000000 | header: efffffffffffffff0100000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x00ffffffffffffff | kid: 0x00ffffffffffffff | |||
ctr: 0xffffffffffffffff | ctr: 0xffffffffffffffff | |||
header: efffffffffffffffffffffffffffffff | header: efffffffffffffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0100000000000000 | kid: 0x0100000000000000 | |||
ctr: 0x0000000000000000 | ctr: 0x0000000000000000 | |||
header: f00100000000000000 | header: f00100000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0100000000000000 | kid: 0x0100000000000000 | |||
ctr: 0x0000000000000001 | ctr: 0x0000000000000001 | |||
header: f10100000000000000 | header: f10100000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0100000000000000 | kid: 0x0100000000000000 | |||
ctr: 0x00000000000000ff | ctr: 0x00000000000000ff | |||
header: f80100000000000000ff | header: f80100000000000000ff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0100000000000000 | kid: 0x0100000000000000 | |||
ctr: 0x0000000000000100 | ctr: 0x0000000000000100 | |||
header: f901000000000000000100 | header: f901000000000000000100 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0100000000000000 | kid: 0x0100000000000000 | |||
ctr: 0x000000000000ffff | ctr: 0x000000000000ffff | |||
header: f90100000000000000ffff | header: f90100000000000000ffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0100000000000000 | kid: 0x0100000000000000 | |||
ctr: 0x0000000000010000 | ctr: 0x0000000000010000 | |||
header: fa0100000000000000010000 | header: fa0100000000000000010000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0100000000000000 | kid: 0x0100000000000000 | |||
ctr: 0x0000000000ffffff | ctr: 0x0000000000ffffff | |||
header: fa0100000000000000ffffff | header: fa0100000000000000ffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0100000000000000 | kid: 0x0100000000000000 | |||
ctr: 0x0000000001000000 | ctr: 0x0000000001000000 | |||
header: fb010000000000000001000000 | header: fb010000000000000001000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0100000000000000 | kid: 0x0100000000000000 | |||
ctr: 0x00000000ffffffff | ctr: 0x00000000ffffffff | |||
header: fb0100000000000000ffffffff | header: fb0100000000000000ffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0100000000000000 | kid: 0x0100000000000000 | |||
ctr: 0x0000000100000000 | ctr: 0x0000000100000000 | |||
header: fc01000000000000000100000000 | header: fc01000000000000000100000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0100000000000000 | kid: 0x0100000000000000 | |||
ctr: 0x000000ffffffffff | ctr: 0x000000ffffffffff | |||
header: fc0100000000000000ffffffffff | header: fc0100000000000000ffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0100000000000000 | kid: 0x0100000000000000 | |||
ctr: 0x0000010000000000 | ctr: 0x0000010000000000 | |||
header: fd0100000000000000010000000000 | header: fd0100000000000000010000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0100000000000000 | kid: 0x0100000000000000 | |||
ctr: 0x0000ffffffffffff | ctr: 0x0000ffffffffffff | |||
header: fd0100000000000000ffffffffffff | header: fd0100000000000000ffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0100000000000000 | kid: 0x0100000000000000 | |||
ctr: 0x0001000000000000 | ctr: 0x0001000000000000 | |||
header: fe010000000000000001000000000000 | header: fe010000000000000001000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0100000000000000 | kid: 0x0100000000000000 | |||
ctr: 0x00ffffffffffffff | ctr: 0x00ffffffffffffff | |||
header: fe0100000000000000ffffffffffffff | header: fe0100000000000000ffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0100000000000000 | kid: 0x0100000000000000 | |||
ctr: 0x0100000000000000 | ctr: 0x0100000000000000 | |||
header: ff010000000000000001000000000000 | header: ff010000000000000001000000000000 | |||
00 | 00 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0x0100000000000000 | kid: 0x0100000000000000 | |||
ctr: 0xffffffffffffffff | ctr: 0xffffffffffffffff | |||
header: ff0100000000000000ffffffffffffff | header: ff0100000000000000ffffffffffffff | |||
ff | ff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0xffffffffffffffff | kid: 0xffffffffffffffff | |||
ctr: 0x0000000000000000 | ctr: 0x0000000000000000 | |||
header: f0ffffffffffffffff | header: f0ffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0xffffffffffffffff | kid: 0xffffffffffffffff | |||
ctr: 0x0000000000000001 | ctr: 0x0000000000000001 | |||
header: f1ffffffffffffffff | header: f1ffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0xffffffffffffffff | kid: 0xffffffffffffffff | |||
ctr: 0x00000000000000ff | ctr: 0x00000000000000ff | |||
header: f8ffffffffffffffffff | header: f8ffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0xffffffffffffffff | kid: 0xffffffffffffffff | |||
ctr: 0x0000000000000100 | ctr: 0x0000000000000100 | |||
header: f9ffffffffffffffff0100 | header: f9ffffffffffffffff0100 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0xffffffffffffffff | kid: 0xffffffffffffffff | |||
ctr: 0x000000000000ffff | ctr: 0x000000000000ffff | |||
header: f9ffffffffffffffffffff | header: f9ffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0xffffffffffffffff | kid: 0xffffffffffffffff | |||
ctr: 0x0000000000010000 | ctr: 0x0000000000010000 | |||
header: faffffffffffffffff010000 | header: faffffffffffffffff010000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0xffffffffffffffff | kid: 0xffffffffffffffff | |||
ctr: 0x0000000000ffffff | ctr: 0x0000000000ffffff | |||
header: faffffffffffffffffffffff | header: faffffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0xffffffffffffffff | kid: 0xffffffffffffffff | |||
ctr: 0x0000000001000000 | ctr: 0x0000000001000000 | |||
header: fbffffffffffffffff01000000 | header: fbffffffffffffffff01000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0xffffffffffffffff | kid: 0xffffffffffffffff | |||
ctr: 0x00000000ffffffff | ctr: 0x00000000ffffffff | |||
header: fbffffffffffffffffffffffff | header: fbffffffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0xffffffffffffffff | kid: 0xffffffffffffffff | |||
ctr: 0x0000000100000000 | ctr: 0x0000000100000000 | |||
header: fcffffffffffffffff0100000000 | header: fcffffffffffffffff0100000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0xffffffffffffffff | kid: 0xffffffffffffffff | |||
ctr: 0x000000ffffffffff | ctr: 0x000000ffffffffff | |||
header: fcffffffffffffffffffffffffff | header: fcffffffffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0xffffffffffffffff | kid: 0xffffffffffffffff | |||
ctr: 0x0000010000000000 | ctr: 0x0000010000000000 | |||
header: fdffffffffffffffff010000000000 | header: fdffffffffffffffff010000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0xffffffffffffffff | kid: 0xffffffffffffffff | |||
ctr: 0x0000ffffffffffff | ctr: 0x0000ffffffffffff | |||
header: fdffffffffffffffffffffffffffff | header: fdffffffffffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0xffffffffffffffff | kid: 0xffffffffffffffff | |||
ctr: 0x0001000000000000 | ctr: 0x0001000000000000 | |||
header: feffffffffffffffff01000000000000 | header: feffffffffffffffff01000000000000 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0xffffffffffffffff | kid: 0xffffffffffffffff | |||
ctr: 0x00ffffffffffffff | ctr: 0x00ffffffffffffff | |||
header: feffffffffffffffffffffffffffffff | header: feffffffffffffffffffffffffffffff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0xffffffffffffffff | kid: 0xffffffffffffffff | |||
ctr: 0x0100000000000000 | ctr: 0x0100000000000000 | |||
header: ffffffffffffffffff01000000000000 | header: ffffffffffffffffff01000000000000 | |||
00 | 00 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
kid: 0xffffffffffffffff | kid: 0xffffffffffffffff | |||
ctr: 0xffffffffffffffff | ctr: 0xffffffffffffffff | |||
header: ffffffffffffffffffffffffffffffff | header: ffffffffffffffffffffffffffffffff | |||
ff | ff | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
</section> | ||||
</section> | <section anchor="aead-encryptiondecryption-using-aes-ctr-and-hmac"> | |||
<section anchor="aead-encryptiondecryption-using-aes-ctr-and-hmac"><name>AEAD En | <name>AEAD Encryption/Decryption Using AES-CTR and HMAC</name> | |||
cryption/Decryption Using AES-CTR and HMAC</name> | <t>For each case, we provide:</t> | |||
<ul spacing="normal"> | ||||
<t>For each case, we provide:</t> | <li> | |||
<t><tt>cipher_suite</tt>: The index of the cipher suite in use (see | ||||
<t><list style="symbols"> | ||||
<t><spanx style="verb">cipher_suite</spanx>: The index of the cipher suite in | ||||
use (see | ||||
<xref target="sframe-cipher-suites"/>)</t> | <xref target="sframe-cipher-suites"/>)</t> | |||
<t><spanx style="verb">key</spanx>: The <spanx style="verb">key</spanx> input | </li> | |||
to encryption/decryption</t> | <li> | |||
<t><spanx style="verb">enc_key</spanx>: The encryption subkey produced by the | <t><tt>key</tt>: The <tt>key</tt> input to encryption/decryption</t> | |||
<spanx style="verb">derive_subkeys()</spanx> algorithm</t> | </li> | |||
<t><spanx style="verb">auth_key</spanx>: The encryption subkey produced by the | <li> | |||
<spanx style="verb">derive_subkeys()</spanx> algorithm</t> | <t><tt>enc_key</tt>: The encryption subkey produced by the <tt>deriv | |||
<t><spanx style="verb">nonce</spanx>: The <spanx style="verb">nonce</spanx> in | e_subkeys()</tt> algorithm</t> | |||
put to encryption/decryption</t> | </li> | |||
<t><spanx style="verb">aad</spanx>: The <spanx style="verb">aad</spanx> input | <li> | |||
to encryption/decryption</t> | <t><tt>auth_key</tt>: The encryption subkey produced by the <tt>deri | |||
<t><spanx style="verb">pt</spanx>: The plaintext</t> | ve_subkeys()</tt> algorithm</t> | |||
<t><spanx style="verb">ct</spanx>: The ciphertext</t> | </li> | |||
</list></t> | <li> | |||
<t><tt>nonce</tt>: The <tt>nonce</tt> input to encryption/decryption | ||||
<t>An implementation should verify that the following are true, where | </t> | |||
<spanx style="verb">AEAD.Encrypt</spanx> and <spanx style="verb">AEAD.Decrypt</s | </li> | |||
panx> are as defined in <xref target="aes-ctr-with-sha2"/>:</t> | <li> | |||
<t><tt>aad</tt>: The <tt>aad</tt> input to encryption/decryption</t> | ||||
<t><list style="symbols"> | </li> | |||
<t><spanx style="verb">AEAD.Encrypt(key, nonce, aad, pt) == ct</spanx></t> | <li> | |||
<t><spanx style="verb">AEAD.Decrypt(key, nonce, aad, ct) == pt</spanx></t> | <t><tt>pt</tt>: The plaintext</t> | |||
</list></t> | </li> | |||
<li> | ||||
<t>The other values in the test vector are intermediate values provided to | <t><tt>ct</tt>: The ciphertext</t> | |||
</li> | ||||
</ul> | ||||
<t>An implementation should verify that the following are true, where | ||||
<tt>AEAD.Encrypt</tt> and <tt>AEAD.Decrypt</tt> are as defined in <xref target=" | ||||
aes-ctr-with-sha2"/>:</t> | ||||
<ul spacing="normal"> | ||||
<li> | ||||
<t><tt>AEAD.Encrypt(key, nonce, aad, pt) == ct</tt></t> | ||||
</li> | ||||
<li> | ||||
<t><tt>AEAD.Decrypt(key, nonce, aad, ct) == pt</tt></t> | ||||
</li> | ||||
</ul> | ||||
<t>The other values in the test vector are intermediate values provided | ||||
to | ||||
facilitate debugging of test failures.</t> | facilitate debugging of test failures.</t> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
cipher_suite: 0x0001 | cipher_suite: 0x0001 | |||
key: 000102030405060708090a0b0c0d0e0f | key: 000102030405060708090a0b0c0d0e0f | |||
101112131415161718191a1b1c1d1e1f | 101112131415161718191a1b1c1d1e1f | |||
202122232425262728292a2b2c2d2e2f | 202122232425262728292a2b2c2d2e2f | |||
enc_key: 000102030405060708090a0b0c0d0e0f | enc_key: 000102030405060708090a0b0c0d0e0f | |||
auth_key: 101112131415161718191a1b1c1d1e1f | auth_key: 101112131415161718191a1b1c1d1e1f | |||
202122232425262728292a2b2c2d2e2f | 202122232425262728292a2b2c2d2e2f | |||
nonce: 101112131415161718191a1b | nonce: 101112131415161718191a1b | |||
aad: 4945544620534672616d65205747 | aad: 4945544620534672616d65205747 | |||
pt: 64726166742d696574662d736672616d | pt: 64726166742d696574662d736672616d | |||
652d656e63 | 652d656e63 | |||
ct: 6339af04ada1d064688a442b8dc69d5b | ct: 6339af04ada1d064688a442b8dc69d5b | |||
6bfa40f4bef0583e8081069cc60705 | 6bfa40f4bef0583e8081069cc60705 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
cipher_suite: 0x0002 | cipher_suite: 0x0002 | |||
key: 000102030405060708090a0b0c0d0e0f | key: 000102030405060708090a0b0c0d0e0f | |||
101112131415161718191a1b1c1d1e1f | 101112131415161718191a1b1c1d1e1f | |||
202122232425262728292a2b2c2d2e2f | 202122232425262728292a2b2c2d2e2f | |||
enc_key: 000102030405060708090a0b0c0d0e0f | enc_key: 000102030405060708090a0b0c0d0e0f | |||
auth_key: 101112131415161718191a1b1c1d1e1f | auth_key: 101112131415161718191a1b1c1d1e1f | |||
202122232425262728292a2b2c2d2e2f | 202122232425262728292a2b2c2d2e2f | |||
nonce: 101112131415161718191a1b | nonce: 101112131415161718191a1b | |||
aad: 4945544620534672616d65205747 | aad: 4945544620534672616d65205747 | |||
pt: 64726166742d696574662d736672616d | pt: 64726166742d696574662d736672616d | |||
652d656e63 | 652d656e63 | |||
ct: 6339af04ada1d064688a442b8dc69d5b | ct: 6339af04ada1d064688a442b8dc69d5b | |||
6bfa40f4be6e93b7da076927bb | 6bfa40f4be6e93b7da076927bb | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
cipher_suite: 0x0003 | cipher_suite: 0x0003 | |||
key: 000102030405060708090a0b0c0d0e0f | key: 000102030405060708090a0b0c0d0e0f | |||
101112131415161718191a1b1c1d1e1f | 101112131415161718191a1b1c1d1e1f | |||
202122232425262728292a2b2c2d2e2f | 202122232425262728292a2b2c2d2e2f | |||
enc_key: 000102030405060708090a0b0c0d0e0f | enc_key: 000102030405060708090a0b0c0d0e0f | |||
auth_key: 101112131415161718191a1b1c1d1e1f | auth_key: 101112131415161718191a1b1c1d1e1f | |||
202122232425262728292a2b2c2d2e2f | 202122232425262728292a2b2c2d2e2f | |||
nonce: 101112131415161718191a1b | nonce: 101112131415161718191a1b | |||
aad: 4945544620534672616d65205747 | aad: 4945544620534672616d65205747 | |||
pt: 64726166742d696574662d736672616d | pt: 64726166742d696574662d736672616d | |||
652d656e63 | 652d656e63 | |||
ct: 6339af04ada1d064688a442b8dc69d5b | ct: 6339af04ada1d064688a442b8dc69d5b | |||
6bfa40f4be09480509 | 6bfa40f4be09480509 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
</section> | ||||
</section> | <section anchor="sframe-encryptiondecryption"> | |||
<section anchor="sframe-encryptiondecryption"><name>SFrame Encryption/Decryption | <name>SFrame Encryption/Decryption</name> | |||
</name> | <t>For each case, we provide:</t> | |||
<ul spacing="normal"> | ||||
<t>For each case, we provide:</t> | <li> | |||
<t><tt>cipher_suite</tt>: The index of the cipher suite in use (see | ||||
<t><list style="symbols"> | ||||
<t><spanx style="verb">cipher_suite</spanx>: The index of the cipher suite in | ||||
use (see | ||||
<xref target="sframe-cipher-suites"/>)</t> | <xref target="sframe-cipher-suites"/>)</t> | |||
<t><spanx style="verb">kid</spanx>: A KID value</t> | </li> | |||
<t><spanx style="verb">ctr</spanx>: A CTR value</t> | <li> | |||
<t><spanx style="verb">base_key</spanx>: The <spanx style="verb">base_key</spa | <t><tt>kid</tt>: A KID value</t> | |||
nx> input to the <spanx style="verb">derive_key_salt</spanx> algorithm</t> | </li> | |||
<t><spanx style="verb">sframe_key_label</spanx>: The label used to derive <spa | <li> | |||
nx style="verb">sframe_key</spanx> in the <spanx style="verb">derive_key_salt</s | <t><tt>ctr</tt>: A CTR value</t> | |||
panx> algorithm</t> | </li> | |||
<t><spanx style="verb">sframe_salt_label</spanx>: The label used to derive <sp | <li> | |||
anx style="verb">sframe_salt</spanx> in the <spanx style="verb">derive_key_salt< | <t><tt>base_key</tt>: The <tt>base_key</tt> input to the <tt>derive_ | |||
/spanx> algorithm</t> | key_salt</tt> algorithm</t> | |||
<t><spanx style="verb">sframe_secret</spanx>: The <spanx style="verb">sframe_s | </li> | |||
ecret</spanx> variable in the <spanx style="verb">derive_key_salt</spanx> algori | <li> | |||
thm</t> | <t><tt>sframe_key_label</tt>: The label used to derive <tt>sframe_ke | |||
<t><spanx style="verb">sframe_key</spanx>: The <spanx style="verb">sframe_key< | y</tt> in the <tt>derive_key_salt</tt> algorithm</t> | |||
/spanx> value produced by the <spanx style="verb">derive_key_salt</spanx> algori | </li> | |||
thm</t> | <li> | |||
<t><spanx style="verb">sframe_salt</spanx>: The <spanx style="verb">sframe_sal | <t><tt>sframe_salt_label</tt>: The label used to derive <tt>sframe_s | |||
t</spanx> value produced by the <spanx style="verb">derive_key_salt</spanx> algo | alt</tt> in the <tt>derive_key_salt</tt> algorithm</t> | |||
rithm</t> | </li> | |||
<t><spanx style="verb">metadata</spanx>: The <spanx style="verb">metadata</spa | <li> | |||
nx> input to the SFrame <spanx style="verb">encrypt</spanx> algorithm</t> | <t><tt>sframe_secret</tt>: The <tt>sframe_secret</tt> variable in th | |||
<t><spanx style="verb">pt</spanx>: The plaintext</t> | e <tt>derive_key_salt</tt> algorithm</t> | |||
<t><spanx style="verb">ct</spanx>: The SFrame ciphertext</t> | </li> | |||
</list></t> | <li> | |||
<t><tt>sframe_key</tt>: The <tt>sframe_key</tt> value produced by th | ||||
<t>An implementation should verify that the following are true, where | e <tt>derive_key_salt</tt> algorithm</t> | |||
<spanx style="verb">encrypt</spanx> and <spanx style="verb">decrypt</spanx> are | </li> | |||
as defined in <xref target="encryption-schema"/>, using an SFrame | <li> | |||
context initialized with <spanx style="verb">base_key</spanx> assigned to <spanx | <t><tt>sframe_salt</tt>: The <tt>sframe_salt</tt> value produced by | |||
style="verb">kid</spanx>:</t> | the <tt>derive_key_salt</tt> algorithm</t> | |||
</li> | ||||
<t><list style="symbols"> | <li> | |||
<t><spanx style="verb">encrypt(ctr, kid, metadata, plaintext) == ct</spanx></t | <t><tt>metadata</tt>: The <tt>metadata</tt> input to the SFrame <tt> | |||
> | encrypt</tt> algorithm</t> | |||
<t><spanx style="verb">decrypt(metadata, ct) == pt</spanx></t> | </li> | |||
</list></t> | <li> | |||
<t><tt>pt</tt>: The plaintext</t> | ||||
<t>The other values in the test vector are intermediate values provided to | </li> | |||
<li> | ||||
<t><tt>ct</tt>: The SFrame ciphertext</t> | ||||
</li> | ||||
</ul> | ||||
<t>An implementation should verify that the following are true, where | ||||
<tt>encrypt</tt> and <tt>decrypt</tt> are as defined in <xref target="encryption | ||||
-schema"/>, using an SFrame | ||||
context initialized with <tt>base_key</tt> assigned to <tt>kid</tt>:</t> | ||||
<ul spacing="normal"> | ||||
<li> | ||||
<t><tt>encrypt(ctr, kid, metadata, plaintext) == ct</tt></t> | ||||
</li> | ||||
<li> | ||||
<t><tt>decrypt(metadata, ct) == pt</tt></t> | ||||
</li> | ||||
</ul> | ||||
<t>The other values in the test vector are intermediate values provided | ||||
to | ||||
facilitate debugging of test failures.</t> | facilitate debugging of test failures.</t> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
cipher_suite: 0x0001 | cipher_suite: 0x0001 | |||
kid: 0x0000000000000123 | kid: 0x0000000000000123 | |||
ctr: 0x0000000000004567 | ctr: 0x0000000000004567 | |||
base_key: 000102030405060708090a0b0c0d0e0f | base_key: 000102030405060708090a0b0c0d0e0f | |||
sframe_key_label: 534672616d6520312e30205365637265 | sframe_key_label: 534672616d6520312e30205365637265 | |||
74206b65792000000000000001230001 | 74206b65792000000000000001230001 | |||
sframe_salt_label: 534672616d6520312e30205365637265 | sframe_salt_label: 534672616d6520312e30205365637265 | |||
742073616c7420000000000000012300 | 742073616c7420000000000000012300 | |||
01 | 01 | |||
sframe_secret: d926952ca8b7ec4a95941d1ada3a5203 | sframe_secret: d926952ca8b7ec4a95941d1ada3a5203 | |||
skipping to change at line 4642 ¶ | skipping to change at line 4167 ¶ | |||
sframe_salt: 50b29329a04dc0f184ac3168 | sframe_salt: 50b29329a04dc0f184ac3168 | |||
metadata: 4945544620534672616d65205747 | metadata: 4945544620534672616d65205747 | |||
nonce: 50b29329a04dc0f184ac740f | nonce: 50b29329a04dc0f184ac740f | |||
aad: 99012345674945544620534672616d65 | aad: 99012345674945544620534672616d65 | |||
205747 | 205747 | |||
pt: 64726166742d696574662d736672616d | pt: 64726166742d696574662d736672616d | |||
652d656e63 | 652d656e63 | |||
ct: 9901234567449408b6f490086165b9d6 | ct: 9901234567449408b6f490086165b9d6 | |||
f62b24ae1a59a56486b4ae8ed036b889 | f62b24ae1a59a56486b4ae8ed036b889 | |||
12e24f11 | 12e24f11 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
cipher_suite: 0x0002 | cipher_suite: 0x0002 | |||
kid: 0x0000000000000123 | kid: 0x0000000000000123 | |||
ctr: 0x0000000000004567 | ctr: 0x0000000000004567 | |||
base_key: 000102030405060708090a0b0c0d0e0f | base_key: 000102030405060708090a0b0c0d0e0f | |||
sframe_key_label: 534672616d6520312e30205365637265 | sframe_key_label: 534672616d6520312e30205365637265 | |||
74206b65792000000000000001230002 | 74206b65792000000000000001230002 | |||
sframe_salt_label: 534672616d6520312e30205365637265 | sframe_salt_label: 534672616d6520312e30205365637265 | |||
742073616c7420000000000000012300 | 742073616c7420000000000000012300 | |||
02 | 02 | |||
sframe_secret: d926952ca8b7ec4a95941d1ada3a5203 | sframe_secret: d926952ca8b7ec4a95941d1ada3a5203 | |||
skipping to change at line 4669 ¶ | skipping to change at line 4193 ¶ | |||
sframe_salt: e68ac8dd3d02fbcd368c5577 | sframe_salt: e68ac8dd3d02fbcd368c5577 | |||
metadata: 4945544620534672616d65205747 | metadata: 4945544620534672616d65205747 | |||
nonce: e68ac8dd3d02fbcd368c1010 | nonce: e68ac8dd3d02fbcd368c1010 | |||
aad: 99012345674945544620534672616d65 | aad: 99012345674945544620534672616d65 | |||
205747 | 205747 | |||
pt: 64726166742d696574662d736672616d | pt: 64726166742d696574662d736672616d | |||
652d656e63 | 652d656e63 | |||
ct: 99012345673f31438db4d09434e43afa | ct: 99012345673f31438db4d09434e43afa | |||
0f8a2f00867a2be085046a9f5cb4f101 | 0f8a2f00867a2be085046a9f5cb4f101 | |||
d607 | d607 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
cipher_suite: 0x0003 | cipher_suite: 0x0003 | |||
kid: 0x0000000000000123 | kid: 0x0000000000000123 | |||
ctr: 0x0000000000004567 | ctr: 0x0000000000004567 | |||
base_key: 000102030405060708090a0b0c0d0e0f | base_key: 000102030405060708090a0b0c0d0e0f | |||
sframe_key_label: 534672616d6520312e30205365637265 | sframe_key_label: 534672616d6520312e30205365637265 | |||
74206b65792000000000000001230003 | 74206b65792000000000000001230003 | |||
sframe_salt_label: 534672616d6520312e30205365637265 | sframe_salt_label: 534672616d6520312e30205365637265 | |||
742073616c7420000000000000012300 | 742073616c7420000000000000012300 | |||
03 | 03 | |||
sframe_secret: d926952ca8b7ec4a95941d1ada3a5203 | sframe_secret: d926952ca8b7ec4a95941d1ada3a5203 | |||
skipping to change at line 4695 ¶ | skipping to change at line 4218 ¶ | |||
11d57909934f46f5405e38cd583c69fe | 11d57909934f46f5405e38cd583c69fe | |||
sframe_salt: 38c16e4f5159700c00c7f350 | sframe_salt: 38c16e4f5159700c00c7f350 | |||
metadata: 4945544620534672616d65205747 | metadata: 4945544620534672616d65205747 | |||
nonce: 38c16e4f5159700c00c7b637 | nonce: 38c16e4f5159700c00c7b637 | |||
aad: 99012345674945544620534672616d65 | aad: 99012345674945544620534672616d65 | |||
205747 | 205747 | |||
pt: 64726166742d696574662d736672616d | pt: 64726166742d696574662d736672616d | |||
652d656e63 | 652d656e63 | |||
ct: 990123456717fc8af28a5a695afcfc6c | ct: 990123456717fc8af28a5a695afcfc6c | |||
8df6358a17e26b2fcb3bae32e443 | 8df6358a17e26b2fcb3bae32e443 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
cipher_suite: 0x0004 | cipher_suite: 0x0004 | |||
kid: 0x0000000000000123 | kid: 0x0000000000000123 | |||
ctr: 0x0000000000004567 | ctr: 0x0000000000004567 | |||
base_key: 000102030405060708090a0b0c0d0e0f | base_key: 000102030405060708090a0b0c0d0e0f | |||
sframe_key_label: 534672616d6520312e30205365637265 | sframe_key_label: 534672616d6520312e30205365637265 | |||
74206b65792000000000000001230004 | 74206b65792000000000000001230004 | |||
sframe_salt_label: 534672616d6520312e30205365637265 | sframe_salt_label: 534672616d6520312e30205365637265 | |||
742073616c7420000000000000012300 | 742073616c7420000000000000012300 | |||
04 | 04 | |||
sframe_secret: d926952ca8b7ec4a95941d1ada3a5203 | sframe_secret: d926952ca8b7ec4a95941d1ada3a5203 | |||
skipping to change at line 4720 ¶ | skipping to change at line 4242 ¶ | |||
sframe_salt: 75234edefe07819026751816 | sframe_salt: 75234edefe07819026751816 | |||
metadata: 4945544620534672616d65205747 | metadata: 4945544620534672616d65205747 | |||
nonce: 75234edefe07819026755d71 | nonce: 75234edefe07819026755d71 | |||
aad: 99012345674945544620534672616d65 | aad: 99012345674945544620534672616d65 | |||
205747 | 205747 | |||
pt: 64726166742d696574662d736672616d | pt: 64726166742d696574662d736672616d | |||
652d656e63 | 652d656e63 | |||
ct: 9901234567b7412c2513a1b66dbb4884 | ct: 9901234567b7412c2513a1b66dbb4884 | |||
1bbaf17f598751176ad847681a69c6d0 | 1bbaf17f598751176ad847681a69c6d0 | |||
b091c07018ce4adb34eb | b091c07018ce4adb34eb | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="test-vectors"><![CDATA[ | ||||
<figure><sourcecode type="test-vectors"><![CDATA[ | ||||
cipher_suite: 0x0005 | cipher_suite: 0x0005 | |||
kid: 0x0000000000000123 | kid: 0x0000000000000123 | |||
ctr: 0x0000000000004567 | ctr: 0x0000000000004567 | |||
base_key: 000102030405060708090a0b0c0d0e0f | base_key: 000102030405060708090a0b0c0d0e0f | |||
sframe_key_label: 534672616d6520312e30205365637265 | sframe_key_label: 534672616d6520312e30205365637265 | |||
74206b65792000000000000001230005 | 74206b65792000000000000001230005 | |||
sframe_salt_label: 534672616d6520312e30205365637265 | sframe_salt_label: 534672616d6520312e30205365637265 | |||
742073616c7420000000000000012300 | 742073616c7420000000000000012300 | |||
05 | 05 | |||
sframe_secret: 0fc3ea6de6aac97a35f194cf9bed94d4 | sframe_secret: 0fc3ea6de6aac97a35f194cf9bed94d4 | |||
skipping to change at line 4748 ¶ | skipping to change at line 4269 ¶ | |||
sframe_salt: 84991c167b8cd23c93708ec7 | sframe_salt: 84991c167b8cd23c93708ec7 | |||
metadata: 4945544620534672616d65205747 | metadata: 4945544620534672616d65205747 | |||
nonce: 84991c167b8cd23c9370cba0 | nonce: 84991c167b8cd23c9370cba0 | |||
aad: 99012345674945544620534672616d65 | aad: 99012345674945544620534672616d65 | |||
205747 | 205747 | |||
pt: 64726166742d696574662d736672616d | pt: 64726166742d696574662d736672616d | |||
652d656e63 | 652d656e63 | |||
ct: 990123456794f509d36e9beacb0e261d | ct: 990123456794f509d36e9beacb0e261d | |||
99c7d1e972f1fed787d4049f17ca2135 | 99c7d1e972f1fed787d4049f17ca2135 | |||
3c1cc24d56ceabced279 | 3c1cc24d56ceabced279 | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
</section> | ||||
</section> | </section> | |||
</section> | <section numbered="false" anchor="acknowledgements"> | |||
<section numbered="false" anchor="acknowledgements"><name>Acknowledgements</name | <name>Acknowledgements</name> | |||
> | <t>The authors wish to specially thank <contact fullname="Dr. Alex Gouaill | |||
ard"/> as one of the early | ||||
<t>The authors wish to specially thank <contact fullname="Dr. Alex Gouaillard"/> | ||||
as one of the early | ||||
contributors to the document. His passion and energy were key to the design and | contributors to the document. His passion and energy were key to the design and | |||
development of SFrame.</t> | development of SFrame.</t> | |||
</section> | ||||
</section> | ||||
<section anchor="contributors" numbered="false" toc="include" removeInRFC="f alse"> | <section anchor="contributors" numbered="false" toc="include" removeInRFC="f alse"> | |||
<name>Contributors</name> | <name>Contributors</name> | |||
<contact initials="F." surname="Jacobs" fullname="Frédéric Jacobs"> | <contact initials="F." surname="Jacobs" fullname="Frédéric Jacobs"> | |||
<organization>Apple</organization> | <organization>Apple</organization> | |||
<address> | <address> | |||
<email>frederic.jacobs@apple.com</email> | <email>frederic.jacobs@apple.com</email> | |||
</address> | </address> | |||
</contact> | </contact> | |||
<contact initials="M." surname="Mularczyk" fullname="Marta Mularczyk"> | <contact initials="M." surname="Mularczyk" fullname="Marta Mularczyk"> | |||
<organization>Amazon</organization> | <organization>Amazon</organization> | |||
<address> | <address> | |||
<email>mulmarta@amazon.com</email> | <email>mulmarta@amazon.com</email> | |||
</address> | </address> | |||
</contact> | </contact> | |||
<contact initials="S." surname="Nandakumar" fullname="Suhas Nandakumar"> | <contact initials="S." surname="Nandakumar" fullname="Suhas Nandakumar"> | |||
<organization>Cisco</organization> | <organization>Cisco</organization> | |||
<address> | <address> | |||
<email>snandaku@cisco.com</email> | <email>snandaku@cisco.com</email> | |||
</address> | </address> | |||
</contact> | </contact> | |||
<contact initials="T." surname="Rigaux" fullname="Tomas Rigaux"> | <contact initials="T." surname="Rigaux" fullname="Tomas Rigaux"> | |||
<organization>Cisco</organization> | <organization>Cisco</organization> | |||
<address> | <address> | |||
<email>trigaux@cisco.com</email> | <email>trigaux@cisco.com</email> | |||
</address> | </address> | |||
</contact> | </contact> | |||
<contact initials="R." surname="Robert" fullname="Raphael Robert"> | <contact initials="R." surname="Robert" fullname="Raphael Robert"> | |||
<organization>Phoenix R&D</organization> | <organization>Phoenix R&D</organization> | |||
<address> | <address> | |||
<email>ietf@raphaelrobert.com</email> | <email>ietf@raphaelrobert.com</email> | |||
</address> | </address> | |||
</contact> | </contact> | |||
</section> | </section> | |||
</back> | </back> | |||
<!-- ##markdown-source: | ||||
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 | ||||
mIjPj3Rh17kqC7APTQ70jY3GqONrYF2/NTrltC35+fO/wqvt0zdPv39iLuya | ||||
Fe0wj65SzJuGyeM7TbHd6zc/vf3pyZvnT8eDXpfq4b1Y4NHnIkr5wKDU1xxp | ||||
bTllIz9V9qq130T3lctzuL6CR1enYya/gkEC276OO07x8j3iWYCUz8dFVEYL | ||||
xH+YO/dk4hZs8f6ngCcppyEVwMN5JtthnqD3r/BY2eFpMyKfrtQjLsiynxLy | ||||
Q3lJeKQyXZlbEAiwOjzF0zmbjIvRqKgxrppAF8OK2RSuVCAtZV5yc4Il1qDH | ||||
urWUFLVywnWnBjDnXO4lyyy6kitvaSIEbUmc0S/BTmEDAl/CO+A/mbIvylWj | ||||
Oa/S5JnSpcIcIwq0mmmrVHggdM2VzC0nBWm8EnGINI5qHt5ImhtHbpl5GlA9 | ||||
w5lTvHFE9DYOU9nMzhD1vHhmiCr33rLIlH5qz9EVZSRydU0nN5K8MG7Wo7Ky | ||||
OUnTusILJD4alpYGHl1lGZ1x3BgEKGOQJxJMIY1pDU91NaaW+Vb9GEfAqcPC | ||||
FuAfZRnecksMAPQDrlTinv2tNa5AH8W9fyars28bRd9BG9TB8K7lPStN+oEm | ||||
Ea2deOA3NYnOKibR2WYmEbTzGo0G/0FGw5kYDR6hrqwFf721kPF9oCAV0Mn2 | ||||
0RAnj115Eq3ruyhSlWUIbknUArktS2ESFfLAqYmh58g7Y+2fDrxLYT6wzj/C | ||||
3FycXyC+JIDNwQe21oHsTMIZXakr24G4guI+zOI8lpTU+xwIMlEH6ax306a4 | ||||
oKbv6czumyditZwfqARjfQsCAPesnHHph1Cly1vJb6jnTJ/uuFbWOfxfaAPz | ||||
hsXSEpxCutXuIuL7MxUfifB2wUXFXN2vtrrocokiT/g4N8YjZRyzQhozPtea | ||||
dQIRh79/Dvbc2QFZddzje55d+O2MnvLaKiPvrMnIAwsPNqay8c7Vl7MGM0+b | ||||
eOZLxT47rH5BG09uGqXrBG6xLitgCF/OCLeqhdcAQV9ZMrvPruPIbWLlzCrJ | ||||
nuM0Cx3TxXeeaANMV3yyC8Morkzzp2obCHjerqyohAtlfbkJHJZIoPJ8c7JF | ||||
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 | ||||
mTIAjRzlmBgLRwxqjD4wr3fuH7XCxkWSkdms1Ep1Xmh7MwiwpwE3j4LYF3fa | ||||
4FiwPcCsHuAFTxhQYOkCJEqra0OCyD1M/uqrpxRKUG998tVXQtna7SKlxemA | ||||
UYx2N6x2EdMtorRIigI61MtpHKssKTNQ1YU7qeS4rhQpUcmB0oWp36YQkvJ6 | ||||
CttW5bqTkGuom5VoQEoTzt8PLe72TAlJ4+vDLs1jyZPWjkCjNCpcVRukN6op | ||||
rw5mShP3j+XpRKpxv8905cI6/0cE7vrdxL1j9Wmf5sXyIZoumy9fDY0rnDU/ | ||||
g5kHNsiqKNvhMkXl+wrjpCjYmRm7yL3yZsmx3NplwuYbwLnKYtExSAP3rPp+ | ||||
UZW2kbcDhm+gQ6lXg317CB39Wi/wftvVcPBbfvJUl+i3npkCy/g8GP7W8+Q6 | ||||
YUxpASCqLNFnmCZYrxP/5yT6ZjX6tkWxWLPSeYBbW5XqP1EdtrwvGihYPx8f | ||||
BtS8y4O2X+UFfU/b9cQeC8EB/NHNVpz434fF1ctw+Q3NSasyMuoUdsvH5sYu | ||||
xowQMLO0gs9LWTlEa7qQpdpfi+CB3/4Wq6pMf8vtwzh+rxDe/5cCfmj5H9L4 | ||||
xBcslM/wxP+XP61GfzmwXlOoP+A10Wv3/2WOlWprbylqlrcq5brNLhegOBRZ | ||||
LoGv7o4WjKrw7I3aBOOLroijtlJTMRy9BeRs+id1LnAKas9NkeKxz+JGRdtp | ||||
5yzoAemcDRxTFMRH/45OrjA3+erAOM+Jc9NpAaZmlInYpgCrkGo94Pn0HG0o | ||||
3ZWO9MNKqp6VKqrSbKbwZpazNHvreHmUQ8MuYRLS+a7EquybK6Ow7JUAiFe5 | ||||
U0+m+QX0jcsL7gkt6/lWy3pqAr6oQqzW21AS1NySOoQqG1cVV2a1egWixvN+ | ||||
4iuw2ITXU0eH4oDPh3SWUfU1k3ShfKFJUYLqQJGEheSMKKr4YbIsfCqId+jf | ||||
wmhv8V+YJvr37envbw/8r/wR/P/p29ewR1USSdDtDTiB5PtEdEZdoFNq1QV4 | ||||
89YUaxaoi6I+6UpMIjF+619Qn1LLkvrVb/FhEc2vUCASJ/lSCnwRkat0ISF/ | ||||
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 | ||||
</rfc> | </rfc> | |||
End of changes. 490 change blocks. | ||||
3886 lines changed or deleted | 2822 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |