rfc8746xml2.original.xml | rfc8746.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 SYSTEM "rfc2629-xhtml.ent"> | |||
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.2.12 --> | ||||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [ | ||||
]> | ||||
<?rfc toc="yes"?> | ||||
<?rfc sortrefs="yes"?> | ||||
<?rfc symrefs="yes"?> | ||||
<?rfc compact="yes"?> | ||||
<?rfc comments="yes"?> | ||||
<rfc ipr="trust200902" docName="draft-ietf-cbor-array-tags-08" category="std"> | <rfc number="8746" xmlns:xi="http://www.w3.org/2001/XInclude" consensus="true" | |||
ipr="trust200902" docName="draft-ietf-cbor-array-tags-08" category="std" | ||||
obsoletes="" updates="" submissionType="IETF" xml:lang="en" | ||||
tocInclude="true" sortRefs="true" symRefs="true" version="3"> | ||||
<front> | <front> | |||
<title abbrev="CBOR tags for typed arrays">Concise Binary Object Representat | <title abbrev="CBOR tags for typed arrays">Concise Binary Object | |||
ion (CBOR) Tags for Typed Arrays</title> | Representation (CBOR) Tags for Typed Arrays</title> | |||
<seriesInfo name="RFC" value="8746"/> | ||||
<author initials="C." surname="Bormann" fullname="Carsten Bormann" role="edi tor"> | <author initials="C." surname="Bormann" fullname="Carsten Bormann" role="edi tor"> | |||
<organization>Universität Bremen TZI</organization> | <organization ascii="Universitaet Bremen TZI">Universität Bremen TZI</orga nization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>Postfach 330440</street> | <street>Postfach 330440</street> | |||
<city>Bremen</city> | <city>Bremen</city> | |||
<code>D-28359</code> | <code>D-28359</code> | |||
<country>Germany</country> | <country>Germany</country> | |||
</postal> | </postal> | |||
<phone>+49-421-218-63921</phone> | <phone>+49-421-218-63921</phone> | |||
<email>cabo@tzi.org</email> | <email>cabo@tzi.org</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<date month="February" year="2020"/> | ||||
<date year="2019" month="October" day="08"/> | <keyword>binary format</keyword> | |||
<keyword>data interchange format</keyword> | ||||
<keyword>Internet-Draft</keyword> | <keyword>JSON</keyword> | |||
<abstract> | <abstract> | |||
<t>The Concise Binary Object Representation (CBOR), as defined in RFC | ||||
<t>The Concise Binary Object Representation (CBOR, RFC 7049) is a data | 7049, is a data format whose design goals include the possibility of | |||
format whose design goals include the possibility of extremely small | extremely small code size, fairly small message size, and extensibility | |||
code size, fairly small message size, and extensibility without the | without the need for version negotiation.</t> | |||
need for version negotiation.</t> | <t>This document makes use of this extensibility to define a number of | |||
CBOR tags for typed arrays of numeric data, as well as additional | ||||
<t>The present document makes use of this extensibility to define a | tags for multi-dimensional and homogeneous arrays. It is intended as | |||
number of CBOR tags for typed arrays of numeric data, as well as two | the reference document for the IANA registration of the CBOR tags | |||
additional tags for multi-dimensional and homogeneous arrays. It is | defined.</t> | |||
intended as the reference document for the IANA registration of the | ||||
CBOR tags defined.</t> | ||||
</abstract> | </abstract> | |||
</front> | </front> | |||
<middle> | <middle> | |||
<section anchor="intro" numbered="true" toc="default"> | ||||
<name>Introduction</name> | ||||
<t>The Concise Binary Object Representation (CBOR) <xref | ||||
target="RFC7049" format="default"/> provides for the interchange of | ||||
structured data without a requirement for a pre-agreed schema. <xref | ||||
target="RFC7049"/> defines a basic set of data types as well as a | ||||
tagging mechanism that enables extending the set of data types supported | ||||
via an IANA registry.</t> | ||||
<t>Recently, a simple form of typed arrays of numeric data has received | ||||
interest both in the Web graphics community <xref target="TypedArray" | ||||
format="default"/> and in the JavaScript specification (see <eref | ||||
target="https://www.ecma-international.org/ecma-262/10.0/index.html#sec-ty | ||||
pedarray-objects">Section | ||||
22.2</eref> of <xref target="ECMA-ES10" format="default"/>) as well as | ||||
in corresponding implementations <xref target="ArrayBuffer" | ||||
format="default"/>.</t> | ||||
<t>Since these typed arrays may carry significant amounts of data, there | ||||
is interest in interchanging them in CBOR without the need of lengthy | ||||
conversion of each number in the array. This can also save space | ||||
overhead with encoding a type for each element of an array.</t> | ||||
<t>This document defines a number of interrelated CBOR tags that cover | ||||
these typed arrays, as well as additional tags for multi-dimensional and | ||||
homogeneous arrays. It is intended as the reference document for the | ||||
IANA registration of the tags defined.</t> | ||||
<t>Note that an application that generates CBOR with these tags has | ||||
considerable freedom in choosing variants (e.g., with respect to | ||||
endianness, embedded type (signed vs. unsigned), and number of bits per | ||||
element) or whether a tag defined in this specification is used at all | ||||
instead of more basic CBOR. In contrast to representation variants of | ||||
single CBOR numbers, there is no representation that could be identified | ||||
as "preferred". If deterministic encoding is desired in a CBOR-based | ||||
protocol making use of these tags, the protocol has to define which of | ||||
the encoding variants are used for each individual case.</t> | ||||
<section anchor="intro" title="Introduction"> | <section anchor="terms" numbered="true" toc="default"> | |||
<name>Terminology</name> | ||||
<t>The Concise Binary Object Representation (CBOR, <xref target="RFC7049"/>) pro | ||||
vides | ||||
for the interchange of structured data without a requirement for a | ||||
pre-agreed schema. | ||||
RFC 7049 defines a basic set of data types, as well as a tagging | ||||
mechanism that enables extending the set of data types supported via | ||||
an IANA registry.</t> | ||||
<t>Recently, a simple form of typed arrays of numeric data has received | ||||
interest both in the Web graphics community <xref target="TypedArray"/> and in | ||||
the JavaScript specification <xref target="TypedArrayES6"/>, as well as in | ||||
corresponding implementations <xref target="ArrayBuffer"/>.</t> | ||||
<t>Since these typed arrays may carry significant amounts of data, there | ||||
is interest in interchanging them in CBOR without the need of lengthy | ||||
conversion of each number in the array. This can also save space | ||||
overhead with encoding a type for each element of an array.</t> | ||||
<t>This document defines a number of interrelated CBOR tags that cover | ||||
these typed arrays, as well as two additional tags for | ||||
multi-dimensional and homogeneous arrays. | ||||
It is intended as the reference document for the IANA registration of | ||||
the tags defined.</t> | ||||
<t>Note that an application that generates CBOR with these tags has | ||||
considerable freedom in choosing variants, e.g., with respect to | ||||
endianness, embedded type (signed vs. unsigned), and number of bits | ||||
per element, or whether a tag defined in this specification is used at | ||||
all instead of more basic CBOR. In contrast to representation | ||||
variants of single CBOR numbers, there is no representation that could | ||||
be identified as “preferred”. If deterministic encoding is desired in | ||||
a CBOR-based protocol making use of these tags, the protocol has to | ||||
define which of the encoding variants are used in which case.</t> | ||||
<section anchor="terms" title="Terminology"> | ||||
<!-- | ||||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL | ||||
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and | ||||
"OPTIONAL" in this document are to be interpreted as described in | ||||
RFC 2119 {{ !RFC2119}}. | ||||
--> | ||||
<t>The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL | ||||
NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, | ||||
“MAY”, and “OPTIONAL” in this document are to be interpreted as | ||||
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and | ||||
only when, they | ||||
appear in all capitals, as shown here.</t> | ||||
<t>The term “byte” is used in its now customary sense as a synonym for | ||||
“octet”. | ||||
Where bit arithmetic is explained, this document uses the notation | ||||
familiar from the programming language C <xref target="C"/> (including C++14’s 0 | ||||
bnnn | ||||
binary literals <xref target="Cplusplus"/>), except that the operator “**” stand | ||||
s for | ||||
exponentiation.</t> | ||||
<t>The term “array” is used in a general sense in this document, unless | ||||
further specified. The term “classical CBOR array” describes an array | ||||
represented with CBOR major type 4. A “homogeneous array” is an array | ||||
of elements that are all of the same type (the term is neutral as to whether | ||||
that is a representation type or an application data model type).</t> | ||||
<t>The terms “big endian” and “little endian” are used to indicate a most | ||||
significant byte first (MSB first) representation of integers, and a | ||||
least significant byte first (LSB first) representation, respectively.</t> | ||||
</section> | ||||
</section> | ||||
<section anchor="typedarrays" title="Typed Arrays"> | ||||
<t>Typed arrays are homogeneous arrays of numbers, all of which are | ||||
encoded in a single form of binary representation. The concatenation | ||||
of these representations is encoded as a single CBOR byte string | ||||
(major type 2), enclosed by a single tag indicating the type and | ||||
encoding of all the numbers represented in the byte string.</t> | ||||
<section anchor="dataTypes" title="Types of numbers"> | ||||
<t>Three classes of numbers are of interest: unsigned integers (uint), | ||||
signed integers (two’s complement, sint), and IEEE 754 binary floating | ||||
point numbers (which are always signed). For each of these classes, | ||||
there are multiple representation lengths in active use:</t> | ||||
<texttable title="Length values" anchor="lengths"> | ||||
<ttcol align='left'>Length ll</ttcol> | ||||
<ttcol align='left'>uint</ttcol> | ||||
<ttcol align='left'>sint</ttcol> | ||||
<ttcol align='left'>float</ttcol> | ||||
<c>0</c> | ||||
<c>uint8</c> | ||||
<c>sint8</c> | ||||
<c>binary16</c> | ||||
<c>1</c> | ||||
<c>uint16</c> | ||||
<c>sint16</c> | ||||
<c>binary32</c> | ||||
<c>2</c> | ||||
<c>uint32</c> | ||||
<c>sint32</c> | ||||
<c>binary64</c> | ||||
<c>3</c> | ||||
<c>uint64</c> | ||||
<c>sint64</c> | ||||
<c>binary128</c> | ||||
</texttable> | ||||
<t>Here, sintN stands for a signed integer of exactly N bits (for | ||||
instance, sint16), and uintN stands for an unsigned integer of exactly | ||||
N bits (for instance, uint32). The name binaryN stands for the number | ||||
form of the same name defined in IEEE 754 <xref target="IEEE754"/>.</t> | ||||
<t>Since one objective of these tags is to be able to directly ship the | ||||
ArrayBuffers underlying the Typed Arrays without re-encoding them, and | ||||
these may be either in big endian (network byte order) or in little | ||||
endian form, we need to define tags for both variants.</t> | ||||
<t>In total, this leads to 24 variants. In the tag, we need to express | ||||
the choice between integer and floating point, the signedness (for | ||||
integers), the endianness, and one of the four length values.</t> | ||||
<t>In order to simplify implementation, a range of tags is being | ||||
allocated that allows retrieving all this information from the bits of | ||||
the tag: Tag values from 64 to 87. <!-- (0x40 to 0x57) --></t> | ||||
<t>The value is split up into 5 bit fields: 0b010_f_s_e_ll, as | ||||
detailed in <xref target="fields"/>.</t> | ||||
<texttable title="Bit fields in the low 8 bits of the tag" anchor="fields"> | ||||
<ttcol align='left'>Field</ttcol> | ||||
<ttcol align='left'>Use</ttcol> | ||||
<c>0b010</c> | ||||
<c>the constant bits 0, 1, 0</c> | ||||
<c>f</c> | ||||
<c>0 for integer, 1 for float</c> | ||||
<c>s</c> | ||||
<c>0 for float or unsigned integer, 1 for signed integer</c> | ||||
<c>e</c> | ||||
<c>0 for big endian, 1 for little endian</c> | ||||
<c>ll</c> | ||||
<c>A number for the length (<xref target="lengths"/>).</c> | ||||
</texttable> | ||||
<t>The number of bytes in each array element can then be calculated by | ||||
<spanx style="verb">2**(f + ll)</spanx> (or <spanx style="verb">1 << (f + | ||||
ll)</spanx> in a typical programming language). | ||||
(Notice that 0f and ll are the two least significant bits, respectively, of each | ||||
nibble (4bit) in the byte.)</t> | ||||
<t>In the CBOR representation, the total number of elements in the array | ||||
is not expressed explicitly, but implied from the length of the byte | ||||
string and the length of each representation. It can be | ||||
computed from the length, in bytes, of the byte string comprising the | ||||
representation of the array by inverting the previous formula: | ||||
<spanx style="verb">bytelength >> (f + ll)</spanx>.</t> | ||||
<t>For the uint8/sint8 values, the endianness is redundant. | ||||
Only the tag for the big endian variant is used and assigned as such. | ||||
The Tag that would signify the little endian variant of sint8 MUST NOT | ||||
be used, its tag number is marked as reserved. | ||||
As a special case, the Tag that would signify the little | ||||
endian variant of uint8 is instead assigned to signify that the numbers in the a | ||||
rray are using clamped | ||||
conversion from integers, as described in more detail in Section 7.1.11 (<spanx | ||||
style="verb">ToUint8Clamp</spanx>) | ||||
of the ES6 JavaScript specification <xref target="TypedArrayES6"/>; the assumpti | ||||
on | ||||
here is that a program-internal representation of this array after | ||||
decoding would be marked this way for further processing, providing | ||||
“roundtripping” of JavaScript typed arrays through CBOR.</t> | ||||
<t>IEEE 754 binary floating numbers are always signed. Therefore, for | ||||
the float variants (<spanx style="verb">f</spanx> == 1), there is no need to dis | ||||
tinguish between | ||||
signed and unsigned variants; the <spanx style="verb">s</spanx> bit is always ze | ||||
ro. The Tag | ||||
numbers where <spanx style="verb">s</spanx> would be one (which would have Tag v | ||||
alues 88 to 95) | ||||
remain free to use by other specifications.</t> | ||||
</section> | ||||
</section> | ||||
<section anchor="additional-array-tags" title="Additional Array Tags"> | ||||
<t>This specification defines three additional array tags. | ||||
The Multi-dimensional Array tags can be combined with classical CBOR | ||||
arrays as well as with Typed Arrays in order to build | ||||
multi-dimensional arrays with constant numbers of elements in the | ||||
sub-arrays. | ||||
The Homogeneous Array tag can be used as a signal by an application to | ||||
identify a classical CBOR array as a homogeneous array, | ||||
even when a Typed Array does not apply.</t> | ||||
<section anchor="multi-dimensional-array" title="Multi-dimensional Array"> | ||||
<t>A multi-dimensional array is represented as a tagged array that | ||||
contains two (one-dimensional) arrays. The first array defines the | ||||
dimensions of the | ||||
multi-dimensional array (in the sequence of outer dimensions towards | ||||
inner dimensions) while the second array represents the contents | ||||
of the multi-dimensional array. If the second array is itself tagged | ||||
as a Typed Array then the element type of the multi-dimensional array | ||||
is known to be the same type as that of the Typed Array.</t> | ||||
<t>Two tags are defined by this document, one for elements arranged in | <t> | |||
row-major order, and one for column-major order <xref target="RowColMajor"/>.</t | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | |||
> | "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", | ||||
"<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | ||||
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are | ||||
to be interpreted as described in BCP 14 <xref target="RFC2119"/> | ||||
<xref target="RFC8174"/> when, and only when, they appear in all capitals, | ||||
as shown here. | ||||
</t> | ||||
<section anchor="row-major-order" title="Row-major Order"> | <t>The term "byte" is used in its now-customary sense as a synonym for | |||
"octet". Where bit arithmetic is explained, this document uses | ||||
familiar notation from the programming language C <xref target="C" | ||||
format="default"/> (including C++14's 0bnnn binary literals <xref | ||||
target="CPlusPlus" format="default"/>) with the exception of the | ||||
operator "**", which stands for exponentiation.</t> | ||||
<t>The term "array" is used in a general sense in this document unless | ||||
further specified. The term "classical CBOR array" describes an array | ||||
represented with CBOR major type 4. A "homogeneous array" is an array | ||||
of elements that are all the same type (the term is neutral as to | ||||
whether that is a representation type or an application data model | ||||
type).</t> | ||||
<t>The terms "big endian" and "little endian" are used to indicate a | ||||
most significant byte first (MSB first) representation of integers and | ||||
a least significant byte first (LSB first) representation, | ||||
respectively.</t> | ||||
</section> | ||||
</section> | ||||
<t><list style="hanging"> | <section anchor="typedarrays" numbered="true" toc="default"> | |||
<t hangText='Tag:'> | <name>Typed Arrays</name> | |||
40</t> | <t>Typed arrays are homogeneous arrays of numbers, all of which are | |||
<t hangText='Data Item:'> | encoded in a single form of binary representation. The concatenation of | |||
array (major type 4) of two arrays, one array (major type 4) of | these representations is encoded as a single CBOR byte string (major | |||
dimensions, which are unsigned integers distinct from zero, and one | type 2), enclosed by a single tag indicating the type and encoding of | |||
array (either a CBOR array of major type 4, or a Typed Array, or a | all the numbers represented in the byte string.</t> | |||
Homogeneous Array) of elements</t> | <section anchor="dataTypes" numbered="true" toc="default"> | |||
</list></t> | <name>Types of Numbers</name> | |||
<t>Three classes of numbers are of interest: unsigned integers (uint), | ||||
signed integers (two's complement, sint), and IEEE 754 binary floating | ||||
point numbers (which are always signed). For each of these classes, | ||||
there are multiple representation lengths in active use:</t> | ||||
<table anchor="lengths" align="center"> | ||||
<name>Length Values</name> | ||||
<thead> | ||||
<tr> | ||||
<th align="left">Length ll</th> | ||||
<th align="left">uint</th> | ||||
<th align="left">sint</th> | ||||
<th align="left">float</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> | ||||
<td align="left">0</td> | ||||
<td align="left">uint8</td> | ||||
<td align="left">sint8</td> | ||||
<td align="left">binary16</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">1</td> | ||||
<td align="left">uint16</td> | ||||
<td align="left">sint16</td> | ||||
<td align="left">binary32</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">2</td> | ||||
<td align="left">uint32</td> | ||||
<td align="left">sint32</td> | ||||
<td align="left">binary64</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">3</td> | ||||
<td align="left">uint64</td> | ||||
<td align="left">sint64</td> | ||||
<td align="left">binary128</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>Here, sintN stands for a signed integer of exactly N bits (for | ||||
instance, sint16), and uintN stands for an unsigned integer of exactly | ||||
N bits (for instance, uint32). The name binaryN stands for the number | ||||
form of the same name defined in IEEE 754 <xref target="IEEE754" | ||||
format="default"/>.</t> | ||||
<t>Data in the second array consists of consecutive values where the last | <t>Since one objective of these tags is to be able to directly ship the | |||
dimension is considered contiguous (row-major order).</t> | ArrayBuffers underlying the Typed Arrays without re-encoding them, and these | |||
may be either in big-endian (network byte order) or in little-endian form, we | ||||
need to define tags for both variants.</t> | ||||
<t>In total, this leads to 24 variants. In the tag, we need to | ||||
express the choice between integer and floating point, the signedness | ||||
(for integers), the endianness, and one of the four length values.</t> | ||||
<t>In order to simplify implementation, a range of tags is being | ||||
allocated that allows retrieving all this information from the bits of | ||||
the tag: tag values from 64 to 87. | ||||
</t> | ||||
<t>The value is split up into 5 bit fields: 0b010, f, s, e, and ll as | ||||
detailed in <xref target="fields" format="default"/>.</t> | ||||
<t><xref target="ex-multidim"/> shows a declaration of a two-dimensional array i | <table anchor="fields" align="center"> | |||
n the | <name>Bit Fields in the Low 8 Bits of the Tag</name> | |||
C language, a representation of that in CBOR using both a | <thead> | |||
multidimensional array tag and a typed array tag.</t> | <tr> | |||
<th align="left">Field</th> | ||||
<th align="left">Use</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> | ||||
<td align="left">0b010</td> | ||||
<td align="left">the constant bits 0, 1, 0</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">f</td> | ||||
<td align="left">0 for integer, 1 for float</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">s</td> | ||||
<td align="left">0 for float or unsigned integer, 1 for signed int | ||||
eger</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">e</td> | ||||
<td align="left">0 for big endian, 1 for little endian</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">ll</td> | ||||
<td align="left">A number for the length (<xref target="lengths" f | ||||
ormat="default"/>).</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<figure title="Multi-dimensional array in C and CBOR" anchor="ex-multidim"><artw | <t>The number of bytes in each array element can then be calculated by | |||
ork><![CDATA[ | <tt>2**(f + ll)</tt> (or <tt>1 << (f + ll)</tt> in a typical | |||
programming language). (Notice that 0f and ll are the two least | ||||
significant bits, respectively, of each 4-bit nibble in the byte.)</t> | ||||
<t>In the CBOR representation, the total number of elements in the | ||||
array is not expressed explicitly but is implied from the length of | ||||
the byte string and the length of each representation. It can be | ||||
computed from the length, in bytes, of the byte string comprising the | ||||
representation of the array by inverting the previous formula: | ||||
<tt>bytelength >> (f + ll)</tt>.</t> | ||||
<t>For the uint8/sint8 values, the endianness is redundant. Only the | ||||
tag for the big-endian variant is used and assigned as such. The tag | ||||
that would signify the little-endian variant of sint8 <bcp14>MUST | ||||
NOT</bcp14> be used; its tag number is marked as reserved. As a | ||||
special case, the tag that would signify the little-endian variant of | ||||
uint8 is instead assigned to signify that the numbers in the array are | ||||
using clamped conversion from integers, as described in more detail in | ||||
<eref | ||||
target="http://www.ecma-international.org/ecma-262/6.0/#sec-touint8clamp | ||||
">Section 7.1.11</eref> | ||||
of the ES10 JavaScript specification (<tt>ToUint8Clamp</tt>) <xref | ||||
target="ECMA-ES10" format="default"/>; the assumption here is that a | ||||
program-internal representation of this array after decoding would be | ||||
marked this way for further processing providing "roundtripping" of | ||||
JavaScript-typed arrays through CBOR.</t> | ||||
<t>IEEE 754 binary floating numbers are always signed. Therefore, for | ||||
the float variants (<tt>f</tt> == 1), there is no need to distinguish | ||||
between signed and unsigned variants; the <tt>s</tt> bit is always | ||||
zero. The tag numbers where <tt>s</tt> would be one (which would have | ||||
tag values 88 to 95) remain free to use by other specifications.</t> | ||||
</section> | ||||
</section> | ||||
<section anchor="additional-array-tags" numbered="true" toc="default"> | ||||
<name>Additional Array Tags</name> | ||||
<t>This specification defines three additional array tags. The | ||||
Multi-dimensional Array tags can be combined with classical CBOR arrays | ||||
as well as with Typed Arrays in order to build multi-dimensional arrays | ||||
with constant numbers of elements in the sub-arrays. The Homogeneous | ||||
Array tag can be used as a signal by an application to identify a | ||||
classical CBOR array as a homogeneous array, even when a Typed Array | ||||
does not apply.</t> | ||||
<section anchor="multi-dimensional-array" numbered="true" toc="default"> | ||||
<name>Multi-dimensional Array</name> | ||||
<t>A multi-dimensional array is represented as a tagged array that | ||||
contains two (one-dimensional) arrays. The first array defines the | ||||
dimensions of the multi-dimensional array (in the sequence of outer | ||||
dimensions towards inner dimensions) while the second array represents | ||||
the contents of the multi-dimensional array. If the second array is | ||||
itself tagged as a Typed Array, then the element type of the | ||||
multi-dimensional array is known to be the same type as that of the | ||||
Typed Array.</t> | ||||
<t>Two tags are defined by this document: one for elements arranged in | ||||
row-major order and another for column-major order <xref | ||||
target="RowColMajor" format="default"/>.</t> | ||||
<section anchor="row-major-order" numbered="true" toc="default"> | ||||
<name>Row-Major Order</name> | ||||
<dl newline="false" spacing="normal"> | ||||
<dt>Tag:</dt> | ||||
<dd> | ||||
40</dd> | ||||
<dt>Data Item:</dt> | ||||
<dd> | ||||
Array (major type 4) of two arrays: one array (major type 4) of dimensions, | ||||
which are unsigned integers distinct from zero; and one array (any one of a | ||||
CBOR array of major type 4, a Typed Array, or a Homogeneous Array) of | ||||
elements.</dd> | ||||
</dl> | ||||
<t>Data in the second array consists of consecutive values where the | ||||
last dimension is considered contiguous (row-major order).</t> | ||||
<t><xref target="ex-multidim" format="default"/> shows a declaration | ||||
of a two-dimensional array in the C language, a representation of | ||||
that in CBOR using both a multi-dimensional array tag and a typed | ||||
array tag.</t> | ||||
<figure anchor="ex-multidim"> | ||||
<name>Multi-dimensional Array in C and CBOR</name> | ||||
<sourcecode type="C"> | ||||
uint16_t a[2][3] = { | uint16_t a[2][3] = { | |||
{2, 4, 8}, /* row 0 */ | {2, 4, 8}, /* row 0 */ | |||
{4, 16, 256}, | {4, 16, 256}, | |||
}; | }; | |||
<Tag 40> # multi-dimensional array tag | <Tag 40> # multi-dimensional array tag | |||
82 # array(2) | 82 # array(2) | |||
82 # array(2) | 82 # array(2) | |||
02 # unsigned(2) 1st Dimension | 02 # unsigned(2) 1st Dimension | |||
03 # unsigned(3) 2nd Dimension | 03 # unsigned(3) 2nd Dimension | |||
<Tag 65> # uint16 array | <Tag 65> # uint16 array | |||
4c # byte string(12) | 4c # byte string(12) | |||
0002 # unsigned(2) | 0002 # unsigned(2) | |||
0004 # unsigned(4) | 0004 # unsigned(4) | |||
0008 # unsigned(8) | 0008 # unsigned(8) | |||
0004 # unsigned(4) | 0004 # unsigned(4) | |||
0010 # unsigned(16) | 0010 # unsigned(16) | |||
0100 # unsigned(256) | 0100 # unsigned(256) | |||
]]></artwork></figure> | </sourcecode> | |||
</figure> | ||||
<t><xref target="ex-multidim1"/> shows the same two-dimensional array using the | <t><xref target="ex-multidim1" format="default"/> shows the same | |||
multidimensional array tag in conjunction with a basic CBOR array | two-dimensional array using the multi-dimensional array tag in | |||
(which, with the small numbers chosen for the example, happens to be | conjunction with a basic CBOR array (which, with the small numbers | |||
shorter).</t> | chosen for the example, happens to be shorter).</t> | |||
<figure anchor="ex-multidim1"> | ||||
<figure title="Multi-dimensional array using basic CBOR array" anchor="ex-multid | <name>Multi-dimensional Array Using Basic CBOR Array</name> | |||
im1"><artwork><![CDATA[ | <sourcecode type="CBOR"> | |||
<Tag 40> # multi-dimensional array tag | <Tag 40> # multi-dimensional array tag | |||
82 # array(2) | 82 # array(2) | |||
82 # array(2) | 82 # array(2) | |||
02 # unsigned(2) 1st Dimension | 02 # unsigned(2) 1st Dimension | |||
03 # unsigned(3) 2nd Dimension | 03 # unsigned(3) 2nd Dimension | |||
86 # array(6) | 86 # array(6) | |||
02 # unsigned(2) | 02 # unsigned(2) | |||
04 # unsigned(4) | 04 # unsigned(4) | |||
08 # unsigned(8) | 08 # unsigned(8) | |||
04 # unsigned(4) | 04 # unsigned(4) | |||
10 # unsigned(16) | 10 # unsigned(16) | |||
19 0100 # unsigned(256) | 19 0100 # unsigned(256) | |||
]]></artwork></figure> | </sourcecode> | |||
</section> | ||||
<section anchor="column-major-order" title="Column-Major order"> | ||||
<t>The multidimensional arrays specified in the previous | ||||
sub-subsection are in “row major” order, which is the preferred order | ||||
for the purposes of this specification. An analogous representation | ||||
that uses “column major” order arrays is provided in this subsection | ||||
under the tag 1040, as illustrated in <xref target="ex-multidim2"/>.</t> | ||||
<t><list style="hanging"> | ||||
<t hangText='Tag:'> | ||||
1040</t> | ||||
<t hangText='Data Item:'> | ||||
as with tag 40, except that the data in the second array consists of | ||||
consecutive values where the first dimension is considered contiguous | ||||
(column-major order).</t> | ||||
</list></t> | ||||
<figure title="Multi-dimensional array using basic CBOR | </figure> | |||
array, column major order" anchor="ex-multidim2"><artwork><![CDATA[ | </section> | |||
<Tag 1040> # multi-dimensional array tag, column major order | <section anchor="column-major-order" numbered="true" toc="default"> | |||
<name>Column-Major Order</name> | ||||
<t>The multi-dimensional arrays specified in the previous | ||||
sub-subsection are in "row major" order, which is the preferred | ||||
order for the purposes of this specification. An analogous | ||||
representation that uses "column major" order arrays is provided in | ||||
this subsection under the tag 1040, as illustrated in <xref | ||||
target="ex-multidim2" format="default"/>.</t> | ||||
<dl newline="false" spacing="normal"> | ||||
<dt>Tag:</dt> | ||||
<dd> | ||||
1040</dd> | ||||
<dt>Data Item:</dt> | ||||
<dd> | ||||
The same as tag 40, except the data in the second array consists of | ||||
consecutive values where the first dimension is considered contiguous | ||||
(column-major order).</dd> | ||||
</dl> | ||||
<figure anchor="ex-multidim2"> | ||||
<name>Multi-dimensional Array Using Basic CBOR Array, Column-Major O | ||||
rder</name> | ||||
<sourcecode type="CBOR"> | ||||
<Tag 1040> # multi-dimensional array tag, column-major order | ||||
82 # array(2) | 82 # array(2) | |||
82 # array(2) | 82 # array(2) | |||
02 # unsigned(2) 1st Dimension | 02 # unsigned(2) 1st Dimension | |||
03 # unsigned(3) 2nd Dimension | 03 # unsigned(3) 2nd Dimension | |||
86 # array(6) | 86 # array(6) | |||
02 # unsigned(2) | 02 # unsigned(2) | |||
04 # unsigned(4) | 04 # unsigned(4) | |||
04 # unsigned(4) | 04 # unsigned(4) | |||
10 # unsigned(16) | 10 # unsigned(16) | |||
08 # unsigned(8) | 08 # unsigned(8) | |||
19 0100 # unsigned(256) | 19 0100 # unsigned(256) | |||
]]></artwork></figure> | </sourcecode> | |||
</section> | ||||
</section> | ||||
<section anchor="homogeneous-array" title="Homogeneous Array"> | ||||
<t><list style="hanging"> | ||||
<t hangText='Tag:'> | ||||
41</t> | ||||
<t hangText='Data Item:'> | ||||
array (major type 4)</t> | ||||
</list></t> | ||||
<t>This tag identifies the classical CBOR array (a one-dimensional array) | ||||
tagged by it as a homogeneous array, that is, it has elements that are | ||||
all of the same application model data type. The element type of the | ||||
array is thus determined by the application model data type of the | ||||
first array element.</t> | ||||
<t>This can be used in application data models that apply specific | ||||
semantics to homogeneous arrays. Also, in certain cases, | ||||
implementations in strongly typed languages may be able to create | ||||
native homogeneous arrays of specific types instead of ordered lists | ||||
while decoding. Which CBOR data items constitute elements of the same | ||||
application type is specific to the application.</t> | ||||
<t><xref target="ex-homogeneous"/> shows an example for a homogeneous array of | ||||
booleans in C++ <xref target="Cplusplus"/> and CBOR.</t> | ||||
<figure title="Homogeneous array in C++ and CBOR" anchor="ex-homogeneous"><artwo | </figure> | |||
rk><![CDATA[ | </section> | |||
</section> | ||||
<section anchor="homogeneous-array" numbered="true" toc="default"> | ||||
<name>Homogeneous Array</name> | ||||
<dl newline="false" spacing="normal"> | ||||
<dt>Tag:</dt> | ||||
<dd> | ||||
41</dd> | ||||
<dt>Data Item:</dt> | ||||
<dd> | ||||
Array (major type 4)</dd> | ||||
</dl> | ||||
<t>This tag identifies the classical CBOR array (a one-dimensional | ||||
array) tagged by it as a homogeneous array, that is, it has elements | ||||
that are all of the same application model data type. The element | ||||
type of the array is therefore determined by the application model | ||||
data type of the first array element.</t> | ||||
<t>This can be used in application data models that apply specific | ||||
semantics to homogeneous arrays. Also, in certain cases, | ||||
implementations in strongly typed languages may be able to create | ||||
native homogeneous arrays of specific types instead of ordered lists | ||||
while decoding. Which CBOR data items constitute elements of the same | ||||
application type is specific to the application.</t> | ||||
<t><xref target="ex-homogeneous" format="default"/> shows an example | ||||
for a homogeneous array of booleans in C++ <xref target="CPlusPlus" | ||||
format="default"/> and CBOR.</t> | ||||
<figure anchor="ex-homogeneous"> | ||||
<name>Homogeneous Array in C++ and CBOR</name> | ||||
<sourcecode type="C++"> | ||||
bool boolArray[2] = { true, false }; | bool boolArray[2] = { true, false }; | |||
<Tag 41> # Homogeneous Array Tag | <Tag 41> # Homogeneous Array Tag | |||
82 #array(2) | 82 #array(2) | |||
F5 # true | F5 # true | |||
F4 # false | F4 # false | |||
]]></artwork></figure> | </sourcecode> | |||
<t><xref target="ex-homogeneous1"/> extends the example with a more complex stru | ||||
cture.</t> | ||||
<figure title="Homogeneous array in C++ and CBOR" anchor="ex-homogeneous1"><artw | </figure> | |||
ork><![CDATA[ | <t><xref target="ex-homogeneous1" format="default"/> extends the | |||
example with a more complex structure.</t> | ||||
<figure anchor="ex-homogeneous1"> | ||||
<name>Homogeneous Array in C++ and CBOR</name> | ||||
<sourcecode type="C++"> | ||||
typedef struct { | typedef struct { | |||
bool active; | bool active; | |||
int value; | int value; | |||
} foo; | } foo; | |||
foo myArray[2] = { {true, 3}, {true, -4} }; | foo myArray[2] = { {true, 3}, {true, -4} }; | |||
<Tag 41> | <Tag 41> | |||
82 # array(2) | 82 # array(2) | |||
82 # array(2) | 82 # array(2) | |||
F5 # true | F5 # true | |||
03 # 3 | 03 # 3 | |||
82 # array(2) | 82 # array(2) | |||
F5 # true | F5 # true | |||
23 # -4 | 23 # -4 | |||
]]></artwork></figure> | </sourcecode> | |||
</figure> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="discussion" title="Discussion"> | <section anchor="discussion" numbered="true" toc="default"> | |||
<name>Discussion</name> | ||||
<t>Support for both little- and big-endian representation may seem out of | <t>Support for both little- and big-endian representation may seem out | |||
character with CBOR, which is otherwise fully big endian. This | of character with CBOR, which is otherwise fully big endian. This | |||
support is in line with the intended use of the typed arrays and the | support is in line with the intended use of the typed arrays and the | |||
objective not to require conversion of each array element.</t> | objective not to require conversion of each array element.</t> | |||
<t>This specification allocates a sizable chunk out of the single-byte | ||||
<t>This specification allocates a sizable chunk out of the single-byte | tag space. This use of code point space is justified by the wide use of | |||
tag space. This use of code point space is justified by the wide use | typed arrays in data interchange.</t> | |||
of typed arrays in data interchange.</t> | <t>Providing a column-major order variant of the multi-dimensional array | |||
may seem superfluous to some and useful to others. It is cheap to | ||||
<t>Providing a column-major order variant of the multi-dimensional array | define the additional tag so that it is available when actually needed. | |||
may seem superfluous to some, and useful to others. It is cheap to | Allocating it out of a different number space makes the preference for | |||
define the additional tag so it is available when actually needed. | row-major evident.</t> | |||
Allocating it out of a different number space makes the preference for | <t>Applying a Homogeneous Array tag to a Typed Array would usually be | |||
row-major evident.</t> | redundant and is therefore not provided by the present | |||
specification.</t> | ||||
<t>Applying a Homogeneous Array tag to a Typed Array would usually be | <t/> | |||
redundant and is therefore not provided by the present specification.</t> | </section> | |||
<section anchor="cddl-typenames" numbered="true" toc="default"> | ||||
<t><vspace blankLines='999' /></t> | <name>CDDL Typenames</name> | |||
<t>For use with CDDL <xref target="RFC8610" format="default"/>, the | ||||
</section> | typenames defined in <xref target="tag-cddl" format="default"/> are | |||
<section anchor="cddl-typenames" title="CDDL typenames"> | recommended:</t> | |||
<figure anchor="tag-cddl"> | ||||
<t>For the use with CDDL <xref target="RFC8610"/>, the | <name>Recommended Typenames for CDDL</name> | |||
typenames defined in <xref target="tag-cddl"/> are recommended:</t> | <sourcecode type="CDDL"> | |||
<figure title="Recommended typenames for CDDL" anchor="tag-cddl"><artwork type=" | ||||
CDDL"><![CDATA[ | ||||
ta-uint8 = #6.64(bstr) | ta-uint8 = #6.64(bstr) | |||
ta-uint16be = #6.65(bstr) | ta-uint16be = #6.65(bstr) | |||
ta-uint32be = #6.66(bstr) | ta-uint32be = #6.66(bstr) | |||
ta-uint64be = #6.67(bstr) | ta-uint64be = #6.67(bstr) | |||
ta-uint8-clamped = #6.68(bstr) | ta-uint8-clamped = #6.68(bstr) | |||
ta-uint16le = #6.69(bstr) | ta-uint16le = #6.69(bstr) | |||
ta-uint32le = #6.70(bstr) | ta-uint32le = #6.70(bstr) | |||
ta-uint64le = #6.71(bstr) | ta-uint64le = #6.71(bstr) | |||
ta-sint8 = #6.72(bstr) | ta-sint8 = #6.72(bstr) | |||
ta-sint16be = #6.73(bstr) | ta-sint16be = #6.73(bstr) | |||
skipping to change at line 459 ¶ | skipping to change at line 479 ¶ | |||
ta-sint32le = #6.78(bstr) | ta-sint32le = #6.78(bstr) | |||
ta-sint64le = #6.79(bstr) | ta-sint64le = #6.79(bstr) | |||
ta-float16be = #6.80(bstr) | ta-float16be = #6.80(bstr) | |||
ta-float32be = #6.81(bstr) | ta-float32be = #6.81(bstr) | |||
ta-float64be = #6.82(bstr) | ta-float64be = #6.82(bstr) | |||
ta-float128be = #6.83(bstr) | ta-float128be = #6.83(bstr) | |||
ta-float16le = #6.84(bstr) | ta-float16le = #6.84(bstr) | |||
ta-float32le = #6.85(bstr) | ta-float32le = #6.85(bstr) | |||
ta-float64le = #6.86(bstr) | ta-float64le = #6.86(bstr) | |||
ta-float128le = #6.87(bstr) | ta-float128le = #6.87(bstr) | |||
homogeneous<array> = #6.41(array) | homogeneous<array> = #6.41(array) | |||
multi-dim<dim, array> = #6.40([dim, array]) | multi-dim<dim, array> = #6.40([dim, array]) | |||
multi-dim-column-major<dim, array> = #6.1040([dim, array]) | multi-dim-column-major<dim, array> = #6.1040([dim, array]) | |||
]]></artwork></figure> | </sourcecode> | |||
<t><vspace blankLines='999' /></t> | ||||
</section> | ||||
<section anchor="iana-considerations" title="IANA Considerations"> | ||||
<t>IANA has allocated the tags in <xref target="tab-tag-values"/>, with the | ||||
present document as the specification reference. (The reserved value | ||||
is reserved for a future revision of typed array tags.)</t> | ||||
<t>The allocations came out of the “specification required” space | ||||
(24..255), with the exception of 1040, which came out of the “first | ||||
come first served” space (256..).</t> | ||||
<texttable title="Values for Tags" anchor="tab-tag-values"> | ||||
<ttcol align='right'>Tag</ttcol> | ||||
<ttcol align='left'>Data Item</ttcol> | ||||
<ttcol align='left'>Semantics</ttcol> | ||||
<c>64</c> | ||||
<c>byte string</c> | ||||
<c>uint8 Typed Array</c> | ||||
<c>65</c> | ||||
<c>byte string</c> | ||||
<c>uint16, big endian, Typed Array</c> | ||||
<c>66</c> | ||||
<c>byte string</c> | ||||
<c>uint32, big endian, Typed Array</c> | ||||
<c>67</c> | ||||
<c>byte string</c> | ||||
<c>uint64, big endian, Typed Array</c> | ||||
<c>68</c> | ||||
<c>byte string</c> | ||||
<c>uint8 Typed Array, clamped arithmetic</c> | ||||
<c>69</c> | ||||
<c>byte string</c> | ||||
<c>uint16, little endian, Typed Array</c> | ||||
<c>70</c> | ||||
<c>byte string</c> | ||||
<c>uint32, little endian, Typed Array</c> | ||||
<c>71</c> | ||||
<c>byte string</c> | ||||
<c>uint64, little endian, Typed Array</c> | ||||
<c>72</c> | ||||
<c>byte string</c> | ||||
<c>sint8 Typed Array</c> | ||||
<c>73</c> | ||||
<c>byte string</c> | ||||
<c>sint16, big endian, Typed Array</c> | ||||
<c>74</c> | ||||
<c>byte string</c> | ||||
<c>sint32, big endian, Typed Array</c> | ||||
<c>75</c> | ||||
<c>byte string</c> | ||||
<c>sint64, big endian, Typed Array</c> | ||||
<c>76</c> | ||||
<c>byte string</c> | ||||
<c>(reserved)</c> | ||||
<c>77</c> | ||||
<c>byte string</c> | ||||
<c>sint16, little endian, Typed Array</c> | ||||
<c>78</c> | ||||
<c>byte string</c> | ||||
<c>sint32, little endian, Typed Array</c> | ||||
<c>79</c> | ||||
<c>byte string</c> | ||||
<c>sint64, little endian, Typed Array</c> | ||||
<c>80</c> | ||||
<c>byte string</c> | ||||
<c>IEEE 754 binary16, big endian, Typed Array</c> | ||||
<c>81</c> | ||||
<c>byte string</c> | ||||
<c>IEEE 754 binary32, big endian, Typed Array</c> | ||||
<c>82</c> | ||||
<c>byte string</c> | ||||
<c>IEEE 754 binary64, big endian, Typed Array</c> | ||||
<c>83</c> | ||||
<c>byte string</c> | ||||
<c>IEEE 754 binary128, big endian, Typed Array</c> | ||||
<c>84</c> | ||||
<c>byte string</c> | ||||
<c>IEEE 754 binary16, little endian, Typed Array</c> | ||||
<c>85</c> | ||||
<c>byte string</c> | ||||
<c>IEEE 754 binary32, little endian, Typed Array</c> | ||||
<c>86</c> | ||||
<c>byte string</c> | ||||
<c>IEEE 754 binary64, little endian, Typed Array</c> | ||||
<c>87</c> | ||||
<c>byte string</c> | ||||
<c>IEEE 754 binary128, little endian, Typed Array</c> | ||||
<c>40</c> | ||||
<c>array of two arrays*</c> | ||||
<c>Multi-dimensional Array, row-major order</c> | ||||
<c>1040</c> | ||||
<c>array of two arrays*</c> | ||||
<c>Multi-dimensional Array, column-major order</c> | ||||
<c>41</c> | ||||
<c>array</c> | ||||
<c>Homogeneous Array</c> | ||||
</texttable> | ||||
<t>*) 40 or 1040 data item: second element of outer array in data item is | ||||
native CBOR array (major type 4) or Typed Array (one of Tag 64..87)</t> | ||||
</section> | ||||
<section anchor="security-considerations" title="Security Considerations"> | ||||
<t>The security considerations of RFC 7049 apply; special attention is | </figure> | |||
drawn to the second paragraph of Section 8 of RFC 7049.</t> | <t/> | |||
</section> | ||||
<section anchor="iana-considerations" numbered="true" toc="default"> | ||||
<name>IANA Considerations</name> | ||||
<t>The Tag for homogeneous arrays makes a promise about its tagged data | <t>IANA has allocated the tags in <xref target="tab-tag-values" | |||
item that a maliciously constructed CBOR input can then choose to | format="default"/> using this document as the specification reference. | |||
ignore. As always, the decoder therefore has to ensure that it is not | (The reserved value is for a future revision of typed array tags.)</t> | |||
driven into an undefined state by array elements that do not fulfill | <t>The allocations were assigned from the "specification required" space | |||
the promise and that it does continue to fulfill its API contract in | (24..255) with the exception of 1040, which was assigned from the "first c | |||
this case as well.</t> | ome | |||
first served" space (256..).</t> | ||||
<table anchor="tab-tag-values" align="center"> | ||||
<name>Values for Tags</name> | ||||
<thead> | ||||
<tr> | ||||
<th align="right">Tag</th> | ||||
<th align="left">Data Item</th> | ||||
<th align="left">Semantics</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<t>As with all formats that are used for data interchange, an attacker | <tr> | |||
may have control over the shape of the data delivered as input to the | <td align="right">40</td> | |||
application, which therefore needs to validate that shape before it | <td align="left">array of two arrays*</td> | |||
makes it the basis of its further processing. One unique aspect that | <td align="left">Multi-dimensional Array, row-major order</td> | |||
typed arrays add to this is that an attacker might substitute a | </tr> | |||
Uint8ClampedArray for where the application expects a Uint8Array, or | <tr> | |||
vice versa, potentially leading to very different (and unexpected) | <td align="right">41</td> | |||
processing semantics of the in-memory data structures constructed. | <td align="left">array</td> | |||
Applications that could be affected by this therefore will need to be | <td align="left">Homogeneous Array</td> | |||
careful about making this distinction in their input validation.</t> | </tr> | |||
<tr> | ||||
<td align="right">64</td> | ||||
<td align="left">byte string</td> | ||||
<td align="left">uint8 Typed Array</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">65</td> | ||||
<td align="left">byte string</td> | ||||
<td align="left">uint16, big endian, Typed Array</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">66</td> | ||||
<td align="left">byte string</td> | ||||
<td align="left">uint32, big endian, Typed Array</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">67</td> | ||||
<td align="left">byte string</td> | ||||
<td align="left">uint64, big endian, Typed Array</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">68</td> | ||||
<td align="left">byte string</td> | ||||
<td align="left">uint8 Typed Array, clamped arithmetic</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">69</td> | ||||
<td align="left">byte string</td> | ||||
<td align="left">uint16, little endian, Typed Array</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">70</td> | ||||
<td align="left">byte string</td> | ||||
<td align="left">uint32, little endian, Typed Array</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">71</td> | ||||
<td align="left">byte string</td> | ||||
<td align="left">uint64, little endian, Typed Array</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">72</td> | ||||
<td align="left">byte string</td> | ||||
<td align="left">sint8 Typed Array</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">73</td> | ||||
<td align="left">byte string</td> | ||||
<td align="left">sint16, big endian, Typed Array</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">74</td> | ||||
<td align="left">byte string</td> | ||||
<td align="left">sint32, big endian, Typed Array</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">75</td> | ||||
<td align="left">byte string</td> | ||||
<td align="left">sint64, big endian, Typed Array</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">76</td> | ||||
<td align="left">byte string</td> | ||||
<td align="left">(reserved)</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">77</td> | ||||
<td align="left">byte string</td> | ||||
<td align="left">sint16, little endian, Typed Array</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">78</td> | ||||
<td align="left">byte string</td> | ||||
<td align="left">sint32, little endian, Typed Array</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">79</td> | ||||
<td align="left">byte string</td> | ||||
<td align="left">sint64, little endian, Typed Array</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">80</td> | ||||
<td align="left">byte string</td> | ||||
<td align="left">IEEE 754 binary16, big endian, Typed Array</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">81</td> | ||||
<td align="left">byte string</td> | ||||
<td align="left">IEEE 754 binary32, big endian, Typed Array</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">82</td> | ||||
<td align="left">byte string</td> | ||||
<td align="left">IEEE 754 binary64, big endian, Typed Array</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">83</td> | ||||
<td align="left">byte string</td> | ||||
<td align="left">IEEE 754 binary128, big endian, Typed Array</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">84</td> | ||||
<td align="left">byte string</td> | ||||
<td align="left">IEEE 754 binary16, little endian, Typed Array</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">85</td> | ||||
<td align="left">byte string</td> | ||||
<td align="left">IEEE 754 binary32, little endian, Typed Array</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">86</td> | ||||
<td align="left">byte string</td> | ||||
<td align="left">IEEE 754 binary64, little endian, Typed Array</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">87</td> | ||||
<td align="left">byte string</td> | ||||
<td align="left">IEEE 754 binary128, little endian, Typed Array</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">1040</td> | ||||
<td align="left">array of two arrays*</td> | ||||
<td align="left">Multi-dimensional Array, column-major order</td> | ||||
</tr> | ||||
<t><vspace blankLines='999' /></t> | </tbody> | |||
</table> | ||||
</section> | <t>*40 or 1040 data item: The second element of the outer array in the data | |||
item is a native CBOR array (major type 4) or Typed Array (one of tag | ||||
64..87)</t> | ||||
</section> | ||||
<section anchor="security-considerations" numbered="true" toc="default"> | ||||
<name>Security Considerations</name> | ||||
<t>The security considerations of <xref target="RFC7049"/> apply; | ||||
special attention is drawn to the second paragraph of <xref | ||||
target="RFC7049" sectionFormat="of" section="8"/>.</t> | ||||
<t>The tag for homogeneous arrays makes a promise about its tagged data | ||||
item, which a maliciously constructed CBOR input can then choose to | ||||
ignore. As always, the decoder therefore has to ensure that it is not | ||||
driven into an undefined state by array elements that do not fulfill the | ||||
promise, and that it does continue to fulfill its API contract in this | ||||
case as well.</t> | ||||
<t>As with all formats that are used for data interchange, an attacker | ||||
may have control over the shape of the data delivered as input to the | ||||
application, which therefore needs to validate that shape before it | ||||
makes it the basis of its further processing. One unique aspect that | ||||
typed arrays add to this is that an attacker might substitute a | ||||
Uint8ClampedArray for where the application expects a Uint8Array, or | ||||
vice versa, potentially leading to very different (and unexpected) | ||||
processing semantics of the in-memory data structures constructed. | ||||
Applications that could be affected by this will therefore need to be | ||||
careful about making this distinction in their input validation.</t> | ||||
<t/> | ||||
</section> | ||||
</middle> | </middle> | |||
<back> | <back> | |||
<references> | ||||
<name>References</name> | ||||
<references> | ||||
<name>Normative References</name> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.7049.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8610.xml"/> | ||||
<references title='Normative References'> | <reference anchor="IEEE754" target ="https://ieeexplore.ieee.org/documen | |||
t/8766229"> | ||||
<reference anchor="RFC7049" target='https://www.rfc-editor.org/info/rfc7049'> | <front> | |||
<front> | <title>IEEE Standard for Floating-Point Arithmetic</title> | |||
<title>Concise Binary Object Representation (CBOR)</title> | <author> | |||
<author initials='C.' surname='Bormann' fullname='C. Bormann'><organization /></ | <organization>IEEE</organization> | |||
author> | </author> | |||
<author initials='P.' surname='Hoffman' fullname='P. Hoffman'><organization /></ | <date/> | |||
author> | </front> | |||
<date year='2013' month='October' /> | <seriesInfo name="IEEE" value="754-2019"/> | |||
<abstract><t>The Concise Binary Object Representation (CBOR) is a data format wh | <seriesInfo name="DOI" value="10.1109/IEEESTD.2019.8766229"/> | |||
ose design goals include the possibility of extremely small code size, fairly sm | </reference> | |||
all message size, and extensibility without the need for version negotiation. T | ||||
hese design goals make it different from earlier binary serializations such as A | ||||
SN.1 and MessagePack.</t></abstract> | ||||
</front> | ||||
<seriesInfo name='RFC' value='7049'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC7049'/> | ||||
</reference> | ||||
<reference anchor="RFC8610" target='https://www.rfc-editor.org/info/rfc8610'> | ||||
<front> | ||||
<title>Concise Data Definition Language (CDDL): A Notational Convention to Expre | ||||
ss Concise Binary Object Representation (CBOR) and JSON Data Structures</title> | ||||
<author initials='H.' surname='Birkholz' fullname='H. Birkholz'><organization /> | ||||
</author> | ||||
<author initials='C.' surname='Vigano' fullname='C. Vigano'><organization /></au | ||||
thor> | ||||
<author initials='C.' surname='Bormann' fullname='C. Bormann'><organization /></ | ||||
author> | ||||
<date year='2019' month='June' /> | ||||
<abstract><t>This document proposes a notational convention to express Concise B | ||||
inary Object Representation (CBOR) data structures (RFC 7049). Its main goal is | ||||
to provide an easy and unambiguous way to express structures for protocol messa | ||||
ges and data formats that use CBOR or JSON.</t></abstract> | ||||
</front> | ||||
<seriesInfo name='RFC' value='8610'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC8610'/> | ||||
</reference> | ||||
<reference anchor="IEEE754" > | ||||
<front> | ||||
<title>IEEE Standard for Floating-Point Arithmetic</title> | ||||
<author > | ||||
<organization>IEEE</organization> | ||||
</author> | ||||
<date /> | ||||
</front> | ||||
<seriesInfo name="IEEE Std" value="754-2008"/> | ||||
</reference> | ||||
<reference anchor="TypedArrayES6" target="http://www.ecma-international.org/ecma | ||||
-262/6.0/#sec-typedarray-objects"> | ||||
<front> | ||||
<title>22.2 TypedArray Objects</title> | ||||
<author > | ||||
<organization></organization> | ||||
</author> | ||||
<date year="2015" month="June"/> | ||||
</front> | ||||
<seriesInfo name="in: ECMA-262 6th Edition," value="The ECMAScript 2015 Langua | ||||
ge Specification"/> | ||||
</reference> | ||||
<reference anchor="C" > | ||||
<front> | ||||
<title>Information technology — Programming languages — C</title> | ||||
<author > | ||||
<organization></organization> | ||||
</author> | ||||
<date year="2018"/> | ||||
</front> | ||||
<seriesInfo name="ISO/IEC" value="9899"/> | ||||
</reference> | ||||
<reference anchor="Cplusplus" > | ||||
<front> | ||||
<title>Programming languages — C++</title> | ||||
<author > | ||||
<organization></organization> | ||||
</author> | ||||
<date year="2017"/> | ||||
</front> | ||||
<seriesInfo name="ISO/IEC" value="14882"/> | ||||
</reference> | ||||
<reference anchor="RFC2119" target='https://www.rfc-editor.org/info/rfc2119'> | <reference anchor="ECMA-ES10" | |||
<front> | target="https://www.ecma-international.org/ecma-262/10.0/index.html"> | |||
<title>Key words for use in RFCs to Indicate Requirement Levels</title> | <front> | |||
<author initials='S.' surname='Bradner' fullname='S. Bradner'><organization /></ | <title>ECMAScript 2019 Language Specification</title> | |||
author> | <author> | |||
<date year='1997' month='March' /> | <organization>ECMA International | |||
<abstract><t>In many standards track documents several words are used to signify | </organization> | |||
the requirements in the specification. These words are often capitalized. This | </author> | |||
document defines these words as they should be interpreted in IETF documents. | <date year="2019" month="June"/> | |||
This document specifies an Internet Best Current Practices for the Internet Comm | </front> | |||
unity, and requests discussion and suggestions for improvements.</t></abstract> | <refcontent>Standard ECMA-262 10th Edition</refcontent> | |||
</front> | </reference> | |||
<seriesInfo name='BCP' value='14'/> | ||||
<seriesInfo name='RFC' value='2119'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC2119'/> | ||||
</reference> | ||||
<reference anchor="RFC8174" target='https://www.rfc-editor.org/info/rfc8174'> | <reference anchor="C"> | |||
<front> | <front> | |||
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title> | <title>Information technology — Programming languages — C</title> | |||
<author initials='B.' surname='Leiba' fullname='B. Leiba'><organization /></auth | <seriesInfo name="ISO/IEC" value="9899:2018, Fourth Edition"/> | |||
or> | <author> | |||
<date year='2017' month='May' /> | <organization>International Organization for Standardization | |||
<abstract><t>RFC 2119 specifies common key words that may be used in protocol s | </organization> | |||
pecifications. This document aims to reduce the ambiguity by clarifying that on | </author> | |||
ly UPPERCASE usage of the key words have the defined special meanings.</t></abs | <date month="June" year="2018"/> | |||
tract> | </front> | |||
</front> | </reference> | |||
<seriesInfo name='BCP' value='14'/> | ||||
<seriesInfo name='RFC' value='8174'/> | ||||
<seriesInfo name='DOI' value='10.17487/RFC8174'/> | ||||
</reference> | ||||
</references> | <reference anchor="CPlusPlus"> | |||
<front> | ||||
<title>Programming languages — C++</title> | ||||
<seriesInfo name="ISO/IEC" value="14882:2017, Fifth Edition"/> | ||||
<author> | ||||
<organization>International Organization for Standardization | ||||
</organization> | ||||
</author> | ||||
<date month="December" year="2017"/> | ||||
</front> | ||||
</reference> | ||||
<references title='Informative References'> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
FC.2119.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8174.xml"/> | ||||
<reference anchor="TypedArray" target="https://web.archive.org/web/2011020702441 | </references> | |||
3/http://www.khronos.org/registry/typedarray/specs/latest/"> | ||||
<front> | ||||
<title>Typed Array Specification</title> | ||||
<author initials="V." surname="Vukicevic" fullname="Vladimir Vukicevic"> | ||||
<organization>Mozilla Corporation</organization> | ||||
</author> | ||||
<author initials="K." surname="Russell" fullname="Kenneth Russell"> | ||||
<organization>Google, Inc.</organization> | ||||
</author> | ||||
<date year="2011" month="February" day="02"/> | ||||
</front> | ||||
</reference> | ||||
<reference anchor="ArrayBuffer" target="https://developer.mozilla.org/en-US/docs | ||||
/Web/JavaScript/Typed_arrays"> | ||||
<front> | ||||
<title>JavaScript typed arrays</title> | ||||
<author > | ||||
<organization>Mozilla Developer Network</organization> | ||||
</author> | ||||
<date year="2013"/> | ||||
</front> | ||||
</reference> | ||||
<reference anchor="RowColMajor" target="https://en.wikipedia.org/w/index.php?tit | ||||
le=Row-_and_column-major_order&oldid=917905325"> | ||||
<front> | ||||
<title>Row- and column-major order</title> | ||||
<author > | ||||
<organization>Wikipedia</organization> | ||||
</author> | ||||
<date year="2019" month="September" day="26"/> | ||||
</front> | ||||
</reference> | ||||
</references> | <references> | |||
<name>Informative References</name> | ||||
<section numbered="no" anchor="contributors" title="Contributors"> | <reference anchor="TypedArray" target="https://web.archive.org/web/20110 | |||
207024413/http://www.khronos.org/registry/typedarray/specs/latest/"> | ||||
<front> | ||||
<title>Typed Array Specification</title> | ||||
<author initials="V." surname="Vukicevic" fullname="Vladimir Vukicev | ||||
ic"> | ||||
<organization>Mozilla Corporation</organization> | ||||
</author> | ||||
<author initials="K." surname="Russell" fullname="Kenneth Russell"> | ||||
<organization>Google, Inc.</organization> | ||||
</author> | ||||
<date year="2011" month="February"/> | ||||
</front> | ||||
</reference> | ||||
<t>The initial draft for this specification was written by Johnathan | <reference anchor="ArrayBuffer" target="https://developer.mozilla.org/en | |||
Roatch (roatch@gmail.com). Many thanks for getting this ball rolling.</t> | -US/docs/Web/JavaScript/Typed_arrays"> | |||
<front> | ||||
<title>JavaScript typed arrays</title> | ||||
<author> | ||||
<organization>Mozilla Developer Network</organization> | ||||
</author> | ||||
<date month="June" year="2010"/> | ||||
</front> | ||||
</reference> | ||||
<t>Glenn Engel suggested the tags for multi-dimensional arrays and | <reference anchor="RowColMajor" target="https://en.wikipedia.org/w/index | |||
homogeneous arrays.</t> | .php?title=Row-_and_column-major_order&oldid=917905325"> | |||
<front> | ||||
<title>Row- and column-major order</title> | ||||
<author> | ||||
<organization>Wikipedia</organization> | ||||
</author> | ||||
<date year="2019" month="September"/> | ||||
</front> | ||||
</reference> | ||||
</section> | </references> | |||
<section numbered="no" anchor="acknowledgements" title="Acknowledgements"> | </references> | |||
<t>Jim Schaad provided helpful comments and reminded us that column-major order | <section numbered="false" anchor="acknowledgements" toc="default"> | |||
still is in use. Jeffrey Yaskin helped improve the definition of | <name>Acknowledgements</name> | |||
homogeneous arrays. | <t>Jim Schaad provided helpful comments and reminded us that | |||
IANA helped correct an error in a previous version. | column-major order still is in use. Jeffrey Yaskin helped improve the | |||
Francesca Palombini acted as a shepherd, and Alexey Melnikov as | definition of homogeneous arrays. IANA helped correct an error in a | |||
responsible area director. | previous draft version. Francesca Palombini acted as Shepherd, and | |||
Elwyn Davies as Gen-ART reviewer and IESG members Martin Vigoureux, | Alexey Melnikov as responsible Area Director. Elwyn Davies as Gen-ART | |||
Adam Roach, Roman Danyliw, and Benjamin Kaduk helped finding further | reviewer and IESG members Martin Vigoureux, Adam Roach, Roman Danyliw, | |||
improvements of the text; thanks also to the other reviewers.</t> | and Benjamin Kaduk helped in finding further improvements to the text; | |||
thanks also to the other reviewers.</t> | ||||
<!-- LocalWords: CBOR extensibility IANA uint sint IEEE endian | </section> | |||
--> | ||||
<!-- LocalWords: signedness endianness | ||||
--> | ||||
</section> | <section numbered="false" anchor="contributors" toc="default"> | |||
<name>Contributors</name> <t>The initial draft version of this | ||||
specification was written by Johnathan Roatch <roatch@gmail.com>. | ||||
Many thanks for getting this ball rolling.</t> | ||||
<t>Glenn Engel suggested the tags for multi-dimensional arrays and | ||||
homogeneous arrays.</t> | ||||
</section> | ||||
</back> | </back> | |||
<!-- ##markdown-source: | ||||
H4sIAOuSnF0AA9087XIbN5L/8RRYuupCOiRFUpREybFvZVlOnPXXWXJSe0nK | ||||
BocgOdFwhhnMSGZkbd1D3APsj3uSvTe5J7n+AGYwQ4qyclVXdafarIcDoIFu | ||||
9Dca0+l0RBZmkT6SJ0kchEbLp2Gs0pV8M/5VB5l8p5epNjrOVBYmsWyePH3z | ||||
riXP1czIaZLK89VST+RxmqqVEWo8TvUlQII+MnNdMuqiuMskCWK1gNkmqZpm | ||||
nVBn004wTtIOtXdwUCdSmTaZeCAn8HAkB73+Yad32BnsCWEyFU8+qCiJoSFL | ||||
cy1EuEzp0WSDXu+wNxAXenWVpJMj+SLOdBrrrPMM5xKByo6kySZCLMMj+VOW | ||||
BG1pkjRL9dTA02rBD0GyWKogo4cF4G1+EULl2TxJj4SUHfhPyjA2gGVXPk3S | ||||
hYpjesdonajUZDqutCTp7Ei+j8NLnZow+8//yOTTVANoef6vL6iDgTVoWNzb | ||||
xGRTFczl7m5vOOxRWxBmqyM7gF8kE5jnWWcw2t07tG/yOEuh17caJ13Ry+Wc | ||||
aPT18LAzHPQ7g/6os797OOhTo16oMDqSgRonf85+D7uwQnqfJsgIehJmSSpE | ||||
jDhksGxE/N3zk4Pe8BAGwW7x79F+vwe/J5MIfr84PT092BseEZzOkZwu6cny | ||||
FrbKM9w8lU6IK55HCcCOZ523SRhnwEFhNl/oLAxoWElwAmf/taREYEw3nYba | ||||
hPE0cT3tPLD5sJYOMMSIGpiRpioyGn4TzxLLnp7t88hMpTPcgXmWLY92dq6u | ||||
rro6WKhOSCxErK8iJNMOvR7sD3b2u72dB0YHHeJvZt+EZMb4mD+xKxsMugNv | ||||
Zite5hY8ZCOMj+TpyatjnEvuZ3N5CrsCy2g3jmTjfK6p8SxIw2WGErInX6p4 | ||||
lquZlmdLHYTTMKBVNzz8sVuntw9vTo4qmwMT006DfGc6mMdJlMxW8r/+7d/l | ||||
2zSZpWqxgI2SkZ3AUMtJFfDotg05e7Pz4vTkSB6ODpFbT5ZRbvC/ygq2TPP1 | ||||
19WJDu6aqD8cjQYC9ILDivm3JH1lZk9/VQm3lQ1J/n/oyh/yizDQl5ZpSy3w | ||||
Q6Qm4SJMN3QgDn6V/B5GkQKVmy6TtJxvbY6/dOW73BgdRbUZ/qJj0GzztVYC | ||||
/22SzCLdho0NulXq9Tu9AfxvjecNMr0ed1UazIFgxOnweweH9Aa9g95gOOzv | ||||
7njicTFPkzgx1DPVsxB02GqnFIUdA8Q0O6zKd2A+IvHTfDrV6brI4fQTfamj | ||||
ZKnT7oKpw+IWd96f7YDVMDs/wnq+V5eKmX6Hdu6DNSvejpZdqpanQofdu7WM | ||||
26Nnbl3ytc7AsFyg8kuuTpLolfo1uQUZHXevwosQpg8Zj6udMJ7oT93lfPnP | ||||
tNDHAKPzAa1ZkET5Iu4sENoHMFw6/ackmoSTx4f9g8Pe3i7YPQ89HCZhmPSH | ||||
SRpWRZFt5v7diP7oFgpC0+kA8DHsJVhAIVDNfLlX0EabINFItGRopMKlKMFC | ||||
KK/mCQCZgMzOYjlLQBMDgwdRPtEyg1mWiTHhOIzA2MlkKvWnDA1etJJmoYC7 | ||||
0eZJE/4OPD1VYerey4U2BlUeNyFVYKSOC1BXYFSSPMMpRKw1Wx4yw7DoWM+S | ||||
LCQEuoyrxUkCu+Vo+uVCXYAeymHlsKhsDlhV4WcJoDQNYy2ViPPFGJgEOt7u | ||||
/mAr9APlFRB1YM1GXoH84r/AXEJNWMurqASwyKMs7IA+wYmpCRGdJ4tkpmOd | ||||
5MYC74ISzIDyAo0WMNuEgAJa4NfoVMeBLhGjhUHTi+PXx9KKL28lIapFiQMj | ||||
OOkycyxCMPfgdYFvlSaTPKAx9u/6QYhvb8Rj7+/+XHR9bX2Nm5sWbElyGQLb | ||||
CLdissjBHIwEbQqsGxaRp4AtErTYcQVY/ZaH5DYxukrAZB01S5EPTDAHH6gr | ||||
HMdaLJFrx8rA7hidIXiCiTtoKlulkDQzsFZioXEtoVnA4oDNdazGkbZsMkFz | ||||
hmteAyZNvgTFn8FKLkHuVFzZiBXQ+p0OYOHRCqYF7l4sI41ILGh7tjCUnMPq | ||||
UhgLSnxCjAAEzuQ4AVMRxrQYUKMSjO1yHgaGfNw8Rla+vi4t5M0NsVgYCxzg | ||||
KVTjW8jKEPCkbm4qNILRQZLC9MuEKUFYLNxuGxju2YSbG0D6LEQmhTmBUypY | ||||
LsA6B/AMcg/6g1YAu6oW6PgaR9o2jky1CI0sEAecS4ax27HAt8TfnnqQpB4A | ||||
UqTjWTZfwdpjpyhQIaFXbiXc0pGWBjJ3jmoB1iNBpyXSqEvYbwggtEhg/Fyr | ||||
CU0DnAFKDFfALEAsSVA1EwVnQSAEFYUGoBbiWnJnqWUIr1SjhZ14KofYMMC5 | ||||
xToh6/pGbtA34ov1jSB1I/+H6oZ4rKZpXieZZkyQJMtl5FiO3uEyUnQsyl10 | ||||
TINgQARw9wyojRSlUU5R5BPa9mCeJAZ34VKlIfAQUER3Z902A0FmRb2UJQKl | ||||
F+I3sC/QA0g+QQRp45rIgii4oHDzmH+02PiUmzMOwbVHn8HubhtMLdhAjRzK | ||||
2sNhy+wEZKzKVkhmB2iaCTR04AxmyEoAepGk2iopRB+1PuCVgOZVBpcOWPha | ||||
VThMSVsC6kAQIhsv1lipwQnj+ljHTHk0EWPoMoEGWCJvdWNJGw2at4FrABnU | ||||
wJDgwsPmwtoKfkc+BrOfEqpC0eQdWD/8BuUOUXgSoZ3FroWhdXvZZufAdUPl | ||||
BntjTe4VaLC57V9OV6CrACkiIRCYuwYwKTCXOKdlcpBT2i5cvLlBI1f8CfHN | ||||
n+D/0YBdaPAmwMsCvF+9PztvtPlf+foNPb87/Zf3L96dPsPns++OX74sHoTt | ||||
cfbdm/cvn5VP5ciTN69enb5+RoMB6vFfG8RNovHm7fmLN6+PXzYKHikECpGD | ||||
rR5bewhbkfGuAKlBVY+Z2GjdBv3+Iaha+Sf4gc+oaGWn80T8b6LVgLey8kqU | ||||
iMo/gqjwEZVPT97+4+/9IeBZoml/jPoHQ/gBshfzbEkM7iP/BMZZCVAvWpFW | ||||
R0EL1DLMQJOTpjTz5CqWKB7ENqingElkY7zKdKMQUbQxGUrPlQxykyUL9HBA | ||||
hoCHyVUwqziJVwvSrY0kyHTW6IofSehATQCGLvMhyb9cRgr1QrtGCJiK1Wuc | ||||
WMGeqgV4obD0aZosnKCshdHyBAhxAhRosr+NbRBU94dfGdkbx3EsxuyTgUML | ||||
+jJCu1wE6eCBgfr7FGgMplAX4CwYC6kM9Fnj54c/P2xIysmx6YDVJzEqCd+r | ||||
ZpqRzagQTVlFHlli1fe+DeoVfClw/fKU9KbVkGAh0Oo6wEGkIHYIAAypNTuP | ||||
Yw9TGFVR6DZtTTL15/iJNPsQ4B7Lxpqlo1UXYNAbYKVujS2yKLKO1UQG4nNr | ||||
KTK3SFSuOs8QV1JhzhQIAkDBUl3zIgD0Wqv2j3y8BURDEfVoeSQGER6HM8mG | ||||
q8GCBXsKQWP5zqlEWAGEowgUlg7wTCZ8xwr5W07DFOxJ89XZU35s1ZdofZAZ | ||||
GRGcTolIow26DdTL20C1neUFrzUi78fLKnsausgumLUYw/cWEc11d8W6ymzz | ||||
7H6xXYD+guyH40trJp3DbQWkumbLg2B4kYqcIhSF8ar2NSTZdgbWCZ4hJhKB | ||||
Q4ThRNNjxwHKHshsgjs2XpWj0Huw2+ciDBqARqOwg+hOApKkMRhr6QuAdWK9 | ||||
uS3ZfTqVpEe+o9a6gTyfg3MlSQarQ3ETnJcKnvhR4SsVTCObOTy22mLtPXim | ||||
X1FssnTek6GexGWU4j3YG7ptmdpEslhSItnN3yz2FuhwhftvXTXYuOfO9y72 | ||||
yyLQFuwM4ShygzHuqrE9BwiGOIU4FkXqSIjP8iW1SKD6Z4moAeU+08rpgdZJ | ||||
5PwMfd1fz/Ydub70wKj196t9+7YvvOe+9MB9dwfVvgPbd3dg+9ID990fVvvu | ||||
2r7wnvvSg13DYAR9r4/kA4c3Z68aFtlLFeXaNG6E+A4Ixxv12jMJxLX+9nJ6 | ||||
BygHVvg1+cmyiaYDPVwFQUPbYmZ3O1+DF69xkgdSeCBlCZIp0bIyixlUi14F | ||||
dCkrooi1nUKnMZ7LXnDh9XVnuvSiV7B/ko8BkDUq3ixqAfZlKCzB5BG4xUQJ | ||||
Mw+XlHfxQmKwlBBWpdHKCXlFK7rYNdWdQuYxuGXfkSfFsBlm0yGZT1h1aSBk | ||||
M+ZsJqsAyh+2JBFNstWwIRBpQYiPbIRcZryK/BQlF5zb3cXUEPQCH8p6MGAT | ||||
JoT3YFj2oqDFBn4V4OBBpGjzsQ2CtRAoOoaFah0Xu41s4YRektBzmMBMgSGb | ||||
4yjWJ622jRDKiI79QLc9gEWeWrm2DM1oEFVwVZSBCaerWg4DkzOpy0S5HR5r | ||||
VEage5OAQnP2EeDnFWpgULX6ktIApJwpfC5PXwpPjpi4jI2P8MDVLo07gYjC | ||||
ukYHXYkhimz2Pg17+Kb3ae+gVfr3NERSdAm7KvMlUjGRe+R5gisVTcwRuIG9 | ||||
fu/nD9OfP5ifP+ifP0RRmz3sTIURs/v1NXcmRv8sn+MP0BHvgcnu/4e6h+YE | ||||
CBnbUJTCjLHutWW/DXrxLghTfoKeLOu02TCWfpbKdgsEU4HAQ+Chrl4czJrS | ||||
QQi6AqGULjek4n9tXANwAUE4dskDp4gsOzavr63iBV+8uw4BNTNvjVPMT4ud | ||||
dUYeWE+OHEs5qUOVfV4oPHJzVphSgTFkGslpKpJTmN+CgTGqE3C1g5zTTuOV | ||||
+Dh4+LA5lV8DJq2Psgmr/9iX33wjy3fkUoGDQj76phAFvNjm6yQLA5vz6U1J | ||||
QDFLlfLxAKaqNviWIeZvfNexXebqwjHq2OYQOrV8b6fbYg01t95X3ROl6VB9 | ||||
eZQp/H0/9ScoY5I5jaUnFLuFQUhZ2zGoZlIaeOjgpNruqd0EXI1g34vwrfYg | ||||
LNZczhe8FWMt0DvKs3XobdLzuJVtfyLr5JFTlYbGWgux7tIX+KHLGWIOtHAy | ||||
oetliA41KizggCPxEUHbNT95Uu45KInnlo/Judlhz4YVWF0do3pK9QSMHWxq | ||||
V7zB+NwyaSENnuGyNqTMkGHkYaxwYtCeB/MusTbqTGKoK8xgWdZh2FXBdCA5 | ||||
QwYLdTkQzHrhJG2K8HFBLgeMOen0gmdECqaXmLg8Jt8ew1QVUbqJcb1zIWJ9 | ||||
IewUkn3g1F+BI9kjB8HG5M7r9RnUhnu065FagO/gJ7WJbbz4rZo64iwjWwD8 | ||||
eabppOcffz/o9rv9vmx+PE/e4wpPEPLHlo185OnZ/j3OCx7xYo3JF0uKn1wm | ||||
km2mUxauCiPaEIGSCbXoTqEXWC3rDDGtx9ptFPWEQICVvU0pwAwBsCD0b9uj | ||||
JjTejTQBbgSBWS7hZwPnueVUGaBC3xnnEtBpuCU4qYRFlXiEfdJUw6rwdDOh | ||||
tL01RkUus/lx+lE+fiz7rWq6tnDJMOcKyjQ0c+cuuaiKnGhn0RxAJvxH85H8 | ||||
AKQgL+l3nSbWSQaeFW7RVzQldi+Iit6TDbH43RwPPjwvZTTChR3utUDHLFQY | ||||
UxYeX2GSF1RL4qd0mEHQ6xLH5YkEV2VgqVkl2q8cLa4lzt1RSUaBqXe+wUyC | ||||
Xhprh1drxxzHRQ+rZFFbjsnjp3xRNdMkXLahPFGhXhUvPfScyHEeRpNNpyul | ||||
Q1+6Qo7069ZHmHzccScwiMh3XqqjQMFhwCrS2DAMZsNEQu1MJRE2s485hk3p | ||||
NAawllJpC32pY8qlQrNfSTNJNBtHnAcTOrcQu5JMqOQVjjcdexPssJrIKE5j | ||||
nUyS8kBNB7or5lOuJnCrD6lVnpgjATk9xYNL9tGiGOH8pts2D3Or9qD3t5xO | ||||
vqA/BGew7x6MLLlS6QSP5+NKQwvTUJG2AGDhDpECTePc5Ax/OF17y2L4MGYN | ||||
GFqSzOhoaokliHD+ppF/R6bZOn2cg9w6GTpBFzFmyTmwrSZAldXkFoY3GSab | ||||
YGNI1lRaRtbjVT0HjIqGzkqdFOC88YwPONLkyi+AKQM7HLFeIIOlBWXlDsUy | ||||
Dx48oJIa7vWGymgEqJwjcSSHPSGeYcL1RaYX+MJutp8ybhFyeJJqD1hx9lv6 | ||||
CentertMPm5IjbFCDzI206iWC9wAioVv43rlSyoeEHrT0rljZZv5DQBZUxst | ||||
X9lYzAu+9jiJzlYNBxP4rIOcch1W8bOxIN8GHPZSiJAD3bGsnhA3h7McZ2/W | ||||
thGz2tfX+lOHmA4A3NzQUQzVFGlQUGWpikLab1ISrCpPihijvZ5iJ65UWVEN | ||||
wK4SZTOUcFPX4KJmJYfT9wLwLSz5b3/7m+D03AfQJj8Nfvlp9xf5WF4Dra8H | ||||
bdyL0U0bgradhxIQhpjxIdbFXcP7/n5bDvb2b9ri5pEQ36AVHfaeyAe36kCY | ||||
EGu4RgMbBz7g981Bi0u7XEP9vZS9gW1wPAdtsg/q75mbpOi5W++525IDwL3W | ||||
k5a7v4fLtclJ1gwWzDCwYLwopNkvFwQT9WBRlQVV2oZ+27DaNvLbRl88rt/z | ||||
2/r7fmO/V2mEbWnRzmKg7bGki7bXDVvBgCfEKchaGGtXGLpfcHSpMDfycV5E | ||||
alsYMqTz/1/zmKuxyJFQXomA3RB219pFvYStoXOeRoAVenERcelPCnNdbXDs | ||||
lksd28ylgFWnGYsoUuX/GK+O9itT7den2syGwEr1xpKfgAfrjaMvG9nvrTV6 | ||||
rNg//GJe7N/FjFaz1RgCuRLN3wnbyVdeISn5lZs5zpTHsM46uLwAeabwn+Fg | ||||
kUwbdGmgtiP13nBmmk1faNxwriOxkzsOXObpMrGnSusVMnhWC1PAupIZGpFa | ||||
1Qtpdjozb7AfUFmBQwWA2gJDrw6nQEBQ/r3IRfR7wx4FymEU5VTA5HKj3l4M | ||||
yKuwDgSOqLsQ1tHPSG7WD9cnX2B1hdxud9mfvdvwApzmupNUEW3E4A7hbkuf | ||||
wGUl8v9bgf/jMr1VV9xD4Af3FXiOVTftFJ3c1T3B9bCs9In7X+ATCxuZk3Fy | ||||
RWM2iNkUXjaVrEVo3NASNrDDVGR2WxRqvTiDSToqEVsrzxD18gw//OVqiqI2 | ||||
18aEG2IgUQRS2Tw3Rbmbi1q2QnUg/FDTTuGKPf2APbyt6sPhhGF1oQ+F0QsF | ||||
RA7ISG8sDD+OTEKZ4UCnGBdTctK0Rb0mF1pAsyXxDHOw5OGW13HsaaI7uwxS | ||||
DRpQxHTD5pZ6C7dCW/XsVTES8yF41GmCA2CXuoP1/kgGgliENSJwG2sx4HwI | ||||
rMs99rZVVLIaSHXPaOCSa5vkwgxv7WWkETsPyJ5iryGIinicJJFWTLeTr7+u | ||||
lk4V7p9VqNhZ4v+RjEF8gMEBXWJs89U0WXr//SeoJdYzO+c1Z4q0SU2NPt8r | ||||
WviKpH09LF/zTThPs/jYWd3y3RrCFsk1r9YbjI4t174b34t0Pilllbmu41NZ | ||||
um/pQ/ymXUk/xU1EMq6yeCTwSlTG1u6RuIFtSR6Br5DIxapC0Gum6C7EWvax | ||||
M7ypkFY4K7Rugfjt2uuSsBWSesbogdz1YKwD3g5hQBA6w1u2pH+vPQEFHZog | ||||
N2QF/WzpGV86KA/t+fCBrxONw1nHnkLU4mSUe6P1AjNayPTBXOH1IPCMiio6 | ||||
z6OjvO4V3vWY5hFokfLkxtbKC3v3gc82YA2xLkOSopa8LAWu5tvtQZkoSyww | ||||
zUhVz3TdQ26o29+obqtZY3dcz4nS30nHBfM8vrBI2wIDLL/q0LkdmjYq83c3 | ||||
AOyC6aYSVyJRM2L5K3iL7DBbQ3EFRhEHiPptjjB2DmBxyQXW+9YdTGB6dj2p | ||||
5R0abcvUFdsI9NfpNKLUC54lJQt7dwpWBHuG72gTiwtFQAmtll7lNenRys0B | ||||
gCLtScKlCiOiH+eFQcIV8gEeVdARGVOaKsMzR10F3uqUbg24zLelHl/AKqME | ||||
Sq7iIUmZMtKX5GIAnY7RKjKZNufEAbNqypOPLnLDSxzjeag9h+QLMIZPW/Bs | ||||
hvisCBbsRroLY9XIhG5Kgct08uzZS9pfLB4yFVEsTkeNZX7qe33dwdvUeJEG | ||||
ebwY6hceXV8DJrYbRVip5ovqsKwjUqQECxi0w0eIj+WD/e7+sIm3+lrudX8f | ||||
LDm37FVbdgdFy361ZX9YtBxUW0Yde8Bom0f1ySI38LA+mWs56NUnK1r6ZYsp | ||||
MToYVF+XGB3sVltKjA6G1ZYSowNHhUfFae4Rvd+vz1Is66A+S9Eyqs9StHjo | ||||
0wlfuehRr9ZUrnrUrzWVyx4N6gAHo6Jtd20yt47RcG2yomlvbbKiaX99sqLN | ||||
UcOzWt+Q3nnCHYb9pnXpC/30DfzXlpVOveZP5ctfvL4dX++tD8QwtTbUWVIn | ||||
Lc6EvivFpZRNMokoNmg/WXjpqtKJu0ZE3nGt5ph6YLzh13q5Sj8W1DF+0KLD | ||||
ATpKtbNzYu2mqb07VbVKhcoDTdw8p6tVzJvsBYmwrD2wXuo0R4dKYkLGmcBa | ||||
otpgAQzCsqsmtz/AoMizdI36Osi2Thr2ZltzMOx2B3t7LS+ZyIkMOyenStyt | ||||
mxpsioGwfsVlKhgDC1xi1NvttqjODB02+VkWAafvM32WZ0XY80V/WG6Fpa9Y | ||||
2+pVxHgAWWH6BuJugHt3AcTkvl8ZtgU8Ady/C+Du4H4AD+4CuD+8H8DRvWjY | ||||
dtUn/k2XKsDDL6FhpWTn9kUiwIPel9DwPgD7X0LD+wAcbANo7s+HB7t3Abwn | ||||
Hx5slRRzfz482Cop5v58eLBVUppOM7a2E88HuFVSzB/gw62SYv4AH26VFHN/ | ||||
PhxtlZRaNdNdHEQAt0pKDeBdHEQAt0pKDeBdHEQAt0pKHeXBaCtEArhVUjbQ | ||||
cNv+EMCtkrKBhncC3CopG2h4J8CtkrKJhlsgIsAh82FRw1BWVDyE17dUD7Vl | ||||
rXDAY2z0QP4AwA3htQU47HsrrP193hBvbv37bF1T3z/Euc3jr1IZyegr563+ | ||||
YEv+8Utr4Luhe/qwhdSCF4RikR09csdF3vcEuASpSBQVffEjITZv62fha/Uq | ||||
lY+7UQ0VwqTTfnD/RgfgR57pIE/x6xFbHeVzPsvinkGlJ0IsvsFBWe1HRf2s | ||||
yrDciQ+wxCRVXGTkHYwtVaroSxYIxVaoypEP0l6PPLeVxBuS1JxgoFLTBSat | ||||
1BhdVVvtO7NfFRFENFuUulBY5A0gIkaGspXuEwxhvMy9ann63ICmCrtZnKTo | ||||
xx+7YksuDaacNx8y2jwDX3IHSTF5agviObMSJxmQIbzkqzAJ34RymQGT4V1O | ||||
LO7zk132uGCSUPZimkfTMIoEZy4svvGkmIOq9uh4MM4pxW8HEDmO376wXxkI | ||||
Mv4yCJ1Z8CVnLIDEBIw93MTjFr7U4l2RpYMN3IV6hqtNBYlZpoILnVKaimpJ | ||||
abIkkvgpC971uSrr0QjIREf4UT2uAmTSM4f4JwEuDvEyOVrzjSQQvBC/l8SL | ||||
ZPhj7hNmglkj5HNZPEsjbkVarFcPw8a+ibGQK/wtR4rwZySwELGavZxMeIWh | ||||
KcucS+TlIpzNMzqBtsccSpRV1u7LcVP+lIQ97PXPPPQnnBfZmUYV9V7iEu9W | ||||
YFpUteUyIbGijBfezaICkwRbV14Wrsl1wwwRnChR4irL4ya7GSFoTL1IEABu | ||||
S5HYN76AdCk/50p9ZflpCTpUgnmDzCsALHfrCjnQFTrjxQdgJkxTsqTaL0dw | ||||
0aAtmiOVQRIYppYt7E772Tn8mtEYyC7ECXJaOM6zJK2pLtDSnI7Uk8eNOHF3 | ||||
ZsI4RALyNyxtxcxaSvkK5QJUHn4NErD6PpmDygWGF+8SlQE/NlP6988z/BZj | ||||
F8JhvN7zSsVUwBpfsNKf6Swr8BujXIFIRHxb99tIx7E8BQmKgGVAWZlKCuKW | ||||
T0cVaXSx6Ysu4jjAcs5IT2a2DnCt6HoDTb4PF/IMhFlNygzpXEdL3Cb3FU3S | ||||
NKlehDa97xhg7SNmsIeociiHAjoDiPK9nk5TvZJ/VQY2myBjLnSBc2mrRae0 | ||||
J/xBmY2fqqFkDY+kzxIFJHk6TfnOoypvt9jjg654nuLtURMo+VZFVAkeYj67 | ||||
KKie6yVw6YST58eR/gRrfKWjOLxILvECHX/7yISYDAemVfa6Z5J2xWl0tYrl | ||||
M3WJ5+IA7Vsdd47fnVPiRl/ZS44vTs++lQvN5VmvFF7EkT+EswQkK//UFscT | ||||
tZDATFjT9S4BkQR48SoKr3hBT3X8qwJyy7+oSX7hcJ+G/DEmq8KEpWLlLDXT | ||||
n7JHjgvpq0bW7nLNvlsjsgtdPpQvk0BFP+JnRI4k28HqZ9KI+HQjmm5Dk3/I | ||||
niB/imQDFO8yZ3lTiHv/NxPVv2mzVgAA | ||||
</rfc> | </rfc> | |||
End of changes. 53 change blocks. | ||||
842 lines changed or deleted | 677 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |