RFC 8742 PROPOSED STANDARD DATA FORMATS · CBOR · MEDIA TYPES

Concise Binary Object Representation (CBOR) Sequences

Glue CBOR data items end to end and you have a sequence, with no separators or end marker needed.

On rfc-editor.org ↗
PUBLISHED
February 2020
AUTHORS
C. Bormann
STREAM
IETF
MEDIA TYPE
application/cbor-seq
STRUCTURED SYNTAX SUFFIX
+cbor-seq
COAP CONTENT-FORMAT ID
63
SEPARATOR BETWEEN ITEMS
None
END-OF-SEQUENCE MARKER
None
DOI
10.17487/RFC8742

RFC text

Contents
Original text · RFC Editor View on rfc-editor.org ↗
Internet Engineering Task Force (IETF)                        C. Bormann
Request for Comments: 8742                        Universität Bremen TZI
Category: Standards Track                                  February 2020
ISSN: 2070-1721


         Concise Binary Object Representation (CBOR) Sequences

Abstract

   This document describes the Concise Binary Object Representation
   (CBOR) Sequence format and associated media type "application/cbor-
   seq".  A CBOR Sequence consists of any number of encoded CBOR data
   items, simply concatenated in sequence.

   Structured syntax suffixes for media types allow other media types to
   build on them and make it explicit that they are built on an existing
   media type as their foundation.  This specification defines and
   registers "+cbor-seq" as a structured syntax suffix for CBOR
   Sequences.

Status of This Memo

   This is an Internet Standards Track document.

   This document is a product of the Internet Engineering Task Force
   (IETF).  It represents the consensus of the IETF community.  It has
   received public review and has been approved for publication by the
   Internet Engineering Steering Group (IESG).  Further information on
   Internet Standards is available in Section 2 of RFC 7841.

   Information about the current status of this document, any errata,
   and how to provide feedback on it may be obtained at
   https://www.rfc-editor.org/info/rfc8742.

Copyright Notice

   Copyright (c) 2020 IETF Trust and the persons identified as the
   document authors.  All rights reserved.

   This document is subject to BCP 78 and the IETF Trust's Legal
   Provisions Relating to IETF Documents
   (https://trustee.ietf.org/license-info) in effect on the date of
   publication of this document.  Please review these documents
   carefully, as they describe your rights and restrictions with respect
   to this document.  Code Components extracted from this document must
   include Simplified BSD License text as described in Section 4.e of
   the Trust Legal Provisions and are provided without warranty as
   described in the Simplified BSD License.

Table of Contents

   1.  Introduction
     1.1.  Conventions Used in This Document
   2.  CBOR Sequence Format
   3.  The "+cbor-seq" Structured Syntax Suffix
   4.  Practical Considerations
     4.1.  Specifying CBOR Sequences in Concise Data Definition
           Language (CDDL)
     4.2.  Diagnostic Notation
     4.3.  Optimizing CBOR Sequences for Skipping Elements
   5.  Security Considerations
   6.  IANA Considerations
     6.1.  Media Type
     6.2.  CoAP Content-Format Registration
     6.3.  Structured Syntax Suffix
   7.  References
     7.1.  Normative References
     7.2.  Informative References
   Acknowledgements
   Author's Address

1.  Introduction

   The Concise Binary Object Representation (CBOR) [RFC7049] can be used
   for serialization of data in the JSON [RFC8259] data model or in its
   own, somewhat expanded, data model.  When serializing a sequence of
   such values, it is sometimes convenient to have a format where these
   sequences can simply be concatenated to obtain a serialization of the
   concatenated sequence of values or to encode a sequence of values
   that might grow at the end by just appending further CBOR data items.

   This document describes the concept and format of "CBOR Sequences",
   which are composed of zero or more encoded CBOR data items.  CBOR
   Sequences can be consumed (and produced) incrementally without
   requiring a streaming CBOR parser that is able to deliver
   substructures of a data item incrementally (or a streaming encoder
   able to encode from substructures incrementally).

   This document defines and registers the "application/cbor-seq" media
   type in the "Media Types" registry along with a Constrained
   Application Protocol (CoAP) Content-Format identifier.  Media type
   structured syntax suffixes [RFC6838] were introduced as a way for a
   media type to signal that it is based on another media type as its
   foundation.  CBOR [RFC7049] defines the "+cbor" structured syntax
   suffix.  This document defines and registers the "+cbor-seq"
   structured syntax suffix in the "Structured Syntax Suffix Registry".

1.1.  Conventions Used in This Document

   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
   "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
   "OPTIONAL" in this document are to be interpreted as described in
   BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all
   capitals, as shown here.

   In this specification, the term "byte" is used in its now-customary
   sense as a synonym for "octet".

2.  CBOR Sequence Format

   Formally, a CBOR Sequence is a sequence of bytes that is recursively
   defined as either of the following:

   *  an empty (zero-length) sequence of bytes

   *  the sequence of bytes making up an encoded CBOR data item
      [RFC7049] followed by a CBOR Sequence.

   In short, concatenating zero or more encoded CBOR data items
   generates a CBOR Sequence.  (Consequently, concatenating zero or more
   CBOR Sequences also results in a CBOR Sequence.)

   There is no end-of-sequence indicator.  (If one is desired, CBOR
   encoding an array of the CBOR data model values being encoded,
   employing either a definite or an indefinite length encoding, as a
   single CBOR data item may actually be the more appropriate
   representation.)

   CBOR Sequences, unlike JSON Text Sequences [RFC7464], do not use a
   marker between items.  This is possible because CBOR-encoded data
   items are self delimiting and the end can always be calculated.
   (Note that, while the early object/array-only form of JSON was self
   delimiting as well, this stopped being the case when simple values
   such as single numbers were made valid JSON documents.)

   Decoding a CBOR Sequence works as follows:

   *  If the CBOR Sequence is an empty sequence of bytes, the result is
      an empty sequence of CBOR data model values.

   *  Otherwise, one must decode a single CBOR data item from the bytes
      of the CBOR Sequence and insert the resulting CBOR data model
      value at the start of the result of repeating this decoding
      process recursively with the remaining bytes.  (A streaming
      decoder would therefore simply deliver zero or more CBOR data
      model values, each as soon as the bytes making it up are
      available.)

   This means that if any data item in the sequence is not well formed,
   it is not possible to reliably decode the rest of the sequence.  (An
   implementation may be able to recover from some errors in a sequence
   of bytes that is almost, but not entirely, a well-formed encoded CBOR
   data item.  Handling malformed data is outside the scope of this
   specification.)

   This also means that the CBOR Sequence format can reliably detect
   truncation of the bytes making up the last CBOR data item in the
   sequence, but it cannot detect entirely missing CBOR data items at
   the end.  A CBOR Sequence decoder that is used for consuming
   streaming CBOR Sequence data may simply pause for more data (e.g., by
   suspending and later resuming decoding) in case a truncated final
   item is being received.

3.  The "+cbor-seq" Structured Syntax Suffix

   The use case for the "+cbor-seq" structured syntax suffix is
   analogous to that for "+cbor": it SHOULD be used by a media type when
   the result of parsing the bytes of the media type object as a CBOR
   Sequence is meaningful and is at least sometimes not just a single
   CBOR data item.  (Without the qualification at the end, this sentence
   is trivially true for any +cbor media type, which of course should
   continue to use the "+cbor" structured syntax suffix.)

   Applications encountering a "+cbor-seq" media type can then either
   simply use generic processing if all they need is a generic view of
   the CBOR Sequence or use generic CBOR Sequence tools for initial
   parsing and then implement their own specific processing on top of
   that generic parsing tool.

4.  Practical Considerations

4.1.  Specifying CBOR Sequences in Concise Data Definition Language
      (CDDL)

   In Concise Data Definition Language (CDDL) [RFC8610], CBOR Sequences
   are already supported as contents of byte strings using the
   ".cborseq" control operator (Section 3.8.4 of [RFC8610]) by employing
   an array as the controller type:

   my-embedded-cbor-seq = bytes .cborseq my-array
   my-array = [* my-element]
   my-element = my-foo / my-bar

   Currently, CDDL does not provide for unadorned CBOR Sequences as a
   top-level subject of a specification.  For now, the suggestion is to
   use an array for the top-level rule, as is used for the ".cborseq"
   control operator, and add English text that explains that the
   specification is really about a CBOR Sequence with the elements of
   the array:

   ; This defines an array, the elements of which are to be used
   ; in a CBOR Sequence:
   my-sequence = [* my-element]
   my-element = my-foo / my-bar

   (Future versions of CDDL may provide a notation for top-level CBOR
   Sequences, e.g., by using a group as the top-level rule in a CDDL
   specification.)

4.2.  Diagnostic Notation

   CBOR diagnostic notation (see Section 6 of [RFC7049]) or extended
   diagnostic notation (Appendix G of [RFC8610]) also does not provide
   for unadorned CBOR Sequences at this time (the latter does provide
   for CBOR Sequences embedded in a byte string as per Appendix G.3 of
   [RFC8610]).

   In a similar spirit to the recommendation for CDDL above, this
   specification recommends enclosing the CBOR data items in an array.
   In a more informal setting, where the boundaries within which the
   notation is used are obvious, it is also possible to leave off the
   outer brackets for this array, as shown in these two examples:

   [1, 2, 3]

   1, 2, 3

   Note that it is somewhat difficult to discuss zero-length CBOR
   Sequences in the latter form.

4.3.  Optimizing CBOR Sequences for Skipping Elements

   In certain applications, being able to efficiently skip an element
   without the need for decoding its substructure, or efficiently
   fanning out elements to multi-threaded decoding processes, is of the
   utmost importance.  For these applications, byte strings (which carry
   length information in bytes) containing embedded CBOR can be used as
   the elements of a CBOR Sequence:

   ; This defines an array of CBOR byte strings, the elements of which
   ; are to be used in a CBOR Sequence:
   my-sequence = [* my-element]
   my-element = bytes .cbor my-element-structure
   my-element-structure = my-foo / my-bar

   Within limits, this may also enable recovering from elements that
   internally are not well formed; the limitation is that the sequence
   of byte strings does need to be well formed as such.

5.  Security Considerations

   The security considerations of CBOR [RFC7049] apply.  This format
   provides no cryptographic integrity protection of any kind but can be
   combined with security specifications such as CBOR Object Signing and
   Encryption (COSE) [RFC8152] to do so.  (COSE protections can be
   applied to an entire CBOR Sequence or to each of the elements of the
   sequence independently; in the latter case, additional effort may be
   required if there is a need to protect the relationship of the
   elements in the sequence.)

   As usual, decoders must operate on input that is assumed to be
   untrusted.  This means that decoders MUST fail gracefully in the face
   of malicious inputs.

6.  IANA Considerations

6.1.  Media Type

   Media types are registered in the "Media Types" registry
   [IANA-MEDIA-TYPES].  IANA has registered the media type for CBOR
   Sequence, application/cbor-seq, as follows:

   Type name: application

   Subtype name: cbor-seq

   Required parameters: N/A

   Optional parameters: N/A

   Encoding considerations: binary

   Security considerations: See RFC 8742, Section 5.

   Interoperability considerations: Described herein.

   Published specification: RFC 8742.

   Applications that use this media type: Data serialization and
   deserialization.

   Fragment identifier considerations: N/A

   Additional information:

   *  Deprecated alias names for this type: N/A

   *  Magic number(s): N/A

   *  File extension(s): N/A

   *  Macintosh file type code(s): N/A

   Person & email address to contact for further information:
      cbor@ietf.org

   Intended usage: COMMON

   Author: Carsten Bormann (cabo@tzi.org)

   Change controller: IETF

6.2.  CoAP Content-Format Registration

   IANA has assigned a CoAP Content-Format ID for the media type
   "application/cbor-seq", within the "CoAP Content-Formats" subregistry
   of the "Constrained RESTful Environments (CoRE) Parameters" registry
   [IANA-CORE-PARAMETERS], from the "Expert Review" (0-255) range
   ([RFC8126]).  The assigned ID is shown in Table 1.

           +----------------------+----------+----+-----------+
           | Media type           | Encoding | ID | Reference |
           +======================+==========+====+===========+
           | application/cbor-seq | -        | 63 | RFC 8742  |
           +----------------------+----------+----+-----------+

                     Table 1: CoAP Content-Format ID

6.3.  Structured Syntax Suffix

   Structured Syntax Suffixes are registered within the "Structured
   Syntax Suffix Registry" maintained at
   [IANA-STRUCTURED-SYNTAX-SUFFIX].  IANA has registered the "+cbor-seq"
   structured syntax suffix in accordance with [RFC6838] as follows:

      Name: CBOR Sequence

      +suffix: +cbor-seq

      References: RFC 8742

      Encoding considerations: binary

      Fragment identifier considerations: The syntax and semantics of
      fragment identifiers specified for +cbor-seq SHOULD be the same as
      that specified for "application/cbor-seq".  (At the time of
      publication of this document, there is no fragment identification
      syntax defined for "application/cbor-seq".)

         The syntax and semantics for fragment identifiers for a
         specific "xxx/yyy+cbor-seq" SHOULD be processed as follows:

         o  For cases defined in +cbor-seq, if the fragment identifier
            resolves per the +cbor-seq rules, then process as specified
            in +cbor-seq.

         o  For cases defined in +cbor-seq, if the fragment identifier
            does not resolve per the +cbor-seq rules, then process as
            specified in "xxx/yyy+cbor-seq".

         o  For cases not defined in +cbor-seq, process as specified in
            "xxx/yyy+cbor-seq".

      Interoperability considerations: n/a

      Security considerations: See RFC 8742, Section 5

      Contact: CBOR WG mailing list (cbor@ietf.org), or any IESG-
      designated successor.

      Author/Change controller: IETF

7.  References

7.1.  Normative References

   [IANA-CORE-PARAMETERS]
              IANA, "Constrained RESTful Environments (CoRE)
              Parameters",
              <https://www.iana.org/assignments/core-parameters>.

   [IANA-MEDIA-TYPES]
              IANA, "Media Types",
              <https://www.iana.org/assignments/media-types>.

   [IANA-STRUCTURED-SYNTAX-SUFFIX]
              IANA, "Structured Syntax Suffix Registry",
              <https://www.iana.org/assignments/media-type-structured-
              suffix>.

   [RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
              Requirement Levels", BCP 14, RFC 2119,
              DOI 10.17487/RFC2119, March 1997,
              <https://www.rfc-editor.org/info/rfc2119>.

   [RFC7049]  Bormann, C. and P. Hoffman, "Concise Binary Object
              Representation (CBOR)", RFC 7049, DOI 10.17487/RFC7049,
              October 2013, <https://www.rfc-editor.org/info/rfc7049>.

   [RFC8174]  Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
              2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
              May 2017, <https://www.rfc-editor.org/info/rfc8174>.

7.2.  Informative References

   [RFC6838]  Freed, N., Klensin, J., and T. Hansen, "Media Type
              Specifications and Registration Procedures", BCP 13,
              RFC 6838, DOI 10.17487/RFC6838, January 2013,
              <https://www.rfc-editor.org/info/rfc6838>.

   [RFC7464]  Williams, N., "JavaScript Object Notation (JSON) Text
              Sequences", RFC 7464, DOI 10.17487/RFC7464, February 2015,
              <https://www.rfc-editor.org/info/rfc7464>.

   [RFC8091]  Wilde, E., "A Media Type Structured Syntax Suffix for JSON
              Text Sequences", RFC 8091, DOI 10.17487/RFC8091, February
              2017, <https://www.rfc-editor.org/info/rfc8091>.

   [RFC8126]  Cotton, M., Leiba, B., and T. Narten, "Guidelines for
              Writing an IANA Considerations Section in RFCs", BCP 26,
              RFC 8126, DOI 10.17487/RFC8126, June 2017,
              <https://www.rfc-editor.org/info/rfc8126>.

   [RFC8152]  Schaad, J., "CBOR Object Signing and Encryption (COSE)",
              RFC 8152, DOI 10.17487/RFC8152, July 2017,
              <https://www.rfc-editor.org/info/rfc8152>.

   [RFC8259]  Bray, T., Ed., "The JavaScript Object Notation (JSON) Data
              Interchange Format", STD 90, RFC 8259,
              DOI 10.17487/RFC8259, December 2017,
              <https://www.rfc-editor.org/info/rfc8259>.

   [RFC8610]  Birkholz, H., Vigano, C., and C. Bormann, "Concise Data
              Definition Language (CDDL): A Notational Convention to
              Express Concise Binary Object Representation (CBOR) and
              JSON Data Structures", RFC 8610, DOI 10.17487/RFC8610,
              June 2019, <https://www.rfc-editor.org/info/rfc8610>.

Acknowledgements

   This document has mostly been generated from [RFC7464] by Nico
   Williams and [RFC8091] by Erik Wilde, which do a similar but slightly
   more complicated exercise for JSON [RFC8259].  Laurence Lundblade
   raised an issue on the CBOR mailing list that pointed out the need
   for this document.  Jim Schaad and John Mattsson provided helpful
   comments.

Author's Address

   Carsten Bormann
   Universität Bremen TZI
   Postfach 330440
   D-28359 Bremen
   Germany

   Phone: +49-421-218-63921
   Email: cabo@tzi.org

AI ELI5

On this page
PROBLEMSometimes you want a stream or file of many CBOR values that can be concatenated or grown at the end by appending, without wrapping everything in one array or needing a streaming CBOR parser.
MECHANISMA CBOR Sequence is zero or more encoded CBOR data items simply concatenated. Items are self delimiting, so no separator is needed. The RFC also registers the application/cbor-seq media type and the +cbor-seq structured syntax suffix.
THE CATCHSequences can be produced and consumed incrementally. The format has no end-of-sequence marker and no integrity protection, and a malformed item makes the rest of the sequence undecodable.

§1Why Sequences of CBOR Items

The Concise Binary Object Representation (CBOR, RFC 7049) serializes data in the JSON data model or in its own somewhat expanded model. When you serialize a sequence of such values, it is sometimes convenient to simply concatenate them, or to append more items to a sequence that grows at the end.

RFC 8742 describes CBOR Sequences, made of zero or more encoded CBOR data items. They can be consumed and produced incrementally, without a streaming CBOR parser that delivers parts of an item early or an encoder that emits parts of an item incrementally. The RFC also defines the application/cbor-seq media type and the +cbor-seq structured syntax suffix.

Sometimes you have lots of little notes and want to keep adding more to the end of the pile. This RFC says how to stack CBOR notes so you can just keep adding.

§2The CBOR Sequence Format

A CBOR Sequence is defined recursively. It is either an empty (zero-length) sequence of bytes, or the bytes of one encoded CBOR data item followed by a CBOR Sequence. Concatenating zero or more encoded items makes a sequence, and concatenating sequences makes another sequence.

There is no end-of-sequence indicator. If you want one, the RFC suggests encoding an array of the values as a single CBOR data item instead.

Unlike JSON Text Sequences (RFC 7464), CBOR Sequences use no marker between items. That works because CBOR data items are self delimiting, so the end of each can always be calculated.

Each bead tells you how big it is, so you do not need a divider between beads. The string just ends when the beads run out.

§2.1Decoding and Truncation

Decoding is simple. An empty byte sequence gives an empty sequence of values. Otherwise, decode one data item from the front, put its value first in the result, and repeat on the remaining bytes. A streaming decoder can hand over each value as soon as its bytes have arrived.

The consequence is that if any item is not well formed, the rest of the sequence cannot be reliably decoded. Handling malformed data is outside the scope of the specification.

The format can detect truncation of the last item, and a streaming decoder may simply pause for more data. It cannot detect data items that are entirely missing at the end.

You read one bead, then the next. If a bead is broken in the middle, you cannot tell where the next one starts. If beads are missing off the end, you will not notice.

§3The +cbor-seq Suffix

Media types can use a structured syntax suffix to say which media type they build on. RFC 7049 already defines +cbor. RFC 8742 defines +cbor-seq.

A media type SHOULD use +cbor-seq when parsing its bytes as a CBOR Sequence is meaningful and is at least sometimes not just a single CBOR data item. Media types that always carry a single item should keep using +cbor.

Applications seeing such a type can use generic processing, or use generic CBOR Sequence tools for the first parse and add their own processing on top.

A suffix is a label on the box that says what it is made from. This one says that the box holds a string of CBOR beads.

§4Practical Considerations

The RFC gives three pieces of practical advice.

  • CDDL. The CDDL notation (RFC 8610) supports sequences inside byte strings through the .cborseq control operator. For a top-level sequence, describe an array in CDDL and say in English text that the specification is really about a sequence of the array's elements.
  • Diagnostic notation. Enclose the items in an array, as in [1, 2, 3]. In informal settings the outer brackets can be left off, as in 1, 2, 3. Zero-length sequences are hard to discuss in the second form.
  • Skipping elements. If you need to skip an element without decoding it, or fan elements out to multiple decoding threads, use CBOR byte strings that contain embedded CBOR as the elements. Byte strings carry their length.

With byte-string elements, you may also be able to recover from an element that is not well formed inside, as long as the sequence of byte strings is well formed.

If you want to skip a bead quickly, put it in a small labeled bag that says how big it is. Then you can pass over the bag without opening it.

TWO WAYS TO WRITE THE SAME SEQUENCE IN DIAGNOSTIC NOTATION
Diagnostic notation for a sequence of three items
[1, 2, 3]

1, 2, 3

§5Security Considerations

The security considerations of CBOR apply. The format gives no cryptographic integrity protection, but can be combined with CBOR Object Signing and Encryption (COSE, RFC 8152). COSE can protect a whole sequence or each element on its own. In the second case, extra effort may be needed to protect the relationship between elements.

Decoders must assume input is untrusted, and MUST fail gracefully on malicious input.

The string of beads has no lock on it. If you want to be sure nobody changed it, you need to add a seal separately.

§6IANA Registrations

IANA has registered three things.

  • The media type application/cbor-seq, with encoding considerations of binary and intended usage COMMON.
  • A CoAP Content-Format ID of 63 for that media type, from the Expert Review (0-255) range.
  • The +cbor-seq structured syntax suffix. Fragment identifiers for it SHOULD follow those of application/cbor-seq, and the text notes that no fragment identification syntax is defined for that type.

IANA wrote the new name and a number into the official lists so everyone uses the same ones.

§8References