| 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/ | ||||