blob: 6c95c4b0a96bcee2fe713abaf2f9fd8f8e001b68 [file] [log] [blame]
/*==============================================================================
Copyright (c) 2016-2018, The Linux Foundation.
Copyright (c) 2018-2022, Laurence Lundblade.
Copyright (c) 2021, Arm Limited.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of The Linux Foundation nor the names of its
contributors, nor the name "Laurence Lundblade" may be used to
endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/
#ifndef qcbor_common_h
#define qcbor_common_h
/**
@file qcbor_common.h
This define indicates a version of QCBOR that supports spiffy decode,
the decode functions found in qcbor_spiffy_decode.h.
Versions of QCBOR that support spiffy decode are backwards compatible
with previous versions, but there are a few minor exceptions such as
some aspects of tag handling that are different. This define can be
used handle these variances.
*/
#define QCBOR_SPIFFY_DECODE
/* It was originally defined as QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA,
* but this is incosistent with all the other QCBOR_DISABLE_
* #defines, so the name was changed and this was added for backwards
* compatibility
*/
#ifdef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA
#define QCBOR_DISABLE_EXP_AND_MANTISSA
#endif
/* If USEFULBUF_DISABLE_ALL_FLOATis defined then define
* QCBOR_DISABLE_FLOAT_HW_USE and QCBOR_DISABLE_PREFERRED_FLOAT
*/
#ifdef USEFULBUF_DISABLE_ALL_FLOAT
#ifndef QCBOR_DISABLE_FLOAT_HW_USE
#define QCBOR_DISABLE_FLOAT_HW_USE
#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
#ifndef QCBOR_DISABLE_PREFERRED_FLOAT
#define QCBOR_DISABLE_PREFERRED_FLOAT
#endif /* QCBOR_DISABLE_PREFERRED_FLOAT */
#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
/* Standard CBOR Major type for positive integers of various lengths */
#define CBOR_MAJOR_TYPE_POSITIVE_INT 0
/* Standard CBOR Major type for negative integer of various lengths */
#define CBOR_MAJOR_TYPE_NEGATIVE_INT 1
/* Standard CBOR Major type for an array of arbitrary 8-bit bytes. */
#define CBOR_MAJOR_TYPE_BYTE_STRING 2
/* Standard CBOR Major type for a UTF-8 string. Note this is true 8-bit UTF8
with no encoding and no NULL termination */
#define CBOR_MAJOR_TYPE_TEXT_STRING 3
/* Standard CBOR Major type for an ordered array of other CBOR data items */
#define CBOR_MAJOR_TYPE_ARRAY 4
/* Standard CBOR Major type for CBOR MAP. Maps an array of pairs. The
first item in the pair is the "label" (key, name or identfier) and the second
item is the value. */
#define CBOR_MAJOR_TYPE_MAP 5
/* Standard CBOR major type for a tag number. This creates a CBOR "tag" that
* is the tag number and a data item that follows as the tag content.
*
* Note that this was called an optional tag in RFC 7049, but there's
* not really anything optional about it. It was misleading. It is
* renamed in RFC 8949.
*/
#define CBOR_MAJOR_TYPE_TAG 6
#define CBOR_MAJOR_TYPE_OPTIONAL 6
/* Standard CBOR extra simple types like floats and the values true and false */
#define CBOR_MAJOR_TYPE_SIMPLE 7
/*
These are special values for the AdditionalInfo bits that are part of
the first byte. Mostly they encode the length of the data item.
*/
#define LEN_IS_ONE_BYTE 24
#define LEN_IS_TWO_BYTES 25
#define LEN_IS_FOUR_BYTES 26
#define LEN_IS_EIGHT_BYTES 27
#define ADDINFO_RESERVED1 28
#define ADDINFO_RESERVED2 29
#define ADDINFO_RESERVED3 30
#define LEN_IS_INDEFINITE 31
/*
24 is a special number for CBOR. Integers and lengths
less than it are encoded in the same byte as the major type.
*/
#define CBOR_TWENTY_FOUR 24
/*
Tags that are used with CBOR_MAJOR_TYPE_OPTIONAL. These
are types defined in RFC 8949 and some additional ones
in the IANA CBOR tags registry.
*/
/** See QCBOREncode_AddDateString(). */
#define CBOR_TAG_DATE_STRING 0
/** See QCBOREncode_AddDateEpoch(). */
#define CBOR_TAG_DATE_EPOCH 1
/** See QCBOREncode_AddPositiveBignum(). */
#define CBOR_TAG_POS_BIGNUM 2
/** See QCBOREncode_AddNegativeBignum(). */
#define CBOR_TAG_NEG_BIGNUM 3
/** CBOR tag for a two-element array representing a fraction with a
mantissa and base-10 scaling factor. See QCBOREncode_AddDecimalFraction()
and @ref expAndMantissa.
*/
#define CBOR_TAG_DECIMAL_FRACTION 4
/** CBOR tag for a two-element array representing a fraction with a
mantissa and base-2 scaling factor. See QCBOREncode_AddBigFloat()
and @ref expAndMantissa. */
#define CBOR_TAG_BIGFLOAT 5
/** Not Decoded by QCBOR. Tag for COSE format encryption with no recipient
identification. See [RFC 8152, COSE]
(https://tools.ietf.org/html/rfc8152). No API is provided for this
tag. */
#define CBOR_TAG_COSE_ENCRYPTO 16
/** Not Decoded by QCBOR. Tag for COSE format MAC'd data with no recipient
identification. See [RFC 8152, COSE]
(https://tools.ietf.org/html/rfc8152). No API is provided for this
tag.*/
#define CBOR_TAG_COSE_MAC0 17
/** Tag for COSE format single signature signing. No API is provided
for this tag. See [RFC 8152, COSE]
(https://tools.ietf.org/html/rfc8152). */
#define CBOR_TAG_COSE_SIGN1 18
/** A hint that the following byte string should be encoded in
Base64URL when converting to JSON or similar text-based
representations. Call @c
QCBOREncode_AddTag(pCtx,CBOR_TAG_ENC_AS_B64URL) before the call to
QCBOREncode_AddBytes(). */
#define CBOR_TAG_ENC_AS_B64URL 21
/** A hint that the following byte string should be encoded in Base64
when converting to JSON or similar text-based
representations. Call @c
QCBOREncode_AddTag(pCtx,CBOR_TAG_ENC_AS_B64) before the call to
QCBOREncode_AddBytes(). */
#define CBOR_TAG_ENC_AS_B64 22
/** A hint that the following byte string should be encoded in base-16
format per [RFC 4648] (https://tools.ietf.org/html/rfc4648) when
converting to JSON or similar text-based
representations. Essentially, Base-16 encoding is the standard
case- insensitive hex encoding and may be referred to as
"hex". Call @c QCBOREncode_AddTag(pCtx,CBOR_TAG_ENC_AS_B16) before
the call to QCBOREncode_AddBytes(). */
#define CBOR_TAG_ENC_AS_B16 23
/** See QCBORDecode_EnterBstrWrapped()). */
#define CBOR_TAG_CBOR 24
/** See QCBOREncode_AddURI(). */
#define CBOR_TAG_URI 32
/** See QCBOREncode_AddB64URLText(). */
#define CBOR_TAG_B64URL 33
/** See QCBOREncode_AddB64Text(). */
#define CBOR_TAG_B64 34
/** See QCBOREncode_AddRegex(). */
#define CBOR_TAG_REGEX 35
/** See QCBOREncode_AddMIMEData(). */
#define CBOR_TAG_MIME 36
/** See QCBOREncode_AddBinaryUUID(). */
#define CBOR_TAG_BIN_UUID 37
/** The data is a CBOR Web Token per [RFC 8392]
(https://tools.ietf.org/html/rfc8932). No API is provided for this
tag. */
#define CBOR_TAG_CWT 61
/** Tag for COSE format encryption. See [RFC 8152, COSE]
(https://tools.ietf.org/html/rfc8152). No API is provided for this
tag. */
#define CBOR_TAG_CBOR_SEQUENCE 63
#define CBOR_TAG_ENCRYPT 96
/** Not Decoded by QCBOR. Tag for COSE format MAC. See [RFC 8152, COSE]
(https://tools.ietf.org/html/rfc8152). No API is provided for this
tag. */
#define CBOR_TAG_MAC 97
/** Not Decoded by QCBOR. Tag for COSE format signed data. See [RFC 8152, COSE]
(https://tools.ietf.org/html/rfc8152). No API is provided for this
tag. */
#define CBOR_TAG_SIGN 98
/** Tag for date counted by days from Jan 1 1970 per [RFC 8943]
(https://tools.ietf.org/html/rfc8943). See
QCBOREncode_AddTDaysEpoch(). */
#define CBOR_TAG_DAYS_EPOCH 100
/** Not Decoded by QCBOR. World geographic coordinates. See ISO 6709, [RFC 5870]
(https://tools.ietf.org/html/rfc5870) and WGS-84. No API is
provided for this tag. */
#define CBOR_TAG_GEO_COORD 103
/** Binary MIME.*/
#define CBOR_TAG_BINARY_MIME 257
/** Tag for date string without time or time zone per [RFC 8943]
(https://tools.ietf.org/html/rfc8943). See
QCBOREncode_AddTDaysString(). */
#define CBOR_TAG_DAYS_STRING 1004
/** The magic number, self-described CBOR. No API is provided for this
tag. */
#define CBOR_TAG_CBOR_MAGIC 55799
/** The 16-bit invalid tag from the CBOR tags registry */
#define CBOR_TAG_INVALID16 0xffff
/** The 32-bit invalid tag from the CBOR tags registry */
#define CBOR_TAG_INVALID32 0xffffffff
/** The 64-bit invalid tag from the CBOR tags registry */
#define CBOR_TAG_INVALID64 0xffffffffffffffff
/*
Values for the 5 bits for items of major type 7
*/
#define CBOR_SIMPLEV_FALSE 20
#define CBOR_SIMPLEV_TRUE 21
#define CBOR_SIMPLEV_NULL 22
#define CBOR_SIMPLEV_UNDEF 23
#define CBOR_SIMPLEV_ONEBYTE 24
#define HALF_PREC_FLOAT 25
#define SINGLE_PREC_FLOAT 26
#define DOUBLE_PREC_FLOAT 27
#define CBOR_SIMPLE_BREAK 31
#define CBOR_SIMPLEV_RESERVED_START CBOR_SIMPLEV_ONEBYTE
#define CBOR_SIMPLEV_RESERVED_END CBOR_SIMPLE_BREAK
/**
Error codes returned by QCBOR Encoder and Decoder.
Encode errors are 1..8
Decode errors are 9..43
Not well-formed errors are 9..16
Unrecoverable decode errors are 15..24
(partial overlap with not well-formed errors)
Other decode errors are 25..43
The errors are order and grouped intentionally to keep the code size
of QCBORDecode_IsNotWellFormedError() and
QCBORDecode_IsUnrecoverableError() minimal. Error renumbering may
occur in the future when new error codes are added for new QCBOR
features.
*/
typedef enum {
/** The encode or decode completely correctly. */
QCBOR_SUCCESS = 0,
/** The buffer provided for the encoded output when doing encoding
was too small and the encoded output will not fit. */
QCBOR_ERR_BUFFER_TOO_SMALL = 1,
/** During encoding, an attempt to create simple value between 24
and 31. */
QCBOR_ERR_ENCODE_UNSUPPORTED = 2,
/** During encoding, the length of the encoded CBOR exceeded
QCBOR_MAX_ARRAY_OFFSET, which is slightly less than
@c UINT32_MAX. */
QCBOR_ERR_BUFFER_TOO_LARGE = 3,
/** During encoding, the array or map nesting was deeper than this
implementation can handle. Note that in the interest of code
size and memory use, this implementation has a hard limit on
array nesting. The limit is defined as the constant @ref
QCBOR_MAX_ARRAY_NESTING. */
QCBOR_ERR_ARRAY_NESTING_TOO_DEEP = 4,
/** During encoding, @c QCBOREncode_CloseXxx() called with a
different type than is currently open. */
QCBOR_ERR_CLOSE_MISMATCH = 5,
/** During encoding, the array or map had too many items in it.
This limit @ref QCBOR_MAX_ITEMS_IN_ARRAY, typically 65,535. */
QCBOR_ERR_ARRAY_TOO_LONG = 6,
/** During encoding, more arrays or maps were closed than
opened. This is a coding error on the part of the caller of the
encoder. */
QCBOR_ERR_TOO_MANY_CLOSES = 7,
/** During encoding the number of array or map opens was not
matched by the number of closes. Also occurs with opened
byte strings that are not closed. */
QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN = 8,
#define QCBOR_START_OF_NOT_WELL_FORMED_ERRORS 9
/** During decoding, the CBOR is not well-formed because a simple
value between 0 and 31 is encoded in a two-byte integer rather
than one. */
QCBOR_ERR_BAD_TYPE_7 = 9,
/** During decoding, returned by QCBORDecode_Finish() if all the
inputs bytes have not been consumed. This is considered not
well-formed. */
QCBOR_ERR_EXTRA_BYTES = 10,
/** During decoding, some CBOR construct was encountered that this
decoder doesn't support, primarily this is the reserved
additional info values, 28 through 30. The CBOR is not
well-formed.*/
QCBOR_ERR_UNSUPPORTED = 11,
/** During decoding, the an array or map was not fully consumed.
Returned by QCBORDecode_Finish(). The CBOR is not
well-formed. */
QCBOR_ERR_ARRAY_OR_MAP_UNCONSUMED = 12,
/** During decoding, an integer type is encoded with a bad length
(that of an indefinite length string). The CBOR is not-well
formed. */
QCBOR_ERR_BAD_INT = 13,
#define QCBOR_START_OF_UNRECOVERABLE_DECODE_ERRORS 14
/** During decoding, one of the chunks in an indefinite-length
string is not of the type of the start of the string. The CBOR
is not well-formed. This error makes no further decoding
possible. */
QCBOR_ERR_INDEFINITE_STRING_CHUNK = 14,
/** During decoding, hit the end of the given data to decode. For
example, a byte string of 100 bytes was expected, but the end
of the input was hit before finding those 100 bytes. Corrupted
CBOR input will often result in this error. See also @ref
QCBOR_ERR_NO_MORE_ITEMS. The CBOR is not well-formed. This
error makes no further decoding possible. */
QCBOR_ERR_HIT_END = 15,
/** During decoding, a break occurred outside an indefinite-length
item. The CBOR is not well-formed. This error makes no further
decoding possible. */
QCBOR_ERR_BAD_BREAK = 16,
#define QCBOR_END_OF_NOT_WELL_FORMED_ERRORS 16
/** During decoding, the input is too large. It is greater than
QCBOR_MAX_DECODE_INPUT_SIZE. This is an implementation limit.
This error makes no further decoding possible. */
QCBOR_ERR_INPUT_TOO_LARGE = 17,
/** During decoding, the array or map nesting was deeper than this
implementation can handle. Note that in the interest of code
size and memory use, this implementation has a hard limit on
array nesting. The limit is defined as the constant @ref
QCBOR_MAX_ARRAY_NESTING. This error makes no further decoding
possible. */
QCBOR_ERR_ARRAY_DECODE_NESTING_TOO_DEEP = 18,
/** During decoding, the array or map had too many items in it.
This limit @ref QCBOR_MAX_ITEMS_IN_ARRAY, typically 65,534,
UINT16_MAX - 1. This error makes no further decoding
possible. */
QCBOR_ERR_ARRAY_DECODE_TOO_LONG = 19,
/** When decoding, a string's size is greater than what a size_t
can hold less 4. In all but some very strange situations this
is because of corrupt input CBOR and should be treated as
such. The strange situation is a CPU with a very small size_t
(e.g., a 16-bit CPU) and a large string (e.g., > 65KB). This
error makes no further decoding possible. */
QCBOR_ERR_STRING_TOO_LONG = 20,
/** Something is wrong with a decimal fraction or bigfloat such as
it not consisting of an array with two integers. This error
makes no further decoding possible. */
QCBOR_ERR_BAD_EXP_AND_MANTISSA = 21,
/** Unable to decode an indefinite-length string because no string
allocator was configured. See QCBORDecode_SetMemPool() or
QCBORDecode_SetUpAllocator(). This error makes no further
decoding possible.*/
QCBOR_ERR_NO_STRING_ALLOCATOR = 22,
/** Error allocating space for a string, usually for an
indefinite-length string. This error makes no further decoding
possible. */
QCBOR_ERR_STRING_ALLOCATE = 23,
#define QCBOR_END_OF_UNRECOVERABLE_DECODE_ERRORS 23
/** More than @ref QCBOR_MAX_TAGS_PER_ITEM tags encountered for a
CBOR ITEM. @ref QCBOR_MAX_TAGS_PER_ITEM is a limit of this
implementation. During decoding, too many tags in the
caller-configured tag list, or not enough space in @ref
QCBORTagListOut. This error makes no further decoding
possible. */
QCBOR_ERR_TOO_MANY_TAGS = 24,
/** During decoding, the type of the label for a map entry is not
one that can be handled in the current decoding mode. Typically
this is because a label is not an intger or a string. This is
an implemation limit. */
QCBOR_ERR_MAP_LABEL_TYPE = 25,
/** When decoding for a specific type, the type was not was
expected. */
QCBOR_ERR_UNEXPECTED_TYPE = 26,
/** This occurs when decoding one of the tags that QCBOR processed
internally. The content of a tag was of the wrong type. (They
were known as "Optional Tags" in RFC 7049, but "optional" is
misleading. The old error name is retained for backwards
compatibility. */
QCBOR_ERR_BAD_TAG_CONTENT = 27,
QCBOR_ERR_BAD_OPT_TAG = 27,
/** Duplicate label in map detected */
QCBOR_ERR_DUPLICATE_LABEL = 28,
/** During decoding, the buffer given to QCBORDecode_SetMemPool()
is either too small, smaller than
QCBOR_DECODE_MIN_MEM_POOL_SIZE or too large, larger than
UINT32_MAX. */
QCBOR_ERR_MEM_POOL_SIZE = 29,
/** During decoding, an integer smaller than INT64_MIN was received
(CBOR can represent integers smaller than INT64_MIN, but C
cannot). */
QCBOR_ERR_INT_OVERFLOW = 30,
/** During decoding, a date greater than +- 292 billion years from
Jan 1 1970 encountered during parsing. This is an
implementation limit. */
QCBOR_ERR_DATE_OVERFLOW = 31,
/** During decoding, @c QCBORDecode_ExitXxx() was called for a
different type than @c QCBORDecode_EnterXxx(). */
QCBOR_ERR_EXIT_MISMATCH = 32,
/** All well-formed data items have been consumed and there are no
more. If parsing a CBOR stream this indicates the non-error end
of the stream. If not parsing a CBOR stream / sequence, this
probably indicates that some data items expected are not
present. See also @ref QCBOR_ERR_HIT_END. */
QCBOR_ERR_NO_MORE_ITEMS = 33,
/** When finding an item by label, an item with the requested label
was not found. */
QCBOR_ERR_LABEL_NOT_FOUND = 34,
/** Number conversion failed because of sign. For example a
negative int64_t can't be converted to a uint64_t */
QCBOR_ERR_NUMBER_SIGN_CONVERSION = 35,
/** When converting a decoded number, the value is too large or to
small for the conversion target */
QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW = 36,
/** Trying to get an item by label when a map has not been
entered. */
QCBOR_ERR_MAP_NOT_ENTERED = 37,
/** A callback indicates processing should not continue for some
non-CBOR reason */
QCBOR_ERR_CALLBACK_FAIL = 38,
/** This error code is deprecated. Instead,
\ref QCBOR_ERR_HALF_PRECISION_DISABLED,
\ref QCBOR_ERR_HW_FLOAT_DISABLED or \ref QCBOR_ERR_ALL_FLOAT_DISABLED
is returned depending on the specific floating-point functionality
that is disabled and the type of floating-point input. */
QCBOR_ERR_FLOAT_DATE_DISABLED = 39,
/** Support for half-precision float decoding is disabled. */
QCBOR_ERR_HALF_PRECISION_DISABLED = 40,
/** Use of floating-point HW is disabled. This affects all type
conversions to and from double and float types. */
QCBOR_ERR_HW_FLOAT_DISABLED = 41,
/** Unable to complete operation because a floating-point value
that is a NaN (not a number), that is too large, too small,
infinity or -infinity was encountered in encoded CBOR. Usually
this because conversion of the float-point value was being
attempted. */
QCBOR_ERR_FLOAT_EXCEPTION = 42,
/** Indefinite length string handling is disabled and there is an
indefinite length string in the input CBOR. */
QCBOR_ERR_INDEF_LEN_STRINGS_DISABLED = 43,
/** Indefinite length arrays and maps handling are disabled and there is an
indefinite length map or array in the input CBOR. */
QCBOR_ERR_INDEF_LEN_ARRAYS_DISABLED = 44,
/** Trying to cancel a byte string wrapping after items have been
added to it. */
QCBOR_ERR_CANNOT_CANCEL = 45,
/** Floating point support is completely turned off, encoding/decoding
floating point numbers is not possible. */
QCBOR_ERR_ALL_FLOAT_DISABLED = 46,
/** During encode, opening a byte string while a byte string is open
is not allowed. . */
QCBOR_ERR_OPEN_BYTE_STRING = 47
/* This is stored in uint8_t; never add values > 255 */
} QCBORError;
/* Function for getting an error string from an error code */
const char *qcbor_err_to_str(QCBORError err);
/**
The maximum nesting of arrays and maps when encoding or decoding. The
error @ref QCBOR_ERR_ARRAY_NESTING_TOO_DEEP will be returned on
encoding or QCBOR_ERR_ARRAY_DECODE_NESTING_TOO_DEEP on decoding if it is exceeded.
*/
#define QCBOR_MAX_ARRAY_NESTING QCBOR_MAX_ARRAY_NESTING1
/**
The maximum number of items in a single array or map when encoding of
decoding.
*/
// -1 is because the value UINT16_MAX is used to track indefinite-length arrays
#define QCBOR_MAX_ITEMS_IN_ARRAY (UINT16_MAX-1)
/**
This is deprecated. See QCBORDecode_GetNthTag() and QCBORDecode_GetNthTagOfLast()
for tag handling.
The maximum number of tags that can be in @ref QCBORTagListIn and passed to
QCBORDecode_SetCallerConfiguredTagList()
*/
#define QCBOR_MAX_CUSTOM_TAGS 16
#endif /* qcbor_common_h */