rfc8949xml2.original.xml | rfc8949.xml | |||
---|---|---|---|---|
<?xml version='1.0' encoding='utf-8'?> | <?xml version="1.0" encoding="UTF-8"?> | |||
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?> | ||||
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.3.12 --> | ||||
<!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
<?rfc toc="yes"?> | ||||
<?rfc tocdepth="4"?> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" | |||
<?rfc sortrefs="yes"?> | ipr="trust200902" | |||
<?rfc symrefs="yes"?> | docName="draft-ietf-cbor-7049bis-16" | |||
<?rfc compact="no"?> | number="8949" | |||
<?rfc subcompact="no"?> | submissionType="IETF" | |||
<?rfc rfcedstyle="yes"?> | category="std" | |||
<?rfc comments="yes"?> | consensus="yes" | |||
<?rfc text-list-symbols="*-o+"?> | obsoletes="7049" | |||
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft | updates="" | |||
-ietf-cbor-7049bis-16" category="std" consensus="yes" obsoletes="7049" updates=" | xml:lang="en" | |||
" submissionType="IETF" xml:lang="en" tocInclude="true" tocDepth="4" sortRefs="t | tocInclude="true" | |||
rue" symRefs="true" version="3"> | tocDepth="4" | |||
sortRefs="true" | ||||
symRefs="true" | ||||
version="3"> | ||||
<!-- xml2rfc v2v3 conversion 3.2.1 --> | <!-- xml2rfc v2v3 conversion 3.2.1 --> | |||
<front> | <front> | |||
<title abbrev="CBOR">Concise Binary Object Representation (CBOR)</title> | <title abbrev="CBOR">Concise Binary Object Representation (CBOR)</title> | |||
<seriesInfo name="Internet-Draft" value="draft-ietf-cbor-7049bis-16"/> | <seriesInfo name="RFC" value="8949"/> | |||
<seriesInfo name="STD" value="94"/> | ||||
<author initials="C." surname="Bormann" fullname="Carsten Bormann"> | <author initials="C." surname="Bormann" fullname="Carsten Bormann"> | |||
<organization>Universitaet Bremen TZI</organization> | <organization>Universitรคt Bremen TZI</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>Postfach 330440</street> | <street>Postfach 330440</street> | |||
<city>D-28359 Bremen</city> | <city>Bremen</city> | |||
<country>Germany</country> | <code>D-28359</code> | |||
<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> | |||
<author initials="P." surname="Hoffman" fullname="Paul Hoffman"> | <author initials="P." surname="Hoffman" fullname="Paul Hoffman"> | |||
<organization>ICANN</organization> | <organization>ICANN</organization> | |||
<address> | <address> | |||
<email>paul.hoffman@icann.org</email> | <email>paul.hoffman@icann.org</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<date year="2020" month="September" day="30"/> | <date year="2020" month="December"/> | |||
<area>Internet</area> | <area>Internet</area> | |||
<keyword>parser, decoder, encoder, binary format, data interchange format, J | <keyword>parser</keyword> | |||
SON</keyword> | <keyword>decoder</keyword> | |||
<keyword>encoder</keyword> | ||||
<keyword>binary format</keyword> | ||||
<keyword>data interchange format</keyword> | ||||
<keyword>JSON</keyword> | ||||
<abstract> | <abstract> | |||
<t>The Concise Binary Object Representation (CBOR) is a data format whose design | <t>The Concise Binary Object Representation (CBOR) is a data format whose design | |||
goals include the | goals include the | |||
possibility of extremely small code size, fairly small message size, and | possibility of extremely small code size, fairly small message size, and | |||
extensibility without the | extensibility without the | |||
need for version negotiation. These design goals make it different from earlier | need for version negotiation. These design goals make it different from earlier | |||
binary | binary | |||
serializations such as ASN.1 and MessagePack.</t> | serializations such as ASN.1 and MessagePack.</t> | |||
<t>This document is a revised edition of RFC 7049, with editorial improvem | <t> This document obsoletes RFC 7049, providing editorial improvements, ne | |||
ents, | w | |||
added detail, and fixed errata. | details, and errata fixes while keeping full compatibility with | |||
This revision formally obsoletes RFC 7049, while keeping full compatibility | the interchange format of RFC 7049. It does not create a new version | |||
of the interchange format from RFC 7049. | of the format. </t> | |||
It does not create a new version of the format.</t> | ||||
</abstract> | </abstract> | |||
</front> | </front> | |||
<middle> | <middle> | |||
<section anchor="introduction" toc="default"> | <section anchor="introduction" toc="default"> | |||
<name>Introduction</name> | <name>Introduction</name> | |||
<t>There are hundreds of standardized formats for binary representation | <t>There are hundreds of standardized formats for binary representation | |||
of structured data (also known as binary serialization formats). Of | of structured data (also known as binary serialization formats). Of | |||
those, some are for specific domains of information, while others are | those, some are for specific domains of information, while others are | |||
generalized for arbitrary data. In the IETF, probably the best-known | generalized for arbitrary data. In the IETF, probably the best-known | |||
formats in the latter category are ASN.1's BER and DER <xref target="ASN.1" form at="default"/>.</t> | formats in the latter category are ASN.1's BER and DER <xref target="ASN.1" form at="default"/>.</t> | |||
skipping to change at line 74 ¶ | skipping to change at line 86 ¶ | |||
not well met by current formats. The underlying data model is an | not well met by current formats. The underlying data model is an | |||
extended version of the JSON data model <xref target="RFC8259" format="default"/ >. It is important | extended version of the JSON data model <xref target="RFC8259" format="default"/ >. It is important | |||
to note that this is not a proposal that the grammar in RFC 8259 be | to note that this is not a proposal that the grammar in RFC 8259 be | |||
extended in general, since doing so would cause a significant | extended in general, since doing so would cause a significant | |||
backwards incompatibility with already deployed JSON | backwards incompatibility with already deployed JSON | |||
documents. Instead, this document simply defines its own data model | documents. Instead, this document simply defines its own data model | |||
that starts from JSON.</t> | that starts from JSON.</t> | |||
<t><xref target="comparison-app" format="default"/> lists some existing bi nary formats and discusses | <t><xref target="comparison-app" format="default"/> lists some existing bi nary formats and discusses | |||
how well they do or do not fit the design objectives of the Concise | how well they do or do not fit the design objectives of the Concise | |||
Binary Object Representation (CBOR).</t> | Binary Object Representation (CBOR).</t> | |||
<t>This document is a revised edition of <xref target="RFC7049" format="de | <t> This document obsoletes <xref target="RFC7049" format="default"/>, pro | |||
fault"/>, with editorial improvements, | viding editorial improvements, new | |||
added detail, and fixed errata. | details, and errata fixes while keeping full compatibility with | |||
This revision formally obsoletes RFC 7049, while keeping full compatibility | the interchange format of RFC 7049. It does not create a new version | |||
of the interchange format from RFC 7049. | of the format. </t> | |||
It does not create a new version of the format.</t> | ||||
<section anchor="objectives" toc="default"> | <section anchor="objectives" toc="default"> | |||
<name>Objectives</name> | <name>Objectives</name> | |||
<t>The objectives of CBOR, roughly in decreasing order of importance, | <t>The objectives of CBOR, roughly in decreasing order of importance, | |||
are:</t> | are:</t> | |||
<ol spacing="normal" type="1"><li> | <ol spacing="normal" type="1"><li> | |||
<t>The representation must be able to unambiguously encode most comm on | <t>The representation must be able to unambiguously encode most comm on | |||
data formats used in Internet standards. </t> | data formats used in Internet standards. </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>It must represent a reasonable set of basic data types and | <li>It must represent a reasonable set of basic data types and | |||
structures using binary encoding. "Reasonable" here is largely | structures using binary encoding. "Reasonable" here is largely | |||
skipping to change at line 121 ¶ | skipping to change at line 132 ¶ | |||
<t>Data must be able to be decoded without a schema description. </ t> | <t>Data must be able to be decoded without a schema description. </ t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>Similar to JSON, encoded data should be self-describing so tha t | <li>Similar to JSON, encoded data should be self-describing so tha t | |||
a generic decoder can be written.</li> | a generic decoder can be written.</li> | |||
</ul> | </ul> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>The serialization must be reasonably compact, but data compactnes s | <t>The serialization must be reasonably compact, but data compactnes s | |||
is secondary to code compactness for the encoder and decoder. </t> | is secondary to code compactness for the encoder and decoder. </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>"Reasonable" here is bounded by JSON as an upper bound in size | <li>"Reasonable" here is bounded by JSON as an upper bound in | |||
, | size and by the implementation complexity, which limits the | |||
and by the implementation complexity limiting how much effort | amount of effort that can go into achieving that compactness. | |||
can go into achieving that compactness. | Using either general compression schemes or extensive | |||
Using either general compression schemes or extensive | bit-fiddling violates the complexity goals.</li> | |||
bit-fiddling violates the complexity goals.</li> | ||||
</ul> | </ul> | |||
</li> | </li> | |||
<li> | <li> | |||
<t>The format must be applicable to both constrained nodes and | <t>The format must be applicable to both constrained nodes and | |||
high-volume applications. </t> | high-volume applications. </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>This means it must be reasonably frugal in CPU usage for both | <li>This means it must be reasonably frugal in CPU usage for both | |||
encoding and decoding. This is relevant both for constrained | encoding and decoding. This is relevant both for constrained | |||
nodes and for potential usage in applications with a very high | nodes and for potential usage in applications with a very high | |||
volume of data.</li> | volume of data.</li> | |||
skipping to change at line 164 ¶ | skipping to change at line 175 ¶ | |||
fallback so that a decoder that does not understand an extension | fallback so that a decoder that does not understand an extension | |||
can still decode the message.</li> | can still decode the message.</li> | |||
<li>The format must be able to be extended in the future by later | <li>The format must be able to be extended in the future by later | |||
IETF standards.</li> | IETF standards.</li> | |||
</ul> | </ul> | |||
</li> | </li> | |||
</ol> | </ol> | |||
</section> | </section> | |||
<section anchor="terminology" toc="default"> | <section anchor="terminology" toc="default"> | |||
<name>Terminology</name> | <name>Terminology</name> | |||
<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL | <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | |||
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", | "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
"MAY", and "OPTIONAL" in this document are to be interpreted as | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", | |||
described in BCP 14 <xref target="RFC2119" format="default"/> <xref target= | "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
"RFC8174" format="default"/> when, and only when, they | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are | |||
appear in all capitals, as shown here.</t> | to be interpreted as | |||
described in BCP 14 <xref target="RFC2119" format="default"/> <xref | ||||
target="RFC8174" format="default"/> | ||||
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 | <t>The term "byte" is used in its now-customary sense as a synonym for | |||
"octet". All multi-byte values are encoded in network byte order (that | "octet". All multi-byte values are encoded in network byte order (that | |||
is, most significant byte first, also known as "big-endian").</t> | is, most significant byte first, also known as "big-endian").</t> | |||
<t>This specification makes use of the following terminology:</t> | <t>This specification makes use of the following terminology:</t> | |||
<dl newline="false" spacing="normal"> | <dl newline="false" spacing="normal"> | |||
<dt>Data item:</dt> | <dt>Data item:</dt> | |||
<dd> | <dd> | |||
A single piece of CBOR data. The structure of a data item may | A single piece of CBOR data. The structure of a data item may | |||
contain zero, one, or more nested data items. The term is used both | contain zero, one, or more nested data items. The term is used both | |||
for the data item in representation format and for the abstract idea | for the data item in representation format and for the abstract idea | |||
that can be derived from that by a decoder; the former can be | that can be derived from that by a decoder; the former can be | |||
addressed specifically by using "encoded data item".</dd> | addressed specifically by using the term "encoded data item".</dd> | |||
<dt>Decoder:</dt> | <dt>Decoder:</dt> | |||
<dd> | <dd> | |||
A process that decodes a well-formed encoded CBOR data item and makes it avail able to an | A process that decodes a well-formed encoded CBOR data item and makes it avail able to an | |||
application. Formally speaking, a decoder contains a parser to | application. Formally speaking, a decoder contains a parser to | |||
break up the input using the syntax rules of CBOR, as well as a | break up the input using the syntax rules of CBOR, as well as a | |||
semantic processor to prepare the data in a form suitable to the | semantic processor to prepare the data in a form suitable to the | |||
application.</dd> | application.</dd> | |||
<dt>Encoder:</dt> | <dt>Encoder:</dt> | |||
<dd> | <dd> | |||
A process that generates the (well-formed) representation format of a CBOR dat a | A process that generates the (well-formed) representation format of a CBOR dat a | |||
skipping to change at line 227 ¶ | skipping to change at line 241 ¶ | |||
<dt>Stream decoder:</dt> | <dt>Stream decoder:</dt> | |||
<dd> | <dd> | |||
A process that decodes a data stream and makes each of the data | A process that decodes a data stream and makes each of the data | |||
items in the sequence available to an application as they are | items in the sequence available to an application as they are | |||
received.</dd> | received.</dd> | |||
</dl> | </dl> | |||
<t>Terms and concepts for floating-point values such as Infinity, NaN | <t>Terms and concepts for floating-point values such as Infinity, NaN | |||
(not a number), negative zero, and subnormal are defined in <xref target="IEEE75 4" format="default"/>.</t> | (not a number), negative zero, and subnormal are defined in <xref target="IEEE75 4" format="default"/>.</t> | |||
<t>Where bit arithmetic or data types are explained, this document uses | <t>Where bit arithmetic or data types are explained, this document uses | |||
the notation familiar from the programming language C <xref target="C" format="d efault"/>, except that | the notation familiar from the programming language C <xref target="C" format="d efault"/>, except that | |||
"**" denotes exponentiation and ".." denotes a range that includes both | ".." denotes a range that includes both ends given, and superscript | |||
ends given. Examples and pseudocode | notation denotes exponentiation. For example, 2 to the power of 64 is | |||
notated: 2<sup>64</sup>. | ||||
In the plain-text version of this specification, superscript notation | ||||
is not available and therefore is rendered by a surrogate notation. | ||||
That notation is not optimized for this RFC; it is unfortunately | ||||
ambiguous with C's exclusive-or (which is only used in the appendices, | ||||
which in turn do not use exponentiation) and requires circumspection | ||||
from the reader of the plain-text version. | ||||
</t> | ||||
<t>Examples and pseudocode | ||||
assume that signed integers use two's complement representation and | assume that signed integers use two's complement representation and | |||
that right shifts of signed integers perform sign extension; these | that right shifts of signed integers perform sign extension; these | |||
assumptions are also specified in Sections 6.8.2 and 7.6.7 of the 2020 | assumptions are also specified in Sections 6.8.1 (basic.fundamental) | |||
version of C++, successor of <xref target="Cplusplus17" format="default"/>.</t> | and 7.6.7 (expr.shift) of the 2020 version of C++ (currently available | |||
as a final draft, <xref target="Cplusplus20" format="default"/>).</t> | ||||
<t>Similar to the "0x" notation for | <t>Similar to the "0x" notation for | |||
hexadecimal numbers, numbers in binary notation are prefixed with | hexadecimal numbers, numbers in binary notation are prefixed with | |||
"0b". Underscores can be added to a number solely for | "0b". Underscores can be added to a number solely for | |||
readability, so 0b00100001 (0x21) might be written 0b001_00001 to | readability, so 0b00100001 (0x21) might be written 0b001_00001 to | |||
emphasize the desired interpretation of the bits in the byte; in this | emphasize the desired interpretation of the bits in the byte; in this | |||
case, it is split into three bits and five bits. Encoded CBOR data | case, it is split into three bits and five bits. Encoded CBOR data | |||
items are sometimes given in the "0x" or "0b" notation; these values | items are sometimes given in the "0x" or "0b" notation; these values | |||
are first interpreted as numbers as in C and are then interpreted as | are first interpreted as numbers as in C and are then interpreted as | |||
byte strings in network byte order, including any leading zero bytes | byte strings in network byte order, including any leading zero bytes | |||
expressed in the notation.</t> | expressed in the notation.</t> | |||
<t>Words may be <em>italicized</em> for emphasis; in the plain text form | <t>Words may be <em>italicized</em> for emphasis; in the plain text | |||
of this | form of this specification, this is indicated by surrounding words | |||
specification this is indicated by surrounding words with underscore | with underscore characters. Verbatim text (e.g., names from a | |||
characters. Verbatim text (e.g., names from a programming language) | programming language) may be set in <tt>monospace</tt> type; in plain | |||
may be set in <tt>monospace</tt> type; in plain text this is approximated | text, this is approximated somewhat ambiguously by surrounding the | |||
somewhat ambiguously by surrounding the text in double quotes (which | text in double quotes (which also retain their usual meaning).</t> | |||
also retain their usual meaning).</t> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="cbor-data-models" toc="default"> | <section anchor="cbor-data-models" toc="default"> | |||
<name>CBOR Data Models</name> | <name>CBOR Data Models</name> | |||
<t>CBOR is explicit about its generic data model, which defines the set | <t>CBOR is explicit about its generic data model, which defines the set | |||
of all data items that can be represented in CBOR. Its basic generic | of all data items that can be represented in CBOR. Its basic generic | |||
data model is extensible by the registration of "simple values" and | data model is extensible by the registration of "simple values" and | |||
tags. Applications can then subset the resulting extended generic | tags. Applications can then create a subset of the resulting extended generic | |||
data model to build their specific data models.</t> | data model to build their specific data models.</t> | |||
<t>Within environments that can represent the data items in the generic | <t>Within environments that can represent the data items in the generic | |||
data model, generic CBOR encoders and decoders can be implemented | data model, generic CBOR encoders and decoders can be implemented | |||
(which usually involves defining additional implementation data types | (which usually involves defining additional implementation data types | |||
for those data items that do not already have a natural representation | for those data items that do not already have a natural representation | |||
in the environment). The ability to provide generic encoders and | in the environment). The ability to provide generic encoders and | |||
decoders is an explicit design goal of CBOR; however many applications | decoders is an explicit design goal of CBOR; however, many applications | |||
will provide their own application-specific encoders and/or decoders.</t> | will provide their own application-specific encoders and/or decoders.</t> | |||
<t>In the basic (un-extended) generic data model defined in <xref target=" | <t>In the basic (unextended) generic data model defined in | |||
encoding" format="default"/>, a data item is one of:</t> | <xref target="encoding" format="default"/>, a data item is one of | |||
the following:</t> | ||||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>an integer in the range -2**64..2**64-1 inclusive</li> | <li>an integer in the range -2<sup>64</sup>..2<sup>64</sup>-1 inclusive< /li> | |||
<li>a simple value, identified by a number | <li>a simple value, identified by a number | |||
between 0 and 255, but distinct from that number itself</li> | between 0 and 255, but distinct from that number itself</li> | |||
<li>a floating-point value, distinct from an integer, out of the set | <li>a floating-point value, distinct from an integer, out of the set | |||
representable by IEEE 754 binary64 (including non-finites) <xref target="IEEE754 " format="default"/></li> | representable by IEEE 754 binary64 (including non-finites) <xref target="IEEE754 " format="default"/></li> | |||
<li>a sequence of zero or more bytes ("byte string")</li> | <li>a sequence of zero or more bytes ("byte string")</li> | |||
<li>a sequence of zero or more Unicode code points ("text string")</li> | <li>a sequence of zero or more Unicode code points ("text string")</li> | |||
<li>a sequence of zero or more data items ("array")</li> | <li>a sequence of zero or more data items ("array")</li> | |||
<li>a mapping (mathematical function) from zero or more data items | <li>a mapping (mathematical function) from zero or more data items | |||
("keys") each to a data item ("values"), ("map")</li> | ("keys") each to a data item ("values"), ("map")</li> | |||
<li>a tagged data item ("tag"), comprising a tag number (an integer in | <li>a tagged data item ("tag"), comprising a tag number (an integer in | |||
the range 0..2**64-1) and the tag content (a data item)</li> | the range 0..2<sup>64</sup>-1) and the tag content (a data item)</li> | |||
</ul> | </ul> | |||
<t>Note that integer and floating-point values are distinct in this | <t>Note that integer and floating-point values are distinct in this | |||
model, even if they have the same numeric value.</t> | model, even if they have the same numeric value.</t> | |||
<t>Also note that serialization variants are not visible at the | ||||
generic data model level, including the number of bytes of the | <t>Also note that serialization variants are not visible at the generic | |||
encoded floating-point value or the choice of one of the ways in which an | data model level. This deliberate absence of visibility includes the number of | |||
integer, the length of a text or byte string, the number of elements | bytes of the encoded | |||
in an array or pairs in a map, or a tag number, (collectively "the | floating-point value. It also includes the choice of encoding for an "argument" | |||
argument", see <xref target="encoding" format="default"/>) can be encoded.</t> | (see | |||
<xref target="encoding"/>) such as the encoding for an | ||||
integer, the encoding for the length of a text or byte string, the encoding for | ||||
the number of elements | ||||
in an array or pairs in a map, or the encoding for a tag number.</t> | ||||
<section anchor="extended-generic-data-models" toc="default"> | <section anchor="extended-generic-data-models" toc="default"> | |||
<name>Extended Generic Data Models</name> | <name>Extended Generic Data Models</name> | |||
<t>This basic generic data model comes pre-extended by the registration | <t>This basic generic data model has been extended in this document by t | |||
of a number of simple values and tag numbers right in this document, such as:</t | he registration | |||
> | of a number of simple values and tag numbers, such as:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li> | <li> | |||
<tt>false</tt>, <tt>true</tt>, <tt>null</tt>, and <tt>undefined</tt> | <tt>false</tt>, <tt>true</tt>, <tt>null</tt>, and <tt>undefined</tt> | |||
(simple values identified by 20..23)</li> | (simple values identified by 20..23, <xref target="fpnocont" format="default"/>) | |||
</li> | ||||
<li>integer and floating-point values with a larger range and precisio n | <li>integer and floating-point values with a larger range and precisio n | |||
than the above (tag numbers 2 to 5)</li> | than the above (tag numbers 2 to 5, <xref target="tags" format="default"/>)</li> | |||
<li>application data types such as a point in time or an RFC 3339 | <li>application data types such as a point in time or | |||
date/time string (tag numbers 1, 0)</li> | date/time string defined in RFC 3339 (tag numbers 1 and 0, <xref target="tags" f | |||
ormat="default"/>)</li> | ||||
</ul> | </ul> | |||
<t>Further elements of the extended generic data model can be (and have | <t>Additional elements of the extended generic data model can be (and ha ve | |||
been) defined via the IANA registries created for CBOR. Even if such | been) defined via the IANA registries created for CBOR. Even if such | |||
an extension is unknown to a generic encoder or decoder, data items | an extension is unknown to a generic encoder or decoder, data items | |||
using that extension can be passed to or from the application by | using that extension can be passed to or from the application by | |||
representing them at the interface to the application within the basic | representing them at the application interface within the basic | |||
generic data model, i.e., as generic simple values or | generic data model, i.e., as generic simple values or | |||
generic tags.</t> | generic tags.</t> | |||
<t>In other words, the basic generic data model is stable as defined in | <t>In other words, the basic generic data model is stable as defined in | |||
this document, while the extended generic data model expands by the | this document, while the extended generic data model expands by the | |||
registration of new simple values or tag numbers, but never shrinks.</t> | registration of new simple values or tag numbers, but never shrinks.</t> | |||
<t>While there is a strong expectation that generic encoders and decoder s | <t>While there is a strong expectation that generic encoders and decoder s | |||
can represent <tt>false</tt>, <tt>true</tt>, and <tt>null</tt> (<tt>undefined</t t> is intentionally | can represent <tt>false</tt>, <tt>true</tt>, and <tt>null</tt> (<tt>undefined</t t> is intentionally | |||
omitted) in the form appropriate for their programming environment, | omitted) in the form appropriate for their programming environment, | |||
implementation of the data model extensions created by tags is truly | the implementation of the data model extensions created by tags is truly | |||
optional and a matter of implementation quality.</t> | optional and a matter of implementation quality.</t> | |||
</section> | </section> | |||
<section anchor="specific-data-models" toc="default"> | <section anchor="specific-data-models" toc="default"> | |||
<name>Specific Data Models</name> | <name>Specific Data Models</name> | |||
<t>The specific data model for a CBOR-based protocol usually subsets the | <t>The specific data model for a CBOR-based protocol usually takes a sub set of the | |||
extended generic data model and assigns application semantics to the | extended generic data model and assigns application semantics to the | |||
data items within this subset and its components. When documenting | data items within this subset and its components. | |||
such specific data models, where it is desired to specify the types of | When documenting such specific data models and specifying the types | |||
data items, it is preferred to identify the types by the names they have in | of data items, it is preferable to identify the types by their | |||
the generic data model ("negative integer", "array") instead of by | generic data model names ("negative integer", "array") instead of | |||
referring to aspects of their CBOR representation ("major type 1", | referring to aspects of their CBOR representation ("major type 1", | |||
"major type 4").</t> | "major type 4").</t> | |||
<t>Specific data models can also specify what values (including values o | <t> Specific data models can also specify value equivalency (including | |||
f different types) | values of different types) for the purposes of map keys and encoder freedom. | |||
are equivalent for the purposes of map keys and encoder freedom. For | For | |||
example, in the generic data model, a valid map MAY have both <tt>0</tt> and | example, in the generic data model, a valid map <bcp14>MAY</bcp14> have both <tt | |||
<tt>0.0</tt> as keys, and an encoder MUST NOT encode <tt>0.0</tt> as an integer | >0</tt> and | |||
<tt>0.0</tt> as keys, and an encoder <bcp14>MUST NOT</bcp14> encode <tt>0.0</tt> | ||||
as an integer | ||||
(major type 0, <xref target="majortypes" format="default"/>). However, if a spe cific data model | (major type 0, <xref target="majortypes" format="default"/>). However, if a spe cific data model | |||
declares that floating-point and integer representations of integral | declares that floating-point and integer representations of integral | |||
values are equivalent, using both map keys <tt>0</tt> and <tt>0.0</tt> in a sing le | values are equivalent, using both map keys <tt>0</tt> and <tt>0.0</tt> in a sing le | |||
map would be considered | map would be considered | |||
duplicates, even while encoded as different major types, and so invalid; and an encoder could encode integral-valued | duplicates, even while encoded as different major types, and so invalid; and an encoder could encode integral-valued | |||
floats as integers or vice versa, perhaps to save encoded bytes.</t> | floats as integers or vice versa, perhaps to save encoded bytes.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="encoding" toc="default"> | <section anchor="encoding" toc="default"> | |||
<name>Specification of the CBOR Encoding</name> | <name>Specification of the CBOR Encoding</name> | |||
<t>A CBOR data item (<xref target="cbor-data-models" format="default"/>) i s encoded to or decoded from | <t>A CBOR data item (<xref target="cbor-data-models" format="default"/>) i s encoded to or decoded from | |||
a byte string carrying a well-formed encoded data item as described in this sect ion. The encoding is | a byte string carrying a well-formed encoded data item as described in this sect ion. The encoding is | |||
summarized in <xref target="jumptable" format="default"/> in <xref target="jump- | summarized in <xref target="jumptable" format="default"/> in <xref target="jump- | |||
table" format="default"/>, indexed by the initial byte. An encoder MUST produce | table" format="default"/>, indexed by the initial byte. An encoder <bcp14>MUST< | |||
only well-formed | /bcp14> produce only well-formed | |||
encoded data items. A decoder MUST NOT return a decoded data item when it | encoded data items. A decoder <bcp14>MUST NOT</bcp14> return a decoded data ite | |||
m when it | ||||
encounters input that is not a well-formed encoded CBOR data item (this does | encounters input that is not a well-formed encoded CBOR data item (this does | |||
not detract from the usefulness of diagnostic and recovery tools that | not detract from the usefulness of diagnostic and recovery tools that | |||
might make available some information from a damaged encoded CBOR data item).</t > | might make available some information from a damaged encoded CBOR data item).</t > | |||
<t>The initial byte of each encoded data item contains both information | <t>The initial byte of each encoded data item contains both information | |||
about the major type (the high-order 3 bits, described in | about the major type (the high-order 3 bits, described in | |||
<xref target="majortypes" format="default"/>) and additional information (the lo w-order 5 bits). | <xref target="majortypes" format="default"/>) and additional information (the lo w-order 5 bits). | |||
With a few exceptions, the additional information's value | With a few exceptions, the additional information's value | |||
describes how to load an unsigned integer "argument":</t> | describes how to load an unsigned integer "argument":</t> | |||
<dl newline="false" spacing="normal"> | <dl newline="false" spacing="normal"> | |||
<dt>Less than 24:</dt> | <dt>Less than 24:</dt> | |||
skipping to change at line 373 ¶ | skipping to change at line 402 ¶ | |||
<dt>28, 29, 30:</dt> | <dt>28, 29, 30:</dt> | |||
<dd> | <dd> | |||
These values are reserved for future additions to the CBOR format. | These values are reserved for future additions to the CBOR format. | |||
In the present version of CBOR, the encoded item is not well-formed.</dd> | In the present version of CBOR, the encoded item is not well-formed.</dd> | |||
<dt>31:</dt> | <dt>31:</dt> | |||
<dd> | <dd> | |||
No argument value is derived. | No argument value is derived. | |||
If the major type is 0, 1, or 6, the encoded item is not | If the major type is 0, 1, or 6, the encoded item is not | |||
well-formed. For major types 2 to 5, the item's length is | well-formed. For major types 2 to 5, the item's length is | |||
indefinite, and for major type 7, the byte does not constitute a data | indefinite, and for major type 7, the byte does not constitute a data | |||
item at all but terminates an indefinite length item; all are | item at all but terminates an indefinite-length item; all are | |||
described in <xref target="indefinite" format="default"/>.</dd> | described in <xref target="indefinite" format="default"/>.</dd> | |||
</dl> | </dl> | |||
<t>The initial byte and any additional bytes consumed to construct the | <t>The initial byte and any additional bytes consumed to construct the | |||
argument are collectively referred to as the "head" of the data item.</t> | argument are collectively referred to as the <em>head</em> of the data item.</t> | |||
<t>The meaning of this argument depends on the major type. | <t>The meaning of this argument depends on the major type. | |||
For example, in major type 0, the argument is the value of the data | For example, in major type 0, the argument is the value of the data | |||
item itself (and in major type 1 the value of the data item is | item itself (and in major type 1, the value of the data item is | |||
computed from the argument); in major type 2 and 3 it gives the length | computed from the argument); in major type 2 and 3, it gives the length | |||
of the string data in bytes that follows; and in major types 4 and 5 it is used | of the string data in bytes that follow; and in major types 4 and 5, it is used | |||
to | to | |||
determine the number of data items enclosed.</t> | determine the number of data items enclosed.</t> | |||
<t>If the encoded sequence of bytes ends before the end of a data item, | <t>If the encoded sequence of bytes ends before the end of a data item, | |||
that item is not well-formed. If the encoded | that item is not well-formed. If the encoded | |||
sequence of bytes still has bytes remaining | sequence of bytes still has bytes remaining | |||
after the outermost encoded item is decoded, that encoding is not a | after the outermost encoded item is decoded, that encoding is not a | |||
single well-formed CBOR item; depending on the application, the decoder may eith er | single well-formed CBOR item. Depending on the application, the decoder may eith er | |||
treat the encoding as not well-formed or just identify the start of | treat the encoding as not well-formed or just identify the start of | |||
the remaining bytes to the application.</t> | the remaining bytes to the application.</t> | |||
<t>A CBOR decoder implementation can be based on a jump table with all | <t>A CBOR decoder implementation can be based on a jump table with all | |||
256 defined values for the initial byte (<xref target="jumptable" format="defaul t"/>). A decoder in | 256 defined values for the initial byte (<xref target="jumptable" format="defaul t"/>). A decoder in | |||
a constrained implementation can instead use the structure of the | a constrained implementation can instead use the structure of the | |||
initial byte and following bytes for more compact code (see | initial byte and following bytes for more compact code (see | |||
<xref target="pseudocode" format="default"/> for a rough impression of how this could look).</t> | <xref target="pseudocode" format="default"/> for a rough impression of how this could look).</t> | |||
<section anchor="majortypes" toc="default"> | <section anchor="majortypes" toc="default"> | |||
<name>Major Types</name> | <name>Major Types</name> | |||
<t>The following lists the major types and the additional information an d | <t>The following lists the major types and the additional information an d | |||
other bytes associated with the type.</t> | other bytes associated with the type.</t> | |||
<dl newline="false" spacing="normal"> | <dl newline="true" spacing="normal"> | |||
<dt>Major type 0:</dt> | <dt>Major type 0:</dt> | |||
<dd> | <dd> | |||
an unsigned integer in the range 0..2**64-1 inclusive. The value of the | An unsigned integer in the range 0..2<sup>64</sup>-1 inclusive. The value of the | |||
encoded item is the argument itself. For example, the | encoded item is the argument itself. For example, the | |||
integer 10 is denoted as the one byte 0b000_01010 (major type 0, | integer 10 is denoted as the one byte 0b000_01010 (major type 0, | |||
additional information 10). The integer 500 would be 0b000_11001 | additional information 10). The integer 500 would be 0b000_11001 | |||
(major type 0, additional information 25) followed by the two bytes | (major type 0, additional information 25) followed by the two bytes | |||
0x01f4, which is 500 in decimal.</dd> | 0x01f4, which is 500 in decimal.</dd> | |||
<dt>Major type 1:</dt> | <dt>Major type 1:</dt> | |||
<dd> | <dd> | |||
a negative integer in the range -2**64..-1 inclusive. The value of | A negative integer in the range -2<sup>64</sup>..-1 inclusive. The value of | |||
the item is -1 minus the argument. For example, the integer | the item is -1 minus the argument. For example, the integer | |||
-500 would be 0b001_11001 (major type 1, additional information 25) | -500 would be 0b001_11001 (major type 1, additional information 25) | |||
followed by the two bytes 0x01f3, which is 499 in decimal.</dd> | followed by the two bytes 0x01f3, which is 499 in decimal.</dd> | |||
<dt>Major type 2:</dt> | <dt>Major type 2:</dt> | |||
<dd> | <dd> | |||
a byte string. The number of bytes in the string is equal to the | A byte string. The number of bytes in the string is equal to the | |||
argument. For example, a byte | argument. For example, a byte | |||
string whose length is 5 would have an initial byte of 0b010_00101 | string whose length is 5 would have an initial byte of 0b010_00101 | |||
(major type 2, additional information 5 for the length), followed by | (major type 2, additional information 5 for the length), followed by | |||
5 bytes of binary content. A byte string whose length is 500 would | 5 bytes of binary content. A byte string whose length is 500 would | |||
have 3 initial bytes of 0b010_11001 (major type 2, additional | have 3 initial bytes of 0b010_11001 (major type 2, additional | |||
information 25 to indicate a two-byte length) followed by the two | information 25 to indicate a two-byte length) followed by the two | |||
bytes 0x01f4 for a length of 500, followed by 500 bytes of binary | bytes 0x01f4 for a length of 500, followed by 500 bytes of binary | |||
content.</dd> | content.</dd> | |||
<dt>Major type 3:</dt> | <dt>Major type 3:</dt> | |||
<dd> | <dd> | |||
a text string (<xref target="cbor-data-models" format="default"/>), encoded as | A text string (<xref target="cbor-data-models" format="default"/>) encoded as | |||
UTF-8 | UTF-8 | |||
(<xref target="RFC3629" format="default"/>). The number of bytes in the string i | <xref target="RFC3629" format="default"/>. The number of bytes in the string is | |||
s equal to the | equal to the | |||
argument. A string containing an invalid UTF-8 sequence is | argument. A string containing an invalid UTF-8 sequence is | |||
well-formed but invalid (<xref target="terminology" format="default"/>). This ty pe is provided for | well-formed but invalid (<xref target="terminology" format="default"/>). This ty pe is provided for | |||
systems that need to interpret or display human-readable text, and | systems that need to interpret or display human-readable text, and | |||
allows the differentiation between unstructured bytes and text that | allows the differentiation between unstructured bytes and text that | |||
has a specified repertoire (that of Unicode) and encoding (UTF-8). In contrast to formats | has a specified repertoire (that of Unicode) and encoding (UTF-8). In contrast to formats | |||
such as JSON, the Unicode characters in this type are never | such as JSON, the Unicode characters in this type are never | |||
escaped. Thus, a newline character (U+000A) is always represented in | escaped. Thus, a newline character (U+000A) is always represented in | |||
a string as the byte 0x0a, and never as the bytes 0x5c6e (the | a string as the byte 0x0a, and never as the bytes 0x5c6e (the | |||
characters "\" and "n") nor as 0x5c7530303061 (the characters "\", | characters "\" and "n") nor as 0x5c7530303061 (the characters "\", | |||
"u", "0", "0", "0", and "a").</dd> | "u", "0", "0", "0", and "a").</dd> | |||
<dt>Major type 4:</dt> | <dt>Major type 4:</dt> | |||
<dd> | <dd> | |||
an array of data items. In other formats, arrays are also called lists, seque nces, or | An array of data items. In other formats, arrays are also called lists, seque nces, or | |||
tuples (a "CBOR sequence" is something slightly different, though <xref target=" RFC8742" format="default"/>). | tuples (a "CBOR sequence" is something slightly different, though <xref target=" RFC8742" format="default"/>). | |||
The argument is the number of data items in the | The argument is the number of data items in the | |||
array. Items in an | array. Items in an | |||
array do not need to all be of the same type. For example, an array | array do not need to all be of the same type. For example, an array | |||
that contains 10 items of any type would have an initial byte of | that contains 10 items of any type would have an initial byte of | |||
0b100_01010 (major type 4, additional information 10 for the | 0b100_01010 (major type 4, additional information 10 for the | |||
length) followed by the 10 remaining items.</dd> | length) followed by the 10 remaining items.</dd> | |||
<dt>Major type 5:</dt> | <dt>Major type 5:</dt> | |||
<dd> | <dd> | |||
a map of pairs of data items. Maps are also called tables, | A map of pairs of data items. Maps are also called tables, | |||
dictionaries, hashes, or objects (in JSON). A map is comprised of | dictionaries, hashes, or objects (in JSON). A map is comprised of | |||
pairs of data items, each pair consisting of a key that is | pairs of data items, each pair consisting of a key that is | |||
immediately followed by a value. The argument is the number | immediately followed by a value. The argument is the number | |||
of <em>pairs</em> of data items in the map. For | of <em>pairs</em> of data items in the map. For | |||
example, a map that contains 9 pairs would have an initial byte of | example, a map that contains 9 pairs would have an initial byte of | |||
0b101_01001 (major type 5, additional information 9 for the | 0b101_01001 (major type 5, additional information 9 for the | |||
number of pairs) followed by the 18 remaining items. The first item | number of pairs) followed by the 18 remaining items. The first item | |||
is the first key, the second item is the first value, the third item | is the first key, the second item is the first value, the third item | |||
is the second key, and so on. Because items in a map come in pairs, | is the second key, and so on. Because items in a map come in pairs, | |||
their total number is always even: A map that contains an odd | their total number is always even: a map that contains an odd | |||
number of items (no value data present after the last key data item) is not well -formed. | number of items (no value data present after the last key data item) is not well -formed. | |||
A map that has duplicate keys may be | A map that has duplicate keys may be | |||
well-formed, but it is not valid, and thus it causes indeterminate | well-formed, but it is not valid, and thus it causes indeterminate | |||
decoding; see also <xref target="map-keys" format="default"/>.</dd> | decoding; see also <xref target="map-keys" format="default"/>.</dd> | |||
<dt>Major type 6:</dt> | <dt>Major type 6:</dt> | |||
<dd> | <dd> | |||
a tagged data item ("tag") whose tag number, an integer in the range | A tagged data item ("tag") whose tag number, an integer in the range | |||
0..2**64-1 inclusive, is the argument and | 0..2<sup>64</sup>-1 inclusive, is the argument and | |||
whose enclosed data item ("tag content") is the single encoded data item that fo | whose enclosed data item (<em>tag content</em>) is the single encoded data item | |||
llows the head. | that follows the head. | |||
See <xref target="tags" format="default"/>.</dd> | See <xref target="tags" format="default"/>.</dd> | |||
<dt>Major type 7:</dt> | <dt>Major type 7:</dt> | |||
<dd> | <dd> | |||
floating-point numbers and simple values, as well as the "break" | Floating-point numbers and simple values, as well as the "break" | |||
stop code. See <xref target="fpnocont" format="default"/>.</dd> | stop code. See <xref target="fpnocont" format="default"/>.</dd> | |||
</dl> | </dl> | |||
<t>These eight major types lead to a simple table showing which of the | <t>These eight major types lead to a simple table showing which of the | |||
256 possible values for the initial byte of a data item are used | 256 possible values for the initial byte of a data item are used | |||
(<xref target="jumptable" format="default"/>).</t> | (<xref target="jumptable" format="default"/>).</t> | |||
<t>In major types 6 and 7, many of the possible values are reserved for | <t>In major types 6 and 7, many of the possible values are reserved for | |||
future specification. See <xref target="ianacons" format="default"/> for more in formation on these | future specification. See <xref target="ianacons" format="default"/> for more in formation on these | |||
values.</t> | values.</t> | |||
<t><xref target="major-type-table" format="default"/> summarizes the maj or types defined by CBOR, | <t><xref target="major-type-table" format="default"/> summarizes the maj or types defined by CBOR, | |||
ignoring the next section for now. The number N in this table stands | ignoring <xref target="indefinite" format="default"/> for now. The number N in | |||
for the argument, mt for the major type.</t> | this table stands | |||
for the argument.</t> | ||||
<table anchor="major-type-table" align="center"> | <table anchor="major-type-table" align="center"> | |||
<name>Overview over the definite-length use of CBOR major types (mt = major type, N = argument)</name> | <name>Overview over the Definite-Length Use of CBOR Major Types (N = A rgument)</name> | |||
<thead> | <thead> | |||
<tr> | <tr> | |||
<th align="left">mt</th> | <th align="left">Major Type</th> | |||
<th align="left">Meaning</th> | <th align="left">Meaning</th> | |||
<th align="left">Content</th> | <th align="left">Content</th> | |||
</tr> | </tr> | |||
</thead> | </thead> | |||
<tbody> | <tbody> | |||
<tr> | <tr> | |||
<td align="left">0</td> | <td align="left">0</td> | |||
<td align="left">unsigned integer N</td> | <td align="left">unsigned integer N</td> | |||
<td align="left">-</td> | <td align="left">-</td> | |||
</tr> | </tr> | |||
skipping to change at line 556 ¶ | skipping to change at line 585 ¶ | |||
length of the string, is known. (The ability to start sending a data | length of the string, is known. (The ability to start sending a data | |||
item before all of it is known is often | item before all of it is known is often | |||
referred to as "streaming" within that data item.)</t> | referred to as "streaming" within that data item.)</t> | |||
<t>Indefinite-length arrays and maps are dealt with differently than | <t>Indefinite-length arrays and maps are dealt with differently than | |||
indefinite-length strings (byte strings and text strings).</t> | indefinite-length strings (byte strings and text strings).</t> | |||
<section anchor="break" toc="default"> | <section anchor="break" toc="default"> | |||
<name>The "break" Stop Code</name> | <name>The "break" Stop Code</name> | |||
<t>The "break" stop code is encoded with major type 7 and additional | <t>The "break" stop code is encoded with major type 7 and additional | |||
information value 31 (0b111_11111). It is not itself a data item: it | information value 31 (0b111_11111). It is not itself a data item: it | |||
is just a syntactic feature to close an indefinite-length item.</t> | is just a syntactic feature to close an indefinite-length item.</t> | |||
<t>If the "break" stop code appears anywhere where a data item is expe | <t>If the "break" stop code appears where a data item is expected, | |||
cted, other than directly inside | other than directly inside an indefinite-length string, array, or | |||
an indefinite-length string, array, or map -- for example directly inside | map -- for example, directly inside a definite-length array or map | |||
a definite-length array or map -- the enclosing item is not well-formed.</t> | -- the enclosing item is not well-formed.</t> | |||
</section> | </section> | |||
<section anchor="indef" toc="default"> | <section anchor="indef" toc="default"> | |||
<name>Indefinite-Length Arrays and Maps</name> | <name>Indefinite-Length Arrays and Maps</name> | |||
<t>Indefinite-length arrays and maps are represented using their major | <t>Indefinite-length arrays and maps are represented using their major | |||
type with the additional information value of 31, followed by an | type with the additional information value of 31, followed by an | |||
arbitrary-length sequence of zero or more items for an array or key/value pairs for | arbitrary-length sequence of zero or more items for an array or key/value pairs for | |||
a map, followed by the "break" stop code (<xref target="break" format="default"/ >). In other words, indefinite-length | a map, followed by the "break" stop code (<xref target="break" format="default"/ >). In other words, indefinite-length | |||
arrays and maps look identical to other arrays and maps except for | arrays and maps look identical to other arrays and maps except for | |||
beginning with the additional information value of 31 and ending with the | beginning with the additional information value of 31 and ending with the | |||
"break" stop code.</t> | "break" stop code.</t> | |||
<t>If the "break" stop code appears after a key in a map, in place of that | <t>If the "break" stop code appears after a key in a map, in place of that | |||
key's value, the map is not well-formed.</t> | key's value, the map is not well-formed.</t> | |||
<t>There is no restriction against nesting indefinite-length | <t>There is no restriction against nesting indefinite-length | |||
array or map items. A "break" only terminates a single item, so | array or map items. A "break" only terminates a single item, so | |||
nested indefinite-length items need exactly as many "break" stop codes | nested indefinite-length items need exactly as many "break" stop codes | |||
as there are type bytes starting an indefinite-length item.</t> | as there are type bytes starting an indefinite-length item.</t> | |||
<t>For example, assume an encoder wants to represent the abstract arra y | <t>For example, assume an encoder wants to represent the abstract arra y | |||
[1, [2, 3], [4, 5]]. The definite-length encoding would be | [1, [2, 3], [4, 5]]. The definite-length encoding would be | |||
0x8301820203820405:</t> | 0x8301820203820405:</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <artwork type="hex-dump"><![CDATA[ | |||
83 -- Array of length 3 | 83 -- Array of length 3 | |||
01 -- 1 | 01 -- 1 | |||
82 -- Array of length 2 | 82 -- Array of length 2 | |||
02 -- 2 | 02 -- 2 | |||
03 -- 3 | 03 -- 3 | |||
82 -- Array of length 2 | 82 -- Array of length 2 | |||
04 -- 4 | 04 -- 4 | |||
05 -- 5 | 05 -- 5 | |||
]]></artwork> | ]]></artwork> | |||
<t>Indefinite-length encoding could be applied independently to each o f | <t>Indefinite-length encoding could be applied independently to each o f | |||
the three arrays encoded in this data item, as required, leading to | the three arrays encoded in this data item, as required, leading to | |||
representations such as:</t> | representations such as:</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <artwork type="hex-dump"><![CDATA[ | |||
0x9f018202039f0405ffff | 0x9f018202039f0405ffff | |||
9F -- Start indefinite-length array | 9F -- Start indefinite-length array | |||
01 -- 1 | 01 -- 1 | |||
82 -- Array of length 2 | 82 -- Array of length 2 | |||
02 -- 2 | 02 -- 2 | |||
03 -- 3 | 03 -- 3 | |||
9F -- Start indefinite-length array | 9F -- Start indefinite-length array | |||
04 -- 4 | 04 -- 4 | |||
05 -- 5 | 05 -- 5 | |||
FF -- "break" (inner array) | FF -- "break" (inner array) | |||
FF -- "break" (outer array) | FF -- "break" (outer array) | |||
]]></artwork> | ]]></artwork> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <artwork type="hex-dump"><![CDATA[ | |||
0x9f01820203820405ff | 0x9f01820203820405ff | |||
9F -- Start indefinite-length array | 9F -- Start indefinite-length array | |||
01 -- 1 | 01 -- 1 | |||
82 -- Array of length 2 | 82 -- Array of length 2 | |||
02 -- 2 | 02 -- 2 | |||
03 -- 3 | 03 -- 3 | |||
82 -- Array of length 2 | 82 -- Array of length 2 | |||
04 -- 4 | 04 -- 4 | |||
05 -- 5 | 05 -- 5 | |||
FF -- "break" | FF -- "break" | |||
]]></artwork> | ]]></artwork> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <artwork type="hex-dump"><![CDATA[ | |||
0x83018202039f0405ff | 0x83018202039f0405ff | |||
83 -- Array of length 3 | 83 -- Array of length 3 | |||
01 -- 1 | 01 -- 1 | |||
82 -- Array of length 2 | 82 -- Array of length 2 | |||
02 -- 2 | 02 -- 2 | |||
03 -- 3 | 03 -- 3 | |||
9F -- Start indefinite-length array | 9F -- Start indefinite-length array | |||
04 -- 4 | 04 -- 4 | |||
05 -- 5 | 05 -- 5 | |||
FF -- "break" | FF -- "break" | |||
]]></artwork> | ]]></artwork> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <artwork type="hex-dump"><![CDATA[ | |||
0x83019f0203ff820405 | 0x83019f0203ff820405 | |||
83 -- Array of length 3 | 83 -- Array of length 3 | |||
01 -- 1 | 01 -- 1 | |||
9F -- Start indefinite-length array | 9F -- Start indefinite-length array | |||
02 -- 2 | 02 -- 2 | |||
03 -- 3 | 03 -- 3 | |||
FF -- "break" | FF -- "break" | |||
82 -- Array of length 2 | 82 -- Array of length 2 | |||
04 -- 4 | 04 -- 4 | |||
05 -- 5 | 05 -- 5 | |||
]]></artwork> | ]]></artwork> | |||
<t>An example of an indefinite-length map (that happens to have two | <t>An example of an indefinite-length map (that happens to have two | |||
key/value pairs) might be:</t> | key/value pairs) might be:</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <artwork type="hex-dump"><![CDATA[ | |||
0xbf6346756ef563416d7421ff | 0xbf6346756ef563416d7421ff | |||
BF -- Start indefinite-length map | BF -- Start indefinite-length map | |||
63 -- First key, UTF-8 string length 3 | 63 -- First key, UTF-8 string length 3 | |||
46756e -- "Fun" | 46756e -- "Fun" | |||
F5 -- First value, true | F5 -- First value, true | |||
63 -- Second key, UTF-8 string length 3 | 63 -- Second key, UTF-8 string length 3 | |||
416d74 -- "Amt" | 416d74 -- "Amt" | |||
21 -- Second value, -2 | 21 -- Second value, -2 | |||
FF -- "break" | FF -- "break" | |||
]]></artwork> | ]]></artwork> | |||
skipping to change at line 681 ¶ | skipping to change at line 711 ¶ | |||
least a count, of nesting levels. It is unnecessary on the | least a count, of nesting levels. It is unnecessary on the | |||
encoder side because the inner indefinite-length string would consist of | encoder side because the inner indefinite-length string would consist of | |||
chunks, and these could instead be put directly into the outer indefinite-length | chunks, and these could instead be put directly into the outer indefinite-length | |||
string.</t> | string.</t> | |||
<t>If any definite-length text string inside an indefinite-length text | <t>If any definite-length text string inside an indefinite-length text | |||
string is invalid, the indefinite-length text string is invalid. Note | string is invalid, the indefinite-length text string is invalid. Note | |||
that this implies that the UTF-8 bytes of a single Unicode code point | that this implies that the UTF-8 bytes of a single Unicode code point | |||
(scalar value) cannot be spread between chunks: a new chunk of a text | (scalar value) cannot be spread between chunks: a new chunk of a text | |||
string can only be started at a code point boundary.</t> | string can only be started at a code point boundary.</t> | |||
<t>For example, assume an encoded data item consisting of the bytes:</ t> | <t>For example, assume an encoded data item consisting of the bytes:</ t> | |||
<t>0b010_11111 0b010_00100 0xaabbccdd 0b010_00011 0xeeff99 0b111_11111 | <artwork type="hex-dump"><![CDATA[ | |||
</t> | 0b010_11111 0b010_00100 0xaabbccdd 0b010_00011 0xeeff99 0b111_11111 | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
5F -- Start indefinite-length byte string | 5F -- Start indefinite-length byte string | |||
44 -- Byte string of length 4 | 44 -- Byte string of length 4 | |||
aabbccdd -- Bytes content | aabbccdd -- Bytes content | |||
43 -- Byte string of length 3 | 43 -- Byte string of length 3 | |||
eeff99 -- Bytes content | eeff99 -- Bytes content | |||
FF -- "break" | FF -- "break" | |||
]]></artwork> | ]]></artwork> | |||
<t>After decoding, this results in a single byte string with seven byt es: | <t>After decoding, this results in a single byte string with seven byt es: | |||
0xaabbccddeeff99.</t> | 0xaabbccddeeff99.</t> | |||
</section> | </section> | |||
<section anchor="summary-of-indefinite-length-use-of-major-types" toc="d efault"> | <section anchor="summary-of-indefinite-length-use-of-major-types" toc="d efault"> | |||
<name>Summary of indefinite-length use of major types</name> | <name>Summary of Indefinite-Length Use of Major Types</name> | |||
<t><xref target="major-type-indef-table" format="default"/> summarizes the major types defined by CBOR as | <t><xref target="major-type-indef-table" format="default"/> summarizes the major types defined by CBOR as | |||
used for indefinite length encoding (with additional information set | used for indefinite-length encoding (with additional information set | |||
to 31). mt stands for the major type.</t> | to 31).</t> | |||
<table anchor="major-type-indef-table" align="center"> | <table anchor="major-type-indef-table" align="center"> | |||
<name>Overview over the indefinite-length use of CBOR major types (m t = major type, additional information = 31)</name> | <name>Overview of the Indefinite-Length Use of CBOR Major Types (Add itional Information = 31)</name> | |||
<thead> | <thead> | |||
<tr> | <tr> | |||
<th align="left">mt</th> | <th align="left">Major Type</th> | |||
<th align="left">Meaning</th> | <th align="left">Meaning</th> | |||
<th align="left">enclosed up to "break" stop code</th> | <th align="left">Enclosed up to "break" Stop Code</th> | |||
</tr> | </tr> | |||
</thead> | </thead> | |||
<tbody> | <tbody> | |||
<tr> | <tr> | |||
<td align="left">0</td> | <td align="left">0</td> | |||
<td align="left">(not well-formed)</td> | <td align="left">(not well-formed)</td> | |||
<td align="left">-</td> | <td align="left">-</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">1</td> | <td align="left">1</td> | |||
skipping to change at line 817 ¶ | skipping to change at line 848 ¶ | |||
<name>Simple Values</name> | <name>Simple Values</name> | |||
<thead> | <thead> | |||
<tr> | <tr> | |||
<th align="left">Value</th> | <th align="left">Value</th> | |||
<th align="left">Semantics</th> | <th align="left">Semantics</th> | |||
</tr> | </tr> | |||
</thead> | </thead> | |||
<tbody> | <tbody> | |||
<tr> | <tr> | |||
<td align="left">0..19</td> | <td align="left">0..19</td> | |||
<td align="left">(Unassigned)</td> | <td align="left">(unassigned)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">20</td> | <td align="left">20</td> | |||
<td align="left">False</td> | <td align="left">false</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">21</td> | <td align="left">21</td> | |||
<td align="left">True</td> | <td align="left">true</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">22</td> | <td align="left">22</td> | |||
<td align="left">Null</td> | <td align="left">null</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">23</td> | <td align="left">23</td> | |||
<td align="left">Undefined</td> | <td align="left">undefined</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">24..31</td> | <td align="left">24..31</td> | |||
<td align="left">(Reserved)</td> | <td align="left">(reserved)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">32..255</td> | <td align="left">32..255</td> | |||
<td align="left">(Unassigned)</td> | <td align="left">(unassigned)</td> | |||
</tr> | </tr> | |||
</tbody> | </tbody> | |||
</table> | </table> | |||
<t>An encoder MUST NOT issue two-byte sequences that start with 0xf8 | <t>An encoder <bcp14>MUST NOT</bcp14> issue two-byte sequences that | |||
(major type 7, additional information 24) and continue with a byte | start with 0xf8 (major type 7, additional information 24) and continue | |||
less than 0x20 (32 decimal). Such sequences are not well-formed. | with a byte less than 0x20 (32 decimal). Such sequences are not | |||
(This implies that an encoder cannot encode false, true, null, or | well-formed. (This implies that an encoder cannot encode <tt>false</tt> | |||
undefined in two-byte sequences, and that only the one-byte variants of these | , <tt>true</tt>, | |||
are well-formed; more generally speaking, each simple value only has a | <tt>null</tt>, or <tt>undefined</tt> in two-byte sequences and that only | |||
single representation variant).</t> | the one-byte | |||
variants of these are well-formed; more generally speaking, each | ||||
simple value only has a single representation variant).</t> | ||||
<t>The 5-bit values of 25, 26, and 27 are for 16-bit, 32-bit, and 64-bit | <t>The 5-bit values of 25, 26, and 27 are for 16-bit, 32-bit, and 64-bit | |||
IEEE 754 binary floating-point values <xref target="IEEE754" format="default"/>. These floating-point values | IEEE 754 binary floating-point values <xref target="IEEE754" format="default"/>. These floating-point values | |||
are encoded in the additional bytes of the appropriate size. (See | are encoded in the additional bytes of the appropriate size. (See | |||
<xref target="half-precision" format="default"/> for some information about 16-b it floating-point numbers.)</t> | <xref target="half-precision" format="default"/> for some information about 16-b it floating-point numbers.)</t> | |||
</section> | </section> | |||
<section anchor="tags" toc="default"> | <section anchor="tags" toc="default"> | |||
<name>Tagging of Items</name> | <name>Tagging of Items</name> | |||
<t>In CBOR, a data item can be enclosed by a tag to give it some | <t>In CBOR, a data item can be enclosed by a tag to give it some | |||
additional semantics, as uniquely identified by a "tag number". | additional semantics, as uniquely identified by a <em>tag number</em>. | |||
The tag is major type 6, its argument (<xref target="encoding" format="default"/ >) indicates the tag | The tag is major type 6, its argument (<xref target="encoding" format="default"/ >) indicates the tag | |||
number, and it contains a single enclosed data item, the | number, and it contains a single enclosed data item, the | |||
"tag content". | <em>tag content</em>. | |||
(If a tag requires further structure to its content, this structure is | (If a tag requires further structure to its content, this structure is | |||
provided by the enclosed data item.) | provided by the enclosed data item.) | |||
We use the term "tag" for the entire data item consisting of both a | We use the term <em>tag</em> for the entire data item consisting of both a | |||
tag number and the tag content: the tag content is the data item that | tag number and the tag content: the tag content is the data item that | |||
is being tagged.</t> | is being tagged.</t> | |||
<t>For example, assume that a byte string of length 12 is marked with a | <t>For example, assume that a byte string of length 12 is marked with a | |||
tag of number 2 to indicate it is a positive "bignum" (<xref target="bignums" fo rmat="default"/>). | tag of number 2 to indicate it is an unsigned <em>bignum</em> (<xref target="big nums" format="default"/>). | |||
The encoded data item would start with a byte 0b110_00010 (major type | The encoded data item would start with a byte 0b110_00010 (major type | |||
6, additional information 2 for the tag number) followed by the | 6, additional information 2 for the tag number) followed by the | |||
encoded tag content: 0b010_01100 (major type 2, additional information | encoded tag content: 0b010_01100 (major type 2, additional information | |||
of 12 for the length) followed by the 12 bytes of the bignum.</t> | 12 for the length) followed by the 12 bytes of the bignum.</t> | |||
<t>The definition of a tag number describes the additional semantics | <t>In the extended generic data model, a tag number's | |||
conveyed for tags with this tag number in the extended generic data | definition describes the additional semantics | |||
model. These semantics may include equivalence of some tagged data | conveyed with the tag number. | |||
items with other data items, including some that can already be | These semantics may include equivalence of some tagged data | |||
items with other data items, including some that can be | ||||
represented in the basic generic data model. For instance, 0xc24101, | represented in the basic generic data model. For instance, 0xc24101, | |||
a bignum the tag content of which is the byte string with the single | a bignum the tag content of which is the byte string with the single | |||
byte 0x01, is equivalent to an integer 1, which could also be encoded | byte 0x01, is equivalent to an integer 1, which could also be encoded | |||
for instance as 0x01, 0x1801, or 0x190001. | as 0x01, 0x1801, or 0x190001. | |||
The tag definition may include the definition of a preferred | The tag definition may specify a preferred | |||
serialization (<xref target="preferred" format="default"/>) that is recommended for generic | serialization (<xref target="preferred" format="default"/>) that is recommended for generic | |||
encoders; this may prefer basic generic data model representations | encoders; this may prefer basic generic data model representations | |||
over ones that employ a tag.</t> | over ones that employ a tag.</t> | |||
<t>The tag definition usually restricts what kinds of nested data item o | ||||
r | <t>The tag definition usually defines which nested data items are | |||
items are valid for such tags. | valid for such tags. Tag definitions may restrict their content to a | |||
Tag definitions may restrict their content to a very specific syntactic | very specific syntactic structure, as the tags defined in this | |||
structure, as the tags defined in this document do, or they may aim at | document do, or they may define their content more semantically. An | |||
a more semantically defined definition of their content, as for | example for the latter is how tags 40 and 1040 accept multiple ways to | |||
instance tags 40 and 1040 do <xref target="RFC8746" format="default"/>: These ac | represent arrays <xref target="RFC8746" format="default"/>. | |||
cept a number of | </t> | |||
different ways of representing arrays.</t> | <t>As a matter of convention, many tags do not accept <tt>null</tt> or < | |||
<t>As a matter of convention, many tags do not accept null or undefined | tt>undefined</tt> | |||
values as tag content; instead, the expectation is that a null or | values as tag content; instead, the expectation is that a <tt>null</tt> or | |||
undefined value can be used in place of the entire tag; | <tt>undefined</tt> value can be used in place of the entire tag; <xref target="e | |||
<xref target="epochdatetimesect" format="default"/> provides some further consid | pochdatetimesect" format="default"/> | |||
erations for one | provides some further considerations for one specific tag about the | |||
specific tag about the handling of this convention in application | handling of this convention in application protocols and in mapping | |||
protocols and in mapping to platform types.</t> | to platform types.</t> | |||
<t>Decoders do not need to understand tags of every tag number, and tags may be of | <t>Decoders do not need to understand tags of every tag number, and tags may be of | |||
little value in applications where the implementation creating a | little value in applications where the implementation creating a | |||
particular CBOR data item and the implementation decoding that stream | particular CBOR data item and the implementation decoding that stream | |||
know the semantic meaning of each item in the data flow. Their primary | know the semantic meaning of each item in the data flow. The primary | |||
purpose in this specification is to define common data types such as | purpose of tags in this specification is to define common data types such as | |||
dates. A secondary purpose is to provide conversion hints when it is | dates. A secondary purpose is to provide conversion hints when it is | |||
foreseen that the CBOR data item needs to be translated into a | foreseen that the CBOR data item needs to be translated into a | |||
different format, requiring hints about the content of items. | different format, requiring hints about the content of items. | |||
Understanding the semantics of tags is | Understanding the semantics of tags is | |||
optional for a decoder; it can simply present both the tag number and | optional for a decoder; it can simply present both the tag number and | |||
the tag content to the application, without interpreting the additional | the tag content to the application, without interpreting the additional | |||
semantics of the tag.</t> | semantics of the tag.</t> | |||
<t>A tag applies semantics to the data item it encloses. | <t>A tag applies semantics to the data item it encloses. | |||
Tags can nest: If tag A encloses tag B, which encloses data item C, | Tags can nest: if tag A encloses tag B, which encloses data item C, | |||
tag A applies to the result of applying tag B on data item C.</t> | tag A applies to the result of applying tag B on data item C.</t> | |||
<t>IANA maintains a registry of tag numbers as described in <xref target ="ianatags" format="default"/>. | <t>IANA maintains a registry of tag numbers as described in <xref target ="ianatags" format="default"/>. | |||
<xref target="tagvalues" format="default"/> provides a list of tag numbers that | <xref target="tagvalues" format="default"/> provides a list of tag numbers | |||
were defined in <xref target="RFC7049" format="default"/>, with definitions in | that were defined in <xref target="RFC7049" format="default"/> with definitions | |||
in | ||||
the rest of this section. | the rest of this section. | |||
(Tag number 35 was also defined in <xref target="RFC7049" format="default"/>; a discussion of this | (Tag number 35 was also defined in <xref target="RFC7049" format="default"/>; a discussion of this | |||
tag number follows in <xref target="encodedtext" format="default"/>.) | tag number follows in <xref target="encodedtext" format="default"/>.) | |||
Note that many other tag numbers have been defined since the publication of <xre f target="RFC7049" format="default"/>; | Note that many other tag numbers have been defined since the publication of <xre f target="RFC7049" format="default"/>; | |||
see the registry described at <xref target="ianatags" format="default"/> for the complete list.</t> | see the registry described at <xref target="ianatags" format="default"/> for the complete list.</t> | |||
<table anchor="tagvalues" align="center"> | <table anchor="tagvalues" align="center"> | |||
<name>Tag numbers defined in RFC 7049</name> | <name>Tag Numbers Defined in RFC 7049</name> | |||
<thead> | <thead> | |||
<tr> | <tr> | |||
<th align="left">Tag Number</th> | <th align="left">Tag</th> | |||
<th align="left">Data Item</th> | <th align="left">Data Item</th> | |||
<th align="left">Tag Content Semantics</th> | <th align="left">Semantics</th> | |||
</tr> | </tr> | |||
</thead> | </thead> | |||
<tbody> | <tbody> | |||
<tr> | <tr> | |||
<td align="left">0</td> | <td align="left">0</td> | |||
<td align="left">text string</td> | <td align="left">text string</td> | |||
<td align="left">Standard date/time string; see <xref target="stri ngdatetimesect" format="default"/></td> | <td align="left">Standard date/time string; see <xref target="stri ngdatetimesect" format="default"/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">1</td> | <td align="left">1</td> | |||
<td align="left">integer or float</td> | <td align="left">integer or float</td> | |||
<td align="left">Epoch-based date/time; see <xref target="epochdat etimesect" format="default"/></td> | <td align="left">Epoch-based date/time; see <xref target="epochdat etimesect" format="default"/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">2</td> | <td align="left">2</td> | |||
<td align="left">byte string</td> | <td align="left">byte string</td> | |||
<td align="left">Positive bignum; see <xref target="bignums" forma t="default"/></td> | <td align="left">Unsigned bignum; see <xref target="bignums" forma t="default"/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">3</td> | <td align="left">3</td> | |||
<td align="left">byte string</td> | <td align="left">byte string</td> | |||
<td align="left">Negative bignum; see <xref target="bignums" forma t="default"/></td> | <td align="left">Negative bignum; see <xref target="bignums" forma t="default"/></td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">4</td> | <td align="left">4</td> | |||
<td align="left">array</td> | <td align="left">array</td> | |||
<td align="left">Decimal fraction; see <xref target="fractions" fo rmat="default"/></td> | <td align="left">Decimal fraction; see <xref target="fractions" fo rmat="default"/></td> | |||
skipping to change at line 1012 ¶ | skipping to change at line 1047 ¶ | |||
<tr> | <tr> | |||
<td align="left">55799</td> | <td align="left">55799</td> | |||
<td align="left">(any)</td> | <td align="left">(any)</td> | |||
<td align="left">Self-described CBOR; see <xref target="self-descr ibe" format="default"/></td> | <td align="left">Self-described CBOR; see <xref target="self-descr ibe" format="default"/></td> | |||
</tr> | </tr> | |||
</tbody> | </tbody> | |||
</table> | </table> | |||
<t>Conceptually, tags are interpreted in the generic data model, not at | <t>Conceptually, tags are interpreted in the generic data model, not at | |||
(de-)serialization time. A small number of tags (at this time, tag | (de-)serialization time. A small number of tags (at this time, tag | |||
number 25 and tag number 29 <xref target="IANA.cbor-tags" format="default"/>) ha ve been registered with semantics that | number 25 and tag number 29 <xref target="IANA.cbor-tags" format="default"/>) ha ve been registered with semantics that | |||
may require processing at (de-)serialization time: The decoder needs to | may require processing at (de-)serialization time: the decoder needs to | |||
be aware and the encoder needs to be in control of the exact | be aware of, and the encoder needs to be in control of, the exact | |||
sequence in which data items are encoded into the CBOR data item. | sequence in which data items are encoded into the CBOR data item. | |||
This means these tags cannot be implemented on top of an arbitrary generic | This means these tags cannot be implemented on top of an arbitrary generic | |||
CBOR encoder/decoder (which might not reflect the serialization order | CBOR encoder/decoder (which might not reflect the serialization order | |||
for entries in a map at the data model level and vice versa); their | for entries in a map at the data model level and vice versa); their | |||
implementation therefore typically needs to be integrated into the | implementation therefore typically needs to be integrated into the | |||
generic encoder/decoder. The definition of new tags with this | generic encoder/decoder. The definition of new tags with this | |||
property is NOT RECOMMENDED.</t> | property is <bcp14>NOT RECOMMENDED</bcp14>.</t> | |||
<t>IANA allocated tag numbers 65535, 4294967295, and | <t>IANA allocated tag numbers 65535, 4294967295, and | |||
18446744073709551615 (binary all-ones in 16-bit, 32-bit, and 64-bit). | 18446744073709551615 (binary all-ones in 16-bit, 32-bit, and 64-bit). | |||
These can be used as a convenience for implementers | These can be used as a convenience for implementers | |||
that want a single integer data structure to indicate either that a specific tag | who want a single-integer data structure to indicate either the | |||
is | presence of a specific tag or absence of a tag. | |||
present, or the absence of a tag. | That allocation is described in <xref target="I-D.bormann-cbor-notable-tags" sec | |||
That allocation is described in Section 10 of <xref target="I-D.bormann-cbor-not | tion="10" sectionFormat="of" format="default"/>. | |||
able-tags" format="default"/>. | ||||
These tags are not intended to occur in actual CBOR data items; | These tags are not intended to occur in actual CBOR data items; | |||
implementations MAY flag such an occurrence as an error.</t> | implementations <bcp14>MAY</bcp14> flag such an occurrence as an error.</t> | |||
<t>Protocols using tag numbers 0 and 1 extend the generic data model | ||||
(<xref target="cbor-data-models" format="default"/>) with data items representin | <t>Protocols can extend the generic data model (<xref target="cbor-data- | |||
g points in time; | models" format="default"/>) with data | |||
tag numbers 2 and 3, with arbitrarily sized integers; and tag numbers | items representing points in time by using tag numbers 0 and 1, with | |||
4 and 5, with floating-point values of arbitrary size and precision.</t> | arbitrarily sized integers by using tag numbers 2 and 3, and with | |||
floating-point values of arbitrary size and precision by using tag | ||||
numbers 4 and 5.</t> | ||||
<section anchor="stringdatetimesect" toc="default"> | <section anchor="stringdatetimesect" toc="default"> | |||
<name>Standard Date/Time String</name> | <name>Standard Date/Time String</name> | |||
<t>Tag number 0 contains a text string in the standard format describe d by | <t>Tag number 0 contains a text string in the standard format describe d by | |||
the <tt>date-time</tt> production in <xref target="RFC3339" format="default"/>, | the <tt>date-time</tt> production in <xref target="RFC3339" format="default"/>, | |||
as refined by Section 3.3 | as refined by | |||
of <xref target="RFC4287" format="default"/>, representing the point in time des | <xref target="RFC4287" section="3.3" sectionFormat="of" format="default"/>, repr | |||
cribed there. A | esenting the point in time described there. A | |||
nested item of another type or a text string that doesn't match the <xref target | nested item of another type or a text string that doesn't match the | |||
="RFC4287" format="default"/> | format described in <xref target="RFC4287" format="default"/> is invalid.</t> | |||
format is invalid.</t> | ||||
</section> | </section> | |||
<section anchor="epochdatetimesect" toc="default"> | <section anchor="epochdatetimesect" toc="default"> | |||
<name>Epoch-based Date/Time</name> | <name>Epoch-Based Date/Time</name> | |||
<t>Tag number 1 contains a numerical value counting the number of seco nds | <t>Tag number 1 contains a numerical value counting the number of seco nds | |||
from 1970-01-01T00:00Z in UTC time to the represented point in civil | from 1970-01-01T00:00Z in UTC time to the represented point in civil | |||
time.</t> | time.</t> | |||
<t>The tag content MUST be an unsigned or negative integer (major type | <t>The tag content <bcp14>MUST</bcp14> be an unsigned or negative inte | |||
s 0 | ger (major types 0 | |||
and 1), or a floating-point number (major type 7 with additional | and 1) or a floating-point number (major type 7 with additional | |||
information 25, 26, or 27). Other contained types are invalid.</t> | information 25, 26, or 27). Other contained types are invalid.</t> | |||
<t>Non-negative values (major type 0 and non-negative floating-point | <t>Nonnegative values (major type 0 and nonnegative floating-point | |||
numbers) stand for time values on or after 1970-01-01T00:00Z UTC and | numbers) stand for time values on or after 1970-01-01T00:00Z UTC and | |||
are interpreted according to POSIX <xref target="TIME_T" format="default"/>. | are interpreted according to POSIX <xref target="TIME_T" format="default"/>. | |||
(POSIX time is also known as "UNIX Epoch time".) | (POSIX time is also known as "UNIX Epoch time".) | |||
Leap seconds | Leap seconds | |||
are handled specially by POSIX time and this results in a 1 second | are handled specially by POSIX time, and this results in a 1-second | |||
discontinuity several times per decade. | discontinuity several times per decade. | |||
Note that applications that require the expression of times beyond | Note that applications that require the expression of times beyond | |||
early 2106 cannot leave out support of 64-bit integers for the tag content.</t> | early 2106 cannot leave out support of 64-bit integers for the tag content.</t> | |||
<t>Negative values (major type 1 and negative floating-point numbers) are | <t>Negative values (major type 1 and negative floating-point numbers) are | |||
interpreted as determined by the application requirements as there is | interpreted as determined by the application requirements as there is | |||
no universal standard for UTC count-of-seconds time before | no universal standard for UTC count-of-seconds time before | |||
1970-01-01T00:00Z (this is particularly true for points in time that | 1970-01-01T00:00Z (this is particularly true for points in time that | |||
precede discontinuities in national calendars). The same applies to | precede discontinuities in national calendars). The same applies to | |||
non-finite values.</t> | non-finite values.</t> | |||
<t>To indicate fractional seconds, floating-point values can be used | <t>To indicate fractional seconds, floating-point values can be used | |||
within tag number 1 instead of integer values. Note that this generally | within tag number 1 instead of integer values. Note that this generally | |||
requires binary64 support, as binary16 and binary32 provide non-zero | requires binary64 support, as binary16 and binary32 provide nonzero | |||
fractions of seconds only for a short period of time around | fractions of seconds only for a short period of time around | |||
early 1970. An application that requires tag number 1 support may restrict | early 1970. An application that requires tag number 1 support may restrict | |||
the tag content to be an integer (or a floating-point value) only.</t> | the tag content to be an integer (or a floating-point value) only.</t> | |||
<t>Note that platform types for date/time may include null or undefine d | <t>Note that platform types for date/time may include <tt>null</tt> or <tt>undefined</tt> | |||
values, which may also be desirable at an application protocol level. | values, which may also be desirable at an application protocol level. | |||
While emitting tag number 1 values with non-finite tag content values | While emitting tag number 1 values with non-finite tag content values | |||
(e.g., with NaN for undefined date/time values or with Infinite for an | (e.g., with NaN for undefined date/time values or with Infinity for an | |||
expiry date that is not set) may seem an obvious way to handle this, | expiry date that is not set) may seem an obvious way to handle this, | |||
using untagged null or undefined avoids the use of non-finites and results in a shorter encoding. | using untagged <tt>null</tt> or <tt>undefined</tt> avoids the use of non-finites and results in a shorter encoding. | |||
Application protocol designers are encouraged to consider these cases | Application protocol designers are encouraged to consider these cases | |||
and include clear guidelines for handling them.</t> | and include clear guidelines for handling them.</t> | |||
</section> | </section> | |||
<section anchor="bignums" toc="default"> | <section anchor="bignums" toc="default"> | |||
<name>Bignums</name> | <name>Bignums</name> | |||
<t>Protocols using tag numbers 2 and 3 extend the generic data model | <t>Protocols using tag numbers 2 and 3 extend the generic data model | |||
(<xref target="cbor-data-models" format="default"/>) with "bignums" representing arbitrarily sized | (<xref target="cbor-data-models" format="default"/>) with "bignums" representing arbitrarily sized | |||
integers. In the basic generic data model, bignum values are not equal | integers. In the basic generic data model, bignum values are not equal | |||
to integers from the same model, but the extended generic data model | to integers from the same model, but the extended generic data model | |||
created by this tag definition defines equivalence based on numeric | created by this tag definition defines equivalence based on numeric | |||
value, and preferred serialization (<xref target="preferred" format="default"/>) never makes use of | value, and preferred serialization (<xref target="preferred" format="default"/>) never makes use of | |||
bignums that also can be expressed as basic integers (see below).</t> | bignums that also can be expressed as basic integers (see below).</t> | |||
<t>Bignums are encoded as a byte string data item, which is interprete d | <t>Bignums are encoded as a byte string data item, which is interprete d | |||
as an unsigned integer n in network byte order. Contained items of | as an unsigned integer n in network byte order. Contained items of | |||
other types are invalid. For tag number 2, the | other types are invalid. For tag number 2, the | |||
value of the bignum is n. For tag number 3, the value of the bignum is | value of the bignum is n. For tag number 3, the value of the bignum is | |||
-1 - n. The preferred serialization of the byte string is to leave out any | -1 - n. The preferred serialization of the byte string is to leave out any | |||
leading zeroes (note that this means the preferred serialization for n =&nb sp;0 | leading zeroes (note that this means the preferred serialization for n =&nb sp;0 | |||
is the empty byte string, but see below). | is the empty byte string, but see below). | |||
Decoders that understand these tags MUST be able to decode | Decoders that understand these tags <bcp14>MUST</bcp14> be able to decode | |||
bignums that do have leading zeroes. | bignums that do have leading zeroes. | |||
The preferred serialization of an integer that can be represented using | The preferred serialization of an integer that can be represented using | |||
major type 0 or 1 is to encode it this way instead of as a bignum | major type 0 or 1 is to encode it this way instead of as a bignum | |||
(which means that the empty string never occurs in a bignum when using | (which means that the empty string never occurs in a bignum when using | |||
preferred serialization). | preferred serialization). | |||
Note that this means the non-preferred choice of a bignum | Note that this means the non-preferred choice of a bignum | |||
representation instead of a basic integer for encoding a number is not | representation instead of a basic integer for encoding a number is not | |||
intended to have application semantics (just as the choice of a longer | intended to have application semantics (just as the choice of a longer | |||
basic integer representation than needed, such as 0x1800 for 0x00 does | basic integer representation than needed, such as 0x1800 for 0x00, does | |||
not).</t> | not).</t> | |||
<t>For example, the number 18446744073709551616 (2**64) is represented | <t>For example, the number 18446744073709551616 (2<sup>64</sup>) is re presented | |||
as 0b110_00010 (major type 6, tag number 2), followed by 0b010_01001 (major | as 0b110_00010 (major type 6, tag number 2), followed by 0b010_01001 (major | |||
type 2, length 9), followed by 0x010000000000000000 (one byte 0x01 and | type 2, length 9), followed by 0x010000000000000000 (one byte 0x01 and | |||
eight bytes 0x00). In hexadecimal:</t> | eight bytes 0x00). In hexadecimal:</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <artwork type="hex-dump"><![CDATA[ | |||
C2 -- Tag 2 | C2 -- Tag 2 | |||
49 -- Byte string of length 9 | 49 -- Byte string of length 9 | |||
010000000000000000 -- Bytes content | 010000000000000000 -- Bytes content | |||
]]></artwork> | ]]></artwork> | |||
</section> | </section> | |||
<section anchor="fractions" toc="default"> | <section anchor="fractions" toc="default"> | |||
<name>Decimal Fractions and Bigfloats</name> | <name>Decimal Fractions and Bigfloats</name> | |||
<t>Protocols using tag number 4 extend the generic data model with dat a | <t>Protocols using tag number 4 extend the generic data model with dat a | |||
items representing arbitrary-length decimal fractions of the form m*(10**e). | items representing arbitrary-length decimal fractions of the form m*(10<sup>e</s up>). | |||
Protocols using tag number 5 extend the generic data model with data | Protocols using tag number 5 extend the generic data model with data | |||
items representing arbitrary-length binary fractions of the form m*(2**e). | items representing arbitrary-length binary fractions of the form m*(2<sup>e</sup >). | |||
As with | As with | |||
bignums, values of different types are not equal in the generic data | bignums, values of different types are not equal in the generic data | |||
model.</t> | model.</t> | |||
<t>Decimal fractions combine an integer mantissa with a base-10 scalin g | <t>Decimal fractions combine an integer mantissa with a base-10 scalin g | |||
factor. They are most useful if an application needs the exact | factor. They are most useful if an application needs the exact | |||
representation of a decimal fraction such as 1.1 because there is no | representation of a decimal fraction such as 1.1 because there is no | |||
exact representation for many decimal fractions in binary | exact representation for many decimal fractions in binary | |||
floating-point representations.</t> | floating-point representations.</t> | |||
<t>"Bigfloats" combine an integer mantissa with a base-2 scaling facto r. | <t>"Bigfloats" combine an integer mantissa with a base-2 scaling facto r. | |||
They are binary floating-point values that can exceed the range or the | They are binary floating-point values that can exceed the range or the | |||
precision of the three IEEE 754 formats supported by CBOR | precision of the three IEEE 754 formats supported by CBOR | |||
(<xref target="fpnocont" format="default"/>). Bigfloats may also be used by con strained | (<xref target="fpnocont" format="default"/>). Bigfloats may also be used by con strained | |||
applications that need some basic binary floating-point capability | applications that need some basic binary floating-point capability | |||
without the need for supporting IEEE 754.</t> | without the need for supporting IEEE 754.</t> | |||
<t>A decimal fraction or a bigfloat is represented as a tagged array t hat | <t>A decimal fraction or a bigfloat is represented as a tagged array t hat | |||
contains exactly two integer numbers: an exponent e and a mantissa m. | contains exactly two integer numbers: an exponent e and a mantissa m. | |||
Decimal fractions (tag number 4) use base-10 exponents; the value of a | Decimal fractions (tag number 4) use base-10 exponents; the value of a | |||
decimal fraction data item is m*(10**e). Bigfloats (tag number 5) use | decimal fraction data item is m*(10<sup>e</sup>). Bigfloats (tag number 5) use | |||
base-2 exponents; the value of a bigfloat data item is m*(2**e). | base-2 exponents; the value of a bigfloat data item is m*(2<sup>e</sup>). | |||
The exponent e MUST be represented in an integer of major type 0 or 1, | The exponent e <bcp14>MUST</bcp14> be represented in an integer of major type 0 | |||
or 1, | ||||
while the mantissa can also be a bignum (<xref target="bignums" format="default" />). Contained | while the mantissa can also be a bignum (<xref target="bignums" format="default" />). Contained | |||
items with other structures are invalid.</t> | items with other structures are invalid.</t> | |||
<t>An example of a decimal fraction is that the number 273.15 could be | <t>An example of a decimal fraction is the representation of the numbe | |||
represented as 0b110_00100 (major type 6 for tag, additional | r 273.15 | |||
as 0b110_00100 (major type 6 for tag, additional | ||||
information 4 for the tag number), followed by 0b100_00010 (major | information 4 for the tag number), followed by 0b100_00010 (major | |||
type 4 for the array, additional information 2 for the length of | type 4 for the array, additional information 2 for the length of | |||
the array), followed by 0b001_00001 (major type 1 for the first | the array), followed by 0b001_00001 (major type 1 for the first | |||
integer, additional information 1 for the value of -2), followed by | integer, additional information 1 for the value of -2), followed by | |||
0b000_11001 (major type 0 for the second integer, additional | 0b000_11001 (major type 0 for the second integer, additional | |||
information 25 for a two-byte value), followed by | information 25 for a two-byte value), followed by | |||
0b0110101010110011 (27315 in two bytes). In hexadecimal:</t> | 0b0110101010110011 (27315 in two bytes). In hexadecimal:</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <artwork type="hex-dump"><![CDATA[ | |||
C4 -- Tag 4 | C4 -- Tag 4 | |||
82 -- Array of length 2 | 82 -- Array of length 2 | |||
21 -- -2 | 21 -- -2 | |||
19 6ab3 -- 27315 | 19 6ab3 -- 27315 | |||
]]></artwork> | ]]></artwork> | |||
<t>An example of a bigfloat is that the number 1.5 could be represente d | <t>An example of a bigfloat is the representation of the number 1.5 | |||
as 0b110_00101 (major type 6 for tag, additional information | as 0b110_00101 (major type 6 for tag, additional information | |||
5 for the tag number), followed by 0b100_00010 (major type 4 for | 5 for the tag number), followed by 0b100_00010 (major type 4 for | |||
the array, additional information 2 for the length of the array), | the array, additional information 2 for the length of the array), | |||
followed by 0b001_00000 (major type 1 for the first integer, | followed by 0b001_00000 (major type 1 for the first integer, | |||
additional information 0 for the value of -1), followed by | additional information 0 for the value of -1), followed by | |||
0b000_00011 (major type 0 for the second integer, additional | 0b000_00011 (major type 0 for the second integer, additional | |||
information 3 for the value of 3). In hexadecimal:</t> | information 3 for the value of 3). In hexadecimal:</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <artwork type="hex-dump"><![CDATA[ | |||
C5 -- Tag 5 | C5 -- Tag 5 | |||
82 -- Array of length 2 | 82 -- Array of length 2 | |||
20 -- -1 | 20 -- -1 | |||
03 -- 3 | 03 -- 3 | |||
]]></artwork> | ]]></artwork> | |||
<t>Decimal fractions and bigfloats provide no representation of Infini ty, | <t>Decimal fractions and bigfloats provide no representation of Infini ty, | |||
-Infinity, or NaN; if these are needed in place of a decimal fraction | -Infinity, or NaN; if these are needed in place of a decimal fraction | |||
or bigfloat, the IEEE 754 half-precision representations from | or bigfloat, the IEEE 754 half-precision representations from | |||
<xref target="fpnocont" format="default"/> can be used.</t> | <xref target="fpnocont" format="default"/> can be used.</t> | |||
</section> | </section> | |||
skipping to change at line 1210 ¶ | skipping to change at line 1248 ¶ | |||
usage. That usage specifies that some strings are encoded as base64, | usage. That usage specifies that some strings are encoded as base64, | |||
base64url, and so on. The encoder uses byte strings instead of doing | base64url, and so on. The encoder uses byte strings instead of doing | |||
the encoding itself to reduce the message size, to reduce the code | the encoding itself to reduce the message size, to reduce the code | |||
size of the encoder, or both. The encoder does not know whether or | size of the encoder, or both. The encoder does not know whether or | |||
not the converter will be generic, and therefore wants to say what it | not the converter will be generic, and therefore wants to say what it | |||
believes is the proper way to convert binary strings to JSON.</t> | believes is the proper way to convert binary strings to JSON.</t> | |||
<t>The data item tagged can be a byte string or any other data item. In | <t>The data item tagged can be a byte string or any other data item. In | |||
the latter case, the tag applies to all of the byte string data items | the latter case, the tag applies to all of the byte string data items | |||
contained in the data item, except for those contained in a nested | contained in the data item, except for those contained in a nested | |||
data item tagged with an expected conversion.</t> | data item tagged with an expected conversion.</t> | |||
<t>These three tag numbers suggest conversions to three of the base | <t>These three tag numbers suggest conversions to three of | |||
data | the base data encodings defined in <xref target="RFC4648" format="default"/>. | |||
encodings defined in <xref target="RFC4648" format="default"/>. Tag number 21 | Tag number 21 suggests conversion to base64url encoding | |||
suggests conversion | (<xref target="RFC4648" section="5" sectionFormat="of" format="default"/>) | |||
to base64url encoding (Section 5 of RFC 4648), where | where padding is not used (see | |||
padding is not used (see Section 3.2 of RFC 4648); that is, all | <xref target="RFC4648" section="3.2" sectionFormat="of" format="default"/>); | |||
trailing equals signs ("=") are removed from the encoded string. | that is, all trailing equals signs ("=") are removed from the encoded string. | |||
Tag number 22 suggests conversion to classical base64 encoding (Section 4 of RFC | Tag number 22 suggests conversion to classical base64 encoding | |||
4648), with padding as defined in RFC 4648. | (<xref target="RFC4648" section="4" sectionFormat="of" format="default"/>) | |||
with padding as defined in RFC 4648. | ||||
For both base64url and base64, padding bits are set to zero (see | For both base64url and base64, padding bits are set to zero (see | |||
Section 3.5 of RFC 4648), and the conversion to alternate encoding | <xref target="RFC4648" section="3.5" sectionFormat="of" format="default"/>), | |||
and the conversion to alternate encoding | ||||
is performed on the contents of the byte string (that is, without adding any lin e breaks, whitespace, or | is performed on the contents of the byte string (that is, without adding any lin e breaks, whitespace, or | |||
other additional characters). Tag number 23 suggests conversion to | other additional characters). Tag number 23 suggests conversion to | |||
base16 (hex) encoding, with uppercase alphabetics (see Section 8 of RFC 4648). | base16 (hex) encoding with uppercase alphabetics (see | |||
<xref target="RFC4648" section="8" sectionFormat="of" format="default"/>). | ||||
Note that, for all three tag numbers, the | Note that, for all three tag numbers, the | |||
encoding of the empty byte string is the empty text string.</t> | encoding of the empty byte string is the empty text string.</t> | |||
</section> | </section> | |||
<section anchor="encodedtext" toc="default"> | <section anchor="encodedtext" toc="default"> | |||
<name>Encoded Text</name> | <name>Encoded Text</name> | |||
<t>Some text strings hold data that have formats widely used on the | <t>Some text strings hold data that have formats widely used on the | |||
Internet, and sometimes those formats can be validated and presented | Internet, and sometimes those formats can be validated and presented | |||
to the application in appropriate form by the decoder. There are tags | to the application in appropriate form by the decoder. There are tags | |||
for some of these formats.</t> | for some of these formats.</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>Tag number 32 is for URIs, as defined in <xref target="RFC3986 " format="default"/>. If the text string | <li>Tag number 32 is for URIs, as defined in <xref target="RFC3986 " format="default"/>. If the text string | |||
doesn't match the <tt>URI-reference</tt> production, the string is invalid.</li> | doesn't match the <tt>URI-reference</tt> production, the string is invalid.</li> | |||
<li> | <li> | |||
<t>Tag numbers 33 and 34 are for base64url- and base64-encoded t ext | <t>Tag numbers 33 and 34 are for base64url- and base64-encoded t ext | |||
strings, respectively, | strings, respectively, | |||
as defined in <xref target="RFC4648" format="default"/>. If any of: | as defined in <xref target="RFC4648" format="default"/>. If any of the followin g apply: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>the encoded text string contains non-alphabet characters o r only 1 | <li>the encoded text string contains non-alphabet characters o r only 1 | |||
alphabet character in the last block of 4 (where alphabet is | alphabet character in the last block of 4 (where alphabet is | |||
defined by Section 5 of <xref target="RFC4648" format="default"/> for tag number | defined by <xref target="RFC4648" section="5" sectionFormat="of" format="default | |||
33 and Section | "/> for tag number 33 and | |||
4 of <xref target="RFC4648" format="default"/> for tag number 34), or</li> | <xref target="RFC4648" section="4" sectionFormat="of" format="default"/> for tag | |||
number 34), or</li> | ||||
<li>the padding bits in a 2- or 3-character block are not 0, o r</li> | <li>the padding bits in a 2- or 3-character block are not 0, o r</li> | |||
<li>the base64 encoding has the wrong number of padding charac ters, or</li> | <li>the base64 encoding has the wrong number of padding charac ters, or</li> | |||
<li>the base64url encoding has padding characters,</li> | <li>the base64url encoding has padding characters,</li> | |||
</ul> | </ul> | |||
<t> | <t> | |||
the string is invalid.</t> | the string is invalid.</t> | |||
</li> | </li> | |||
<li>Tag number 36 is for MIME messages (including all headers), as defined in | <li>Tag number 36 is for MIME messages (including all headers), as defined in | |||
<xref target="RFC2045" format="default"/>. A text string that isn't a valid MIME message is | <xref target="RFC2045" format="default"/>. A text string that isn't a valid MIME message is | |||
invalid. (For this tag, validity checking | invalid. (For this tag, validity checking | |||
may be particularly onerous for a generic decoder and might | may be particularly onerous for a generic decoder and might | |||
therefore not be offered. Note that many MIME messages are general | therefore not be offered. Note that many MIME messages are general | |||
binary data and can therefore not be represented in a text string; | binary data and therefore cannot be represented in a text string; | |||
<xref target="IANA.cbor-tags" format="default"/> lists a registration for tag nu mber 257 that is | <xref target="IANA.cbor-tags" format="default"/> lists a registration for tag nu mber 257 that is | |||
similar to tag number 36 but uses a byte string as its tag content.)</li> | similar to tag number 36 but uses a byte string as its tag content.)</li> | |||
</ul> | </ul> | |||
<t>Note that tag numbers 33 and 34 differ from 21 and 22 in that the data is | <t>Note that tag numbers 33 and 34 differ from 21 and 22 in that the data is | |||
transported in base-encoded form for the former and in raw byte string | transported in base-encoded form for the former and in raw byte string | |||
form for the latter.</t> | form for the latter.</t> | |||
<t><xref target="RFC7049" format="default"/> also defined a tag numb er 35, for regular expressions that | <t><xref target="RFC7049" format="default"/> also defined a tag numb er 35 for regular expressions that | |||
are in Perl Compatible Regular Expressions (PCRE/PCRE2) form <xref target="PCRE" format="default"/> | are in Perl Compatible Regular Expressions (PCRE/PCRE2) form <xref target="PCRE" format="default"/> | |||
or in JavaScript regular expression syntax <xref target="ECMA262" format="defaul t"/>. | or in JavaScript regular expression syntax <xref target="ECMA262" format="defaul t"/>. | |||
The state of the art in these regular expression specifications has | The state of the art in these regular expression specifications has | |||
since advanced and is continually advancing, so the present | since advanced and is continually advancing, so this | |||
specification does not attempt to update the references to a snapshot | specification does not attempt to update the references. | |||
that is current at the time of writing. | ||||
Instead, this tag remains available (as registered in <xref target="RFC7049" for mat="default"/>) for | Instead, this tag remains available (as registered in <xref target="RFC7049" for mat="default"/>) for | |||
applications that specify the particular regular expression variant | applications that specify the particular regular expression variant | |||
they use out-of-band (possibly by limiting the usage to a defined | they use out-of-band (possibly by limiting the usage to a defined | |||
common subset of both PCRE and ECMA262). | common subset of both PCRE and ECMA262). | |||
As the present specification clarifies tag validity beyond | As this specification clarifies tag validity beyond | |||
<xref target="RFC7049" format="default"/>, we note that due to the open way the tag was defined in | <xref target="RFC7049" format="default"/>, we note that due to the open way the tag was defined in | |||
<xref target="RFC7049" format="default"/>, any contained string value needs to b e valid at the CBOR | <xref target="RFC7049" format="default"/>, any contained string value needs to b e valid at the CBOR | |||
tag level (but may then not be "expected" at the application level).</t> | tag level (but then may not be "expected" at the application level).</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="self-describe" toc="default"> | <section anchor="self-describe" toc="default"> | |||
<name>Self-Described CBOR</name> | <name>Self-Described CBOR</name> | |||
<t>In many applications, it will be clear from the context that CBOR i s | <t>In many applications, it will be clear from the context that CBOR i s | |||
being employed for encoding a data item. For instance, a specific | being employed for encoding a data item. For instance, a specific | |||
protocol might specify the use of CBOR, or a media type is indicated | protocol might specify the use of CBOR, or a media type is indicated | |||
that specifies its use. However, there may be applications where such | that specifies its use. However, there may be applications where such | |||
context information is not available, such as when CBOR data is stored | context information is not available, such as when CBOR data is stored | |||
in a file that does not have disambiguating metadata. Here, it may | in a file that does not have disambiguating metadata. Here, it may | |||
skipping to change at line 1314 ¶ | skipping to change at line 1357 ¶ | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="serialization-considerations" toc="default"> | <section anchor="serialization-considerations" toc="default"> | |||
<name>Serialization Considerations</name> | <name>Serialization Considerations</name> | |||
<section anchor="preferred" toc="default"> | <section anchor="preferred" toc="default"> | |||
<name>Preferred Serialization</name> | <name>Preferred Serialization</name> | |||
<t>For some values at the data model level, CBOR provides multiple | <t>For some values at the data model level, CBOR provides multiple | |||
serializations. | serializations. | |||
For many applications, it is desirable that an encoder always chooses | For many applications, it is desirable that an encoder always chooses | |||
a preferred serialization (preferred encoding); however, the present specificati on does not | a preferred serialization (preferred encoding); however, the present specificati on does not | |||
put the burden of enforcing this preference on either encoder or decoder.</t> | put the burden of enforcing this preference on either the encoder or decoder.</t > | |||
<t>Some constrained decoders may be limited in their ability to decode | <t>Some constrained decoders may be limited in their ability to decode | |||
non-preferred serializations: For example, if only integers below | non-preferred serializations: for example, if only integers below | |||
1_000_000_000 (one billion) are expected in an application, the decoder may leav | 1_000_000_000 (one billion) are expected in an application, the | |||
e | decoder may leave out the code that would be needed to decode 64-bit | |||
out the code that would be needed to decode 64-bit arguments in | arguments in integers. An encoder that always uses preferred | |||
integers. An encoder that always | serialization ("preferred encoder") interoperates with this decoder | |||
uses preferred serialization ("preferred encoder") interoperates with this decod | for the numbers that can occur in this application. Generally | |||
er for the | speaking, a preferred encoder is more universally interoperable (and | |||
numbers that can occur in this application. | also less wasteful) than one that, say, always uses 64-bit | |||
More generally speaking, it therefore can be said that a preferred encoder | integers.</t> | |||
is more universally | ||||
interoperable (and also less wasteful) than one that, say, always uses | ||||
64-bit integers.</t> | ||||
<t>Similarly, a constrained encoder may be limited in the variety of | <t>Similarly, a constrained encoder may be limited in the variety of | |||
representation variants it supports in such a way that it does not | representation variants it supports such that it does not | |||
emit preferred serializations ("variant encoder"): Say, it could | emit preferred serializations ("variant encoder"). For instance, a constrained e | |||
ncoder could | ||||
be designed to | be designed to | |||
always use the 32-bit variant for an integer that it encodes even if a | always use the 32-bit variant for an integer that it encodes even if a | |||
short representation is available (again, | short representation is available (assuming that there is no application need fo | |||
assuming that there is no application need for integers that can only | r integers that can only | |||
be represented with the 64-bit variant). | be represented with the 64-bit variant). | |||
A decoder that does not rely on only ever | A decoder that does not rely on | |||
receiving preferred serializations ("variation-tolerant decoder") can therefore | receiving only preferred serializations ("variation-tolerant decoder") can there | |||
be said to be more | fore be said to be more | |||
universally interoperable (it might very well optimize for the case of | universally interoperable (it might very well optimize for the case of | |||
receiving preferred serializations, though). | receiving preferred serializations, though). | |||
Full implementations of CBOR decoders are by definition | Full implementations of CBOR decoders are by definition | |||
variation-tolerant; the distinction is only relevant if a constrained | variation tolerant; the distinction is only relevant if a constrained | |||
implementation of a CBOR decoder meets a variant encoder.</t> | implementation of a CBOR decoder meets a variant encoder.</t> | |||
<t>The preferred serialization always uses the shortest form of | <t>The preferred serialization always uses the shortest form of | |||
representing the argument (<xref target="encoding" format="default"/>); it also uses the shortest | representing the argument (<xref target="encoding" format="default"/>); it also uses the shortest | |||
floating-point encoding that preserves the value being encoded.</t> | floating-point encoding that preserves the value being encoded.</t> | |||
<t>The preferred serialization for a floating-point value is the shortes t | <t>The preferred serialization for a floating-point value is the shortes t | |||
floating-point encoding that preserves its value, e.g., 0xf94580 for | floating-point encoding that preserves its value, e.g., 0xf94580 for | |||
the number 5.5, and 0xfa45ad9c00 for the number 5555.5. For NaN | the number 5.5, and 0xfa45ad9c00 for the number 5555.5. For NaN | |||
values, a shorter encoding is preferred if zero-padding the shorter | values, a shorter encoding is preferred if zero-padding the shorter | |||
significand towards the right reconstitutes the original NaN value | significand towards the right reconstitutes the original NaN value | |||
(for many applications, the single NaN encoding 0xf97e00 will | (for many applications, the single NaN encoding 0xf97e00 will | |||
suffice).</t> | suffice).</t> | |||
<t>Definite length encoding is preferred whenever the length is known at | <t>Definite-length encoding is preferred whenever the length is known at | |||
the time the serialization of the item starts.</t> | the time the serialization of the item starts.</t> | |||
</section> | </section> | |||
<section anchor="det-enc" toc="default"> | <section anchor="det-enc" toc="default"> | |||
<name>Deterministically Encoded CBOR</name> | <name>Deterministically Encoded CBOR</name> | |||
<t>Some protocols may want encoders to only emit CBOR in a particular | <t>Some protocols may want encoders to only emit CBOR in a particular | |||
deterministic format; those protocols might also have the decoders check | deterministic format; those protocols might also have the decoders check | |||
that their input is in that deterministic format. Those protocols are | that their input is in that deterministic format. Those protocols are | |||
free to define what | free to define what | |||
they mean by a "deterministic format" and what encoders and decoders are | they mean by a "deterministic format" and what encoders and decoders are | |||
expected to do. This section defines a set of restrictions that can | expected to do. This section defines a set of restrictions that can | |||
serve as the base of such a deterministic format.</t> | serve as the base of such a deterministic format.</t> | |||
<section anchor="core-det" toc="default"> | <section anchor="core-det" toc="default"> | |||
<name>Core Deterministic Encoding Requirements</name> | <name>Core Deterministic Encoding Requirements</name> | |||
<t>A CBOR encoding satisfies the "core deterministic encoding requirem ents" if | <t>A CBOR encoding satisfies the "core deterministic encoding requirem ents" if | |||
it satisfies the following restrictions:</t> | it satisfies the following restrictions:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li> | <li> | |||
<t>Preferred serialization MUST be used. In particular, this mean s | <t>Preferred serialization <bcp14>MUST</bcp14> be used. In partic ular, this means | |||
that arguments (see <xref target="encoding" format="default"/>) for integers, le ngths in major types | that arguments (see <xref target="encoding" format="default"/>) for integers, le ngths in major types | |||
2 through 5, and tags MUST be as short as possible, for instance: </t> | 2 through 5, and tags <bcp14>MUST</bcp14> be as short as possible, for instance: </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>0 to 23 and -1 to -24 MUST be expressed in the same byte as the | <li>0 to 23 and -1 to -24 <bcp14>MUST</bcp14> be expressed in th e same byte as the | |||
major type;</li> | major type;</li> | |||
<li>24 to 255 and -25 to -256 MUST be expressed only with an | <li>24 to 255 and -25 to -256 <bcp14>MUST</bcp14> be expressed o nly with an | |||
additional uint8_t;</li> | additional uint8_t;</li> | |||
<li>256 to 65535 and -257 to -65536 MUST be expressed only with an | <li>256 to 65535 and -257 to -65536 <bcp14>MUST</bcp14> be expre ssed only with an | |||
additional uint16_t;</li> | additional uint16_t;</li> | |||
<li>65536 to 4294967295 and -65537 to -4294967296 MUST be expres sed | <li>65536 to 4294967295 and -65537 to -4294967296 <bcp14>MUST</b cp14> be expressed | |||
only with an additional uint32_t.</li> | only with an additional uint32_t.</li> | |||
</ul> | </ul> | |||
<t> | <t> | |||
Floating-point values also MUST use the shortest form that preserves | Floating-point values also <bcp14>MUST</bcp14> use the shortest form that preser | |||
the value, e.g. 1.5 is encoded as 0xf93e00 (binary16) and 1000000.5 as | ves | |||
the value, e.g., 1.5 is encoded as 0xf93e00 (binary16) and 1000000.5 as | ||||
0xfa49742408 (binary32). | 0xfa49742408 (binary32). | |||
(One implementation of this is to have all floats start as a 64-bit | (One implementation of this is to have all floats start as a 64-bit | |||
float, then do a test conversion to a 32-bit float; if the result is | float, then do a test conversion to a 32-bit float; if the result is | |||
the same numeric value, use the shorter form and repeat the process | the same numeric value, use the shorter form and repeat the process | |||
with a test conversion to a 16-bit float. This also works to select | with a test conversion to a 16-bit float. This also works to select | |||
16-bit float for positive and negative Infinity as well.)</t> | 16-bit float for positive and negative Infinity as well.)</t> | |||
</li> | </li> | |||
<li>Indefinite-length items MUST NOT appear. They can be encoded as | <li>Indefinite-length items <bcp14>MUST NOT</bcp14> appear. They can be encoded as | |||
definite-length items instead.</li> | definite-length items instead.</li> | |||
<li> | <li> | |||
<t>The keys in every map MUST be sorted in the bytewise lexicograp | <t>The keys in every map <bcp14>MUST</bcp14> be sorted in the | |||
hic | bytewise lexicographic order of their deterministic | |||
order of their deterministic encodings. For example, the following keys | encodings. For example, the following keys are sorted correctly: | |||
are sorted correctly: </t> | </t> | |||
<ol spacing="normal" type="1"><li>10, encoded as 0x0a.</li> | <ol spacing="normal" type="1"><li>10, encoded as 0x0a.</li> | |||
<li>100, encoded as 0x1864.</li> | <li>100, encoded as 0x1864.</li> | |||
<li>-1, encoded as 0x20.</li> | <li>-1, encoded as 0x20.</li> | |||
<li>"z", encoded as 0x617a.</li> | <li>"z", encoded as 0x617a.</li> | |||
<li>"aa", encoded as 0x626161.</li> | <li>"aa", encoded as 0x626161.</li> | |||
<li>[100], encoded as 0x811864.</li> | <li>[100], encoded as 0x811864.</li> | |||
<li>[-1], encoded as 0x8120.</li> | <li>[-1], encoded as 0x8120.</li> | |||
<li>false, encoded as 0xf4.</li> | <li>false, encoded as 0xf4.</li> | |||
</ol> | </ol> | |||
<t> | </li> | |||
(Implementation note: the self-delimiting nature of the CBOR | </ul> | |||
<aside><t> | ||||
Implementation note: the self-delimiting nature of the CBOR | ||||
encoding means that there are no two well-formed CBOR encoded data | encoding means that there are no two well-formed CBOR encoded data | |||
items where one is a prefix of the other. | items where one is a prefix of the other. | |||
The bytewise lexicographic comparison of deterministic encodings of | The bytewise lexicographic comparison of deterministic encodings of | |||
different map keys therefore always ends in a position where the | different map keys therefore always ends in a position where the | |||
byte differs between the keys, before the end of a key is reached.)</t> | byte differs between the keys, before the end of a key is reached.</t></aside> | |||
</li> | ||||
</ul> | ||||
</section> | </section> | |||
<section anchor="additional-deterministic-encoding-considerations" toc=" default"> | <section anchor="additional-deterministic-encoding-considerations" toc=" default"> | |||
<name>Additional Deterministic Encoding Considerations</name> | <name>Additional Deterministic Encoding Considerations</name> | |||
<t>CBOR tags present additional considerations for deterministic | <t>CBOR tags present additional considerations for deterministic | |||
encoding. If a CBOR-based protocol were to provide the same semantics | encoding. If a CBOR-based protocol were to provide the same semantics | |||
for the presence and absence of a specific tag (e.g., by allowing both | for the presence and absence of a specific tag (e.g., by allowing both | |||
tag 1 data items and raw numbers in a date/time position, treating the | tag 1 data items and raw numbers in a date/time position, treating the | |||
latter as if they were tagged), the deterministic format would not | latter as if they were tagged), the deterministic format would not | |||
allow the presence of the tag, based on the "shortest form" principle. | allow the presence of the tag, based on the "shortest form" principle. | |||
For example, a protocol might give encoders the choice of representing a URL as | For example, a protocol might give encoders the choice of representing a URL as | |||
either a text string or, using <xref target="encodedtext" format="default"/>, ta g number 32 containing a | either a text string or, using <xref target="encodedtext" format="default"/>, ta g number 32 containing a | |||
text string. This protocol's deterministic encoding needs to either | text string. This protocol's deterministic encoding needs either to | |||
require that the tag is present or require that it is absent, not | require that the tag is present or to require that it is absent, not | |||
allow either one.</t> | allow either one.</t> | |||
<t>In a protocol that does require tags in certain places to | <t>In a protocol that does require tags in certain places to | |||
obtain specific semantics, the tag needs to appear in the | obtain specific semantics, the tag needs to appear in the | |||
deterministic format as well. Deterministic encoding considerations | deterministic format as well. Deterministic encoding considerations | |||
also apply to the content of tags.</t> | also apply to the content of tags.</t> | |||
<t>If a protocol includes a field that can express integers with an | <t>If a protocol includes a field that can express integers with an | |||
absolute value of 2^64 or larger using tag numbers 2 or 3 | absolute value of 2<sup>64</sup> or larger using tag numbers 2 or 3 | |||
(<xref target="bignums" format="default"/>), the protocol's deterministic encodi ng needs to specify | (<xref target="bignums" format="default"/>), the protocol's deterministic encodi ng needs to specify | |||
whether smaller integers are also expressed using these tags or using | whether smaller integers are also expressed using these tags or using | |||
major types 0 and 1. Preferred serialization uses the latter choice, | major types 0 and 1. Preferred serialization uses the latter choice, | |||
which is therefore recommended.</t> | which is therefore recommended.</t> | |||
<t>Protocols that include floating-point values, whether represented | <t>Protocols that include floating-point values, whether represented | |||
using basic floating-point values (<xref target="fpnocont" format="default"/>) o r using tags (or | using basic floating-point values (<xref target="fpnocont" format="default"/>) o r using tags (or | |||
both), may need to define extra requirements on their deterministic | both), may need to define extra requirements on their deterministic | |||
encodings, such as:</t> | encodings, such as:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>Although IEEE floating-point values can represent both positive and negative zero as | <li>Although IEEE floating-point values can represent both positive and negative zero as | |||
skipping to change at line 1457 ¶ | skipping to change at line 1499 ¶ | |||
decide to represent all zero values with a positive sign, disallowing | decide to represent all zero values with a positive sign, disallowing | |||
negative zero. | negative zero. | |||
(The application may also want to restrict the precision of | (The application may also want to restrict the precision of | |||
floating-point values in such a way that there is never a need to represent | floating-point values in such a way that there is never a need to represent | |||
64-bit -- or even 32-bit -- floating-point values.)</li> | 64-bit -- or even 32-bit -- floating-point values.)</li> | |||
<li> | <li> | |||
<t>If a protocol includes a field that can express floating-point values, | <t>If a protocol includes a field that can express floating-point values, | |||
with a specific data model that declares integer and | with a specific data model that declares integer and | |||
floating-point values to be interchangeable, the protocol's | floating-point values to be interchangeable, the protocol's | |||
deterministic encoding needs to specify | deterministic encoding needs to specify | |||
whether (for example) the integer 1.0 is encoded as 0x01 (unsigned | whether, for example, the integer 1.0 is encoded as 0x01 (unsigned | |||
integer), 0xf93c00 (binary16), 0xfa3f800000 (binary32), | integer), 0xf93c00 (binary16), 0xfa3f800000 (binary32), | |||
or 0xfb3ff0000000000000 (binary64). Example rules for this are: | or 0xfb3ff0000000000000 (binary64). Example rules for this are: | |||
</t> | </t> | |||
<ol spacing="normal" type="1"><li>Encode integral values that fit in 64 bits as values from major | <ol spacing="normal" type="1"><li>Encode integral values that fit in 64 bits as values from major | |||
types 0 and 1, and other values as the preferred (smallest of 16-, 32-, or | types 0 and 1, and other values as the preferred (smallest of 16-, 32-, or | |||
64-bit) floating-point representation that accurately represents the value,</li> | 64-bit) floating-point representation that accurately represents the value,</li> | |||
<li>Encode all values as the preferred | <li>Encode all values as the preferred | |||
floating-point representation that accurately represents the | floating-point representation that accurately represents the | |||
value, even for integral values, or</li> | value, even for integral values, or</li> | |||
<li>Encode all values as 64-bit floating-point representations.< /li> | <li>Encode all values as 64-bit floating-point representations.< /li> | |||
</ol> | </ol> | |||
<t> | <t> | |||
Rule 1 straddles the boundaries between integers and floating-point | Rule 1 straddles the boundaries between integers and floating-point | |||
values, and Rule 3 does not use preferred serialization, so Rule 2 may be | values, and Rule 3 does not use preferred serialization, so Rule 2 may be | |||
a good choice in many cases.</t> | a good choice in many cases.</t> | |||
</li> | </li> | |||
<li>If NaN is an allowed value and there is no intent to support NaN | <li>If NaN is an allowed value, and there is no intent to support Na N | |||
payloads or signaling NaNs, the protocol needs to pick a single | payloads or signaling NaNs, the protocol needs to pick a single | |||
representation, typically 0xf97e00. If that simple choice is not | representation, typically 0xf97e00. If that simple choice is not | |||
possible, specific attention will be needed for NaN handling.</li> | possible, specific attention will be needed for NaN handling.</li> | |||
<li>Subnormal numbers (nonzero numbers with the lowest possible expo nent | <li>Subnormal numbers (nonzero numbers with the lowest possible expo nent | |||
of a given IEEE 754 number format) may be flushed to zero outputs or | of a given IEEE 754 number format) may be flushed to zero outputs or | |||
be treated as zero inputs in some floating-point implementations. | be treated as zero inputs in some floating-point implementations. | |||
A protocol's deterministic encoding may want to specifically | A protocol's deterministic encoding may want to specifically | |||
accommodate such implementations while creating an onus on other | accommodate such implementations while creating an onus on other | |||
implementations, by excluding subnormal numbers from interchange, | implementations by excluding subnormal numbers from interchange, | |||
interchanging zero instead.</li> | interchanging zero instead.</li> | |||
<li>The same number can be represented by different decimal fraction s, | <li>The same number can be represented by different decimal fraction s, | |||
by different bigfloats, and by different forms under other tags that | by different bigfloats, and by different forms under other tags that | |||
may be defined to express numeric values. Depending on the | may be defined to express numeric values. Depending on the | |||
implementation, it may not always be practical to determine whether | implementation, it may not always be practical to determine whether | |||
any of these forms (or forms in the basic generic data model) are | any of these forms (or forms in the basic generic data model) are | |||
equivalent. An application protocol that presents choices of this | equivalent. An application protocol that presents choices of this | |||
kind for the representation format of numbers needs to be explicit | kind for the representation format of numbers needs to be explicit | |||
in how the formats are to be chosen for deterministic encoding.</li> | about how the formats for deterministic encoding are to be chosen.</li> | |||
</ul> | </ul> | |||
</section> | </section> | |||
<section anchor="length-first" toc="default"> | <section anchor="length-first" toc="default"> | |||
<name>Length-first Map Key Ordering</name> | <name>Length-First Map Key Ordering</name> | |||
<t>The core deterministic encoding requirements (<xref target="core-de t" format="default"/>) sort map keys in a different | <t>The core deterministic encoding requirements (<xref target="core-de t" format="default"/>) sort map keys in a different | |||
order from the one suggested by Section 3.9 of <xref target="RFC7049" format="de fault"/> (called | order from the one suggested by <xref target="RFC7049" section="3.9" sectionForm at="of" format="default"/> (called | |||
"Canonical CBOR" there). Protocols that need to | "Canonical CBOR" there). Protocols that need to | |||
be compatible with <xref target="RFC7049" format="default"/>'s order can instead be specified in | be compatible with the order specified in <xref target="RFC7049" format="default "/> can instead be specified in | |||
terms of this specification's "length-first core deterministic encoding | terms of this specification's "length-first core deterministic encoding | |||
requirements":</t> | requirements":</t> | |||
<t>A CBOR encoding satisfies the "length-first core deterministic enco ding | <t>A CBOR encoding satisfies the "length-first core deterministic enco ding | |||
requirements" if it satisfies the core deterministic encoding requirements | requirements" if it satisfies the core deterministic encoding requirements | |||
except that the keys in every map MUST be sorted such that:</t> | except that the keys in every map <bcp14>MUST</bcp14> be sorted such that:</t> | |||
<ol spacing="normal" type="1"><li>If two keys have different lengths, the shorter one sorts earlier;</li> | <ol spacing="normal" type="1"><li>If two keys have different lengths, the shorter one sorts earlier;</li> | |||
<li>If two keys have the same length, the one with the lower value i n | <li>If two keys have the same length, the one with the lower value i n | |||
(byte-wise) lexical order sorts earlier.</li> | (bytewise) lexical order sorts earlier.</li> | |||
</ol> | </ol> | |||
<t>For example, under the length-first core deterministic encoding | <t>For example, under the length-first core deterministic encoding | |||
requirements, the following keys are sorted correctly:</t> | requirements, the following keys are sorted correctly:</t> | |||
<ol spacing="normal" type="1"><li>10, encoded as 0x0a.</li> | <ol spacing="normal" type="1"><li>10, encoded as 0x0a.</li> | |||
<li>-1, encoded as 0x20.</li> | <li>-1, encoded as 0x20.</li> | |||
<li>false, encoded as 0xf4.</li> | <li>false, encoded as 0xf4.</li> | |||
<li>100, encoded as 0x1864.</li> | <li>100, encoded as 0x1864.</li> | |||
<li>"z", encoded as 0x617a.</li> | <li>"z", encoded as 0x617a.</li> | |||
<li>[-1], encoded as 0x8120.</li> | <li>[-1], encoded as 0x8120.</li> | |||
<li>"aa", encoded as 0x626161.</li> | <li>"aa", encoded as 0x626161.</li> | |||
<li>[100], encoded as 0x811864.</li> | <li>[100], encoded as 0x811864.</li> | |||
</ol> | </ol> | |||
<t>(Although <xref target="RFC7049" format="default"/> used the term " | <aside> | |||
Canonical CBOR" for its form of | <t>Although <xref target="RFC7049" format="default"/> used the term "C | |||
anonical CBOR" for its form of | ||||
requirements on deterministic encoding, this document avoids this term | requirements on deterministic encoding, this document avoids this term | |||
because "canonicalization" is often associated with specific uses of determinist ic | because "canonicalization" is often associated with specific uses of determinist ic | |||
encoding only. The terms are essentially interchangeable, however, and | encoding only. The terms are essentially interchangeable, however, and | |||
the set of core requirements in this document could also be | the set of core requirements in this document could also be | |||
called "Canonical CBOR", while the length-first-ordered version of that | called "Canonical CBOR", while the length-first-ordered version of that | |||
could be called "Old Canonical CBOR".)</t> | could be called "Old Canonical CBOR".</t></aside> | |||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="creating-cbor-based-protocols" toc="default"> | <section anchor="creating-cbor-based-protocols" toc="default"> | |||
<name>Creating CBOR-Based Protocols</name> | <name>Creating CBOR-Based Protocols</name> | |||
<t>Data formats such as CBOR are often used in environments where there | <t>Data formats such as CBOR are often used in environments where there | |||
is no format negotiation. A specific design goal of CBOR is to not | is no format negotiation. A specific design goal of CBOR is to not | |||
need any included or assumed schema: a decoder can take a CBOR item | need any included or assumed schema: a decoder can take a CBOR item | |||
and decode it with no other knowledge.</t> | and decode it with no other knowledge.</t> | |||
<t>Of course, in real-world implementations, the encoder and the decoder | <t>Of course, in real-world implementations, the encoder and the decoder | |||
will have a shared view of what should be in a CBOR data item. For | will have a shared view of what should be in a CBOR data item. For | |||
example, an agreed-to format might be "the item is an array whose | example, an agreed-to format might be "the item is an array whose | |||
first value is a UTF-8 string, second value is an integer, and | first value is a UTF-8 string, second value is an integer, and | |||
subsequent values are zero or more floating-point numbers" or "the | subsequent values are zero or more floating-point numbers" or "the | |||
item is a map that has byte strings for keys and contains a | item is a map that has byte strings for keys and contains a | |||
pair whose key is 0xab01".</t> | pair whose key is 0xab01".</t> | |||
<t>CBOR-based protocols MUST specify how their decoders handle | <t>CBOR-based protocols <bcp14>MUST</bcp14> specify how their decoders han dle | |||
invalid and other unexpected data. CBOR-based protocols | invalid and other unexpected data. CBOR-based protocols | |||
MAY specify that they treat arbitrary valid data as unexpected. | <bcp14>MAY</bcp14> specify that they treat arbitrary valid data as unexpected. | |||
Encoders for CBOR-based protocols MUST produce only valid items, that | Encoders for CBOR-based protocols <bcp14>MUST</bcp14> produce only valid items, | |||
that | ||||
is, the protocol cannot be designed to make use of invalid items. An | is, the protocol cannot be designed to make use of invalid items. An | |||
encoder can be capable of encoding as many or as few types of values | encoder can be capable of encoding as many or as few types of values | |||
as is required by the protocol in which it is used; a decoder can be | as is required by the protocol in which it is used; a decoder can be | |||
capable of understanding as many or as few types of values as is | capable of understanding as many or as few types of values as is | |||
required by the protocols in which it is used. This lack of | required by the protocols in which it is used. This lack of | |||
restrictions allows CBOR to be used in extremely constrained | restrictions allows CBOR to be used in extremely constrained | |||
environments.</t> | environments.</t> | |||
<t>The rest of this section discusses some considerations in creating CBOR -based | <t>The rest of this section discusses some considerations in creating CBOR -based | |||
protocols. With few exceptions, it is advisory only and explicitly excludes any language | protocols. With few exceptions, it is advisory only and explicitly excludes any language | |||
from BCP 14 other than words that could be interpreted as "MAY" in | from BCP 14 <xref target="RFC2119" format="default"/> <xref target="RFC8174" | |||
format="default"/> other than words that could be interpreted as "<bcp14>MAY</bc | ||||
p14>" in | ||||
the sense of BCP 14. The exceptions aim at facilitating | the sense of BCP 14. The exceptions aim at facilitating | |||
interoperability of CBOR-based protocols while making use of a wide variety of | interoperability of CBOR-based protocols while making use of a wide variety of | |||
both generic and application-specific encoders and decoders.</t> | both generic and application-specific encoders and decoders.</t> | |||
<section anchor="cbor-in-streaming-applications" toc="default"> | <section anchor="cbor-in-streaming-applications" toc="default"> | |||
<name>CBOR in Streaming Applications</name> | <name>CBOR in Streaming Applications</name> | |||
<t>In a streaming application, a data stream may be composed of a | <t>In a streaming application, a data stream may be composed of a | |||
sequence of CBOR data items concatenated back-to-back. In such an | sequence of CBOR data items concatenated back-to-back. In such an | |||
environment, the decoder immediately begins decoding a new data item | environment, the decoder immediately begins decoding a new data item | |||
if data is found after the end of a previous data item.</t> | if data is found after the end of a previous data item.</t> | |||
<t>Not all of the bytes making up a data item may be immediately | <t>Not all of the bytes making up a data item may be immediately | |||
available to the decoder; some decoders will buffer additional data | available to the decoder; some decoders will buffer additional data | |||
until a complete data item can be presented to the application. Other | until a complete data item can be presented to the application. Other | |||
decoders can present partial information about a top-level data item | decoders can present partial information about a top-level data item | |||
to an application, such as the nested data items that could already be | to an application, such as the nested data items that could already be | |||
decoded, or even parts of a byte string that hasn't completely arrived | decoded, or even parts of a byte string that hasn't completely arrived | |||
yet. | yet. | |||
Such an application also MUST have a matching streaming security mechanism, wher e | Such an application also <bcp14>MUST</bcp14> have a matching streaming security mechanism, where | |||
the desired protection is available for incremental data presented to the | the desired protection is available for incremental data presented to the | |||
application.</t> | application.</t> | |||
<t>Note that some applications and protocols will not want to use | <t>Note that some applications and protocols will not want to use | |||
indefinite-length encoding. Using indefinite-length encoding allows | indefinite-length encoding. Using indefinite-length encoding allows | |||
an encoder to not need to marshal all the data for counting, but it | an encoder to not need to marshal all the data for counting, but it | |||
requires a decoder to allocate increasing amounts of memory while | requires a decoder to allocate increasing amounts of memory while | |||
waiting for the end of the item. This might be fine for some | waiting for the end of the item. This might be fine for some | |||
applications but not others.</t> | applications but not others.</t> | |||
</section> | </section> | |||
<section anchor="generic" toc="default"> | <section anchor="generic" toc="default"> | |||
skipping to change at line 1598 ¶ | skipping to change at line 1642 ¶ | |||
(The diagnostic notation, <xref target="diagnostic-notation" format="default"/>, may be used to | (The diagnostic notation, <xref target="diagnostic-notation" format="default"/>, may be used to | |||
present well-formed CBOR values to humans.)</t> | present well-formed CBOR values to humans.)</t> | |||
<t>Generic CBOR encoders provide an application interface that allows th e | <t>Generic CBOR encoders provide an application interface that allows th e | |||
application to specify any well-formed value to be encoded as a CBOR | application to specify any well-formed value to be encoded as a CBOR | |||
data item, including simple values and tags unknown to the encoder.</t> | data item, including simple values and tags unknown to the encoder.</t> | |||
<t>Even though CBOR attempts to minimize these cases, not all well-forme d | <t>Even though CBOR attempts to minimize these cases, not all well-forme d | |||
CBOR data is valid: for example, the encoded text string <tt>0x62c0ae</tt> | CBOR data is valid: for example, the encoded text string <tt>0x62c0ae</tt> | |||
does not contain valid UTF-8 (because <xref target="RFC3629" format="default"/> requires always using the shortest | does not contain valid UTF-8 (because <xref target="RFC3629" format="default"/> requires always using the shortest | |||
form) and so is not a valid CBOR item. | form) and so is not a valid CBOR item. | |||
Also, specific tags may | Also, specific tags may | |||
make semantic constraints that may be violated, for instance by a bignum tag | make semantic constraints that may be violated, for instance, by a bignum tag | |||
enclosing another tag, or by an instance of tag number 0 containing a byte | enclosing another tag or by an instance of tag number 0 containing a byte | |||
string, or containing a text string with contents that do not match <xref target | string or containing a text string with contents that do not match the | |||
="RFC3339" format="default"/>'s | <tt>date-time</tt> production of <xref target="RFC3339" format="default"/>. The | |||
<tt>date-time</tt> production. There is | re is | |||
no requirement that generic encoders and decoders make unnatural | no requirement that generic encoders and decoders make unnatural | |||
choices for their application interface to enable the processing of | choices for their application interface to enable the processing of | |||
invalid data. Generic encoders and decoders are expected to forward | invalid data. Generic encoders and decoders are expected to forward | |||
simple values and tags even if their specific codepoints are not | simple values and tags even if their specific codepoints are not | |||
registered at the time the encoder/decoder is written | registered at the time the encoder/decoder is written | |||
(<xref target="validity-checking" format="default"/>).</t> | (<xref target="validity-checking" format="default"/>).</t> | |||
</section> | </section> | |||
<section anchor="semantic-errors" toc="default"> | <section anchor="semantic-errors" toc="default"> | |||
<name>Validity of Items</name> | <name>Validity of Items</name> | |||
<t>A well-formed but invalid CBOR data item (<xref target="terminology" format="default"/>) presents a problem with | <t>A well-formed but invalid CBOR data item (<xref target="terminology" format="default"/>) presents a problem with | |||
interpreting the data encoded in it in the CBOR data model. A | interpreting the data encoded in it in the CBOR data model. A | |||
CBOR-based protocol could be specified in several layers, in which the | CBOR-based protocol could be specified in several layers, in which the | |||
lower layers don't process the semantics of some of the CBOR data they | lower layers don't process the semantics of some of the CBOR data they | |||
forward. These layers can't notice any validity errors in data they don't | forward. These layers can't notice any validity errors in data they don't | |||
process and MUST forward that data as-is. The first layer that does | process and <bcp14>MUST</bcp14> forward that data as-is. The first layer that d | |||
process the semantics of an invalid CBOR item MUST take one of two | oes | |||
process the semantics of an invalid CBOR item <bcp14>MUST</bcp14> pick one of tw | ||||
o | ||||
choices:</t> | choices:</t> | |||
<ol spacing="normal" type="1"><li>Replace the problematic item with an e rror marker and continue with | <ol spacing="normal" type="1"><li>Replace the problematic item with an e rror marker and continue with | |||
the next item, or</li> | the next item, or</li> | |||
<li>Issue an error and stop processing altogether.</li> | <li>Issue an error and stop processing altogether.</li> | |||
</ol> | </ol> | |||
<t>A CBOR-based protocol MUST specify which of these options its decoder | <t>A CBOR-based protocol <bcp14>MUST</bcp14> specify which of these opti | |||
s | ons its decoders | |||
take, for each kind of invalid item they might encounter.</t> | take for each kind of invalid item they might encounter.</t> | |||
<t>Such problems might occur at the basic validity level of CBOR or in | <t>Such problems might occur at the basic validity level of CBOR or in | |||
the context of tags (tag validity).</t> | the context of tags (tag validity).</t> | |||
<section anchor="basic-validity" toc="default"> | <section anchor="basic-validity" toc="default"> | |||
<name>Basic validity</name> | <name>Basic validity</name> | |||
<t>Two kinds of validity errors can occur in the basic generic data mo del:</t> | <t>Two kinds of validity errors can occur in the basic generic data mo del:</t> | |||
<dl newline="false" spacing="normal"> | <dl newline="false" spacing="normal"> | |||
<dt>Duplicate keys in a map:</dt> | <dt>Duplicate keys in a map:</dt> | |||
<dd> | <dd> | |||
Generic decoders (<xref target="generic" format="default"/>) make data availab le to applications | Generic decoders (<xref target="generic" format="default"/>) make data availab le to applications | |||
using the native CBOR data model. That data model includes maps | using the native CBOR data model. That data model includes maps | |||
skipping to change at line 1657 ¶ | skipping to change at line 1701 ¶ | |||
</dl> | </dl> | |||
</section> | </section> | |||
<section anchor="tag-validity" toc="default"> | <section anchor="tag-validity" toc="default"> | |||
<name>Tag validity</name> | <name>Tag validity</name> | |||
<t>Two additional kinds of validity errors are introduced by adding ta gs | <t>Two additional kinds of validity errors are introduced by adding ta gs | |||
to the basic generic data model:</t> | to the basic generic data model:</t> | |||
<dl newline="false" spacing="normal"> | <dl newline="false" spacing="normal"> | |||
<dt>Inadmissible type for tag content:</dt> | <dt>Inadmissible type for tag content:</dt> | |||
<dd> | <dd> | |||
Tag numbers (<xref target="tags" format="default"/>) specify what type of data item is supposed to be | Tag numbers (<xref target="tags" format="default"/>) specify what type of data item is supposed to be | |||
used as their tag content; for example, the tag numbers for positive or negative bignums are | used as their tag content; for example, the tag numbers for unsigned or negative bignums are | |||
supposed to be put on byte strings. A decoder that decodes the | supposed to be put on byte strings. A decoder that decodes the | |||
tagged data item into a native representation (a native big integer | tagged data item into a native representation (a native big integer | |||
in this example) is expected to check the type of the data item | in this example) is expected to check the type of the data item | |||
being tagged. Even decoders that don't have such native | being tagged. Even decoders that don't have such native | |||
representations available in their environment may perform the check | representations available in their environment may perform the check | |||
on those tags known to them and react appropriately.</dd> | on those tags known to them and react appropriately.</dd> | |||
<dt>Inadmissible value for tag content:</dt> | <dt>Inadmissible value for tag content:</dt> | |||
<dd> | <dd> | |||
The type of data item may be admissible for a tag's content, but the | The type of data item may be admissible for a tag's content, but the | |||
specific value may not be; e.g., a value of "yesterday" is not | specific value may not be; e.g., a value of "yesterday" is not | |||
skipping to change at line 1683 ¶ | skipping to change at line 1727 ¶ | |||
</dl> | </dl> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="validity-checking" toc="default"> | <section anchor="validity-checking" toc="default"> | |||
<name>Validity and Evolution</name> | <name>Validity and Evolution</name> | |||
<t>A decoder with validity checking will expend the effort to reliably | <t>A decoder with validity checking will expend the effort to reliably | |||
detect data items with validity errors. For example, such a | detect data items with validity errors. For example, such a | |||
decoder needs to have an API that reports an error (and does not | decoder needs to have an API that reports an error (and does not | |||
return data) for a CBOR data item that contains any of the validity | return data) for a CBOR data item that contains any of the validity | |||
errors listed in the previous subsection.</t> | errors listed in the previous subsection.</t> | |||
<t>The set of tags defined in the tag registry (<xref target="ianatags" | <t>The set of tags defined in the "Concise Binary Object | |||
format="default"/>), as well as | Representation (CBOR) Tags" registry (<xref target="ianatags" | |||
the set of simple values defined in the simple values registry | format="default"/>), as well as the set of simple values defined in | |||
(<xref target="ianasimple" format="default"/>), can grow at any time beyond the | the "Concise Binary Object Representation (CBOR) Simple Values" | |||
set understood by a | registry (<xref target="ianasimple" format="default"/>), can grow at | |||
generic decoder. | any time beyond the set understood by a generic decoder. A | |||
A validity-checking decoder can do one of two things when it | validity-checking decoder can do one of two things when it encounters | |||
encounters such a case that it does not recognize:</t> | such a case that it does not recognize:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>It can report an error (and not return data). | <li>It can report an error (and not return data). | |||
Note that treating this case as an error can cause ossification, and is | Note that treating this case as an error can cause ossification and is | |||
thus not encouraged. This error | thus not encouraged. This error | |||
is not a validity error per se. This kind of error is more likely | is not a validity error, per se. This kind of error is more likely | |||
to be raised by a decoder that would be performing validity checking | to be raised by a decoder that would be performing validity checking | |||
if this were a known case.</li> | if this were a known case.</li> | |||
<li>It can emit the unknown item (type, value, and, for tags, the | <li>It can emit the unknown item (type, value, and, for tags, the | |||
decoded tagged data item) to the application calling the decoder, | decoded tagged data item) to the application calling the decoder, | |||
with an indication that the decoder did not recognize that tag | and then give the application | |||
an indication that the decoder did not recognize that tag | ||||
number or simple value.</li> | number or simple value.</li> | |||
</ul> | </ul> | |||
<t>The latter approach, which is also appropriate for decoders that do | <t>The latter approach, which is also appropriate for decoders that do | |||
not support validity checking, provides forward compatibility with | not support validity checking, provides forward compatibility with | |||
newly registered tags and simple values without the requirement to | newly registered tags and simple values without the requirement to | |||
update the encoder at the same time as the calling application. (For | update the encoder at the same time as the calling application. (For | |||
this, the API for the decoder needs to have a way to mark unknown | this, the decoder's API needs the ability to mark unknown | |||
items so that the calling application can handle them in a manner | items so that the calling application can handle them in a manner | |||
appropriate for the program.)</t> | appropriate for the program.)</t> | |||
<t>Since some of the processing needed for validity checking may have an | <t>Since some of the processing needed for validity checking may have an | |||
appreciable cost (in particular with duplicate detection for maps), | appreciable cost (in particular with duplicate detection for maps), | |||
support of validity checking is not a requirement placed on all CBOR | support of validity checking is not a requirement placed on all CBOR | |||
decoders.</t> | decoders.</t> | |||
<t>Some encoders will rely on their applications to provide input data i n | <t>Some encoders will rely on their applications to provide input data i n | |||
such a way that valid CBOR results from the encoder. A generic | such a way that valid CBOR results from the encoder. A generic | |||
encoder may also want to provide a validity-checking mode where it | encoder may also want to provide a validity-checking mode where it | |||
reliably limits its output to valid CBOR, independent of whether or | reliably limits its output to valid CBOR, independent of whether or | |||
not its application is indeed providing API-conformant data.</t> | not its application is indeed providing API-conformant data.</t> | |||
</section> | </section> | |||
<section anchor="numbers" toc="default"> | <section anchor="numbers" toc="default"> | |||
<name>Numbers</name> | <name>Numbers</name> | |||
<t>CBOR-based protocols should take into account that different language | <t>CBOR-based protocols should take into account that different language | |||
environments pose different restrictions on the range and precision of | environments pose different restrictions on the range and precision of | |||
numbers that are representable. For example, the basic JavaScript number | numbers that are representable. For example, the basic JavaScript number | |||
system treats all numbers as floating-point values, which may result in | system treats all numbers as floating-point values, which may result in | |||
silent loss of precision in decoding integers with more than 53 | the silent loss of precision in decoding integers with more than 53 | |||
significant bits. | significant bits. | |||
Another example is that, since CBOR keeps the sign bit for its integer | Another example is that, since CBOR keeps the sign bit for its integer | |||
representation in the major type, it has one bit more for signed | representation in the major type, it has one bit more for signed | |||
numbers of a certain length (e.g., -2**64..2**64-1 for 1+8-byte | numbers of a certain length (e.g., -2<sup>64</sup>..2<sup>64</sup>-1 for 1+8-byt e | |||
integers) than the typical platform signed integer representation of | integers) than the typical platform signed integer representation of | |||
the same length (-2**63..2**63-1 for 8-byte int64_t). | the same length (-2<sup>63</sup>..2<sup>63</sup>-1 for 8-byte int64_t). | |||
A protocol that uses numbers should define its | A protocol that uses numbers should define its | |||
expectations on the handling of non-trivial numbers in decoders and | expectations on the handling of nontrivial numbers in decoders and | |||
receiving applications.</t> | receiving applications.</t> | |||
<t>A CBOR-based protocol that includes floating-point numbers can | <t>A CBOR-based protocol that includes floating-point numbers can | |||
restrict which of the three formats (half-precision, single-precision, | restrict which of the three formats (half-precision, single-precision, | |||
and double-precision) are to be supported. For an integer-only | and double-precision) are to be supported. For an integer-only | |||
application, a protocol may want to completely exclude the use of | application, a protocol may want to completely exclude the use of | |||
floating-point values.</t> | floating-point values.</t> | |||
<t>A CBOR-based protocol designed for compactness may want to exclude | <t>A CBOR-based protocol designed for compactness may want to exclude | |||
specific integer encodings that are longer than necessary for the | specific integer encodings that are longer than necessary for the | |||
application, such as to save the need to implement 64-bit integers. | application, such as to save the need to implement 64-bit integers. | |||
There is an expectation that encoders will use the most compact | There is an expectation that encoders will use the most compact | |||
skipping to change at line 1754 ¶ | skipping to change at line 1801 ¶ | |||
compact application that does not require deterministic encoding | compact application that does not require deterministic encoding | |||
should accept values that use a longer-than-needed | should accept values that use a longer-than-needed | |||
encoding (such as encoding "0" as 0b000_11001 followed by two bytes of | encoding (such as encoding "0" as 0b000_11001 followed by two bytes of | |||
0x00) as long as the application can decode an integer of the given | 0x00) as long as the application can decode an integer of the given | |||
size. | size. | |||
Similar considerations apply to floating-point values; decoding both | Similar considerations apply to floating-point values; decoding both | |||
preferred serializations and longer-than-needed ones is recommended.</t> | preferred serializations and longer-than-needed ones is recommended.</t> | |||
<t>CBOR-based protocols for constrained applications that provide a | <t>CBOR-based protocols for constrained applications that provide a | |||
choice between representing a specific number as an integer and | choice between representing a specific number as an integer and | |||
as a decimal fraction or bigfloat (such as when the exponent is small | as a decimal fraction or bigfloat (such as when the exponent is small | |||
and non-negative), might express a quality-of-implementation expectation | and nonnegative) might express a quality-of-implementation expectation | |||
that the integer representation is used directly.</t> | that the integer representation is used directly.</t> | |||
</section> | </section> | |||
<section anchor="map-keys" toc="default"> | <section anchor="map-keys" toc="default"> | |||
<name>Specifying Keys for Maps</name> | <name>Specifying Keys for Maps</name> | |||
<t>The encoding and decoding applications need to agree on what types of | <t>The encoding and decoding applications need to agree on what types of | |||
keys are going to be used in maps. In applications that need to | keys are going to be used in maps. In applications that need to | |||
interwork with JSON-based applications, conversion is simplified by | interwork with JSON-based applications, conversion is simplified by | |||
limiting keys to text strings only; otherwise, there has to be a specified | limiting keys to text strings only; otherwise, there has to be a specified | |||
mapping from the other CBOR types to text strings, and this | mapping from the other CBOR types to text strings, and this | |||
often leads to implementation errors. In applications where keys are | often leads to implementation errors. In applications where keys are | |||
numeric in nature and numeric ordering of keys is important to the | numeric in nature, and numeric ordering of keys is important to the | |||
application, directly using the numbers for the keys is useful.</t> | application, directly using the numbers for the keys is useful.</t> | |||
<t>If multiple types of keys are to be used, consideration should be | <t>If multiple types of keys are to be used, consideration should be | |||
given to how these types would be represented in the specific | given to how these types would be represented in the specific | |||
programming environments that are to be used. For example, in | programming environments that are to be used. For example, in | |||
JavaScript Maps <xref target="ECMA262" format="default"/>, a key of integer 1 ca nnot be | JavaScript Maps <xref target="ECMA262" format="default"/>, a key of integer 1 ca nnot be | |||
distinguished from a key of floating-point 1.0. This means that, if integer | distinguished from a key of floating-point 1.0. This means that, if integer | |||
keys are used, the protocol needs to avoid use of | keys are used, the protocol needs to avoid the use of | |||
floating-point keys the values of which happen to be integer numbers in the same map.</t> | floating-point keys the values of which happen to be integer numbers in the same map.</t> | |||
<t>Decoders that deliver data items nested within a CBOR data item | <t>Decoders that deliver data items nested within a CBOR data item | |||
immediately on decoding them ("streaming decoders") often do not keep | immediately on decoding them ("streaming decoders") often do not keep | |||
the state that is necessary to ascertain uniqueness of a key in a map. | the state that is necessary to ascertain uniqueness of a key in a map. | |||
Similarly, an encoder that can start encoding data items before the | Similarly, an encoder that can start encoding data items before the | |||
enclosing data item is completely available ("streaming encoder") may | enclosing data item is completely available ("streaming encoder") may | |||
want to reduce its overhead significantly by relying on its data | want to reduce its overhead significantly by relying on its data | |||
source to maintain uniqueness.</t> | source to maintain uniqueness.</t> | |||
<t>A CBOR-based protocol MUST define what | <t>A CBOR-based protocol <bcp14>MUST</bcp14> define what | |||
to do when a receiving application does see multiple identical keys in | to do when a receiving application sees multiple identical keys in | |||
a map. The resulting rule in the protocol MUST respect the CBOR | a map. The resulting rule in the protocol <bcp14>MUST</bcp14> respect the CBOR | |||
data model: it cannot prescribe a specific handling of the entries | data model: it cannot prescribe a specific handling of the entries | |||
with the identical keys, except that it might have a rule that having | with the identical keys, except that it might have a rule that having | |||
identical keys in a map indicates a malformed map and that the decoder | identical keys in a map indicates a malformed map and that the decoder | |||
has to stop with an error. | has to stop with an error. | |||
When processing maps that exhibit entries with duplicate keys, a generic | When processing maps that exhibit entries with duplicate keys, a generic | |||
decoder might do one of the following:</t> | decoder might do one of the following:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>Not accept maps with duplicate keys (that is, enforce validity for maps, | <li>Not accept maps with duplicate keys (that is, enforce validity for maps, | |||
see also <xref target="validity-checking" format="default"/>). These generic de coders are | see also <xref target="validity-checking" format="default"/>). These generic de coders are | |||
universally useful. An application may still need to do perform its | universally useful. An application may still need to perform its | |||
own duplicate checking based on application rules (for instance if | own duplicate checking based on application rules (for instance, if | |||
the application equates integers and floating-point values in map | the application equates integers and floating-point values in map | |||
key positions for specific maps).</li> | key positions for specific maps).</li> | |||
<li>Pass all map entries to the application, including ones with | <li>Pass all map entries to the application, including ones with | |||
duplicate keys. This requires the application to handle (check | duplicate keys. This requires that the application handle (check | |||
against) duplicate keys, even if the application rules are identical | against) duplicate keys, even if the application rules are identical | |||
to the generic data model rules.</li> | to the generic data model rules.</li> | |||
<li>Lose some entries with duplicate keys, e.g. by only delivering the | <li>Lose some entries with duplicate keys, e.g., deliver only the | |||
final (or first) entry out of the entries with the same key. With | final (or first) entry out of the entries with the same key. With | |||
such a generic decoder, applications may get different results for a | such a generic decoder, applications may get different results for a | |||
specific key on different runs and with different generic decoders | specific key on different runs, and with different generic decoders, | |||
as which value is returned is based on generic decoder | which value is returned is based on generic decoder | |||
implementation and the actual order of keys in the map. In | implementation and the actual order of keys in the map. In | |||
particular, applications cannot validate key uniqueness on their own | particular, applications cannot validate key uniqueness on their own | |||
as they do not necessarily see all entries; they may not be able to | as they do not necessarily see all entries; they may not be able to | |||
use such a generic decoder if they do need to validate key | use such a generic decoder if they need to validate key | |||
uniqueness. These generic decoders can only be used in situations | uniqueness. These generic decoders can only be used in situations | |||
where the data source and transfer can be relied upon to always | where the data source and transfer always | |||
provide valid maps; this is not possible if the data source and transfer can be attacked.</li> | provide valid maps; this is not possible if the data source and transfer can be attacked.</li> | |||
</ul> | </ul> | |||
<t>Generic decoders need to document which of these three approaches the y | <t>Generic decoders need to document which of these three approaches the y | |||
implement.</t> | implement.</t> | |||
<t>The CBOR data model for maps does not allow ascribing semantics to th e | <t>The CBOR data model for maps does not allow ascribing semantics to th e | |||
order of the key/value pairs in the map representation. Thus, a | order of the key/value pairs in the map representation. Thus, a | |||
CBOR-based protocol MUST NOT specify that changing the key/value pair | CBOR-based protocol <bcp14>MUST NOT</bcp14> specify that changing the key/value | |||
order in a map would change the semantics, except to specify that some | pair | |||
orders are disallowed, for example where they would not meet the | order in a map changes the semantics, except to specify that some | |||
orders are disallowed, for example, where they would not meet the | ||||
requirements of a deterministic | requirements of a deterministic | |||
encoding (<xref target="det-enc" format="default"/>). | encoding (<xref target="det-enc" format="default"/>). | |||
(Any secondary effects of map ordering such as on timing, cache usage, | (Any secondary effects of map ordering such as on timing, cache usage, | |||
and other potential side channels are not considered part of the | and other potential side channels are not considered part of the | |||
semantics but may be enough reason on their own for a protocol to require a | semantics but may be enough reason on their own for a protocol to require a | |||
deterministic encoding format.)</t> | deterministic encoding format.)</t> | |||
<t>Applications for constrained devices that have maps where a small | <t>Applications for constrained devices should consider using small | |||
number of frequently used keys can be identified should consider using | integers as keys if they have maps with a small number of frequently | |||
small integers as keys; for instance, a set of 24 or fewer frequent | used keys; for instance, a set of 24 or fewer | |||
keys can be encoded in a single byte as unsigned integers, up to 48 if | keys can be encoded in a single byte as unsigned integers, up to | |||
negative integers are also used. Less frequently occurring keys can | 48 if negative integers are also used. Less frequently | |||
then use integers with longer encodings.</t> | occurring keys can then use integers with longer encodings.</t> | |||
<section anchor="equivalence-of-keys" toc="default"> | <section anchor="equivalence-of-keys" toc="default"> | |||
<name>Equivalence of Keys</name> | <name>Equivalence of Keys</name> | |||
<t>The specific data model applying to a CBOR data item is used to | <t>The specific data model that applies to a CBOR data item is used to | |||
determine whether keys occurring in maps are duplicates or distinct.</t> | determine whether keys occurring in maps are duplicates or distinct.</t> | |||
<t>At the generic data model level, numerically equivalent integer and | <t>At the generic data model level, numerically equivalent integer and | |||
floating-point values are distinct from each other, as they are from | floating-point values are distinct from each other, as they are from | |||
the various big numbers (Tags 2 to 5). Similarly, text strings are | the various big numbers (Tags 2 to 5). Similarly, text strings are | |||
distinct from byte strings, even if composed of the same bytes. A | distinct from byte strings, even if composed of the same bytes. A | |||
tagged value is distinct from an untagged value or from a value tagged | tagged value is distinct from an untagged value or from a value tagged | |||
with a different tag number.</t> | with a different tag number.</t> | |||
<t>Within each of these groups, numeric values are distinct unless the y | <t>Within each of these groups, numeric values are distinct unless the y | |||
are numerically equal (specifically, -0.0 is equal to 0.0); for the | are numerically equal (specifically, -0.0 is equal to 0.0); for the | |||
purpose of map key equivalence, NaN (not a number) | purpose of map key equivalence, NaN | |||
values are equivalent if they have the same significand after | values are equivalent if they have the same significand after | |||
zero-extending both significands at the right to 64 bits.</t> | zero-extending both significands at the right to 64 bits.</t> | |||
<t>(Byte and text) strings are compared | <t>Both byte strings and text strings are compared | |||
byte by byte, arrays element by element, and are equal if they have | byte by byte, arrays are compared element by element, and are equal if they have | |||
the same number of bytes/elements and the same values at the same | the same number of bytes/elements and the same values at the same | |||
positions. | positions. Two maps are equal if they have the same set of pairs regardless of | |||
Two maps are equal if they have the same set of pairs regardless of | ||||
their order; pairs are equal if both the key and value are equal.</t> | their order; pairs are equal if both the key and value are equal.</t> | |||
<t>Tagged values are equal if both the tag number and the tag content are equal. | <t>Tagged values are equal if both the tag number and the tag content are equal. | |||
(Note that a generic decoder that provides processing for a specific | (Note that a generic decoder that provides processing for a specific | |||
tag may not be able to distinguish some semantically equivalent | tag may not be able to distinguish some semantically equivalent | |||
values, e.g. if leading zeroes occur in the content of tag 2/3 | values, e.g., if leading zeroes occur in the content of tag 2 or tag 3 | |||
(<xref target="bignums" format="default"/>).) | (<xref target="bignums" format="default"/>).) | |||
Simple values are equal if they simply have the same value. | Simple values are equal if they simply have the same value. | |||
Nothing else is equal in the generic data model; a simple value 2 is | Nothing else is equal in the generic data model; a simple value 2 is | |||
not equivalent to an integer 2 and an array is never equivalent to a map.</t> | not equivalent to an integer 2, and an array is never equivalent to a map.</t> | |||
<t>As discussed in <xref target="specific-data-models" format="default "/>, specific data models can | <t>As discussed in <xref target="specific-data-models" format="default "/>, specific data models can | |||
make values equivalent for the purpose of comparing map keys that are | make values equivalent for the purpose of comparing map keys that are | |||
distinct in the generic data model. Note that this implies that a | distinct in the generic data model. Note that this implies that a | |||
generic decoder may deliver a decoded map to an application that needs | generic decoder may deliver a decoded map to an application that needs | |||
to be checked for duplicate map keys by that application | to be checked for duplicate map keys by that application | |||
(alternatively, the decoder may provide a programming interface to | (alternatively, the decoder may provide a programming interface to | |||
perform this service for the application). Specific data models | perform this service for the application). Specific data models | |||
are not able to distinguish values for map keys that are equal for this purpose | are not able to distinguish values for map keys that are equal for this purpose | |||
at the generic data model level.</t> | at the generic data model level.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="undefined-values" toc="default"> | <section anchor="undefined-values" toc="default"> | |||
<name>Undefined Values</name> | <name>Undefined Values</name> | |||
<t>In some CBOR-based protocols, the simple value (<xref target="fpnocon t" format="default"/>) of | <t>In some CBOR-based protocols, the simple value (<xref target="fpnocon t" format="default"/>) of | |||
Undefined might be used by an encoder as a substitute for a data item | <tt>undefined</tt> might be used by an encoder as a substitute for a data item | |||
with an encoding problem, in order to allow the rest of the enclosing | with an encoding problem, in order to allow the rest of the enclosing | |||
data items to be encoded without harm.</t> | data items to be encoded without harm.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="converting-data-between-cbor-and-json" toc="default"> | <section anchor="converting-data-between-cbor-and-json" toc="default"> | |||
<name>Converting Data between CBOR and JSON</name> | <name>Converting Data between CBOR and JSON</name> | |||
<t>This section gives non-normative advice about converting between CBOR | <t>This section gives non-normative advice about converting between CBOR | |||
and JSON. Implementations of converters MAY use whichever | and JSON. Implementations of converters <bcp14>MAY</bcp14> use whichever | |||
advice here they want.</t> | advice here they want.</t> | |||
<t>It is worth noting that a JSON text is a sequence of characters, not | <t>It is worth noting that a JSON text is a sequence of characters, not | |||
an encoded sequence of bytes, while a CBOR data item consists of | an encoded sequence of bytes, while a CBOR data item consists of | |||
bytes, not characters.</t> | bytes, not characters.</t> | |||
<section anchor="converting-from-cbor-to-json" toc="default"> | <section anchor="converting-from-cbor-to-json" toc="default"> | |||
<name>Converting from CBOR to JSON</name> | <name>Converting from CBOR to JSON</name> | |||
<t>Most of the types in CBOR have direct analogs in JSON. However, some | <t>Most of the types in CBOR have direct analogs in JSON. However, some | |||
do not, and someone implementing a CBOR-to-JSON converter has to | do not, and someone implementing a CBOR-to-JSON converter has to | |||
consider what to do in those cases. The following non-normative advice | consider what to do in those cases. The following non-normative advice | |||
deals with these by converting them to a single substitute value, such | deals with these by converting them to a single substitute value, such | |||
as a JSON null.</t> | as a JSON null.</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>An integer (major type 0 or 1) becomes a JSON number.</li> | <li>An integer (major type 0 or 1) becomes a JSON number.</li> | |||
<li>A byte string (major type 2) that is not embedded in a tag that | <li>A byte string (major type 2) that is not embedded in a tag that | |||
specifies a proposed encoding is encoded in base64url without | specifies a proposed encoding is encoded in base64url without | |||
padding and becomes a JSON string.</li> | padding and becomes a JSON string.</li> | |||
<li>A UTF-8 string (major type 3) becomes a JSON string. Note that JS ON | <li>A UTF-8 string (major type 3) becomes a JSON string. Note that JS ON | |||
requires escaping certain characters (<xref target="RFC8259" format="default"/>, Section 7): | requires escaping certain characters (<xref target="RFC8259" section="7" section Format="comma" format="default"/>): | |||
quotation mark (U+0022), reverse solidus (U+005C), and the "C0 | quotation mark (U+0022), reverse solidus (U+005C), and the "C0 | |||
control characters" (U+0000 through U+001F). All other characters | control characters" (U+0000 through U+001F). All other characters | |||
are copied unchanged into the JSON UTF-8 string.</li> | are copied unchanged into the JSON UTF-8 string.</li> | |||
<li>An array (major type 4) becomes a JSON array.</li> | <li>An array (major type 4) becomes a JSON array.</li> | |||
<li>A map (major type 5) becomes a JSON object. This is possible | <li>A map (major type 5) becomes a JSON object. This is possible | |||
directly only if all keys are UTF-8 strings. A converter might also | directly only if all keys are UTF-8 strings. A converter might also | |||
convert other keys into UTF-8 strings (such as by converting | convert other keys into UTF-8 strings (such as by converting | |||
integers into strings containing their decimal representation); | integers into strings containing their decimal representation); | |||
however, doing so introduces a danger of key collision. | however, doing so introduces a danger of key collision. | |||
Note also that, if tags on UTF-8 strings are ignored as proposed | Note also that, if tags on UTF-8 strings are ignored as proposed | |||
skipping to change at line 1953 ¶ | skipping to change at line 1999 ¶ | |||
supported by older JSON implementations.</t> | supported by older JSON implementations.</t> | |||
</section> | </section> | |||
<section anchor="converting-from-json" toc="default"> | <section anchor="converting-from-json" toc="default"> | |||
<name>Converting from JSON to CBOR</name> | <name>Converting from JSON to CBOR</name> | |||
<t>All JSON values, once decoded, directly map into one or more CBOR | <t>All JSON values, once decoded, directly map into one or more CBOR | |||
values. As with any kind of CBOR generation, decisions have to be | values. As with any kind of CBOR generation, decisions have to be | |||
made with respect to number representation. In a suggested | made with respect to number representation. In a suggested | |||
conversion:</t> | conversion:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>JSON numbers without fractional parts (integer numbers) are | <li>JSON numbers without fractional parts (integer numbers) are | |||
represented as integers (major types 0 and 1, possibly major type 6 | represented as integers (major types 0 and 1, possibly major type 6, | |||
tag number 2 and 3), choosing the shortest form; integers longer than | tag number 2 and 3), choosing the shortest form; integers longer than | |||
an implementation-defined threshold may instead be represented as | an implementation-defined threshold may instead be represented as | |||
floating-point values. The | floating-point values. The | |||
default range that is represented as integer is | default range that is represented as integer is | |||
-2**53+1..2**53-1 (fully exploiting the range for exact integers | -2<sup>53</sup>+1..2<sup>53</sup>-1 (fully exploiting the range for exact intege rs | |||
in the binary64 representation often used for decoding JSON <xref target="RFC749 3" format="default"/>). | in the binary64 representation often used for decoding JSON <xref target="RFC749 3" format="default"/>). | |||
A CBOR-based protocol, or a generic converter implementation, | A CBOR-based protocol, or a generic converter implementation, | |||
may choose -2**32..2**32-1 or -2**64..2**64-1 (fully | may choose -2<sup>32</sup>..2<sup>32</sup>-1 or -2<sup>64</sup>..2<sup>64</sup>- 1 (fully | |||
using the integer ranges available in CBOR with uint32_t or | using the integer ranges available in CBOR with uint32_t or | |||
uint64_t, respectively) or even -2**31..2**31-1 or | uint64_t, respectively) or even -2<sup>31</sup>..2<sup>31</sup>-1 or | |||
-2**63..2**63-1 (using popular ranges for two's complement | -2<sup>63</sup>..2<sup>63</sup>-1 (using popular ranges for two's complement | |||
signed integers). | signed integers). | |||
(If | (If | |||
the JSON was generated from a JavaScript implementation, its | the JSON was generated from a JavaScript implementation, its | |||
precision is already limited to 53 bits maximum.)</li> | precision is already limited to 53 bits maximum.)</li> | |||
<li>Numbers with fractional parts are represented as floating-point | <li>Numbers with fractional parts are represented as floating-point | |||
values, performing the decimal-to-binary conversion based on the | values, performing the decimal-to-binary conversion based on the | |||
precision provided by IEEE 754 binary64. | precision provided by IEEE 754 binary64. | |||
The mathematical value of the JSON number is converted to binary64 | The mathematical value of the JSON number is converted to binary64 | |||
using the roundTiesToEven procedure in Section 4.3.1 of <xref target="IEEE754" f ormat="default"/>. | using the roundTiesToEven procedure in Section 4.3.1 of <xref target="IEEE754" f ormat="default"/>. | |||
Then, when encoding in | Then, when encoding in | |||
skipping to change at line 2030 ¶ | skipping to change at line 2076 ¶ | |||
<t>In a protocol design, opportunities for evolution are often included | <t>In a protocol design, opportunities for evolution are often included | |||
in the form of extension points. For example, there may be a | in the form of extension points. For example, there may be a | |||
codepoint space that is not fully allocated from the outset, and the | codepoint space that is not fully allocated from the outset, and the | |||
protocol is designed to tolerate and embrace implementations that | protocol is designed to tolerate and embrace implementations that | |||
start using more codepoints than initially allocated.</t> | start using more codepoints than initially allocated.</t> | |||
<t>Sizing the codepoint space may be difficult because the range require d | <t>Sizing the codepoint space may be difficult because the range require d | |||
may be hard to predict. Protocol designs should attempt to make the | may be hard to predict. Protocol designs should attempt to make the | |||
codepoint space large enough so that it can slowly be filled over the | codepoint space large enough so that it can slowly be filled over the | |||
intended lifetime of the protocol.</t> | intended lifetime of the protocol.</t> | |||
<t>CBOR has three major extension points:</t> | <t>CBOR has three major extension points:</t> | |||
<ul spacing="normal"> | <dl spacing="normal"> | |||
<li>the "simple" space (values in major type 7). Of the 24 efficient | <dt>the "simple" space (values in major type 7):</dt><dd>Of the 24 eff | |||
icient | ||||
(and 224 slightly less efficient) values, only a small number have | (and 224 slightly less efficient) values, only a small number have | |||
been allocated. Implementations receiving an unknown simple data | been allocated. Implementations receiving an unknown simple data | |||
item may easily be able to process it as such, given that the structure of | item may easily be able to process it as such, given that the structure of | |||
the value is indeed simple. The IANA registry in | the value is indeed simple. The IANA registry in | |||
<xref target="ianasimple" format="default"/> is the appropriate way to address t he | <xref target="ianasimple" format="default"/> is the appropriate way to address t he | |||
extensibility of this codepoint space.</li> | extensibility of this codepoint space.</dd> | |||
<li>the "tag" space (values in major type 6). The total codepoint spa | <dt>the "tag" space (values in major type 6):</dt><dd> The total codep | |||
ce | oint space | |||
is abundant; only a tiny part of it has | is abundant; only a tiny part of it has | |||
been allocated. However, not all of these codepoints are equally | been allocated. However, not all of these codepoints are equally | |||
efficient: the first 24 only consume a single ("1+0") byte, and | efficient: the first 24 only consume a single ("1+0") byte, and | |||
half of them have already been allocated. The next 232 values only | half of them have already been allocated. The next 232 values only | |||
consume two ("1+1") bytes, with nearly a quarter already allocated. | consume two ("1+1") bytes, with nearly a quarter already allocated. | |||
These subspaces need some curation to last for a few more decades. | These subspaces need some curation to last for a few more decades. | |||
Implementations receiving an unknown tag number can choose to | Implementations receiving an unknown tag number can choose to | |||
process just the enclosed tag content or, preferably, to | process just the enclosed tag content or, preferably, to | |||
process the tag as an unknown tag number wrapping the | process the tag as an unknown tag number wrapping the | |||
tag content. The IANA registry in <xref target="ianatags" format="default"/> is the appropriate way to | tag content. The IANA registry in <xref target="ianatags" format="default"/> is the appropriate way to | |||
address the extensibility of this codepoint space.</li> | address the extensibility of this codepoint space.</dd> | |||
<li>the "additional information" space. An implementation receiving a | <dt>the "additional information" space:</dt><dd>An implementation rece | |||
n | iving an | |||
unknown additional information value has no way to continue decoding, | unknown additional information value has no way to continue decoding, | |||
so allocating codepoints in this space is a major step beyond just | so allocating codepoints in this space is a major step beyond just | |||
exercising an extension point. There are | exercising an extension point. There are | |||
also very few codepoints left. See also <xref target="curating" format="default | also very few codepoints left. See also <xref target="curating" format="default | |||
"/>.</li> | "/>.</dd> | |||
</ul> | </dl> | |||
</section> | </section> | |||
<section anchor="curating" toc="default"> | <section anchor="curating" toc="default"> | |||
<name>Curating the Additional Information Space</name> | <name>Curating the Additional Information Space</name> | |||
<t>The human mind is sometimes drawn to filling in little perceived gaps | <t>The human mind is sometimes drawn to filling in little perceived gaps | |||
to make something neat. We expect the remaining gaps in the codepoint | to make something neat. We expect the remaining gaps in the codepoint | |||
space for the additional information values to be an attractor for new | space for the additional information values to be an attractor for new | |||
ideas, just because they are there.</t> | ideas, just because they are there.</t> | |||
<t>The present specification does not manage the additional information | <t>The present specification does not manage the additional information | |||
codepoint space by an IANA registry. Instead, allocations out of this | codepoint space by an IANA registry. Instead, allocations out of this | |||
space can only be done by updating this specification.</t> | space can only be done by updating this specification.</t> | |||
<t>For an additional information value of n >= 24, the size of the | <t>For an additional information value of n >= 24, the size of the | |||
additional data typically is 2**(n-24) bytes. Therefore, additional | additional data typically is 2<sup>n-24</sup> bytes. Therefore, additional | |||
information values 28 and 29 should be viewed as candidates for | information values 28 and 29 should be viewed as candidates for | |||
128-bit and 256-bit quantities, in case a need arises to add them to | 128-bit and 256-bit quantities, in case a need arises to add them to | |||
the protocol. Additional information value 30 is then the only | the protocol. Additional information value 30 is then the only | |||
additional information value available for general allocation, and | additional information value available for general allocation, and | |||
there should be a very good reason for allocating it before assigning | there should be a very good reason for allocating it before assigning | |||
it through an update of the present specification.</t> | it through an update of the present specification.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="diagnostic-notation" toc="default"> | <section anchor="diagnostic-notation" toc="default"> | |||
<name>Diagnostic Notation</name> | <name>Diagnostic Notation</name> | |||
skipping to change at line 2099 ¶ | skipping to change at line 2145 ¶ | |||
RFC 8259, extending it where needed.</t> | RFC 8259, extending it where needed.</t> | |||
<t>The notation borrows the JSON syntax for numbers (integer and | <t>The notation borrows the JSON syntax for numbers (integer and | |||
floating-point), True (>true<), False (>false<), Null (>null<) , UTF-8 | floating-point), True (>true<), False (>false<), Null (>null<) , UTF-8 | |||
strings, arrays, and maps (maps are called objects in JSON; the | strings, arrays, and maps (maps are called objects in JSON; the | |||
diagnostic notation extends JSON here by allowing any data item in the | diagnostic notation extends JSON here by allowing any data item in the | |||
key position). Undefined is written >undefined< as in JavaScript. | key position). Undefined is written >undefined< as in JavaScript. | |||
The non-finite floating-point numbers Infinity, -Infinity, and NaN are | The non-finite floating-point numbers Infinity, -Infinity, and NaN are | |||
written exactly as in this sentence (this is also a way they can be | written exactly as in this sentence (this is also a way they can be | |||
written in JavaScript, although JSON does not allow them). A tag is | written in JavaScript, although JSON does not allow them). A tag is | |||
written as an integer number for the tag number, followed by the tag content | written as an integer number for the tag number, followed by the tag content | |||
in parentheses; for instance, an RFC 3339 (ISO 8601) date could be | in parentheses; for instance, a date in the format specified by RFC 3339 (ISO 86 01) could be | |||
notated as:</t> | notated as:</t> | |||
<ul empty="true" spacing="normal"> | <t indent="5">0("2013-03-21T20:04:00Z")</t> | |||
<li>0("2013-03-21T20:04:00Z")</li> | <t>or the equivalent relative time as the following:</t> | |||
</ul> | <t indent="5">1(1363896240)</t> | |||
<t>or the equivalent relative time as</t> | ||||
<ul empty="true" spacing="normal"> | ||||
<li>1(1363896240)</li> | ||||
</ul> | ||||
<t>Byte strings are notated in one of the base encodings, without | <t>Byte strings are notated in one of the base encodings, without | |||
padding, enclosed in single quotes, prefixed by >h< for base16, | padding, enclosed in single quotes, prefixed by >h< for base16, | |||
>b32< for base32, >h32< for base32hex, >b64< for base64 or | >b32< for base32, >h32< for base32hex, >b64< for base64 or | |||
base64url (the actual encodings do not overlap, so the string remains | base64url (the actual encodings do not overlap, so the string remains | |||
unambiguous). For example, the byte string 0x12345678 could be | unambiguous). For example, the byte string 0x12345678 could be | |||
written h'12345678', b32'CI2FM6A', or b64'EjRWeA'.</t> | written h'12345678', b32'CI2FM6A', or b64'EjRWeA'.</t> | |||
<t>Unassigned simple values are given as "simple()" with the appropriate | <t>Unassigned simple values are given as "simple()" with the appropriate | |||
integer in the parentheses. For example, "simple(42)" indicates major | integer in the parentheses. For example, "simple(42)" indicates major | |||
type 7, value 42.</t> | type 7, value 42.</t> | |||
<t>A number of useful extensions to the diagnostic notation defined here a re | <t>A number of useful extensions to the diagnostic notation defined here a re | |||
provided in Appendix G of <xref target="RFC8610" format="default"/>, "Extended D | provided in <xref target="RFC8610" section="G" sectionFormat="of" format="defaul | |||
iagnostic Notation" (EDN). | t"/>, "Extended Diagnostic Notation" (EDN). | |||
Similarly, an extension of this notation could be provided in a | Similarly, this notation could be extended in a separate document to | |||
separate document to provide for the documentation of NaN payloads, | provide documentation for NaN payloads, which are not covered in this documen | |||
which are not covered in the present document.</t> | t. </t> | |||
<section anchor="encoding-indicators" toc="default"> | <section anchor="encoding-indicators" toc="default"> | |||
<name>Encoding Indicators</name> | <name>Encoding Indicators</name> | |||
<t>Sometimes it is useful to indicate in the diagnostic notation which o f | <t>Sometimes it is useful to indicate in the diagnostic notation which o f | |||
several alternative representations were actually used; for example, a | several alternative representations were actually used; for example, a | |||
data item written >1.5< by a diagnostic decoder might have been | data item written >1.5< by a diagnostic decoder might have been | |||
encoded as a half-, single-, or double-precision float.</t> | encoded as a half-, single-, or double-precision float.</t> | |||
<t>The convention for encoding indicators is that anything starting with | <t>The convention for encoding indicators is that anything starting with | |||
an underscore and all following characters that are alphanumeric or | an underscore and all following characters that are alphanumeric or | |||
underscore, is an encoding indicator, and can be ignored by anyone not | underscore is an encoding indicator, and can be ignored by anyone not | |||
interested in this information. For example, <tt>_</tt> or <tt>_3</tt>. | interested in this information. For example, <tt>_</tt> or <tt>_3</tt>. | |||
Encoding indicators are always | Encoding indicators are always | |||
optional.</t> | optional.</t> | |||
<t>A single underscore can be written after the opening brace of a map o r | <t>A single underscore can be written after the opening brace of a map o r | |||
the opening bracket of an array to indicate that the data item was | the opening bracket of an array to indicate that the data item was | |||
represented in indefinite-length format. For example, [_ 1, 2] | represented in indefinite-length format. For example, [_ 1, 2] | |||
contains an indicator that an indefinite-length representation was | contains an indicator that an indefinite-length representation was | |||
used to represent the data item [1, 2].</t> | used to represent the data item [1, 2].</t> | |||
<t>An underscore followed by a decimal digit n indicates that the | <t>An underscore followed by a decimal digit n indicates that the | |||
preceding item (or, for arrays and maps, the item starting with the | preceding item (or, for arrays and maps, the item starting with the | |||
preceding bracket or brace) was encoded with an additional information | preceding bracket or brace) was encoded with an additional information | |||
value of 24+n. For example, 1.5_1 is a half-precision floating-point | value of 24+n. For example, 1.5_1 is a half-precision floating-point | |||
number, while 1.5_3 is encoded as double precision. This encoding | number, while 1.5_3 is encoded as double precision. This encoding | |||
indicator is not shown in <xref target="examples" format="default"/>. (Note tha t the encoding | indicator is not shown in <xref target="examples" format="default"/>. (Note tha t the encoding | |||
indicator "_" is thus an abbreviation of the full form "_7", which is | indicator "_" is thus an abbreviation of the full form "_7", which is | |||
not used.)</t> | not used.)</t> | |||
<t>The detailed chunk structure of byte and text strings of indefinite | <t>The detailed chunk structure of byte and text strings of indefinite | |||
length can be | length can be | |||
notated in the form (_ h'0123', h'4567') and (_ "foo", "bar"). | notated in the form (_ h'0123', h'4567') and (_ "foo", "bar"). | |||
However, for an indefinite length string with no chunks inside, (_ ) | However, for an indefinite-length string with no chunks inside, (_ ) | |||
would be ambiguous whether a byte string (0x5fff) or a text string | would be ambiguous as to whether a byte string (0x5fff) or a text string | |||
(0x7fff) is meant and is therefore not used. | (0x7fff) is meant and is therefore not used. | |||
The basic forms ''_ and ""_ can be used instead and are reserved for | The basic forms ''_ and ""_ can be used instead and are reserved for | |||
the case with no chunks only -- not as short forms for the (permitted, | the case of no chunks only -- not as short forms for the (permitted, | |||
but not really useful) encodings with only empty chunks, which to | but not really useful) encodings with only empty chunks, which | |||
preserve the chunk structure need to be notated as (_ ''), (_ ""), etc.</t> | need to be notated as (_ ''), (_ ""), etc., | |||
to preserve the chunk structure.</t> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="ianacons" toc="default"> | <section anchor="ianacons" toc="default"> | |||
<name>IANA Considerations</name> | <name>IANA Considerations</name> | |||
<t>IANA has created two registries for new CBOR values. The registries | <t>IANA has created two registries for new CBOR values. The registries | |||
are separate, that is, not under an umbrella registry, and follow the | are separate, that is, not under an umbrella registry, and follow the | |||
rules in <xref target="RFC8126" format="default"/>. IANA has also assigned a new | rules in <xref target="RFC8126" format="default"/>. IANA has also | |||
MIME media type and | assigned a new media type, an associated | |||
an associated Constrained Application Protocol (CoAP) Content-Format | CoAP Content-Format entry, and a structured syntax suffix.</t> | |||
entry.</t> | ||||
<section anchor="ianasimple" toc="default"> | <section anchor="ianasimple" toc="default"> | |||
<name>Simple Values Registry</name> | ||||
<name>CBOR Simple Values Registry</name> | ||||
<t>IANA has created the "Concise Binary Object Representation (CBOR) | <t>IANA has created the "Concise Binary Object Representation (CBOR) | |||
Simple Values" registry at <xref target="IANA.cbor-simple-values" format="defaul | Simple Values" registry at <xref target="IANA.cbor-simple-values" | |||
t"/>. The initial | format="default"/>. The initial values are shown in <xref | |||
values are shown in <xref target="fpnoconttbl2" format="default"/>.</t> | target="fpnoconttbl2" format="default"/>.</t> | |||
<t>New entries in the range 0 to 19 are assigned by Standards Action. I | <t>New entries in the range 0 to 19 are assigned by Standards Action | |||
t | ||||
is suggested that these Standards Actions allocate values starting | <xref target="RFC8126" format="default"/>. It | |||
is suggested that IANA allocate values starting | ||||
with the number 16 in order to reserve the lower numbers for | with the number 16 in order to reserve the lower numbers for | |||
contiguous blocks (if any).</t> | contiguous blocks (if any).</t> | |||
<t>New entries in the range 32 to 255 are assigned by Specification | <t>New entries in the range 32 to 255 are assigned by Specification | |||
Required.</t> | Required.</t> | |||
</section> | </section> | |||
<section anchor="ianatags" toc="default"> | <section anchor="ianatags" toc="default"> | |||
<name>Tags Registry</name> | <name>CBOR Tags Registry</name> | |||
<t>IANA has created the "Concise Binary Object Representation (CBOR) | <t>IANA has created the "Concise Binary Object Representation (CBOR) | |||
Tags" registry at <xref target="IANA.cbor-tags" format="default"/>. | Tags" registry at <xref target="IANA.cbor-tags" format="default"/>. | |||
The tags that were defined in <xref target="RFC7049" format="default"/> are desc | The tags that were defined in <xref target="RFC7049" format="default"/> | |||
ribed in detail in <xref target="tags" format="default"/>, | are described in detail in <xref target="tags" format="default"/>, | |||
and other tags have already been defined since then.</t> | and other tags have already been defined since then.</t> | |||
<t>New entries in the range 0 to 23 ("1+0") are assigned by Standards Ac tion. | <t>New entries in the range 0 to 23 ("1+0") are assigned by Standards Ac tion. | |||
New entries in the ranges 24 to 255 ("1+1") and 256 to 32767 (lower | New entries in the ranges 24 to 255 ("1+1") and 256 to 32767 (lower | |||
half of "1+2") are assigned by Specification | half of "1+2") are assigned by Specification | |||
Required. New entries in the range 32768 to 18446744073709551615 | Required. New entries in the range 32768 to 18446744073709551615 | |||
(upper half of "1+2", "1+4", and "1+8") are | (upper half of "1+2", "1+4", and "1+8") are | |||
assigned by First Come First Served. The template for registration | assigned by First Come First Served. The template for registration | |||
requests is:</t> | requests is:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>Data item</li> | <li>Data item</li> | |||
skipping to change at line 2209 ¶ | skipping to change at line 2258 ¶ | |||
optional; the URL can point to something like an Internet-Draft or a | optional; the URL can point to something like an Internet-Draft or a | |||
web page.</li> | web page.</li> | |||
</ul> | </ul> | |||
<t>Applicants exercising the First Come First Served range and making | <t>Applicants exercising the First Come First Served range and making | |||
a suggestion for a tag number that is not representable in 32 bits | a suggestion for a tag number that is not representable in 32 bits | |||
(i.e., larger than 4294967295) | (i.e., larger than 4294967295) | |||
should be aware that this could reduce interoperability with | should be aware that this could reduce interoperability with | |||
implementations that do not support 64-bit numbers.</t> | implementations that do not support 64-bit numbers.</t> | |||
</section> | </section> | |||
<section anchor="media-type-mime-type" toc="default"> | <section anchor="media-type-mime-type" toc="default"> | |||
<name>Media Type ("MIME Type")</name> | ||||
<t>The Internet media type <xref target="RFC6838" format="default"/> for | <name>Media Types Registry</name> | |||
a single encoded CBOR data | <t>The Internet media type <xref target="RFC6838" format="default"/> ("M | |||
item is application/cbor, as defined in <xref target="IANA.media-types" format=" | IME type") for a single encoded CBOR data | |||
default"/>:</t> | item is "application/cbor" as defined in the "Media Types" registry <xref target | |||
<t>Type name: application</t> | ="IANA.media-types" format="default"/>:</t> | |||
<t>Subtype name: cbor</t> | <dl newline="false" spacing="normal"> | |||
<t>Required parameters: n/a</t> | <dt>Type name:</dt><dd>application</dd> | |||
<t>Optional parameters: n/a</t> | <dt>Subtype name:</dt><dd>cbor</dd> | |||
<dl newline="false" spacing="normal"> | <dt>Required parameters:</dt><dd>n/a</dd> | |||
<dt>Encoding considerations:</dt> | <dt>Optional parameters:</dt><dd>n/a</dd> | |||
<dd> | <dt>Encoding considerations:</dt><dd>Binary</dd> | |||
Binary</dd> | <dt>Security considerations:</dt><dd>See <xref target="securitycons" | |||
<dt>Security considerations:</dt> | format="default"/> of RFC 8949.</dd> | |||
<dd> | <dt>Interoperability considerations:</dt><dd>n/a</dd> | |||
See <xref target="securitycons" format="default"/> of this document</dd> | <dt>Published specification:</dt><dd>RFC 8949</dd> | |||
</dl> | <dt>Applications that use this media type:</dt><dd>Many</dd> | |||
<t>Interoperability considerations: n/a</t> | <dt>Additional information:</dt> | |||
<t>Published specification: This document</t> | ||||
<dl newline="false" spacing="normal"> | ||||
<dt>Applications that use this media type:</dt> | ||||
<dd> | ||||
Many</dd> | ||||
<dt>Additional information:</dt> | ||||
<dd> | <dd> | |||
<ul spacing="normal"> | <t><br/></t> | |||
<li>Magic number(s): n/a</li> | <dl spacing="compact"> | |||
<li>File extension(s): .cbor</li> | <dt>Magic number(s):</dt><dd> n/a</dd> | |||
<li>Macintosh file type code(s): n/a</li> | <dt>File extension(s):</dt><dd> .cbor</dd> | |||
</ul> | <dt>Macintosh file type code(s):</dt><dd>n/a</dd> | |||
</dl> | ||||
</dd> | </dd> | |||
<dt>Person & email address to contact for further information:</dt > | <dt>Person & email address to contact for further information:</dt > | |||
<dd> | <dd>IETF CBOR Working Group (cbor@ietf.org) or IETF | |||
IETF CBOR Working Group <eref target="mailto:cbor@ietf.org">cbor@ietf.org</ere | Applications and Real-Time Area (art@ietf.org)</dd> | |||
f> or | <dt>Intended usage:</dt><dd>COMMON</dd> | |||
IETF Applications and Real-Time Area <eref target="mailto:art@ietf.org">art@ietf | <dt>Restrictions on usage:</dt><dd>none</dd> | |||
.org</eref></dd> | <dt>Author:</dt><dd>IETF CBOR Working Group (cbor@ietf.org)</dd> | |||
</dl> | <dt>Change controller:</dt><dd>The IESG (iesg@ietf.org)</dd> | |||
<t>Intended usage: COMMON</t> | ||||
<t>Restrictions on usage: none</t> | ||||
<dl newline="false" spacing="normal"> | ||||
<dt>Author:</dt> | ||||
<dd> | ||||
IETF CBOR Working Group <eref target="mailto:cbor@ietf.org">cbor@ietf.org</ere | ||||
f></dd> | ||||
<dt>Change controller:</dt> | ||||
<dd> | ||||
The IESG <eref target="mailto:iesg@ietf.org">iesg@ietf.org</eref></dd> | ||||
</dl> | </dl> | |||
</section> | </section> | |||
<section anchor="coap-content-format" toc="default"> | <section anchor="coap-content-format" toc="default"> | |||
<name>CoAP Content-Format</name> | <name>CoAP Content-Format Registry</name> | |||
<t>The CoAP Content-Format for CBOR is registered in <xref target="IANA. | <t>The CoAP Content-Format for CBOR has been registered in the "CoAP | |||
core-parameters" format="default"/>:</t> | Content-Formats" subregistry within the "Constrained RESTful | |||
<t>Media Type: application/cbor</t> | Environments (CoRE) Parameters" registry <xref | |||
<t>Encoding: -</t> | target="IANA.core-parameters" format="default"/>:</t> | |||
<t>Id: 60</t> | <dl> | |||
<t>Reference: [RFCthis]</t> | <dt>Media Type:</dt><dd>application/cbor</dd> | |||
<dt>Encoding:</dt><dd>-</dd> | ||||
<dt>ID:</dt><dd>60</dd> | ||||
<dt>Reference:</dt><dd>RFC 8949</dd> | ||||
</dl> | ||||
</section> | </section> | |||
<section anchor="the-cbor-structured-syntax-suffix-registration" toc="defa ult"> | <section anchor="the-cbor-structured-syntax-suffix-registration" toc="defa ult"> | |||
<name>The +cbor Structured Syntax Suffix Registration</name> | <name>Structured Syntax Suffix Registry</name> | |||
<t>The Structured Syntax Suffix <xref target="RFC6838" format="default"/ | <t>The structured syntax suffix <xref | |||
> for media types based on a | target="RFC6838" format="default"/> for media types based on a single | |||
single encoded CBOR data item is +cbor, as defined in <xref target="IANA.media-t | encoded CBOR data item is +cbor, which IANA has registered in the | |||
ype-structured-suffix" format="default"/>:</t> | "Structured Syntax Suffixes" registry <xref | |||
<t>Name: Concise Binary Object Representation (CBOR)</t> | target="IANA.structured-suffix" format="default"/>:</t> | |||
<t>+suffix: +cbor</t> | <dl> | |||
<t>References: [RFCthis]</t> | <dt>Name:</dt><dd>Concise Binary Object Representation (CBOR)</dd> | |||
<t>Encoding Considerations: CBOR is a binary format.</t> | <dt>+suffix:</dt><dd>+cbor</dd> | |||
<t>Interoperability Considerations: n/a</t> | <dt>References:</dt><dd>RFC 8949</dd> | |||
<dl newline="false" spacing="normal"> | <dt>Encoding Considerations:</dt><dd>CBOR is a binary format.</dd> | |||
<dt>Fragment Identifier Considerations:</dt> | <dt>Interoperability Considerations:</dt><dd>n/a</dd> | |||
<dd> | <dt>Fragment Identifier Considerations:</dt> | |||
<dd><t> | ||||
The syntax and semantics of fragment identifiers specified for | The syntax and semantics of fragment identifiers specified for | |||
+cbor SHOULD be as specified for "application/cbor". (At | +cbor <bcp14>SHOULD</bcp14> be as specified for "application/cbor". (At | |||
publication of this document, there is no fragment identification | publication of RFC 8949, there is no fragment identification | |||
syntax defined for "application/cbor".)</dd> | syntax defined for "application/cbor".)</t> | |||
<dt/> | ||||
<dd> | ||||
<t>The syntax and semantics for fragment identifiers for a specific | <t>The syntax and semantics for fragment identifiers for a specific | |||
"xxx/yyy+cbor" SHOULD be processed as follows: | "xxx/yyy+cbor" <bcp14>SHOULD</bcp14> be processed as follows: | |||
</t> | </t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>For cases defined in +cbor, where the fragment identifier reso lves | <li>For cases defined in +cbor, where the fragment identifier reso lves | |||
per the +cbor rules, then process as specified in +cbor.</li> | per the +cbor rules, then process as specified in +cbor.</li> | |||
<li>For cases defined in +cbor, where the fragment identifier does | <li>For cases defined in +cbor, where the fragment identifier does | |||
not resolve per the +cbor rules, then process as specified in | not resolve per the +cbor rules, then process as specified in | |||
"xxx/yyy+cbor".</li> | "xxx/yyy+cbor".</li> | |||
<li>For cases not defined in +cbor, then process as specified in | <li>For cases not defined in +cbor, then process as specified in | |||
"xxx/yyy+cbor".</li> | "xxx/yyy+cbor".</li> | |||
</ul> | </ul> | |||
</dd> | </dd> | |||
<dt>Security Considerations:</dt> | <dt>Security Considerations:</dt> <dd>See <xref | |||
<dd> | target="securitycons" format="default"/> of RFC 8949.</dd> | |||
See <xref target="securitycons" format="default"/> of this document</dd> | <dt>Contact:</dt><dd> IETF CBOR Working Group (cbor@ietf.org) or | |||
<dt>Contact:</dt> | IETF Applications and Real-Time Area (art@ietf.org)</dd> | |||
<dd> | ||||
IETF CBOR Working Group <eref target="mailto:cbor@ietf.org">cbor@ietf.org</ere | <dt>Author/Change Controller:</dt><dd>IETF</dd> | |||
f> or | ||||
IETF Applications and Real-Time Area <eref target="mailto:art@ietf.org">art@ietf | ||||
.org</eref></dd> | ||||
<dt>Author/Change Controller:</dt> | ||||
<dd> | ||||
The IESG <eref target="mailto:iesg@ietf.org">iesg@ietf.org</eref></dd> | ||||
</dl> | </dl> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="securitycons" toc="default"> | <section anchor="securitycons" toc="default"> | |||
<name>Security Considerations</name> | <name>Security Considerations</name> | |||
<t>A network-facing application can exhibit vulnerabilities in its | <t>A network-facing application can exhibit vulnerabilities in its | |||
processing logic for incoming data. Complex parsers are well known as | processing logic for incoming data. Complex parsers are well known as | |||
a likely source of such vulnerabilities, such as the ability to | a likely source of such vulnerabilities, such as the ability to | |||
remotely crash a node, or even remotely execute arbitrary code on it. | remotely crash a node, or even remotely execute arbitrary code on it. | |||
CBOR attempts to narrow the opportunities for introducing such | CBOR attempts to narrow the opportunities for introducing such | |||
skipping to change at line 2335 ¶ | skipping to change at line 2374 ¶ | |||
non-preferred serialization. When a single data item is consumed both by such a | non-preferred serialization. When a single data item is consumed both by such a | |||
constrained decoder and a full decoder, it can lead to security issues that can | constrained decoder and a full decoder, it can lead to security issues that can | |||
be exploited by an attacker who can inject or manipulate content.</t> | be exploited by an attacker who can inject or manipulate content.</t> | |||
<t>As discussed throughout this document, there are many values that can b e | <t>As discussed throughout this document, there are many values that can b e | |||
considered "equivalent" in some circumstances and "not equivalent" in others. As | considered "equivalent" in some circumstances and "not equivalent" in others. As | |||
just one example, the numeric value for the number "one" might be expressed as | just one example, the numeric value for the number "one" might be expressed as | |||
an integer or a bignum. A system interpreting CBOR input might accept either | an integer or a bignum. A system interpreting CBOR input might accept either | |||
form for the number "one", or might reject one (or both) forms. Such acceptance | form for the number "one", or might reject one (or both) forms. Such acceptance | |||
or rejection can have security implications in the program that is using the | or rejection can have security implications in the program that is using the | |||
interpreted input.</t> | interpreted input.</t> | |||
<t>Hostile input may be constructed to overrun buffers, overflow or | <t>Hostile input may be constructed to overrun buffers, to overflow or | |||
underflow integer arithmetic, or cause other decoding disruption. CBOR | underflow integer arithmetic, or to cause other decoding disruption. CBOR | |||
data items might have lengths or sizes that are intentionally | data items might have lengths or sizes that are intentionally | |||
extremely large or too short. | extremely large or too short. | |||
Resource exhaustion attacks might attempt to lure a decoder into | Resource exhaustion attacks might attempt to lure a decoder into | |||
allocating very big data items (strings, arrays, maps, or even | allocating very big data items (strings, arrays, maps, or even | |||
arbitrary precision numbers) or exhaust the | arbitrary precision numbers) or exhaust the | |||
stack depth by setting up deeply nested items. Decoders need to have | stack depth by setting up deeply nested items. Decoders need to have | |||
appropriate resource management to mitigate these attacks. (Items for | appropriate resource management to mitigate these attacks. (Items for | |||
which very large sizes are given can also attempt to exploit integer | which very large sizes are given can also attempt to exploit integer | |||
overflow vulnerabilities.)</t> | overflow vulnerabilities.)</t> | |||
<t>A CBOR decoder, by definition, only accepts well-formed CBOR; this is | <t>A CBOR decoder, by definition, only accepts well-formed CBOR; this is | |||
skipping to change at line 2392 ¶ | skipping to change at line 2431 ¶ | |||
overflow and underflow of integer arithmetic, and other such errors | overflow and underflow of integer arithmetic, and other such errors | |||
that are aimed to disrupt the encoder.</t> | that are aimed to disrupt the encoder.</t> | |||
<t>Protocols should be defined in | <t>Protocols should be defined in | |||
such a way that potential multiple interpretations are reliably | such a way that potential multiple interpretations are reliably | |||
reduced to a single interpretation. For example, an attacker could make use of | reduced to a single interpretation. For example, an attacker could make use of | |||
invalid input such as duplicate keys in maps, or exploit different | invalid input such as duplicate keys in maps, or exploit different | |||
precision in processing numbers to make one application base its | precision in processing numbers to make one application base its | |||
decisions on a different interpretation than the one that will be used | decisions on a different interpretation than the one that will be used | |||
by a second application. To facilitate consistent interpretation, | by a second application. To facilitate consistent interpretation, | |||
encoder and decoder implementations should | encoder and decoder implementations should | |||
provide a validity checking mode of operation | provide a validity-checking mode of operation | |||
(<xref target="validity-checking" format="default"/>). Note, however, that a ge neric decoder cannot | (<xref target="validity-checking" format="default"/>). Note, however, that a ge neric decoder cannot | |||
know about all requirements that an application poses on its input | know about all requirements that an application poses on its input | |||
data; it is therefore not relieving the application from performing its | data; it is therefore not relieving the application from performing its | |||
own input checking. Also, since the set of defined tag numbers | own input checking. Also, since the set of defined tag numbers | |||
evolves, the application may employ a tag number that is not yet | evolves, the application may employ a tag number that is not yet | |||
supported for validity checking by the generic decoder it uses. Generic | supported for validity checking by the generic decoder it uses. Generic | |||
decoders therefore need to provide documentation which tag numbers | decoders therefore need to document which tag numbers | |||
they support and what validity checking they can provide for each of | they support and what validity checking they provide for those | |||
them as well as for basic CBOR validity (UTF-8 checking, duplicate map | tag numbers as well as for basic CBOR (UTF-8 checking, duplicate map | |||
key checking).</t> | key checking).</t> | |||
<t><xref target="bignums" format="default"/> notes that using the non-pref erred choice of a bignum | <t><xref target="bignums" format="default"/> notes that using the non-pref erred choice of a bignum | |||
representation instead of a basic integer for encoding a number is not intended | representation instead of a basic integer for encoding a number is not intended | |||
to have application semantics, but it can have such semantics if an application | to have application semantics, but it can have such semantics if an application | |||
receiving CBOR data is using a decoder in the basic generic data model. This | receiving CBOR data is using a decoder in the basic generic data model. This | |||
disparity causes a security issue if the two sets of semantics differ. Thus, | disparity causes a security issue if the two sets of semantics differ. Thus, | |||
applications using CBOR need to specify the data model that they are using for | applications using CBOR need to specify the data model that they are using for | |||
each use of CBOR data.</t> | each use of CBOR data.</t> | |||
<t>It is common to convert CBOR data to other formats. In many cases, CBOR has more | <t>It is common to convert CBOR data to other formats. In many cases, CBOR has more | |||
expressive types than other formats; this is particularly true for the | expressive types than other formats; this is particularly true for the | |||
common conversion to JSON. The loss of type information can cause security | common conversion to JSON. The loss of type information can cause security | |||
issues for the systems that are processing the less-expressive data.</t> | issues for the systems that are processing the less-expressive data.</t> | |||
<t><xref target="converting-from-json" format="default"/> describes a poss | <t><xref target="converting-from-json" format="default"/> describes a poss | |||
ibly-common usage scenario of | ibly common usage scenario of | |||
converting between CBOR and JSON that could allow an attack if the attcker knows | converting between CBOR and JSON that could allow an attack if the attacker know | |||
s | ||||
that the application is performing the conversion.</t> | that the application is performing the conversion.</t> | |||
<t>Security considerations for the use of base16 and base64 from <xref tar get="RFC4648" format="default"/>, and the use | <t>Security considerations for the use of base16 and base64 from <xref tar get="RFC4648" format="default"/>, and the use | |||
of UTF-8 from <xref target="RFC3629" format="default"/>, are relevant to CBOR as well.</t> | of UTF-8 from <xref target="RFC3629" format="default"/>, are relevant to CBOR as well.</t> | |||
</section> | </section> | |||
</middle> | </middle> | |||
<back> | <back> | |||
<displayreference target="I-D.bormann-cbor-notable-tags" to="CBOR-TAGS"/> | ||||
<references> | <references> | |||
<name>References</name> | <name>References</name> | |||
<references> | <references> | |||
<name>Normative References</name> | <name>Normative References</name> | |||
<reference anchor="C"> | ||||
<reference anchor="C" target="https://www.iso.org/standard/74528.html"> | ||||
<front> | <front> | |||
<title>Information technology โ Programming languages โ C</title> | <title>Information technology - Programming languages - C</title> | |||
<author> | <author> | |||
<organization>International Organization for Standardization</orga nization> | <organization>International Organization for Standardization</orga nization> | |||
</author> | </author> | |||
<date year="2018" month="June"/> | <date year="2018" month="June"/> | |||
</front> | </front> | |||
<seriesInfo name="ISO/IEC" value="9899:2018, Fourth Edition"/> | <seriesInfo name="ISO/IEC" value="9899:2018"/> | |||
<refcontent>Fourth Edition</refcontent> | ||||
</reference> | </reference> | |||
<reference anchor="Cplusplus17"> | ||||
<reference anchor="Cplusplus20" target="https://isocpp.org/files/papers/ | ||||
N4860.pdf"> | ||||
<front> | <front> | |||
<title>Programming languages โ C++</title> | <title>Programming languages - C++</title> | |||
<author> | <author> | |||
<organization>International Organization for Standardization</orga nization> | <organization>International Organization for Standardization</orga nization> | |||
</author> | </author> | |||
<date year="2017" month="December"/> | <date year="2020" month="March"/> | |||
</front> | </front> | |||
<seriesInfo name="ISO/IEC" value="14882:2017, Fifth Edition"/> | <seriesInfo name="ISO/IEC" value="DIS 14882"/> | |||
<seriesInfo name="ISO/IEC" value="ISO/IEC JTC1 SC22 WG21 N 4860"/> | ||||
<refcontent>Sixth Edition</refcontent> | ||||
</reference> | </reference> | |||
<reference anchor="TIME_T" target="http://pubs.opengroup.org/onlinepubs/ | ||||
9699919799/basedefs/V1_chap04.html#tag_04_16"> | <reference anchor="TIME_T" target="https://pubs.opengroup.org/onlinepubs | |||
/9699919799/basedefs/V1_chap04.html#tag_04_16"> | ||||
<front> | <front> | |||
<title>Open Group Standard: Vol. 1: Base Definitions, Issue 7</title > | <title>The Open Group Base Specifications</title> | |||
<author> | <author> | |||
<organization>The Open Group Base Specifications</organization> | <organization>The Open Group</organization> | |||
</author> | </author> | |||
<date year="2018"/> | <date year="2018"/> | |||
</front> | </front> | |||
<seriesInfo name="Section 4.16" value="'Seconds Since the Epoch'"/> | ||||
<seriesInfo name="IEEE Std" value="1003.1"/> | <seriesInfo name="IEEE Std" value="1003.1"/> | |||
<seriesInfo name="2018" value="Edition"/> | <refcontent>Section 4.16, 'Seconds Since the Epoch'</refcontent> | |||
<refcontent>Issue 7, 2018 Edition</refcontent> | ||||
</reference> | </reference> | |||
<reference anchor="IEEE754" target="https://ieeexplore.ieee.org/document /8766229"> | <reference anchor="IEEE754" target="https://ieeexplore.ieee.org/document /8766229"> | |||
<front> | <front> | |||
<title>IEEE Standard for Floating-Point Arithmetic</title> | <title>IEEE Standard for Floating-Point Arithmetic</title> | |||
<author> | <author> | |||
<organization>IEEE</organization> | <organization>IEEE</organization> | |||
</author> | </author> | |||
<date/> | <date/> | |||
</front> | </front> | |||
<seriesInfo name="IEEE Std" value="754-2019"/> | <seriesInfo name="IEEE Std" value="754-2019"/> | |||
<seriesInfo name="DOI" value="10.1109/IEEESTD.2019.8766229"/> | <seriesInfo name="DOI" value="10.1109/IEEESTD.2019.8766229"/> | |||
skipping to change at line 2469 ¶ | skipping to change at line 2518 ¶ | |||
<front> | <front> | |||
<title>IEEE Standard for Floating-Point Arithmetic</title> | <title>IEEE Standard for Floating-Point Arithmetic</title> | |||
<author> | <author> | |||
<organization>IEEE</organization> | <organization>IEEE</organization> | |||
</author> | </author> | |||
<date/> | <date/> | |||
</front> | </front> | |||
<seriesInfo name="IEEE Std" value="754-2019"/> | <seriesInfo name="IEEE Std" value="754-2019"/> | |||
<seriesInfo name="DOI" value="10.1109/IEEESTD.2019.8766229"/> | <seriesInfo name="DOI" value="10.1109/IEEESTD.2019.8766229"/> | |||
</reference> | </reference> | |||
<reference anchor="RFC3629" target="https://www.rfc-editor.org/info/rfc3 | ||||
629"> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC | |||
<front> | .3629.xml"/> | |||
<title>UTF-8, a transformation format of ISO 10646</title> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC | |||
<author initials="F." surname="Yergeau" fullname="F. Yergeau"> | .3339.xml"/> | |||
<organization/> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC | |||
</author> | .4287.xml"/> | |||
<date year="2003" month="November"/> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC | |||
<abstract> | .4648.xml"/> | |||
<t>ISO/IEC 10646-1 defines a large character set called the Univer | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC | |||
sal Character Set (UCS) which encompasses most of the world's writing systems. | .3986.xml"/> | |||
The originally proposed encodings of the UCS, however, were not compatible with | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC | |||
many current applications and protocols, and this has led to the development of | .2045.xml"/> | |||
UTF-8, the object of this memo. UTF-8 has the characteristic of preserving the | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC | |||
full US-ASCII range, providing compatibility with file systems, parsers and othe | .8126.xml"/> | |||
r software that rely on US-ASCII values but are transparent to other values. Th | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC | |||
is memo obsoletes and replaces RFC 2279.</t> | .2119.xml"/> | |||
</abstract> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC | |||
</front> | .8174.xml"/> | |||
<seriesInfo name="STD" value="63"/> | ||||
<seriesInfo name="RFC" value="3629"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC3629"/> | ||||
</reference> | ||||
<reference anchor="RFC3339" target="https://www.rfc-editor.org/info/rfc3 | ||||
339"> | ||||
<front> | ||||
<title>Date and Time on the Internet: Timestamps</title> | ||||
<author initials="G." surname="Klyne" fullname="G. Klyne"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="C." surname="Newman" fullname="C. Newman"> | ||||
<organization/> | ||||
</author> | ||||
<date year="2002" month="July"/> | ||||
<abstract> | ||||
<t>This document defines a date and time format for use in Interne | ||||
t protocols that is a profile of the ISO 8601 standard for representation of dat | ||||
es and times using the Gregorian calendar.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="3339"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC3339"/> | ||||
</reference> | ||||
<reference anchor="RFC4287" target="https://www.rfc-editor.org/info/rfc4 | ||||
287"> | ||||
<front> | ||||
<title>The Atom Syndication Format</title> | ||||
<author initials="M." surname="Nottingham" fullname="M. Nottingham" | ||||
role="editor"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="R." surname="Sayre" fullname="R. Sayre" role="edit | ||||
or"> | ||||
<organization/> | ||||
</author> | ||||
<date year="2005" month="December"/> | ||||
<abstract> | ||||
<t>This document specifies Atom, an XML-based Web content and meta | ||||
data syndication format. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="4287"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC4287"/> | ||||
</reference> | ||||
<reference anchor="RFC4648" target="https://www.rfc-editor.org/info/rfc4 | ||||
648"> | ||||
<front> | ||||
<title>The Base16, Base32, and Base64 Data Encodings</title> | ||||
<author initials="S." surname="Josefsson" fullname="S. Josefsson"> | ||||
<organization/> | ||||
</author> | ||||
<date year="2006" month="October"/> | ||||
<abstract> | ||||
<t>This document describes the commonly used base 64, base 32, and | ||||
base 16 encoding schemes. It also discusses the use of line-feeds in encoded d | ||||
ata, use of padding in encoded data, use of non-alphabet characters in encoded d | ||||
ata, use of different encoding alphabets, and canonical encodings. [STANDARDS-T | ||||
RACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="4648"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC4648"/> | ||||
</reference> | ||||
<reference anchor="RFC3986" target="https://www.rfc-editor.org/info/rfc3 | ||||
986"> | ||||
<front> | ||||
<title>Uniform Resource Identifier (URI): Generic Syntax</title> | ||||
<author initials="T." surname="Berners-Lee" fullname="T. Berners-Lee | ||||
"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="R." surname="Fielding" fullname="R. Fielding"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="L." surname="Masinter" fullname="L. Masinter"> | ||||
<organization/> | ||||
</author> | ||||
<date year="2005" month="January"/> | ||||
<abstract> | ||||
<t>A Uniform Resource Identifier (URI) is a compact sequence of ch | ||||
aracters that identifies an abstract or physical resource. This specification d | ||||
efines the generic URI syntax and a process for resolving URI references that mi | ||||
ght be in relative form, along with guidelines and security considerations for t | ||||
he use of URIs on the Internet. The URI syntax defines a grammar that is a supe | ||||
rset of all valid URIs, allowing an implementation to parse the common component | ||||
s of a URI reference without knowing the scheme-specific requirements of every p | ||||
ossible identifier. This specification does not define a generative grammar for | ||||
URIs; that task is performed by the individual specifications of each URI schem | ||||
e. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="STD" value="66"/> | ||||
<seriesInfo name="RFC" value="3986"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC3986"/> | ||||
</reference> | ||||
<reference anchor="RFC2045" target="https://www.rfc-editor.org/info/rfc2 | ||||
045"> | ||||
<front> | ||||
<title>Multipurpose Internet Mail Extensions (MIME) Part One: Format | ||||
of Internet Message Bodies</title> | ||||
<author initials="N." surname="Freed" fullname="N. Freed"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="N." surname="Borenstein" fullname="N. Borenstein"> | ||||
<organization/> | ||||
</author> | ||||
<date year="1996" month="November"/> | ||||
<abstract> | ||||
<t>This initial document specifies the various headers used to des | ||||
cribe the structure of MIME messages. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="2045"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC2045"/> | ||||
</reference> | ||||
<reference anchor="RFC8126" target="https://www.rfc-editor.org/info/rfc8 | ||||
126"> | ||||
<front> | ||||
<title>Guidelines for Writing an IANA Considerations Section in RFCs | ||||
</title> | ||||
<author initials="M." surname="Cotton" fullname="M. Cotton"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="B." surname="Leiba" fullname="B. Leiba"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="T." surname="Narten" fullname="T. Narten"> | ||||
<organization/> | ||||
</author> | ||||
<date year="2017" month="June"/> | ||||
<abstract> | ||||
<t>Many protocols make use of points of extensibility that use con | ||||
stants to identify various protocol parameters. To ensure that the values in th | ||||
ese fields do not have conflicting uses and to promote interoperability, their a | ||||
llocations are often coordinated by a central record keeper. For IETF protocols | ||||
, that role is filled by the Internet Assigned Numbers Authority (IANA).</t> | ||||
<t>To make assignments in a given registry prudently, guidance des | ||||
cribing the conditions under which new values should be assigned, as well as whe | ||||
n and how modifications to existing values can be made, is needed. This documen | ||||
t defines a framework for the documentation of these guidelines by specification | ||||
authors, in order to assure that the provided guidance for the IANA Considerati | ||||
ons is clear and addresses the various issues that are likely in the operation o | ||||
f a registry.</t> | ||||
<t>This is the third edition of this document; it obsoletes RFC 52 | ||||
26.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="BCP" value="26"/> | ||||
<seriesInfo name="RFC" value="8126"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8126"/> | ||||
</reference> | ||||
<reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2 | ||||
119"> | ||||
<front> | ||||
<title>Key words for use in RFCs to Indicate Requirement Levels</tit | ||||
le> | ||||
<author initials="S." surname="Bradner" fullname="S. Bradner"> | ||||
<organization/> | ||||
</author> | ||||
<date year="1997" month="March"/> | ||||
<abstract> | ||||
<t>In many standards track documents several words are used to sig | ||||
nify the requirements in the specification. These words are often capitalized. | ||||
This document defines these words as they should be interpreted in IETF document | ||||
s. This document specifies an Internet Best Current Practices for the Internet | ||||
Community, and requests discussion and suggestions for improvements.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="BCP" value="14"/> | ||||
<seriesInfo name="RFC" value="2119"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC2119"/> | ||||
</reference> | ||||
<reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8 | ||||
174"> | ||||
<front> | ||||
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</ti | ||||
tle> | ||||
<author initials="B." surname="Leiba" fullname="B. Leiba"> | ||||
<organization/> | ||||
</author> | ||||
<date year="2017" month="May"/> | ||||
<abstract> | ||||
<t>RFC 2119 specifies common key words that may be used in protoco | ||||
l specifications. This document aims to reduce the ambiguity by clarifying tha | ||||
t only UPPERCASE usage of the key words have the defined special meanings.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="BCP" value="14"/> | ||||
<seriesInfo name="RFC" value="8174"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8174"/> | ||||
</reference> | ||||
</references> | </references> | |||
<references> | <references> | |||
<name>Informative References</name> | <name>Informative References</name> | |||
<reference anchor="ASN.1"> | ||||
<reference anchor="ASN.1" target="https://www.itu.int/rec/T-REC-X.690-20 | ||||
1508-I/en"> | ||||
<front> | <front> | |||
<title>Information Technology โ ASN.1 encoding rules: Specification | <title>Information Technology - ASN.1 encoding rules: Specification | |||
of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished | of | |||
Encoding Rules (DER)</title> | Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Enc | |||
oding Rules (DER)</title> | ||||
<author> | <author> | |||
<organization>International Telecommunication Union</organization> | <organization>International Telecommunication Union</organization> | |||
</author> | </author> | |||
<date year="1994"/> | <date year="2015"/> | |||
</front> | </front> | |||
<seriesInfo name="ITU-T" value="Recommendation X.690"/> | <seriesInfo name="ITU-T" value="Recommendation X.690"/> | |||
</reference> | </reference> | |||
<reference anchor="BSON" target="http://bsonspec.org/"> | <reference anchor="BSON" target="http://bsonspec.org/"> | |||
<front> | <front> | |||
<title>BSON - Binary JSON</title> | <title>BSON - Binary JSON</title> | |||
<author> | <author> | |||
<organization>Various</organization> | <organization>Various</organization> | |||
</author> | </author> | |||
<date year="2013"/> | ||||
</front> | </front> | |||
</reference> | </reference> | |||
<reference anchor="MessagePack" target="http://msgpack.org/"> | ||||
<reference anchor="MessagePack" target="https://msgpack.org/"> | ||||
<front> | <front> | |||
<title>MessagePack</title> | <title>MessagePack</title> | |||
<author initials="S." surname="Furuhashi" fullname="Sadayuki Furuhas hi"> | <author initials="S." surname="Furuhashi" fullname="Sadayuki Furuhas hi"> | |||
<organization/> | <organization/> | |||
</author> | </author> | |||
<date year="2013"/> | ||||
</front> | </front> | |||
</reference> | </reference> | |||
<reference anchor="YAML" target="http://www.yaml.org/spec/1.2/spec.html" | ||||
> | <reference anchor="YAML" target="https://www.yaml.org/spec/1.2/spec.html | |||
"> | ||||
<front> | <front> | |||
<title>YAML Ain't Markup Language (YAML[TM]) Version 1.2</title> | <title>YAML Ain't Markup Language (YAML[TM]) Version 1.2</title> | |||
<author initials="O." surname="Ben-Kiki" fullname="Oren Ben-Kiki"> | <author initials="O." surname="Ben-Kiki" fullname="Oren Ben-Kiki"> | |||
<organization/> | <organization/> | |||
</author> | </author> | |||
<author initials="C." surname="Evans" fullname="Clark Evans"> | <author initials="C." surname="Evans" fullname="Clark Evans"> | |||
<organization/> | <organization/> | |||
</author> | </author> | |||
<author initials="I.d." surname="Net" fullname="Ingy dot Net"> | <author initials="I.d." surname="Net" fullname="Ingy dรถt Net"> | |||
<organization/> | <organization/> | |||
</author> | </author> | |||
<date year="2009" month="October"/> | <date year="2009" month="October"/> | |||
</front> | </front> | |||
<seriesInfo name="3rd" value="Edition"/> | <refcontent>3rd Edition</refcontent> | |||
</reference> | ||||
<reference anchor="RFC8259" target="https://www.rfc-editor.org/info/rfc8 | ||||
259"> | ||||
<front> | ||||
<title>The JavaScript Object Notation (JSON) Data Interchange Format | ||||
</title> | ||||
<author initials="T." surname="Bray" fullname="T. Bray" role="editor | ||||
"> | ||||
<organization/> | ||||
</author> | ||||
<date year="2017" month="December"/> | ||||
<abstract> | ||||
<t>JavaScript Object Notation (JSON) is a lightweight, text-based, | ||||
language-independent data interchange format. It was derived from the ECMAScri | ||||
pt Programming Language Standard. JSON defines a small set of formatting rules | ||||
for the portable representation of structured data.</t> | ||||
<t>This document removes inconsistencies with other specifications | ||||
of JSON, repairs specification errors, and offers experience-based interoperabi | ||||
lity guidance.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="STD" value="90"/> | ||||
<seriesInfo name="RFC" value="8259"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8259"/> | ||||
</reference> | ||||
<reference anchor="RFC7228" target="https://www.rfc-editor.org/info/rfc7 | ||||
228"> | ||||
<front> | ||||
<title>Terminology for Constrained-Node Networks</title> | ||||
<author initials="C." surname="Bormann" fullname="C. Bormann"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="M." surname="Ersue" fullname="M. Ersue"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="A." surname="Keranen" fullname="A. Keranen"> | ||||
<organization/> | ||||
</author> | ||||
<date year="2014" month="May"/> | ||||
<abstract> | ||||
<t>The Internet Protocol Suite is increasingly used on small devic | ||||
es with severe constraints on power, memory, and processing resources, creating | ||||
constrained-node networks. This document provides a number of basic terms that | ||||
have been useful in the standardization work for constrained-node networks.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="7228"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC7228"/> | ||||
</reference> | ||||
<reference anchor="RFC6838" target="https://www.rfc-editor.org/info/rfc6 | ||||
838"> | ||||
<front> | ||||
<title>Media Type Specifications and Registration Procedures</title> | ||||
<author initials="N." surname="Freed" fullname="N. Freed"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="J." surname="Klensin" fullname="J. Klensin"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="T." surname="Hansen" fullname="T. Hansen"> | ||||
<organization/> | ||||
</author> | ||||
<date year="2013" month="January"/> | ||||
<abstract> | ||||
<t>This document defines procedures for the specification and regi | ||||
stration of media types for use in HTTP, MIME, and other Internet protocols. Th | ||||
is memo documents an Internet Best Current Practice.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="BCP" value="13"/> | ||||
<seriesInfo name="RFC" value="6838"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC6838"/> | ||||
</reference> | ||||
<reference anchor="RFC7049" target="https://www.rfc-editor.org/info/rfc7 | ||||
049"> | ||||
<front> | ||||
<title>Concise Binary Object Representation (CBOR)</title> | ||||
<author initials="C." surname="Bormann" fullname="C. Bormann"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="P." surname="Hoffman" fullname="P. Hoffman"> | ||||
<organization/> | ||||
</author> | ||||
<date year="2013" month="October"/> | ||||
<abstract> | ||||
<t>The Concise Binary Object Representation (CBOR) is a data forma | ||||
t whose design goals include the possibility of extremely small code size, fairl | ||||
y small message size, and extensibility without the need for version negotiation | ||||
. These design goals make it different from earlier binary serializations such | ||||
as ASN.1 and MessagePack.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="7049"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC7049"/> | ||||
</reference> | ||||
<reference anchor="RFC0713" target="https://www.rfc-editor.org/info/rfc7 | ||||
13"> | ||||
<front> | ||||
<title>MSDTP-Message Services Data Transmission Protocol</title> | ||||
<author initials="J." surname="Haverty" fullname="J. Haverty"> | ||||
<organization/> | ||||
</author> | ||||
<date year="1976" month="April"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="713"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC0713"/> | ||||
</reference> | </reference> | |||
<reference anchor="ECMA262" target="https://www.ecma-international.org/p | ||||
ublications/files/ECMA-ST/Ecma-262.pdf"> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC | |||
.8259.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.7228.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.6838.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.7049.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.0713.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.8610.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.8618.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.8742.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.8746.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.7493.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC | ||||
.7991.xml"/> | ||||
<reference anchor="ECMA262" target="https://www.ecma-international.org/p | ||||
ublications/standards/Ecma-262.htm"> | ||||
<front> | <front> | |||
<title>ECMAScript 2018 Language Specification</title> | <title>ECMAScript 2020 Language Specification</title> | |||
<author> | <author> | |||
<organization>Ecma International</organization> | <organization>Ecma International</organization> | |||
</author> | </author> | |||
<date year="2018" month="June"/> | <date year="2020" month="June"/> | |||
</front> | </front> | |||
<seriesInfo name="ECMA" value="Standard ECMA-262, 9th Edition"/> | <refcontent>Standard ECMA-262, 11th Edition</refcontent> | |||
</reference> | </reference> | |||
<reference anchor="PCRE" target="http://www.pcre.org/"> | ||||
<reference anchor="PCRE" target="https://www.pcre.org/"> | ||||
<front> | <front> | |||
<title>PCRE - Perl Compatible Regular Expressions</title> | <title>PCRE - Perl Compatible Regular Expressions</title> | |||
<author initials="A." surname="Ho" fullname="Andrew Ho"> | <author initials="P." surname="Hazel" fullname="Philip Hazel"> | |||
<organization/> | <organization/> | |||
</author> | </author> | |||
<date year="2018"/> | ||||
</front> | </front> | |||
</reference> | </reference> | |||
<reference anchor="SIPHASH_LNCS"> | <reference anchor="SIPHASH_LNCS"> | |||
<front> | <front> | |||
<title>SipHash: A Fast Short-Input PRF</title> | <title>SipHash: A Fast Short-Input PRF</title> | |||
<author initials="J." surname="Aumasson" fullname="Jean-Philippe Aum asson"> | <author initials="J." surname="Aumasson" fullname="Jean-Philippe Aum asson"> | |||
<organization/> | <organization/> | |||
</author> | </author> | |||
<author initials="D." surname="Bernstein" fullname="Daniel J. Bernst ein"> | <author initials="D." surname="Bernstein" fullname="Daniel J. Bernst ein"> | |||
<organization/> | <organization/> | |||
</author> | </author> | |||
<date year="2012"/> | <date year="2012"/> | |||
skipping to change at line 2785 ¶ | skipping to change at line 2623 ¶ | |||
<front> | <front> | |||
<title>SipHash: A Fast Short-Input PRF</title> | <title>SipHash: A Fast Short-Input PRF</title> | |||
<author initials="J." surname="Aumasson" fullname="Jean-Philippe Aum asson"> | <author initials="J." surname="Aumasson" fullname="Jean-Philippe Aum asson"> | |||
<organization/> | <organization/> | |||
</author> | </author> | |||
<author initials="D." surname="Bernstein" fullname="Daniel J. Bernst ein"> | <author initials="D." surname="Bernstein" fullname="Daniel J. Bernst ein"> | |||
<organization/> | <organization/> | |||
</author> | </author> | |||
<date year="2012"/> | <date year="2012"/> | |||
</front> | </front> | |||
<seriesInfo name="Lecture Notes in Computer Science" value="pp. 489-50 8"/> | ||||
<seriesInfo name="DOI" value="10.1007/978-3-642-34931-7_28"/> | <seriesInfo name="DOI" value="10.1007/978-3-642-34931-7_28"/> | |||
<refcontent>Progress in Cryptology - INDOCRYPT 2012, pp. 489-508</refc ontent> | ||||
</reference> | </reference> | |||
<reference anchor="SIPHASH_OPEN" target="https://131002.net/siphash/siph | ||||
ash.pdf"> | <reference anchor="SIPHASH_OPEN" target="https://www.aumasson.jp/siphash | |||
/siphash.pdf"> | ||||
<front> | <front> | |||
<title>SipHash: a fast short-input PRF</title> | <title>SipHash: a fast short-input PRF</title> | |||
<author initials="J." surname="Aumasson" fullname="Jean-Philippe Aum asson"> | <author initials="J." surname="Aumasson" fullname="Jean-Philippe Aum asson"> | |||
<organization/> | <organization/> | |||
</author> | </author> | |||
<author initials="D.J." surname="Bernstein" fullname="Daniel J. Bern stein"> | <author initials="D.J." surname="Bernstein" fullname="Daniel J. Bern stein"> | |||
<organization/> | <organization/> | |||
</author> | </author> | |||
<date/> | <date/> | |||
</front> | </front> | |||
</reference> | </reference> | |||
<reference anchor="RFC8610" target="https://www.rfc-editor.org/info/rfc8 | ||||
610"> | <reference anchor="IANA.cbor-tags" target="https://www.iana.org/assignme | |||
<front> | nts/cbor-tags"> | |||
<title>Concise Data Definition Language (CDDL): A Notational Convent | ||||
ion to Express Concise Binary Object Representation (CBOR) and JSON Data Structu | ||||
res</title> | ||||
<author initials="H." surname="Birkholz" fullname="H. Birkholz"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="C." surname="Vigano" fullname="C. Vigano"> | ||||
<organization/> | ||||
</author> | ||||
<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 Conci | ||||
se Binary Object Representation (CBOR) data structures (RFC 7049). Its main goa | ||||
l is to provide an easy and unambiguous way to express structures for protocol m | ||||
essages 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="RFC8618" target="https://www.rfc-editor.org/info/rfc8 | ||||
618"> | ||||
<front> | ||||
<title>Compacted-DNS (C-DNS): A Format for DNS Packet Capture</title | ||||
> | ||||
<author initials="J." surname="Dickinson" fullname="J. Dickinson"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="J." surname="Hague" fullname="J. Hague"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="S." surname="Dickinson" fullname="S. Dickinson"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="T." surname="Manderson" fullname="T. Manderson"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="J." surname="Bond" fullname="J. Bond"> | ||||
<organization/> | ||||
</author> | ||||
<date year="2019" month="September"/> | ||||
<abstract> | ||||
<t>This document describes a data representation for collections o | ||||
f DNS messages. The format is designed for efficient storage and transmission o | ||||
f large packet captures of DNS traffic; it attempts to minimize the size of such | ||||
packet capture files but retain the full DNS message contents along with the mo | ||||
st useful transport metadata. It is intended to assist with the development of D | ||||
NS traffic- monitoring applications.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8618"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8618"/> | ||||
</reference> | ||||
<reference anchor="RFC8742" target="https://www.rfc-editor.org/info/rfc8 | ||||
742"> | ||||
<front> | ||||
<title>Concise Binary Object Representation (CBOR) Sequences</title> | ||||
<author initials="C." surname="Bormann" fullname="C. Bormann"> | ||||
<organization/> | ||||
</author> | ||||
<date year="2020" month="February"/> | ||||
<abstract> | ||||
<t>This document describes the Concise Binary Object Representatio | ||||
n (CBOR) Sequence format and associated media type "application/cbor-seq". A CB | ||||
OR Sequence consists of any number of encoded CBOR data items, simply concatenat | ||||
ed in sequence.</t> | ||||
<t>Structured syntax suffixes for media types allow other media ty | ||||
pes to build on them and make it explicit that they are built on an existing med | ||||
ia type as their foundation. This specification defines and registers "+cbor-se | ||||
q" as a structured syntax suffix for CBOR Sequences.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8742"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8742"/> | ||||
</reference> | ||||
<reference anchor="RFC8746" target="https://www.rfc-editor.org/info/rfc8 | ||||
746"> | ||||
<front> | ||||
<title>Concise Binary Object Representation (CBOR) Tags for Typed Ar | ||||
rays</title> | ||||
<author initials="C." surname="Bormann" fullname="C. Bormann" role=" | ||||
editor"> | ||||
<organization/> | ||||
</author> | ||||
<date year="2020" month="February"/> | ||||
<abstract> | ||||
<t>The Concise Binary Object Representation (CBOR), as defined in | ||||
RFC 7049, is a data format whose design goals include the possibility of extreme | ||||
ly small code size, fairly small message size, and extensibility without the nee | ||||
d for version negotiation.</t> | ||||
<t>This document makes use of this extensibility to define a numbe | ||||
r of CBOR tags for typed arrays of numeric data, as well as additional tags for | ||||
multi-dimensional and homogeneous arrays. It is intended as the reference docum | ||||
ent for the IANA registration of the CBOR tags defined.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8746"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8746"/> | ||||
</reference> | ||||
<reference anchor="IANA.cbor-tags" target="http://www.iana.org/assignmen | ||||
ts/cbor-tags"> | ||||
<front> | <front> | |||
<title>Concise Binary Object Representation (CBOR) Tags</title> | <title>Concise Binary Object Representation (CBOR) Tags</title> | |||
<author> | <author> | |||
<organization>IANA</organization> | <organization>IANA</organization> | |||
</author> | </author> | |||
<date/> | ||||
</front> | </front> | |||
</reference> | </reference> | |||
<reference anchor="I-D.bormann-cbor-notable-tags" target="http://www.iet | ||||
f.org/internet-drafts/draft-bormann-cbor-notable-tags-02.txt"> | <xi:include href="https://datatracker.ietf.org/doc/bibxml3/reference.I-D.bormann | |||
<front> | -cbor-notable-tags.xml"/> | |||
<title>Notable CBOR Tags</title> | ||||
<author initials="C" surname="Bormann" fullname="Carsten Bormann"> | <reference anchor="IANA.cbor-simple-values" target="https://www.iana.org | |||
<organization/> | /assignments/cbor-simple-values"> | |||
</author> | ||||
<date month="June" day="25" year="2020"/> | ||||
<abstract> | ||||
<t>The Concise Binary Object Representation (CBOR, RFC 7049) is a | ||||
data format whose design goals include the possibility of extremely small code s | ||||
ize, fairly small message size, and extensibility without the need for version n | ||||
egotiation. In CBOR, one point of extensibility is the definition of CBOR tags. | ||||
RFC 7049 and its revision 7049bis define a basic set of tags as well as a regis | ||||
try that can be used to contribute additional tag definitions [IANA.cbor-tags]. | ||||
Since RFC 7049 was published, some 80 tag definitions have been added to that r | ||||
egistry. The present document provides a roadmap to a large subset of these tag | ||||
definitions. Where applicable, it points to a IETF standards or standard devel | ||||
opment document that specifies the tag. Where no such document exists, the inte | ||||
ntion is to collect specification information from the sources of the registrati | ||||
ons. After some more development, the present document is intended to be useful | ||||
as a reference document for the IANA registrations of the CBOR tags the definit | ||||
ions of which have been collected.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="Internet-Draft" value="draft-bormann-cbor-notable-ta | ||||
gs-02"/> | ||||
</reference> | ||||
<reference anchor="RFC7493" target="https://www.rfc-editor.org/info/rfc7 | ||||
493"> | ||||
<front> | ||||
<title>The I-JSON Message Format</title> | ||||
<author initials="T." surname="Bray" fullname="T. Bray" role="editor | ||||
"> | ||||
<organization/> | ||||
</author> | ||||
<date year="2015" month="March"/> | ||||
<abstract> | ||||
<t>I-JSON (short for "Internet JSON") is a restricted profile of J | ||||
SON designed to maximize interoperability and increase confidence that software | ||||
can process it successfully with predictable results.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="7493"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC7493"/> | ||||
</reference> | ||||
<reference anchor="IANA.cbor-simple-values" target="http://www.iana.org/ | ||||
assignments/cbor-simple-values"> | ||||
<front> | <front> | |||
<title>Concise Binary Object Representation (CBOR) Simple Values</ti tle> | <title>Concise Binary Object Representation (CBOR) Simple Values</ti tle> | |||
<author> | <author> | |||
<organization>IANA</organization> | <organization>IANA</organization> | |||
</author> | </author> | |||
<date/> | ||||
</front> | </front> | |||
</reference> | </reference> | |||
<reference anchor="IANA.media-types" target="http://www.iana.org/assignm | ||||
ents/media-types"> | <reference anchor="IANA.media-types" target="https://www.iana.org/assign | |||
ments/media-types"> | ||||
<front> | <front> | |||
<title>Media Types</title> | <title>Media Types</title> | |||
<author> | <author> | |||
<organization>IANA</organization> | <organization>IANA</organization> | |||
</author> | </author> | |||
<date/> | ||||
</front> | </front> | |||
</reference> | </reference> | |||
<reference anchor="IANA.core-parameters" target="http://www.iana.org/ass | ||||
ignments/core-parameters"> | <reference anchor="IANA.core-parameters" target="https://www.iana.org/as | |||
signments/core-parameters"> | ||||
<front> | <front> | |||
<title>Constrained RESTful Environments (CoRE) Parameters</title> | <title>Constrained RESTful Environments (CoRE) Parameters</title> | |||
<author> | <author> | |||
<organization>IANA</organization> | <organization>IANA</organization> | |||
</author> | </author> | |||
<date/> | ||||
</front> | </front> | |||
</reference> | </reference> | |||
<reference anchor="IANA.media-type-structured-suffix" target="http://www | ||||
.iana.org/assignments/media-type-structured-suffix"> | <reference anchor="IANA.structured-suffix" target="https://www.iana.org/ | |||
assignments/media-type-structured-suffix"> | ||||
<front> | <front> | |||
<title>Structured Syntax Suffix Registry</title> | <title>Structured Syntax Suffixes</title> | |||
<author> | <author> | |||
<organization>IANA</organization> | <organization>IANA</organization> | |||
</author> | </author> | |||
<date/> | ||||
</front> | ||||
</reference> | ||||
<reference anchor="RFC7991" target="https://www.rfc-editor.org/info/rfc7 | ||||
991"> | ||||
<front> | ||||
<title>The "xml2rfc" Version 3 Vocabulary</title> | ||||
<author initials="P." surname="Hoffman" fullname="P. Hoffman"> | ||||
<organization/> | ||||
</author> | ||||
<date year="2016" month="December"/> | ||||
<abstract> | ||||
<t>This document defines the "xml2rfc" version 3 vocabulary: an XM | ||||
L-based language used for writing RFCs and Internet-Drafts. It is heavily deriv | ||||
ed from the version 2 vocabulary that is also under discussion. This document o | ||||
bsoletes the v2 grammar described in RFC 7749.</t> | ||||
</abstract> | ||||
</front> | </front> | |||
<seriesInfo name="RFC" value="7991"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC7991"/> | ||||
</reference> | </reference> | |||
<reference anchor="Err3764" quote-title="false" target="https://www.rfc-editor.o | ||||
rg/errata/eid3764"> | ||||
<front> | ||||
<title>Erratum ID 3764</title> | ||||
<author> | ||||
<organization>RFC Errata</organization> | ||||
</author> | ||||
</front> | ||||
<refcontent>RFC 7049</refcontent> | ||||
</reference> | ||||
<reference anchor="Err3770" quote-title="false" target="https://www.rfc-editor.o | ||||
rg/errata/eid3770"> | ||||
<front> | ||||
<title>Erratum ID 3770</title> | ||||
<author> | ||||
<organization>RFC Errata</organization> | ||||
</author> | ||||
</front> | ||||
<refcontent>RFC 7049</refcontent> | ||||
</reference> | ||||
<reference anchor="Err4294" quote-title="false" target="https://www.rfc-editor.o | ||||
rg/errata/eid4294"> | ||||
<front> | ||||
<title>Erratum ID 4294</title> | ||||
<author> | ||||
<organization>RFC Errata</organization> | ||||
</author> | ||||
</front> | ||||
<refcontent>RFC 7049</refcontent> | ||||
</reference> | ||||
<reference anchor="Err5434" quote-title="false" target="https://www.rfc-editor.o | ||||
rg/errata/eid5434"> | ||||
<front> | ||||
<title>Erratum ID 5434</title> | ||||
<author> | ||||
<organization>RFC Errata</organization> | ||||
</author> | ||||
</front> | ||||
<refcontent>RFC 7049</refcontent> | ||||
</reference> | ||||
<reference anchor="Err5763" quote-title="false" target="https://www.rfc-editor.o | ||||
rg/errata/eid5763"> | ||||
<front> | ||||
<title>Erratum ID 5763</title> | ||||
<author> | ||||
<organization>RFC Errata</organization> | ||||
</author> | ||||
</front> | ||||
<refcontent>RFC 7049</refcontent> | ||||
</reference> | ||||
<reference anchor="Err5917" quote-title="false" target="https://www.rfc-editor.o | ||||
rg/errata/eid5917"> | ||||
<front> | ||||
<title>Erratum ID 5917</title> | ||||
<author> | ||||
<organization>RFC Errata</organization> | ||||
</author> | ||||
</front> | ||||
<refcontent>RFC 7049</refcontent> | ||||
</reference> | ||||
<reference anchor="Err4409" quote-title="false" target="https://www.rfc-editor.o | ||||
rg/errata/eid4409"> | ||||
<front> | ||||
<title>Erratum ID 4409</title> | ||||
<author> | ||||
<organization>RFC Errata</organization> | ||||
</author> | ||||
</front> | ||||
<refcontent>RFC 7049</refcontent> | ||||
</reference> | ||||
<reference anchor="Err4963" quote-title="false" target="https://www.rfc-editor.o | ||||
rg/errata/eid4963"> | ||||
<front> | ||||
<title>Erratum ID 4963</title> | ||||
<author> | ||||
<organization>RFC Errata</organization> | ||||
</author> | ||||
</front> | ||||
<refcontent>RFC 7049</refcontent> | ||||
</reference> | ||||
<reference anchor="Err4964" quote-title="false" target="https://www.rfc-editor.o | ||||
rg/errata/eid4964"> | ||||
<front> | ||||
<title>Erratum ID 4964</title> | ||||
<author> | ||||
<organization>RFC Errata</organization> | ||||
</author> | ||||
</front> | ||||
<refcontent>RFC 7049</refcontent> | ||||
</reference> | ||||
</references> | </references> | |||
</references> | </references> | |||
<section anchor="examples" toc="default"> | <section anchor="examples" toc="default"> | |||
<name>Examples of Encoded CBOR Data Items</name> | <name>Examples of Encoded CBOR Data Items</name> | |||
<t>The following table provides some CBOR-encoded values in hexadecimal | <t>The following table provides some CBOR-encoded values in hexadecimal | |||
(right column), together with diagnostic notation for these values | (right column), together with diagnostic notation for these values (left | |||
(left column). Note that the string "\u00fc" is one form of | column). Note that the string "\u00fc" is one form of diagnostic | |||
diagnostic notation for a UTF-8 string containing the single Unicode | notation for a UTF-8 string containing the single Unicode character <u | |||
character U+00FC, LATIN SMALL LETTER U WITH DIAERESIS (u umlaut). | format="num-name-lit">รผ</u>. Similarly, "\u6c34" is a UTF-8 string in | |||
Similarly, "\u6c34" is a UTF-8 string in diagnostic notation with a | diagnostic notation with a single character <u format="num-name-lit">ๆฐด</u> | |||
single character U+6C34 (CJK UNIFIED IDEOGRAPH-6C34, often | , | |||
representing "water"), and "\ud800\udd51" is a UTF-8 string in | often representing "water", and "\ud800\udd51" is a UTF-8 string | |||
diagnostic notation with a single character U+10151 (GREEK ACROPHONIC | in diagnostic notation with a single character <u | |||
ATTIC FIFTY STATERS). (Note that all these single-character strings | format="num-name-lit">๐ </u>. (Note that all these single-character | |||
could also be represented in native UTF-8 in diagnostic notation, just | strings could also be represented in native UTF-8 in diagnostic | |||
not in an ASCII-only specification.) In the | notation, just not if an ASCII-only specification is required.) | |||
diagnostic notation provided for bignums, their intended numeric value | In the diagnostic notation provided for | |||
is shown as a decimal number (such as 18446744073709551616) instead of | bignums, their intended numeric value is shown as a decimal number (such | |||
showing a tagged byte string (such as 2(h'010000000000000000')).</t> | as 18446744073709551616) instead of a tagged byte string (such as | |||
2(h'010000000000000000')).</t> | ||||
<table anchor="table_examples" align="center"> | <table anchor="table_examples" align="center"> | |||
<name>Examples of Encoded CBOR Data Items</name> | <name>Examples of Encoded CBOR Data Items</name> | |||
<thead> | <thead> | |||
<tr> | <tr> | |||
<th align="left">Diagnostic</th> | <th align="left">Diagnostic</th> | |||
<th align="left">Encoded</th> | <th align="left">Encoded</th> | |||
</tr> | </tr> | |||
</thead> | </thead> | |||
<tbody> | <tbody> | |||
<tr> | <tr> | |||
skipping to change at line 3334 ¶ | skipping to change at line 3149 ¶ | |||
<name>Jump Table for Initial Byte</name> | <name>Jump Table for Initial Byte</name> | |||
<thead> | <thead> | |||
<tr> | <tr> | |||
<th align="left">Byte</th> | <th align="left">Byte</th> | |||
<th align="left">Structure/Semantics</th> | <th align="left">Structure/Semantics</th> | |||
</tr> | </tr> | |||
</thead> | </thead> | |||
<tbody> | <tbody> | |||
<tr> | <tr> | |||
<td align="left">0x00..0x17</td> | <td align="left">0x00..0x17</td> | |||
<td align="left">Unsigned integer 0x00..0x17 (0..23)</td> | <td align="left">unsigned integer 0x00..0x17 (0..23)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0x18</td> | <td align="left">0x18</td> | |||
<td align="left">Unsigned integer (one-byte uint8_t follows)</td> | <td align="left">unsigned integer (one-byte uint8_t follows)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0x19</td> | <td align="left">0x19</td> | |||
<td align="left">Unsigned integer (two-byte uint16_t follows)</td> | <td align="left">unsigned integer (two-byte uint16_t follows)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0x1a</td> | <td align="left">0x1a</td> | |||
<td align="left">Unsigned integer (four-byte uint32_t follows)</td> | <td align="left">unsigned integer (four-byte uint32_t follows)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0x1b</td> | <td align="left">0x1b</td> | |||
<td align="left">Unsigned integer (eight-byte uint64_t follows)</td> | <td align="left">unsigned integer (eight-byte uint64_t follows)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0x20..0x37</td> | <td align="left">0x20..0x37</td> | |||
<td align="left">Negative integer -1-0x00..-1-0x17 (-1..-24)</td> | <td align="left">negative integer -1-0x00..-1-0x17 (-1..-24)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0x38</td> | <td align="left">0x38</td> | |||
<td align="left">Negative integer -1-n (one-byte uint8_t for n follo ws)</td> | <td align="left">negative integer -1-n (one-byte uint8_t for n follo ws)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0x39</td> | <td align="left">0x39</td> | |||
<td align="left">Negative integer -1-n (two-byte uint16_t for n foll ows)</td> | <td align="left">negative integer -1-n (two-byte uint16_t for n foll ows)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0x3a</td> | <td align="left">0x3a</td> | |||
<td align="left">Negative integer -1-n (four-byte uint32_t for n fol lows)</td> | <td align="left">negative integer -1-n (four-byte uint32_t for n fol lows)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0x3b</td> | <td align="left">0x3b</td> | |||
<td align="left">Negative integer -1-n (eight-byte uint64_t for n fo llows)</td> | <td align="left">negative integer -1-n (eight-byte uint64_t for n fo llows)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0x40..0x57</td> | <td align="left">0x40..0x57</td> | |||
<td align="left">byte string (0x00..0x17 bytes follow)</td> | <td align="left">byte string (0x00..0x17 bytes follow)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0x58</td> | <td align="left">0x58</td> | |||
<td align="left">byte string (one-byte uint8_t for n, and then n byt es follow)</td> | <td align="left">byte string (one-byte uint8_t for n, and then n byt es follow)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
skipping to change at line 3470 ¶ | skipping to change at line 3285 ¶ | |||
<tr> | <tr> | |||
<td align="left">0xbb</td> | <td align="left">0xbb</td> | |||
<td align="left">map (eight-byte uint64_t for n, and then n pairs of data items follow)</td> | <td align="left">map (eight-byte uint64_t for n, and then n pairs of data items follow)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0xbf</td> | <td align="left">0xbf</td> | |||
<td align="left">map, pairs of data items follow, terminated by "bre ak"</td> | <td align="left">map, pairs of data items follow, terminated by "bre ak"</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0xc0</td> | <td align="left">0xc0</td> | |||
<td align="left">Text-based date/time (data item follows; see <xref target="stringdatetimesect" format="default"/>)</td> | <td align="left">text-based date/time (data item follows; see <xref target="stringdatetimesect" format="default"/>)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0xc1</td> | <td align="left">0xc1</td> | |||
<td align="left">Epoch-based date/time (data item follows; see <xref target="epochdatetimesect" format="default"/>)</td> | <td align="left">epoch-based date/time (data item follows; see <xref target="epochdatetimesect" format="default"/>)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0xc2</td> | <td align="left">0xc2</td> | |||
<td align="left">Positive bignum (data item "byte string" follows)</ td> | <td align="left">unsigned bignum (data item "byte string" follows)</ td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0xc3</td> | <td align="left">0xc3</td> | |||
<td align="left">Negative bignum (data item "byte string" follows)</ td> | <td align="left">negative bignum (data item "byte string" follows)</ td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0xc4</td> | <td align="left">0xc4</td> | |||
<td align="left">Decimal Fraction (data item "array" follows; see <x ref target="fractions" format="default"/>)</td> | <td align="left">decimal Fraction (data item "array" follows; see <x ref target="fractions" format="default"/>)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0xc5</td> | <td align="left">0xc5</td> | |||
<td align="left">Bigfloat (data item "array" follows; see <xref targ et="fractions" format="default"/>)</td> | <td align="left">bigfloat (data item "array" follows; see <xref targ et="fractions" format="default"/>)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0xc6..0xd4</td> | <td align="left">0xc6..0xd4</td> | |||
<td align="left">(tag)</td> | <td align="left">(tag)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0xd5..0xd7</td> | <td align="left">0xd5..0xd7</td> | |||
<td align="left">Expected Conversion (data item follows; see <xref t arget="convexpect" format="default"/>)</td> | <td align="left">expected conversion (data item follows; see <xref t arget="convexpect" format="default"/>)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0xd8..0xdb</td> | <td align="left">0xd8..0xdb</td> | |||
<td align="left">(more tags; 1/2/4/8 bytes of tag number and then a data item follow)</td> | <td align="left">(more tags; 1/2/4/8 bytes of tag number and then a data item follow)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0xe0..0xf3</td> | <td align="left">0xe0..0xf3</td> | |||
<td align="left">(simple value)</td> | <td align="left">(simple value)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0xf4</td> | <td align="left">0xf4</td> | |||
<td align="left">False</td> | <td align="left">false</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0xf5</td> | <td align="left">0xf5</td> | |||
<td align="left">True</td> | <td align="left">true</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0xf6</td> | <td align="left">0xf6</td> | |||
<td align="left">Null</td> | <td align="left">null</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0xf7</td> | <td align="left">0xf7</td> | |||
<td align="left">Undefined</td> | <td align="left">undefined</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0xf8</td> | <td align="left">0xf8</td> | |||
<td align="left">(simple value, one byte follows)</td> | <td align="left">(simple value, one byte follows)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0xf9</td> | <td align="left">0xf9</td> | |||
<td align="left">Half-Precision Float (two-byte IEEE 754)</td> | <td align="left">half-precision float (two-byte IEEE 754)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0xfa</td> | <td align="left">0xfa</td> | |||
<td align="left">Single-Precision Float (four-byte IEEE 754)</td> | <td align="left">single-precision float (four-byte IEEE 754)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0xfb</td> | <td align="left">0xfb</td> | |||
<td align="left">Double-Precision Float (eight-byte IEEE 754)</td> | <td align="left">double-precision float (eight-byte IEEE 754)</td> | |||
</tr> | </tr> | |||
<tr> | <tr> | |||
<td align="left">0xff</td> | <td align="left">0xff</td> | |||
<td align="left">"break" stop code</td> | <td align="left">"break" stop code</td> | |||
</tr> | </tr> | |||
</tbody> | </tbody> | |||
</table> | </table> | |||
</section> | </section> | |||
<section anchor="pseudocode" toc="default"> | <section anchor="pseudocode" toc="default"> | |||
<name>Pseudocode</name> | <name>Pseudocode</name> | |||
<t>The well-formedness of a CBOR item can be checked by the | <t>The well-formedness of a CBOR item can be checked by the | |||
pseudocode in <xref target="pseudo" format="default"/>. The data is well-formed if and only if:</t> | pseudocode in <xref target="pseudo" format="default"/>. The data is well-formed if and only if:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>the pseudocode does not "fail";</li> | <li>the pseudocode does not "fail";</li> | |||
<li>after execution of the pseudocode, no bytes are left in the input | <li>after execution of the pseudocode, no bytes are left in the input | |||
(except in streaming applications)</li> | (except in streaming applications).</li> | |||
</ul> | </ul> | |||
<t>The pseudocode has the following prerequisites:</t> | <t>The pseudocode has the following prerequisites:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>take(n) reads n bytes from the input data and returns them as a byte | <li>take(n) reads n bytes from the input data and returns them as a byte | |||
string. If n bytes are no longer available, take(n) fails.</li> | string. If n bytes are no longer available, take(n) fails.</li> | |||
<li>uint() converts a byte string into an unsigned integer by | <li>uint() converts a byte string into an unsigned integer by | |||
interpreting the byte string in network byte order.</li> | interpreting the byte string in network byte order.</li> | |||
<li>Arithmetic works as in C.</li> | <li>Arithmetic works as in C.</li> | |||
<li>All variables are unsigned integers of sufficient range.</li> | <li>All variables are unsigned integers of sufficient range.</li> | |||
</ul> | </ul> | |||
<t>Note that <tt>well_formed</tt> returns the major type for well-formed | <t>Note that <tt>well_formed</tt> returns the major type for well-formed | |||
definite length items, but 99 for an indefinite length item (or -1 for | definite-length items, but 99 for an indefinite-length item (or -1 for | |||
a "break" stop code, only if <tt>breakable</tt> is set). This is used in | a "break" stop code, only if <tt>breakable</tt> is set). This is used in | |||
<tt>well_formed_indefinite</tt> to ascertain that indefinite length strings | <tt>well_formed_indefinite</tt> to ascertain that indefinite-length strings | |||
only contain definite length strings as chunks.</t> | only contain definite-length strings as chunks.</t> | |||
<figure anchor="pseudo"> | <figure anchor="pseudo"> | |||
<name>Pseudocode for Well-Formedness Check</name> | <name>Pseudocode for Well-Formedness Check</name> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <sourcecode type="pseudocode" markers="false"><![CDATA[ | |||
well_formed(breakable = false) { | well_formed(breakable = false) { | |||
// process initial bytes | // process initial bytes | |||
ib = uint(take(1)); | ib = uint(take(1)); | |||
mt = ib >> 5; | mt = ib >> 5; | |||
val = ai = ib & 0x1f; | val = ai = ib & 0x1f; | |||
switch (ai) { | switch (ai) { | |||
case 24: val = uint(take(1)); break; | case 24: val = uint(take(1)); break; | |||
case 25: val = uint(take(2)); break; | case 25: val = uint(take(2)); break; | |||
case 26: val = uint(take(4)); break; | case 26: val = uint(take(4)); break; | |||
case 27: val = uint(take(8)); break; | case 27: val = uint(take(8)); break; | |||
skipping to change at line 3616 ¶ | skipping to change at line 3431 ¶ | |||
case 4: while (well_formed(true) != -1); break; | case 4: while (well_formed(true) != -1); break; | |||
case 5: while (well_formed(true) != -1) well_formed(); break; | case 5: while (well_formed(true) != -1) well_formed(); break; | |||
case 7: | case 7: | |||
if (breakable) | if (breakable) | |||
return -1; // signal break out | return -1; // signal break out | |||
else fail(); // no enclosing indefinite | else fail(); // no enclosing indefinite | |||
default: fail(); // wrong mt | default: fail(); // wrong mt | |||
} | } | |||
return 99; // indefinite-length data item | return 99; // indefinite-length data item | |||
} | } | |||
]]></artwork> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<t>Note that the remaining complexity of a complete CBOR decoder is about | <t>Note that the remaining complexity of a complete CBOR decoder is about | |||
presenting data that has been decoded to the application in an | presenting data that has been decoded to the application in an | |||
appropriate form.</t> | appropriate form.</t> | |||
<t>Major types 0 and 1 are designed in such a way that they can be | <t>Major types 0 and 1 are designed in such a way that they can be | |||
encoded in C from a signed integer without actually doing an | encoded in C from a signed integer without actually doing an | |||
if-then-else for positive/negative (<xref target="branchless" format="default"/> ). This uses the | if-then-else for positive/negative (<xref target="branchless" format="default"/> ). This uses the | |||
fact that (-1-n), the transformation for major type 1, is the same as | fact that (-1-n), the transformation for major type 1, is the same as | |||
~n (bitwise complement) in C unsigned arithmetic; ~n can then be | ~n (bitwise complement) in C unsigned arithmetic; ~n can then be | |||
expressed as (-1)^n for the negative case, while 0^n leaves n | expressed as (-1)^n for the negative case, while 0^n leaves n | |||
unchanged for non-negative. The sign of a number can be converted to | unchanged for nonnegative. The sign of a number can be converted to | |||
-1 for negative and 0 for non-negative (0 or positive) by | -1 for negative and 0 for nonnegative (0 or positive) by | |||
arithmetic-shifting the number by one bit less than the bit length of | arithmetic-shifting the number by one bit less than the bit length of | |||
1 for negative and 0 for <span class="insert">nonnegative</span> (0 or positive) by | ||||
the number (for example, by 63 for 64-bit numbers).</t> | the number (for example, by 63 for 64-bit numbers).</t> | |||
<figure anchor="branchless"> | <figure anchor="branchless"> | |||
<name>Pseudocode for Encoding a Signed Integer</name> | <name>Pseudocode for Encoding a Signed Integer</name> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <sourcecode type="pseudocode" markers="false"><![CDATA[ | |||
void encode_sint(int64_t n) { | void encode_sint(int64_t n) { | |||
uint64t ui = n >> 63; // extend sign to whole length | uint64t ui = n >> 63; // extend sign to whole length | |||
unsigned mt = ui & 0x20; // extract (shifted) major type | unsigned mt = ui & 0x20; // extract (shifted) major type | |||
ui ^= n; // complement negatives | ui ^= n; // complement negatives | |||
if (ui < 24) | if (ui < 24) | |||
*p++ = mt + ui; | *p++ = mt + ui; | |||
else if (ui < 256) { | else if (ui < 256) { | |||
*p++ = mt + 24; | *p++ = mt + 24; | |||
*p++ = ui; | *p++ = ui; | |||
} else | } else | |||
... | ... | |||
]]></artwork> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<t>See <xref target="terminology" format="default"/> for some specific ass umptions about the profile of | <t>See <xref target="terminology" format="default"/> for some specific ass umptions about the profile of | |||
the C language used in these pieces of code.</t> | the C language used in these pieces of code.</t> | |||
</section> | </section> | |||
<section anchor="half-precision" toc="default"> | <section anchor="half-precision" toc="default"> | |||
<name>Half-Precision</name> | <name>Half-Precision</name> | |||
<t>As half-precision floating-point numbers were only added to IEEE 754 | <t>As half-precision floating-point numbers were only added to IEEE 754 | |||
in 2008 <xref target="IEEE754" format="default"/>, today's programming platforms often still only have limited | in 2008 <xref target="IEEE754" format="default"/>, today's programming platforms often still only have limited | |||
support for them. It is very easy to include at least decoding | support for them. It is very easy to include at least decoding | |||
support for them even without such support. An example of a small | support for them even without such support. An example of a small | |||
decoder for half-precision floating-point numbers in the C language is | decoder for half-precision floating-point numbers in the C language is | |||
shown in <xref target="decode-half-c" format="default"/>. A similar program for Python is in | shown in <xref target="decode-half-c" format="default"/>. A similar program for Python is in | |||
<xref target="decode-half-py" format="default"/>; this code assumes that the 2-b yte value has | <xref target="decode-half-py" format="default"/>; this code assumes that the 2-b yte value has | |||
already been decoded as an (unsigned short) integer in network byte | already been decoded as an (unsigned short) integer in network byte | |||
order (as would be done by the pseudocode in <xref target="pseudocode" format="d efault"/>).</t> | order (as would be done by the pseudocode in <xref target="pseudocode" format="d efault"/>).</t> | |||
<figure anchor="decode-half-c"> | <figure anchor="decode-half-c"> | |||
<name>C Code for a Half-Precision Decoder</name> | <name>C Code for a Half-Precision Decoder</name> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <sourcecode type="c" markers="false"><![CDATA[ | |||
#include <math.h> | #include <math.h> | |||
double decode_half(unsigned char *halfp) { | double decode_half(unsigned char *halfp) { | |||
unsigned half = (halfp[0] << 8) + halfp[1]; | unsigned half = (halfp[0] << 8) + halfp[1]; | |||
unsigned exp = (half >> 10) & 0x1f; | unsigned exp = (half >> 10) & 0x1f; | |||
unsigned mant = half & 0x3ff; | unsigned mant = half & 0x3ff; | |||
double val; | double val; | |||
if (exp == 0) val = ldexp(mant, -24); | if (exp == 0) val = ldexp(mant, -24); | |||
else if (exp != 31) val = ldexp(mant + 1024, exp - 25); | else if (exp != 31) val = ldexp(mant + 1024, exp - 25); | |||
else val = mant == 0 ? INFINITY : NAN; | else val = mant == 0 ? INFINITY : NAN; | |||
return half & 0x8000 ? -val : val; | return half & 0x8000 ? -val : val; | |||
} | } | |||
]]></artwork> | ]]></sourcecode> | |||
</figure> | </figure> | |||
<figure anchor="decode-half-py"> | <figure anchor="decode-half-py"> | |||
<name>Python Code for a Half-Precision Decoder</name> | <name>Python Code for a Half-Precision Decoder</name> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | <sourcecode type="python" markers="false"><![CDATA[ | |||
import struct | import struct | |||
from math import ldexp | from math import ldexp | |||
def decode_single(single): | def decode_single(single): | |||
return struct.unpack("!f", struct.pack("!I", single))[0] | return struct.unpack("!f", struct.pack("!I", single))[0] | |||
def decode_half(half): | def decode_half(half): | |||
valu = (half & 0x7fff) << 13 | (half & 0x8000) << 16 | valu = (half & 0x7fff) << 13 | (half & 0x8000) << 16 | |||
if ((half & 0x7c00) != 0x7c00): | if ((half & 0x7c00) != 0x7c00): | |||
return ldexp(decode_single(valu), 112) | return ldexp(decode_single(valu), 112) | |||
return decode_single(valu | 0x7f800000) | return decode_single(valu | 0x7f800000) | |||
]]></artwork> | ]]></sourcecode> | |||
</figure> | </figure> | |||
</section> | </section> | |||
<section anchor="comparison-app" toc="default"> | <section anchor="comparison-app" toc="default"> | |||
<name>Comparison of Other Binary Formats to CBOR's Design Objectives</name > | <name>Comparison of Other Binary Formats to CBOR's Design Objectives</name > | |||
<t>The proposal for CBOR follows a history of binary formats that is as | <t>The proposal for CBOR follows a history of binary formats that is as | |||
long as the history of computers themselves. Different formats have | long as the history of computers themselves. Different formats have | |||
had different objectives. In most cases, the objectives of the format | had different objectives. In most cases, the objectives of the format | |||
were never stated, although they can sometimes be implied by the | were never stated, although they can sometimes be implied by the | |||
context where the format was first used. Some formats were meant to be | context where the format was first used. Some formats were meant to be | |||
universally usable, although history has proven that no binary format | universally usable, although history has proven that no binary format | |||
skipping to change at line 3723 ¶ | skipping to change at line 3539 ¶ | |||
<ol spacing="normal" type="1"><li>unambiguous encoding of most common data formats from Internet | <ol spacing="normal" type="1"><li>unambiguous encoding of most common data formats from Internet | |||
standards</li> | standards</li> | |||
<li>code compactness for encoder or decoder</li> | <li>code compactness for encoder or decoder</li> | |||
<li>no schema description needed</li> | <li>no schema description needed</li> | |||
<li>reasonably compact serialization</li> | <li>reasonably compact serialization</li> | |||
<li>applicability to constrained and unconstrained applications</li> | <li>applicability to constrained and unconstrained applications</li> | |||
<li>good JSON conversion</li> | <li>good JSON conversion</li> | |||
<li>extensibility</li> | <li>extensibility</li> | |||
</ol> | </ol> | |||
<t>A discussion of CBOR and other formats with respect to a different set | <t>A discussion of CBOR and other formats with respect to a different set | |||
of design objectives is provided in Section 5 and Appendix C of | of design objectives is provided in Section <xref target="RFC8618" section="5" s | |||
ectionFormat="bare" format="default"/> | ||||
and Appendix <xref target="RFC8618" section="C" sectionFormat="bare" format="def | ||||
ault"/> of | ||||
<xref target="RFC8618" format="default"/>.</t> | <xref target="RFC8618" format="default"/>.</t> | |||
<section anchor="asn1-der-ber-and-per" toc="default"> | <section anchor="asn1-der-ber-and-per" toc="default"> | |||
<name>ASN.1 DER, BER, and PER</name> | <name>ASN.1 DER, BER, and PER</name> | |||
<t><xref target="ASN.1" format="default"/> has many serializations. In t he IETF, DER and BER are the | <t><xref target="ASN.1" format="default"/> has many serializations. In t he IETF, DER and BER are the | |||
most common. The serialized output is not particularly compact for | most common. The serialized output is not particularly compact for | |||
many items, and the code needed to decode numeric items can be complex | many items, and the code needed to decode numeric items can be complex | |||
on a constrained device.</t> | on a constrained device.</t> | |||
<t>Few (if any) IETF protocols have adopted one of the several variants | <t>Few (if any) IETF protocols have adopted one of the several variants | |||
of Packed Encoding Rules (PER). There could be many reasons for this, | of Packed Encoding Rules (PER). There could be many reasons for this, | |||
but one that is commonly stated is that PER makes use of the schema | but one that is commonly stated is that PER makes use of the schema | |||
skipping to change at line 3824 ¶ | skipping to change at line 3641 ¶ | |||
<tr> | <tr> | |||
<td align="left">CBOR</td> | <td align="left">CBOR</td> | |||
<td align="left">82 01 82 02 03</td> | <td align="left">82 01 82 02 03</td> | |||
<td align="left">9f 01 82 02 03 ff</td> | <td align="left">9f 01 82 02 03 ff</td> | |||
</tr> | </tr> | |||
</tbody> | </tbody> | |||
</table> | </table> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="errors" toc="default"> | <section anchor="errors" toc="default"> | |||
<name>Well-formedness errors and examples</name> | <name>Well-Formedness Errors and Examples</name> | |||
<t>There are three basic kinds of well-formedness errors that can occur | <t>There are three basic kinds of well-formedness errors that can occur | |||
in decoding a CBOR data item:</t> | in decoding a CBOR data item:</t> | |||
<ul spacing="normal"> | <dl spacing="normal"> | |||
<li>Too much data: There are input bytes left that were not consumed. | <dt>Too much data:</dt><dd>There are input bytes left that were not cons | |||
umed. | ||||
This is only an error if the application assumed that the input | This is only an error if the application assumed that the input | |||
bytes would span exactly one data item. Where the application | bytes would span exactly one data item. Where the application | |||
uses the self-delimiting nature of CBOR encoding to permit | uses the self-delimiting nature of CBOR encoding to permit | |||
additional data after the data item, as is for example done in CBOR | additional data after the data item, as is done in CBOR | |||
sequences <xref target="RFC8742" format="default"/>, the CBOR decoder can simply | sequences <xref target="RFC8742" format="default"/>, for example, the CBOR decod | |||
indicate what part of the input has not been consumed.</li> | er can simply | |||
<li>Too little data: The input data available would need additional | indicate which part of the input has not been consumed.</dd> | |||
<dt>Too little data:</dt><dd>The input data available would need additio | ||||
nal | ||||
bytes added at their end for a complete CBOR data item. This may | bytes added at their end for a complete CBOR data item. This may | |||
indicate the input is truncated; it is also a common error when | indicate the input is truncated; it is also a common error when | |||
trying to decode random data as CBOR. For some | trying to decode random data as CBOR. For some | |||
applications, however, this may not actually be an error, as the | applications, however, this may not actually be an error, as the | |||
application may not be certain it has all the data yet and can | application may not be certain it has all the data yet and can | |||
obtain or wait for additional input bytes. Some of | obtain or wait for additional input bytes. Some of | |||
these applications may have an upper limit for how much additional | these applications may have an upper limit for how much additional | |||
data can show up; here the decoder may be able to indicate that the | data can appear; here the decoder may be able to indicate that the | |||
encoded CBOR data item cannot be completed within this limit.</li> | encoded CBOR data item cannot be completed within this limit.</dd> | |||
<li>Syntax error: The input data are not consistent with the | <dt>Syntax error:</dt><dd>The input data are not consistent with the | |||
requirements of the CBOR encoding, and this cannot be remedied by | requirements of the CBOR encoding, and this cannot be remedied by | |||
adding (or removing) data at the end.</li> | adding (or removing) data at the end.</dd> | |||
</ul> | </dl> | |||
<t>In <xref target="pseudocode" format="default"/>, errors of the first ki nd are addressed in the first | <t>In <xref target="pseudocode" format="default"/>, errors of the first ki nd are addressed in the first | |||
paragraph/bullet list (requiring "no bytes are left"), and errors of | paragraph and bullet list (requiring "no bytes are left"), and errors of | |||
the second kind are addressed in the second paragraph/bullet list | the second kind are addressed in the second paragraph/bullet list | |||
(failing "if n bytes are no longer available"). Errors of the third | (failing "if n bytes are no longer available"). Errors of the third | |||
kind are identified in the pseudocode by specific instances of calling | kind are identified in the pseudocode by specific instances of calling | |||
fail(), in order:</t> | fail(), in order:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>a reserved value is used for additional information (28, 29, 30)</li > | <li>a reserved value is used for additional information (28, 29, 30)</li > | |||
<li>major type 7, additional information 24, value < 32 (incorrect)</ li> | <li>major type 7, additional information 24, value < 32 (incorrect)</ li> | |||
<li>incorrect substructure of indefinite length byte/text string (may | <li>incorrect substructure of indefinite-length byte string or text stri | |||
only contain definite length strings of the same major type)</li> | ng (may | |||
<li>"break" stop code (mt=7, ai=31) occurs in a value position of a map | only contain definite-length strings of the same major type)</li> | |||
or | <li>"break" stop code (major type 7, additional information 31) occurs i | |||
except at a position directly in an indefinite length item where | n a value position of a map or | |||
except at a position directly in an indefinite-length item where | ||||
also another enclosed data item could occur</li> | also another enclosed data item could occur</li> | |||
<li>additional information 31 used with major type 0, 1, or 6</li> | <li>additional information 31 used with major type 0, 1, or 6</li> | |||
</ul> | </ul> | |||
<section anchor="examples-for-cbor-data-items-that-are-not-well-formed" to c="default"> | <section anchor="examples-for-cbor-data-items-that-are-not-well-formed" to c="default"> | |||
<name>Examples for CBOR data items that are not well-formed</name> | <name>Examples of CBOR Data Items That Are Not Well-Formed</name> | |||
<t>This subsection shows a few examples for CBOR data items that are not | <t>This subsection shows a few examples for CBOR data items that are not | |||
well-formed. Each example is a sequence of bytes each shown in | well-formed. Each example is a sequence of bytes, each shown in | |||
hexadecimal; multiple examples in a list are separated by commas.</t> | hexadecimal; multiple examples in a list are separated by commas.</t> | |||
<t>Examples for well-formedness error kind 1 (too much data) can easily | <t>Examples for well-formedness error kind 1 (too much data) can easily | |||
be formed by adding data to a well-formed encoded CBOR data item.</t> | be formed by adding data to a well-formed encoded CBOR data item.</t> | |||
<t>Similarly, examples for well-formedness error kind 2 (too little data ) | <t>Similarly, examples for well-formedness error kind 2 (too little data ) | |||
can be formed by truncating a well-formed encoded CBOR data item. In | can be formed by truncating a well-formed encoded CBOR data item. In | |||
test suites, it may be beneficial to specifically test with incomplete | test suites, it may be beneficial to specifically test with incomplete | |||
data items that would require large amounts of addition to be | data items that would require large amounts of addition to be | |||
completed (for instance by starting the encoding of a string of a very | completed (for instance by starting the encoding of a string of a very | |||
large size).</t> | large size).</t> | |||
<t>A premature end of the input can occur in a head or within the enclos ed | <t>A premature end of the input can occur in a head or within the enclos ed | |||
data, which may be bare strings or enclosed data items that are either | data, which may be bare strings or enclosed data items that are either | |||
counted or should have been ended by a "break" stop code.</t> | counted or should have been ended by a "break" stop code.</t> | |||
<ul spacing="normal"> | <dl spacing="normal"> | |||
<li>End of input in a head: 18, 19, 1a, 1b, 19 01, 1a 01 02, 1b 01 02 | <dt>End of input in a head:</dt><dd>18, 19, 1a, 1b, 19 01, 1a 01 02, 1 | |||
03 | b 01 02 03 | |||
04 05 06 07, 38, 58, 78, 98, 9a 01 ff 00, b8, d8, f8, f9 00, fa 00 | 04 05 06 07, 38, 58, 78, 98, 9a 01 ff 00, b8, d8, f8, f9 00, fa 00 | |||
00, fb 00 00 00</li> | 00, fb 00 00 00</dd> | |||
<li>Definite length strings with short data: 41, 61, 5a ff ff ff ff 00 | <dt>Definite-length strings with short data:</dt><dd>41, 61, 5a ff ff | |||
, | ff ff 00, | |||
5b ff ff ff ff ff ff ff ff 01 02 03, 7a ff ff ff ff 00, 7b 7f ff ff | 5b ff ff ff ff ff ff ff ff 01 02 03, 7a ff ff ff ff 00, 7b 7f ff ff | |||
ff ff ff ff ff 01 02 03</li> | ff ff ff ff ff 01 02 03</dd> | |||
<li>Definite length maps and arrays not closed with enough items: 81, | <dt>Definite-length maps and arrays not closed with enough items:</dt> | |||
81 | <dd>81, 81 | |||
81 81 81 81 81 81 81 81, 82 00, a1, a2 01 02, a1 00, a2 00 00 00</li> | 81 81 81 81 81 81 81 81, 82 00, a1, a2 01 02, a1 00, a2 00 00 00</dd> | |||
<li>Tag number not followed by tag content: c0</li> | <dt>Tag number not followed by tag content:</dt><dd>c0</dd> | |||
<li>Indefinite length strings not closed by a "break" stop code: 5f 41 | <dt>Indefinite-length strings not closed by a "break" stop code:</dt>< | |||
00, 7f 61 00</li> | dd>5f 41 00, 7f 61 00</dd> | |||
<li>Indefinite length maps and arrays not closed by a "break" stop cod | <dt>Indefinite-length maps and arrays not closed by a "break" stop cod | |||
e: | e:</dt><dd> | |||
9f, 9f 01 02, bf, bf 01 02 01 02, 81 9f, 9f 80 00, 9f 9f 9f 9f 9f ff | 9f, 9f 01 02, bf, bf 01 02 01 02, 81 9f, 9f 80 00, 9f 9f 9f 9f 9f ff | |||
ff ff ff, 9f 81 9f 81 9f 9f ff ff ff</li> | ff ff ff, 9f 81 9f 81 9f 9f ff ff ff</dd> | |||
</ul> | </dl> | |||
<t>A few examples for the five subkinds of well-formedness error kind 3 | <t>A few examples for the five subkinds of well-formedness error kind 3 | |||
(syntax error) are shown below.</t> | (syntax error) are shown below.</t> | |||
<t>Subkind 1:</t> | <dl newline="true" spacing="normal"> | |||
<ul spacing="normal"> | <dt>Subkind 1:</dt><dd> | |||
<li>Reserved additional information values: 1c, 1d, 1e, 3c, 3d, 3e, 5c | <t/> | |||
, | <dl spacing="normal"> | |||
5d, 5e, 7c, 7d, 7e, 9c, 9d, 9e, bc, bd, be, dc, dd, de, fc, fd, fe,</li> | <dt>Reserved additional information values:</dt><dd>1c, 1d, 1e, 3c, 3d | |||
</ul> | , 3e, 5c, | |||
<t>Subkind 2:</t> | 5d, 5e, 7c, 7d, 7e, 9c, 9d, 9e, bc, bd, be, dc, dd, de, fc, fd, fe,</dd> | |||
<ul spacing="normal"> | </dl> | |||
<li>Reserved two-byte encodings of simple values: f8 00, f8 01, f8 18, | </dd> | |||
f8 1f</li> | <dt>Subkind 2:</dt><dd> | |||
</ul> | <t/> | |||
<t>Subkind 3:</t> | <dl spacing="normal"> | |||
<ul spacing="normal"> | <dt>Reserved two-byte encodings of simple values:</dt><dd>f8 00, f8 01 | |||
<li>Indefinite length string chunks not of the correct type: 5f 00 ff, | , f8 18, f8 1f</dd> | |||
</dl> | ||||
</dd> | ||||
<dt>Subkind 3:</dt><dd> | ||||
<t/> | ||||
<dl spacing="normal"> | ||||
<dt>Indefinite-length string chunks not of the correct type:</dt><dd>5 | ||||
f 00 ff, | ||||
5f 21 ff, 5f 61 00 ff, 5f 80 ff, 5f a0 ff, 5f c0 00 ff, 5f e0 ff, 7f | 5f 21 ff, 5f 61 00 ff, 5f 80 ff, 5f a0 ff, 5f c0 00 ff, 5f e0 ff, 7f | |||
41 00 ff</li> | 41 00 ff</dd> | |||
<li>Indefinite length string chunks not definite length: | <dt>Indefinite-length string chunks not definite length:</dt><dd> | |||
5f 5f 41 00 ff ff, 7f 7f 61 00 ff ff</li> | 5f 5f 41 00 ff ff, 7f 7f 61 00 ff ff</dd> | |||
</ul> | </dl> | |||
<t>Subkind 4:</t> | </dd> | |||
<ul spacing="normal"> | <dt>Subkind 4:</dt><dd> | |||
<li>Break occurring on its own outside of an indefinite length item: f | <t/> | |||
f</li> | <dl spacing="normal"> | |||
<li>Break occurring in a definite length array or map or a tag: 81 ff, | <dt>Break occurring on its own outside of an indefinite-length item:</ | |||
dt><dd> ff</dd> | ||||
<dt>Break occurring in a definite-length array or map or a tag:</dt><d | ||||
d>81 ff, | ||||
82 00 ff, a1 ff, a1 ff 00, a1 00 ff, a2 00 00 ff, 9f 81 ff, 9f 82 9f | 82 00 ff, a1 ff, a1 ff 00, a1 00 ff, a2 00 00 ff, 9f 81 ff, 9f 82 9f | |||
81 9f 9f ff ff ff ff</li> | 81 9f 9f ff ff ff ff</dd> | |||
<li>Break in indefinite length map would lead to odd number of items | <dt>Break in an indefinite-length map that would lead to an odd number | |||
(break in a value position): bf 00 ff, bf 00 00 00 ff</li> | of items | |||
</ul> | (break in a value position):</dt><dd>bf 00 ff, bf 00 00 00 ff</dd> | |||
<t>Subkind 5:</t> | </dl> | |||
<ul spacing="normal"> | </dd> | |||
<li>Major type 0, 1, 6 with additional information 31: 1f, 3f, df</li> | <dt>Subkind 5:</dt><dd> | |||
</ul> | <t/> | |||
<dl spacing="normal"> | ||||
<dt>Major type 0, 1, 6 with additional information 31:</dt><dd>1f, 3f, | ||||
df</dd> | ||||
</dl> | ||||
</dd> | ||||
</dl> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="changes-from-rfc-7049" toc="default"> | <section anchor="changes-from-rfc-7049" toc="default"> | |||
<name>Changes from RFC 7049</name> | <name>Changes from RFC 7049</name> | |||
<t>As discussed in the introduction, | <t>As discussed in the introduction, | |||
this document is a revised edition of RFC 7049, with editorial improvements, | this document formally obsoletes RFC 7049 while keeping full compatibility | |||
added detail, and fixed errata. | with the interchange format from RFC 7049. This document provides editorial | |||
This document formally obsoletes RFC 7049, while keeping full compatibility | improvements, added detail, and fixed errata. | |||
of the interchange format from RFC 7049. | ||||
This document does not create a new version of the format.</t> | This document does not create a new version of the format.</t> | |||
<section anchor="errata-processing-clerical-changes" toc="default"> | <section anchor="errata-processing-clerical-changes" toc="default"> | |||
<name>Errata processing, clerical changes</name> | <name>Errata Processing and Clerical Changes</name> | |||
<t>The two verified errata on RFC 7049, EID 3764 and EID 3770, concerned | <t>The two verified errata on RFC 7049, | |||
<xref target="Err3764" format="default"/> | ||||
and <xref target="Err3770" format="default"/>, concerned | ||||
two encoding examples in the text that have been corrected | two encoding examples in the text that have been corrected | |||
(<xref target="bignums" format="default"/>: "29" -> "49", <xref target="numbe | (<xref target="bignums" format="default"/>: "29" -> "49", | |||
rs" format="default"/>: "0b000_11101" -> | <xref target="numbers" format="default"/>: "0b000_11101" -> | |||
"0b000_11001"). Also, RFC 7049 contained an example using the numeric | "0b000_11001"). Also, RFC 7049 contained an example using the numeric | |||
value 24 for a simple value (EID 5917), which is not well-formed; this example h | value 24 for a simple value <xref target="Err5917" format="default"/>, | |||
as | which is not well-formed; this example has | |||
been removed. Errata report 5763 pointed to an accident in the | been removed. Errata report 5763 <xref target="Err5763" format="default"/> | |||
wording of the definition of tags; this was resolved during a re-write | pointed to an error in the | |||
of <xref target="tags" format="default"/>. Errata report 5434 pointed out that | wording of the definition of tags; this was resolved during a rewrite | |||
the UBJSON example | of <xref target="tags" format="default"/>. Errata report 5434 | |||
<xref target="Err5434" format="default"/> pointed out that the Universal Binary | ||||
JSON | ||||
(UBJSON) example | ||||
in <xref target="comparison-app" format="default"/> no longer complied with the version of UBJSON | in <xref target="comparison-app" format="default"/> no longer complied with the version of UBJSON | |||
current at the time of submitting the report. It turned out that the | current at the time of the errata report submission. It turned out that the | |||
UBJSON specification had completely changed since 2013; this example | UBJSON specification had completely changed since 2013; this example | |||
therefore also was removed. Further errata reports (4409, 4963, 4964) | therefore was removed. Other errata reports | |||
<xref target="Err4409" format="default"/> | ||||
<xref target="Err4963" format="default"/> | ||||
<xref target="Err4964" format="default"/> | ||||
complained that the map key sorting rules for canonical encoding were | complained that the map key sorting rules for canonical encoding were | |||
onerous; these led to a reconsideration of the canonical encoding | onerous; these led to a reconsideration of the canonical encoding | |||
suggestions and replacement by the deterministic encoding suggestions | suggestions and replacement by the deterministic encoding suggestions | |||
(described below). An editorial suggestion in errata report 4294 was also | (described below). An editorial suggestion in errata report 4294 | |||
<xref target="Err4294" format="default"/> was also | ||||
implemented (improved symmetry by adding "Second value" to a comment | implemented (improved symmetry by adding "Second value" to a comment | |||
to the last example in <xref target="indef" format="default"/>).</t> | to the last example in <xref target="indef" format="default"/>).</t> | |||
<t>Other more clerical changes include:</t> | <t>Other clerical changes include:</t> | |||
<ul spacing="normal"> | <ul spacing="normal"> | |||
<li>use of new RFCXML functionality <xref target="RFC7991" format="def | ||||
ault"/>;</li> | <li>the use of new xml2rfc functionality <xref target="RFC7991" format | |||
<li>explain some more of the notation used;</li> | ="default"/>;</li> | |||
<li>updated references, e.g. for RFC4627 to <xref target="RFC8259" for | <li>more explanation of the notation used;</li> | |||
mat="default"/> in many places, | <li>the update of references, e.g., from RFC 4627 to | |||
for CNN-TERMS to <xref target="RFC7228" format="default"/>; added missing refere | <xref target="RFC8259" format="default"/>, | |||
nce to <xref target="IEEE754" format="default"/> | from CNN-TERMS to <xref target="RFC7228" format="default"/>, and | |||
(importing required definitions) and updated to <xref target="ECMA262" format="d | from the 5.1 edition to the 11th edition of <xref target="ECMA262" format="defau | |||
efault"/>; added a | lt"/>; | |||
reference to <xref target="RFC8618" format="default"/> that further illustrates | the addition of a reference to <xref target="IEEE754" format="default"/> and imp | |||
the discussion in | ortation of required definitions; | |||
the addition of references to <xref target="C" format="default"/> and <xref targ | ||||
et="Cplusplus20" format="default"/>; | ||||
and the addition of a reference to <xref target="RFC8618" format="default"/> tha | ||||
t further illustrates the discussion in | ||||
<xref target="comparison-app" format="default"/>;</li> | <xref target="comparison-app" format="default"/>;</li> | |||
<li>the discussion of diagnostic notation mentions the "Extended | <li>in the discussion of diagnostic notation (<xref target="diagnostic | |||
Diagnostic Notation" (EDN) defined in <xref target="RFC8610" format="default"/> | -notation" format="default"/>), | |||
as well as the gap | the "Extended Diagnostic Notation" (EDN) defined in <xref target="RFC8610" forma | |||
diagnostic notation has in representing NaN payloads; an explanation | t="default"/> is now mentioned, | |||
was added on how to represent indefinite length strings with no chunks;</li> | the gap in representing NaN payloads is now highlighted, | |||
and an explanation of representing indefinite-length strings with | ||||
no chunks has been added (<xref target="encoding-indicators" format="default"/>) | ||||
; | ||||
</li> | ||||
<li>the addition of this appendix.</li> | <li>the addition of this appendix.</li> | |||
</ul> | </ul> | |||
</section> | </section> | |||
<section anchor="changes-in-iana-considerations" toc="default"> | <section anchor="changes-in-iana-considerations" toc="default"> | |||
<name>Changes in IANA considerations</name> | <name>Changes in IANA Considerations</name> | |||
<t>The IANA considerations were generally updated (clerical changes, | <t>The IANA considerations were generally updated (clerical changes, | |||
e.g., now pointing to the CBOR working group as the author of the | e.g., now pointing to the CBOR Working Group as the author of the | |||
specification). References to the respective IANA registries have | specification). References to the respective IANA registries were | |||
been added to the informative references.</t> | added to the informative references.</t> | |||
<t>Tags in the space from 256 to 32767 (lower half of | <t>In the "Concise Binary Object Representation (CBOR) Tags" registry | |||
<xref target="IANA.cbor-tags"/>, | ||||
tags in the space from 256 to 32767 (lower half of | ||||
"1+2") are no longer assigned by First Come First Served; this range | "1+2") are no longer assigned by First Come First Served; this range | |||
is now Specification Required.</t> | is now Specification Required.</t> | |||
</section> | </section> | |||
<section anchor="changes-in-suggestions-and-other-informational-components " toc="default"> | <section anchor="changes-in-suggestions-and-other-informational-components " toc="default"> | |||
<name>Changes in suggestions and other informational components</name> | <name>Changes in Suggestions and Other Informational Components</name> | |||
<t>In revising the document, beyond processing errata reports, the WG | <t>While revising the document, beyond the addressing of the errata repo | |||
could use nearly seven years of experience with the use of CBOR in a | rts, | |||
diverse set of applications. This led to a number of editorial | the working group drew upon nearly seven years of experience with CBOR | |||
changes, including adding tables for illustration, but also to | in a diverse set of applications. This led to a number of editorial | |||
emphasizing some aspects and de-emphasizing others.</t> | changes, including adding tables for illustration, but also | |||
<t>A significant addition in this revision is <xref target="cbor-data-mo | emphasizing some aspects and de-emphasizing others.</t> | |||
dels" format="default"/>, which | <t>A significant addition is <xref target="cbor-data-models" format="def | |||
ault"/>, which | ||||
discusses the CBOR data model and its small variations involved in the | discusses the CBOR data model and its small variations involved in the | |||
processing of CBOR. Introducing terms for those (basic generic, | processing of CBOR. The introduction of terms for those variations (basic gener ic, | |||
extended generic, specific) enables more concise language in other | extended generic, specific) enables more concise language in other | |||
places of the document, but also helps in clarifying expectations on | places of the document and also helps to clarify expectations of | |||
implementations and on the extensibility features of the format.</t> | implementations and of the extensibility features of the format.</t> | |||
<t>RFC 7049, as a format derived from the JSON ecosystem, was influenced | <t>As a format derived from the JSON ecosystem, RFC 7049 was influenced | |||
by the JSON number system that was in turn inherited from JavaScript | by the JSON number system that was in turn inherited from JavaScript | |||
at the time. JSON does not provide distinct integers and floating-point | at the time. JSON does not provide distinct integers and floating-point | |||
values (and the latter are decimal in the format). CBOR | values (and the latter are decimal in the format). CBOR | |||
provides binary representations of numbers, which do differ between | provides binary representations of numbers, which do differ between | |||
integers and floating-point values. Experience from implementation | integers and floating-point values. Experience from implementation and use | |||
and use now suggested that the separation between these two number | suggested that the separation between these two number | |||
domains should be more clearly drawn in the document; language that | domains should be more clearly drawn in the document; language that | |||
suggested an integer could seamlessly stand in for a floating-point | suggested an integer could seamlessly stand in for a floating-point | |||
value was removed. Also, a suggestion (based on I-JSON <xref target="RFC7493" f ormat="default"/>) | value was removed. Also, a suggestion (based on I-JSON <xref target="RFC7493" f ormat="default"/>) | |||
was added for handling these types when converting JSON to CBOR, and | was added for handling these types when converting JSON to CBOR, and | |||
the use of a specific rounding mechanism has been recommended.</t> | the use of a specific rounding mechanism has been recommended.</t> | |||
<t>For a single value in the data model, CBOR often provides multiple | <t>For a single value in the data model, CBOR often provides multiple | |||
encoding options. The revision adds a new section | encoding options. A new section (<xref target="serialization-considerations" fo | |||
<xref target="serialization-considerations" format="default"/>, which first intr | rmat="default"/>) introduces the term | |||
oduces the term | ||||
"preferred serialization" (<xref target="preferred" format="default"/>) and defi nes it for various | "preferred serialization" (<xref target="preferred" format="default"/>) and defi nes it for various | |||
kinds of data items. On the basis of this terminology, the section | kinds of data items. On the basis of this terminology, the section | |||
goes on to discuss how a CBOR-based protocol can define "deterministic | then discusses how a CBOR-based protocol can define "deterministic | |||
encoding" (<xref target="det-enc" format="default"/>), which now avoids the RFC | encoding" (<xref target="det-enc" format="default"/>), which avoids terms | |||
7049 terms | "canonical" and "canonicalization" from RFC 7049. The suggestion of "Core | |||
"canonical" and "canonicalization". The suggestion of "Core | Deterministic Encoding Requirements" (<xref target="core-det" format="default"/> | |||
Deterministic Encoding Requirements" <xref target="core-det" format="default"/> | ) enables generic | |||
enables generic | support for such protocol-defined encoding requirements. This document | |||
support for such protocol-defined encoding requirements. The present | further eases the implementation of deterministic encoding by | |||
revision further eases the implementation of deterministic encoding by | simplifying the map ordering suggested in RFC 7049 to a simple | |||
simplifying the map ordering suggested in RFC 7049 to simple | ||||
lexicographic ordering of encoded keys. A description of the older | lexicographic ordering of encoded keys. A description of the older | |||
suggestion is kept as an alternative, now termed "length-first map key | suggestion is kept as an alternative, now termed "length-first map key | |||
ordering" (<xref target="length-first" format="default"/>).</t> | ordering" (<xref target="length-first" format="default"/>).</t> | |||
<t>The terminology for well-formed and valid data was sharpened and more | <t>The terminology for well-formed and valid data was sharpened and more | |||
stringently used, avoiding less well-defined alternative terms such as | stringently used, avoiding less well-defined alternative terms such as | |||
"syntax error", "decoding error" and "strict mode" outside examples. | "syntax error", "decoding error", and "strict mode" outside of examples. | |||
Also, a third level of requirements beyond CBOR-level validity that an | Also, a third level of requirements that an | |||
application has on its input data is now explicitly called out. | application has on its input data beyond CBOR-level validity is now explicitly c | |||
alled out. | ||||
Well-formed (processable at all), valid (checked by a | Well-formed (processable at all), valid (checked by a | |||
validity-checking generic decoder), and expected input (as checked by | validity-checking generic decoder), and expected input (as checked by | |||
the application) are treated as a hierarchy of layers of | the application) are treated as a hierarchy of layers of | |||
acceptability.</t> | acceptability.</t> | |||
<t>The handling of non-well-formed simple values was clarified in text | <t>The handling of non-well-formed simple values was clarified in text | |||
and pseudocode. <xref target="errors" format="default"/> was added to discuss w ell-formedness | and pseudocode. <xref target="errors" format="default"/> was added to discuss w ell-formedness | |||
errors and provide examples for them. The pseudocode was updated to | errors and provide examples for them. The pseudocode was updated to | |||
be more portable and some portability considerations were added.</t> | be more portable, and some portability considerations were added.</t> | |||
<t>The discussion of validity has been sharpened in two areas. Map | <t>The discussion of validity has been sharpened in two areas. Map | |||
validity (handling of duplicate keys) was clarified and the domain of | validity (handling of duplicate keys) was clarified, and the domain of | |||
applicability of certain implementation choices explained. Also, | applicability of certain implementation choices explained. Also, | |||
while streamlining the terminology for tags, tag numbers, and tag | while streamlining the terminology for tags, tag numbers, and tag | |||
content, discussion was added on tag validity, and the restrictions | content, discussion was added on tag validity, and the restrictions | |||
were clarified on tag content, in general and specifically for tag 1.</t> | were clarified on tag content, in general and specifically for tag 1.</t> | |||
<t>An implementation note (and note for future tag definitions) was adde d | <t>An implementation note (and note for future tag definitions) was adde d | |||
to <xref target="tags" format="default"/> about defining tags with semantics tha t depend on | to <xref target="tags" format="default"/> about defining tags with semantics tha t depend on | |||
serialization order.</t> | serialization order.</t> | |||
<t>Tag 35 is no longer defined in this updated document; the registratio n | <t>Tag 35 is not defined by this document; the registration | |||
based on the definition in RFC 7049 remains in place.</t> | based on the definition in RFC 7049 remains in place.</t> | |||
<t>Terminology was introduced in <xref target="encoding" format="default "/> for "argument" and "head", | <t>Terminology was introduced in <xref target="encoding" format="default "/> for "argument" and "head", | |||
simplifying further discussion.</t> | simplifying further discussion.</t> | |||
<t>The security considerations were mostly rewritten and significantly | <t>The security considerations (<xref target="securitycons" format="defa | |||
ult"/>) | ||||
were mostly rewritten and significantly | ||||
expanded; in multiple other places, the document is now more explicit | expanded; in multiple other places, the document is now more explicit | |||
that a decoder cannot simply condone well-formedness errors.</t> | that a decoder cannot simply condone well-formedness errors.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section numbered="false" anchor="acknowledgements" toc="default"> | <section numbered="false" anchor="acknowledgements" toc="default"> | |||
<name>Acknowledgements</name> | <name>Acknowledgements</name> | |||
<t>CBOR was inspired by MessagePack. MessagePack was developed and | <t>CBOR was inspired by MessagePack. MessagePack was developed and | |||
promoted by Sadayuki Furuhashi ("frsyuki"). This reference to | promoted by <contact fullname="Sadayuki Furuhashi"/> ("frsyuki"). This referenc e to | |||
MessagePack is solely for attribution; CBOR is not intended as a | MessagePack is solely for attribution; CBOR is not intended as a | |||
version of or replacement for MessagePack, as it has different design | version of, or replacement for, MessagePack, as it has different design | |||
goals and requirements.</t> | goals and requirements.</t> | |||
<t>The need for functionality beyond the original MessagePack | <t>The need for functionality beyond the original MessagePack | |||
Specification became obvious to many people at about the same time | specification became obvious to many people at about the same time | |||
around the year 2012. BinaryPack is a minor derivation of MessagePack | around the year 2012. BinaryPack is a minor derivation of MessagePack | |||
that was developed by Eric Zhang for the binaryjs project. A similar, | that was developed by <contact fullname="Eric Zhang"/> for the binaryjs project. | |||
but different, extension was made by Tim Caswell for his msgpack-js | A similar, | |||
but different, extension was made by <contact fullname="Tim Caswell"/> for his m | ||||
sgpack-js | ||||
and msgpack-js-browser projects. Many people have contributed to the | and msgpack-js-browser projects. Many people have contributed to the | |||
discussion about extending MessagePack to separate text string | discussion about extending MessagePack to separate text string | |||
representation from byte string representation.</t> | representation from byte string representation.</t> | |||
<t>The encoding of the additional information in CBOR was inspired by the | <t>The encoding of the additional information in CBOR was inspired by the | |||
encoding of length information designed by Klaus Hartke for CoAP.</t> | encoding of length information designed by <contact fullname="Klaus Hartke"/> fo r CoAP.</t> | |||
<t>This document also incorporates suggestions made by many people, | <t>This document also incorporates suggestions made by many people, | |||
notably Dan Frost, James Manger, Jeffrey Yasskin, Joe Hildebrand, Keith Moore, L | notably <contact fullname="Dan Frost"/>, <contact fullname="James Manger"/>, | |||
aurence | <contact fullname="Jeffrey Yasskin"/>, <contact fullname="Joe Hildebrand"/>, | |||
Lundblade, Matthew Lepinski, Michael Richardson, | <contact fullname="Keith Moore"/>, <contact fullname="Laurence Lundblade"/>, | |||
Nico Williams, Peter Occil, Phillip Hallam-Baker, Ray Polk, Stuart Cheshire, Tim | <contact fullname="Matthew Lepinski"/>, <contact fullname="Michael Richardson"/> | |||
Bray, | , | |||
Tony Finch, Tony Hansen, and Yaron Sheffer. | <contact fullname="Nico Williams"/>, <contact fullname="Peter Occil"/>, | |||
Benjamin Kaduk provided an extensive review during IESG processing. | <contact fullname="Phillip Hallam-Baker"/>, <contact fullname="Ray Polk"/>, | |||
<!-- Do not start this on a new line: --> <contact fullname="รric Vyncke"/>, Eri | <contact fullname="Stuart Cheshire"/>, <contact fullname="Tim Bray"/>, | |||
k Kline, Robert Wilton, and | <contact fullname="Tony Finch"/>, <contact fullname="Tony Hansen"/>, and | |||
Roman Danyliw provided further IESG comments, which included an IoT | <contact fullname="Yaron Sheffer"/>. <contact fullname="Benjamin Kaduk"/> | |||
directorate review by Eve Schooler.</t> | provided an extensive review during IESG processing. | |||
<!-- LocalWords: UTC bigfloats codepoint curation pseudocode | <contact fullname="รric Vyncke"/>, <contact fullname="Erik Kline"/>, | |||
--> | <contact fullname="Robert Wilton"/>, and <contact fullname="Roman Danyliw"/> | |||
provided further IESG comments, which included an IoT directorate review by | ||||
<contact fullname="Eve Schooler"/>.</t> | ||||
</section> | </section> | |||
</back> | </back> | |||
<!-- ##markdown-source: | ||||
H4sIAKS2dF8AA+S965YbyZEm+N+fIhb8QaAEgAASmclMHp0ZFouU2F28bDEp | ||||
TXertyoABDJDBCIgRIDJFIt75iHmAfpZ+lHmSdau7uYRgSxWaWb3x7JbUgKI | ||||
8Ku5uV0+MxuNRq6q02L1Y7opi+wyqfeHzOW7Pf1V1bPJ5GIyc8u0vkyqeuUe | ||||
JMVhu8jg54fnk/nFQ1cuqnKT1Vl1meAXblUui3QLDa326boe5Vm9Hi0X5X6E | ||||
vy7yarRJ4eHaLcuiyorqAO89vMuqh9BydVhs86rKy6K+20ELL59fvXC7/NIl | ||||
SV0u9Tn6sMp29Q18M8fPVbmv99m6Ck9Ud9v4i2W53aVLmMPDoqQHDovmV/v1 | ||||
MltV9d0mi17bZkVtxrjPVodlJouQlOvkep/Wh7wuD1WyytfrbJ8Vy6xK1vty | ||||
m3ycwViTjyc0g+xTPdrkVT2CwS3KDbb5zaj83UNX5zX2+awslnmVJd/mRbq/ | ||||
S94s/pot6+SHbLfPYKHqtIZ1SfrPvn3zw8Cli8U++wjvwCeX7rMUFquos32R | ||||
1e7D7WWyS/dVth8mq2xZrvAPGBT/seDW1+V+m9bwQFqnSY6vLm/S4jrzP/zT | ||||
uzevYbrwOwxtNpmejKYTlx7qm3J/6UbwCoz/2Tj5Fh8vCpgfb/oz6LjOCvN9 | ||||
ub++TN4X+cdsX+V1mtXJt/sMFjW5+teXuBGwcxlswtuyqtfp8iY5OZnM5xNc | ||||
+7y+u0y+G80en5xeyEu0JYei3sMvf8iwizv4andDlNv73fxiNJ9NR7Pp49HZ | ||||
ycVs2oMfs22aby6TZboo/2v993wM49Hxvx0nfyzXa2jFj/9tetiYL2nwL589 | ||||
ff06tLSDR8Y3/Mh/zZcwS2qzoIWDaeJmP8P/gj3nnX1Z8KriBtbZ8qYoN+X1 | ||||
XfI///v/SN7uSyCg7TYvrpMNbMAhvQbiwV+eUQu64gn94+HQRlNr6SZ5s79O | ||||
i/zv3Dh0k7zDw5zuV/Idvel38fFockbfAHXkWZXDwLTtl+/ePHr5/NllcvH4 | ||||
4uISnx0mL8rDvr5Jnq9yaerZbnOo8D/T82iG90zjd7/73zGR89F09ksTmc4f | ||||
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 | ||||
o+e4zmAH1XUHNv9dAZ1IY41W8xGDs8rJPMq12z2qxzMaB68Q9QyYNSDaJk96 | ||||
JIqTfxxms7nWYlxtxsFQ16CB+o418vPpxKmh+jCyNdgWJW43c9hArKbyN7xZ | ||||
pLy9qz87CQEq6P5+hwnpdxu4xxDbTFsC3IwibLzJoSGY/3EuHFv8kSRoId/m | ||||
UID6nSe6bzk2YiwjRCv/6jybmXqGO23uWHmi+//AJ8hP9E44mcjsRp/TcS1Y | ||||
I/zQ+N/paev8AoqBWyNuuFlvI6a4gvBtd4Ul/vHyyy9jCIj4S2oPfJTXur+u | ||||
1zeZFF7a7j4Jv5M7P/C9xml3dnY8U/JbZAtjOvIl+09kPI5ld4I5CWqxuGKz | ||||
WXZ2rXjoXJTbqhgLysulApYMBb+SK3hPsJx1+g/jGa3jFcqprzwsD/X4cpqO | ||||
xL0FmnbYHC65JW6+OMcXDmzkAyNnFr+L2X2I2u4C7mYIJFfAkBOIu7GyQPMQ | ||||
ANKr3WwOqIuNySWqnC+zcXL9KDd4R7ZCL2fJkoEjFXAH+DQzaVHQE4GLSsaN | ||||
QUDo3r6Auci1+RnZL03ya8bMI5m1AnQItkeSLx1a49r9gh5rLDJXBKhLxcaa | ||||
2x6SvZ9fEP80NAtu4m6jo2Z4MDnTPJLi0ew0kBYb3NiIfQcH0NRQYtxhYOJp | ||||
r66JzLmAtkXF2y5p0ShgAC86wQTKvcxri99GMEXPARY6g71+XRRdsMeJFbtd | ||||
y6iTNSdKSqZwxKYwqZ60ABwSj3jNyi6NwDnCLpcPjvd8YZP1FQmL853zb6Jo | ||||
zP4nJeoN+ucpQg3x+I/47lJ5k/2C72izVvm3vzf/EX/1VTyo0W6WL1r/eBJe | ||||
TQLDLgY/azVrgQXnuRYK8X8tTePnzoR/VwJhHijX4eZI96+pnTUb0zdV3F6P | ||||
Ef5SYD24mNS9Tmv9aiIXUdp1pq9B/MnfKZcKRfSk+E/x8cvnxy+PT/8W78cv | ||||
D14+8VqWo5fLxv0pbuDefaE30KUK684412F8aFwrKbMIRegE0+JGyJrAZhKE | ||||
1YjVD0xirN9ztyI4JGwupRB8Vf6piS6rNEsjO6v5ZTJ6W63826RSt+/0m+NK | ||||
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 | ||||
</rfc> | </rfc> | |||
End of changes. 356 change blocks. | ||||
2379 lines changed or deleted | 1035 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |