blob: 83c167e3d7b12d2658c0ff49717c8bec73e3f4c0 [file] [log] [blame]
Laurence Lundblade3eead482023-12-16 20:53:22 -07001/* ===========================================================================
2 * Copyright (c) 2016-2018, The Linux Foundation.
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003 * Copyright (c) 2018-2024, Laurence Lundblade.
Laurence Lundblade3eead482023-12-16 20:53:22 -07004 * Copyright (c) 2021, Arm Limited.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are
9 * met:
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following
14 * disclaimer in the documentation and/or other materials provided
15 * with the distribution.
16 * * Neither the name of The Linux Foundation nor the names of its
17 * contributors, nor the name "Laurence Lundblade" may be used to
18 * endorse or promote products derived from this software without
19 * specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
22 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
23 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
28 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
30 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
31 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 * ========================================================================= */
Michael Eckel5c531332020-03-02 01:35:30 +010033
34
Laurence Lundblade844bb5c2020-03-01 17:27:25 -080035#ifndef qcbor_encode_h
36#define qcbor_encode_h
Michael Eckel5c531332020-03-02 01:35:30 +010037
38
Laurence Lundblade844bb5c2020-03-01 17:27:25 -080039#include "qcbor/qcbor_common.h"
40#include "qcbor/qcbor_private.h"
Michael Eckel5c531332020-03-02 01:35:30 +010041#include <stdbool.h>
Laurence Lundblade844bb5c2020-03-01 17:27:25 -080042
Michael Eckel5c531332020-03-02 01:35:30 +010043
44#ifdef __cplusplus
45extern "C" {
Dave Thaler12b23752020-03-27 01:23:08 -070046#if 0
Michael Eckel5c531332020-03-02 01:35:30 +010047} // Keep editor indention formatting happy
48#endif
49#endif
50
Michael Eckel5c531332020-03-02 01:35:30 +010051
52/**
Laurence Lundblade3eead482023-12-16 20:53:22 -070053 * @file qcbor_encode.h
54 *
55 * @anchor Overview
56 *
57 * # QCBOR Overview
58 *
59 * This implements CBOR -- Concise Binary Object Representation as
60 * defined in [RFC 8949] (https://tools.ietf.org/html/rfc8949). More
61 * information is at http://cbor.io. This is a near-complete implementation of
62 * the specification. [RFC 8742] (https://tools.ietf.org/html/rfc8742) CBOR
63 * Sequences is also supported. Limitations are listed further down.
64 *
65 * See @ref Encoding for general discussion on encoding,
66 * @ref BasicDecode for general discussion on the basic decode features
67 * and @ref SpiffyDecode for general discussion on the easier-to-use
68 * decoder functions.
69 *
70 * CBOR is intentionally designed to be translatable to JSON, but not
71 * all CBOR can convert to JSON. See RFC 8949 for more info on how to
72 * construct CBOR that is the most JSON friendly.
73 *
74 * The memory model for encoding and decoding is that encoded CBOR must
75 * be in a contiguous buffer in memory. During encoding the caller must
76 * supply an output buffer and if the encoding would go off the end of
77 * the buffer an error is returned. During decoding the caller supplies
78 * the encoded CBOR in a contiguous buffer and the decoder returns
79 * pointers and lengths into that buffer for strings.
80 *
81 * This implementation does not require malloc. All data structures
82 * passed in/out of the APIs can fit on the stack.
83 *
84 * Decoding of indefinite-length strings is a special case that requires
85 * a "string allocator" to allocate memory into which the segments of
86 * the string are coalesced. Without this, decoding will error out if an
87 * indefinite-length string is encountered (indefinite-length maps and
88 * arrays do not require the string allocator). A simple string
89 * allocator called MemPool is built-in and will work if supplied with a
90 * block of memory to allocate. The string allocator can optionally use
91 * malloc() or some other custom scheme.
92 *
93 * Here are some terms and definitions:
94 *
95 * - "Item", "Data Item": An integer or string or such. The basic "thing" that
96 * CBOR is about. An array is an item itself that contains some items.
97 *
98 * - "Array": An ordered sequence of items, the same as JSON.
99 *
100 * - "Map": A collection of label/value pairs. Each pair is a data
101 * item. A JSON "object" is the same as a CBOR "map".
102 *
103 * - "Label": The data item in a pair in a map that names or identifies
104 * the pair, not the value. This implementation refers to it as a
105 * "label". JSON refers to it as the "name". The CBOR RFC refers to it
106 * this as a "key". This implementation chooses label instead because
107 * key is too easily confused with a cryptographic key. The COSE
108 * standard, which uses CBOR, has also chosen to use the term "label"
109 * rather than "key" for this same reason.
110 *
111 * - "Key": See "Label" above.
112 *
113 * - "Tag": A data item that is an explicitly labeled new data
114 * type made up of the tagging integer and the tag content.
115 * See @ref Tags-Overview and @ref Tag-Usage.
116 *
117 * - "Initial Byte": The first byte of an encoded item. Encoding and
118 * decoding of this byte is taken care of by the implementation.
119 *
120 * - "Additional Info": In addition to the major type, all data items
121 * have some other info. This is usually the length of the data but can
122 * be several other things. Encoding and decoding of this is taken care
123 * of by the implementation.
124 *
125 * CBOR has two mechanisms for tagging and labeling the data values like
126 * integers and strings. For example, an integer that represents
127 * someone's birthday in epoch seconds since Jan 1, 1970 could be
128 * encoded like this:
129 *
130 * - First it is CBOR_MAJOR_TYPE_POSITIVE_INT (@ref QCBOR_TYPE_INT64),
131 * the primitive positive integer.
132 *
133 * - Next it has a "tag" @ref CBOR_TAG_DATE_EPOCH indicating the integer
134 * represents a date in the form of the number of seconds since Jan 1,
135 * 1970.
136 *
137 * - Last it has a string "label" like "BirthDate" indicating the
138 * meaning of the data.
139 *
140 * The encoded binary looks like this:
141 *
142 * a1 # Map of 1 item
143 * 69 # Indicates text string of 9 bytes
144 * 426972746844617465 # The text "BirthDate"
145 * c1 # Tags next integer as epoch date
146 * 1a # Indicates a 4-byte integer
147 * 580d4172 # unsigned integer date 1477263730
148 *
149 * Implementors using this API will primarily work with
150 * labels. Generally, tags are only needed for making up new data
151 * types. This implementation covers most of the data types defined in
152 * the RFC using tags. It also, allows for the use of custom tags if
153 * necessary.
154 *
155 * This implementation explicitly supports labels that are text strings
156 * and integers. Text strings translate nicely into JSON objects and are
157 * very readable. Integer labels are much less readable but can be very
158 * compact. If they are in the range of 0 to 23, they take up only one
159 * byte.
160 *
161 * CBOR allows a label to be any type of data including an array or a
162 * map. It is possible to use this API to construct and parse such
163 * labels, but it is not explicitly supported.
164 *
165 * @anchor Encoding
166 *
167 * ## Encoding
168 *
169 * A common encoding usage mode is to invoke the encoding twice. First
170 * with the output buffer as @ref SizeCalculateUsefulBuf to compute the
171 * length of the needed output buffer. The correct sized output buffer
172 * is allocated. The encoder is invoked a second time with the allocated
173 * output buffer.
174 *
175 * The double invocation is not required if the maximum output buffer
176 * size can be predicted. This is usually possible for simple CBOR
177 * structures.
178 *
179 * If a buffer too small to hold the encoded output is given, the error
180 * @ref QCBOR_ERR_BUFFER_TOO_SMALL will be returned. Data will never be
181 * written off the end of the output buffer no matter which functions
182 * here are called or what parameters are passed to them.
183 *
184 * The encoding error handling is simple. The only possible errors are
185 * trying to encode structures that are too large or too complex. There
186 * are no internal malloc calls so there will be no failures for out of
187 * memory. The error state is tracked internally, so there is no need
188 * to check for errors when encoding. Only the return code from
189 * QCBOREncode_Finish() need be checked as once an error happens, the
190 * encoder goes into an error state and calls to it to add more data
191 * will do nothing. An error check is not needed after every data item
192 * is added.
193 *
194 * Encoding generally proceeds by calling QCBOREncode_Init(), calling
195 * lots of @c QCBOREncode_AddXxx() functions and calling
196 * QCBOREncode_Finish(). There are many @c QCBOREncode_AddXxx()
197 * functions for various data types. The input buffers need only to be
198 * valid during the @c QCBOREncode_AddXxx() calls as the data is copied
199 * into the output buffer.
200 *
201 * There are three `Add` functions for each data type. The first / main
202 * one for the type is for adding the data item to an array. The second
203 * one's name ends in `ToMap`, is used for adding data items to maps and
204 * takes a string argument that is its label in the map. The third one
205 * ends in `ToMapN`, is also used for adding data items to maps, and
206 * takes an integer argument that is its label in the map.
207 *
208 * The simplest aggregate type is an array, which is a simple ordered
209 * set of items without labels the same as JSON arrays. Call
210 * QCBOREncode_OpenArray() to open a new array, then various @c
211 * QCBOREncode_AddXxx() functions to put items in the array and then
212 * QCBOREncode_CloseArray(). Nesting to the limit @ref
213 * QCBOR_MAX_ARRAY_NESTING is allowed. All opens must be matched by
214 * closes or an encoding error will be returned.
215 *
216 * The other aggregate type is a map which does use labels. The `Add`
217 * functions that end in `ToMap` and `ToMapN` are convenient ways to add
218 * labeled data items to a map. You can also call any type of `Add`
219 * function once to add a label of any type and then call any type of
220 * `Add` again to add its value.
221 *
222 * Note that when you nest arrays or maps in a map, the nested array or
223 * map has a label.
224 *
225 * Many CBOR-based protocols start with an array or map. This makes them
226 * self-delimiting. No external length or end marker is needed to know
227 * the end. It is also possible not start this way, in which case this
228 * it is usually called a CBOR sequence which is described in
229 * [RFC 8742] (https://tools.ietf.org/html/rfc8742). This encoder supports
230 * either just by whether the first item added is an array, map or other.
231 *
232 * If QCBOR is compiled with QCBOR_DISABLE_ENCODE_USAGE_GUARDS defined,
233 * the errors QCBOR_ERR_CLOSE_MISMATCH, QCBOR_ERR_ARRAY_TOO_LONG,
234 * QCBOR_ERR_TOO_MANY_CLOSES, QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN, and
235 * QCBOR_ERR_ENCODE_UNSUPPORTED will never be returned. It is up to the
236 * caller to make sure that opened maps, arrays and byte-string wrapping
237 * is closed correctly and that QCBOREncode_AddType7() is called
238 * correctly. With this defined, it is easier to make a mistake when
239 * authoring the encoding of a protocol that will output not well formed
240 * CBOR, but as long as the calling code is correct, it is safe to
241 * disable these checks. Bounds checking that prevents security issues
242 * in the code is still enforced. This define reduces the size of
243 * encoding object code by about 150 bytes.
244 *
245 * @anchor Tags-Overview
246 *
247 * ## Tags Overview
248 *
249 * Any CBOR data item can be made into a tag to add semantics, define a
250 * new data type or such. Some tags are fully standardized and some are
251 * just registered. Others are not registered and used in a proprietary
252 * way.
253 *
254 * Encoding and decoding of many of the registered tags is fully
255 * implemented by QCBOR. It is also possible to encode and decode tags
256 * that are not directly supported. For many use cases the built-in tag
257 * support should be adequate.
258 *
259 * For example, the registered epoch date tag is supported in encoding
260 * by QCBOREncode_AddDateEpoch() and in decoding by @ref
261 * QCBOR_TYPE_DATE_EPOCH and the @c epochDate member of @ref
262 * QCBORItem. This is typical of the built-in tag support. There is an
263 * API to encode data for it and a @c QCBOR_TYPE_XXX when it is decoded.
264 *
265 * Tags are registered in the [IANA CBOR Tags Registry]
266 * (https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml). There
267 * are roughly three options to create a new tag. First, a public
268 * specification can be created and the new tag registered with IANA.
269 * This is the most formal. Second, the new tag can be registered with
270 * IANA with just a short description rather than a full specification.
271 * These tags must be greater than 256. Third, a tag can be used without
272 * any IANA registration, though the registry should be checked to see
273 * that the new value doesn't collide with one that is registered. The
274 * value of these tags must be 256 or larger.
275 *
276 * See also @ref CBORTags and @ref Tag-Usage
277 *
278 * The encoding side of tags not built-in is handled by
279 * QCBOREncode_AddTag() and is relatively simple. Tag decoding is more
280 * complex and mainly handled by QCBORDecode_GetNext(). Decoding of the
281 * structure of tagged data not built-in (if there is any) has to be
282 * implemented by the caller.
283 *
284 * @anchor Floating-Point
285 *
286 * ## Floating-Point
287 *
288 * By default QCBOR fully supports IEEE 754 floating-point:
289 * - Encode/decode of double, single and half-precision
290 * - CBOR preferred serialization of floating-point
291 * - Floating-point epoch dates
292 *
293 * For the most part, the type double is used in the interface for
294 * floating-point values. In the default configuration, all decoded
295 * floating-point values are returned as a double.
296 *
297 * With CBOR preferred serialization, the encoder outputs the smallest
298 * representation of the double or float that preserves precision. Zero,
299 * NaN and infinity are always output as a half-precision, each taking
300 * just 2 bytes. This reduces the number of bytes needed to encode
301 * double and single-precision, especially if zero, NaN and infinity are
302 * frequently used.
303 *
304 * To avoid use of preferred serialization in the standard configuration
305 * when encoding, use QCBOREncode_AddDoubleNoPreferred() or
306 * QCBOREncode_AddFloatNoPreferred().
307 *
308 * This implementation of preferred floating-point serialization and
309 * half-precision does not depend on the CPU having floating-point HW or
310 * the compiler bringing in a (sometimes large) library to compensate
311 * for lack of CPU support. This implementation uses shifts and masks
312 * rather than floating-point functions.
313 *
314 * To reduce overall object code by about 900 bytes, define
315 * QCBOR_DISABLE_PREFERRED_FLOAT. This will eliminate all support for
316 * preferred serialization and half-precision. An error will be returned
317 * when attempting to decode half-precision. A float will always be
318 * encoded and decoded as 32-bits and a double will always be encoded
319 * and decoded as 64 bits.
320 *
321 * Note that even if QCBOR_DISABLE_PREFERRED_FLOAT is not defined all
322 * the float-point encoding object code can be avoided by never calling
323 * any functions that encode double or float. Just not calling
324 * floating-point functions will reduce object code by about 500 bytes.
325 *
326 * On CPUs that have no floating-point hardware,
327 * QCBOR_DISABLE_FLOAT_HW_USE should be defined in most cases. If it is
328 * not, then the compiler will bring in possibly large software
329 * libraries to compensate. Defining QCBOR_DISABLE_FLOAT_HW_USE reduces
330 * object code size on CPUs with floating-point hardware by a tiny
331 * amount and eliminates the need for <math.h>
332 *
333 * When QCBOR_DISABLE_FLOAT_HW_USE is defined, trying to decoding
334 * floating-point dates will give error
335 * @ref QCBOR_ERR_FLOAT_DATE_DISABLED and decoded single-precision
336 * numbers will be returned as @ref QCBOR_TYPE_FLOAT instead of
337 * converting them to double as usual.
338 *
339 * If both QCBOR_DISABLE_FLOAT_HW_USE and QCBOR_DISABLE_PREFERRED_FLOAT
340 * are defined, then the only thing QCBOR can do is encode/decode a C
341 * float type as 32-bits and a C double type as 64-bits. Floating-point
342 * epoch dates will be unsupported.
343 *
Laurence Lundblade475c2722024-05-08 11:17:47 -0700344 * If USEFULBUF_DISABLE_ALL_FLOAT is defined, then floating point
Laurence Lundblade3eead482023-12-16 20:53:22 -0700345 * support is completely disabled. Decoding functions return
346 * @ref QCBOR_ERR_ALL_FLOAT_DISABLED if a floating point value is
347 * encountered during decoding. Functions that are encoding floating
348 * point values are not available.
349 *
350 * ## Limitations
351 *
Laurence Lundblade475c2722024-05-08 11:17:47 -0700352 * Summary limitations:
Laurence Lundblade3eead482023-12-16 20:53:22 -0700353 * - The entire encoded CBOR must fit into contiguous memory.
Laurence Lundblade475c2722024-05-08 11:17:47 -0700354 * - Max size of encoded CBOR data is a few bytes less than
355 * @c UINT32_MAX (4GB).
356 * - Max array / map nesting level when encoding or decoding is
Laurence Lundblade3eead482023-12-16 20:53:22 -0700357 * @ref QCBOR_MAX_ARRAY_NESTING (this is typically 15).
Laurence Lundblade475c2722024-05-08 11:17:47 -0700358 * - Max items in an array or map when encoding or decoding is
Laurence Lundblade3eead482023-12-16 20:53:22 -0700359 * @ref QCBOR_MAX_ITEMS_IN_ARRAY (typically 65,536).
360 * - Does not directly support labels in maps other than text strings & integers.
Laurence Lundblade475c2722024-05-08 11:17:47 -0700361 * - Does not directly support integer labels beyond whats fits in @c int64_t
362 * or @c uint64_t.
Laurence Lundblade3eead482023-12-16 20:53:22 -0700363 * - Epoch dates limited to @c INT64_MAX (+/- 292 billion years).
Laurence Lundblade475c2722024-05-08 11:17:47 -0700364 * - Exponents for bigfloats and decimal integers are limited to whats fits in
365 * @c int64_t.
Laurence Lundblade3eead482023-12-16 20:53:22 -0700366 * - Tags on labels are ignored during decoding.
367 * - The maximum tag nesting is @c QCBOR_MAX_TAGS_PER_ITEM (typically 4).
Laurence Lundblade475c2722024-05-08 11:17:47 -0700368 * - Works only on 32- and 64-bit CPUs.
Laurence Lundblade31fddb72024-05-13 13:03:35 -0700369 * - QCBORDecode_EnterBstrWrapped() doesn't work on indefinite-length strings.
Laurence Lundblade3eead482023-12-16 20:53:22 -0700370 *
371 * The public interface uses @c size_t for all lengths. Internally the
372 * implementation uses 32-bit lengths by design to use less memory and
373 * fit structures on the stack. This limits the encoded CBOR it can
Laurence Lundblade475c2722024-05-08 11:17:47 -0700374 * work with to size @c UINT32_MAX (4GB).
Laurence Lundblade3eead482023-12-16 20:53:22 -0700375 *
Laurence Lundblade475c2722024-05-08 11:17:47 -0700376 * This implementation requires two's compliment integers. While
377 * C doesn't require two's compliment, <stdint.h> does. Other
378 * parts of this implementation may also require two's compliment.
Michael Eckel5c531332020-03-02 01:35:30 +0100379 */
380
381
Laurence Lundblade825164e2020-10-22 20:18:06 -0700382/**
Laurence Lundblade3eead482023-12-16 20:53:22 -0700383 * The size of the buffer to be passed to QCBOREncode_EncodeHead(). It
384 * is one byte larger than sizeof(uint64_t) + 1, the actual maximum
385 * size of the head of a CBOR data item because
386 * QCBOREncode_EncodeHead() needs one extra byte to work.
Michael Eckel5c531332020-03-02 01:35:30 +0100387 */
388#define QCBOR_HEAD_BUFFER_SIZE (sizeof(uint64_t) + 2)
389
Michael Eckel5c531332020-03-02 01:35:30 +0100390
Laurence Lundblade9b334962020-08-27 10:55:53 -0700391/**
Laurence Lundblade3eead482023-12-16 20:53:22 -0700392 * Output the full CBOR tag. See @ref CBORTags, @ref Tag-Usage and
393 * @ref Tags-Overview.
Laurence Lundblade9b334962020-08-27 10:55:53 -0700394 */
395#define QCBOR_ENCODE_AS_TAG 0
396
397/**
Laurence Lundblade3eead482023-12-16 20:53:22 -0700398 * Output only the 'borrowed' content format for the relevant tag.
399 * See @ref CBORTags, @ref Tag-Usage and @ref Tags-Overview.
Laurence Lundblade9b334962020-08-27 10:55:53 -0700400 */
401#define QCBOR_ENCODE_AS_BORROWED 1
402
Michael Eckel5c531332020-03-02 01:35:30 +0100403
404/**
Laurence Lundblade3eead482023-12-16 20:53:22 -0700405 * QCBOREncodeContext is the data type that holds context for all the
406 * encoding functions. It is less than 200 bytes, so it can go on the
407 * stack. The contents are opaque, and the caller should not access
408 * internal members. A context may be re used serially as long as it is
409 * re initialized.
Michael Eckel5c531332020-03-02 01:35:30 +0100410 */
411typedef struct _QCBOREncodeContext QCBOREncodeContext;
412
413
414/**
Laurence Lundblade3eead482023-12-16 20:53:22 -0700415 * Initialize the encoder to prepare to encode some CBOR.
416 *
417 * @param[in,out] pCtx The encoder context to initialize.
418 * @param[in] Storage The buffer into which the encoded result
419 * will be written.
420 *
421 * Call this once at the start of an encoding of some CBOR. Then call
422 * the many functions like QCBOREncode_AddInt64() and
423 * QCBOREncode_AddText() to add the different data items. Finally,
424 * call QCBOREncode_Finish() to get the pointer and length of the
425 * encoded result.
426 *
427 * The primary purpose of this function is to give the pointer and
428 * length of the output buffer into which the encoded CBOR will be
429 * written. This is done with a @ref UsefulBuf structure, which is
430 * just a pointer and length (it is equivalent to two parameters, one
431 * a pointer and one a length, but a little prettier).
432 *
433 * The output buffer can be allocated any way (malloc, stack,
434 * static). It is just some memory that QCBOR writes to. The length
435 * must be the length of the allocated buffer. QCBOR will never write
436 * past that length, but might write up to that length. If the buffer
437 * is too small, encoding will go into an error state and not write
438 * anything further.
439 *
440 * If allocating on the stack the convenience macro
441 * UsefulBuf_MAKE_STACK_UB() can be used, but its use is not required.
442 *
443 * Since there is no reallocation or such, the output buffer must be
444 * correctly sized when passed in here. It is OK, but wasteful if it
445 * is too large. One way to pick the size is to figure out the maximum
446 * size that will ever be needed and hard code a buffer of that size.
447 *
448 * Another way to do it is to have QCBOR calculate it for you. To do
449 * this, pass @ref SizeCalculateUsefulBuf for @c Storage. Then call
450 * all the functions to add the CBOR exactly as if encoding for
451 * real. Finally, call QCBOREncode_FinishGetSize(). Once the length
452 * is obtained, allocate a buffer of that size, call
453 * QCBOREncode_Init() again with the real buffer. Call all the add
454 * functions again and finally, QCBOREncode_Finish() to obtain the
455 * final result. This uses twice the CPU time, but that is usually not
456 * an issue.
457 *
458 * See QCBOREncode_Finish() for how the pointer and length for the
459 * encoded CBOR is returned.
460 *
461 * For practical purposes QCBOR can't output encoded CBOR larger than
462 * @c UINT32_MAX (4GB) even on 64-bit CPUs because the internal
463 * offsets used to track the start of an array/map are 32 bits to
464 * reduce the size of the encoding context.
465 *
466 * A @ref QCBOREncodeContext can be reused over and over as long as
467 * QCBOREncode_Init() is called before each use.
Michael Eckel5c531332020-03-02 01:35:30 +0100468 */
Laurence Lundblade3eead482023-12-16 20:53:22 -0700469void
470QCBOREncode_Init(QCBOREncodeContext *pCtx, UsefulBuf Storage);
Michael Eckel5c531332020-03-02 01:35:30 +0100471
472
473/**
Laurence Lundblade3eead482023-12-16 20:53:22 -0700474 * @brief Add a signed 64-bit integer to the encoded output.
475 *
476 * @param[in] pCtx The encoding context to add the integer to.
477 * @param[in] nNum The integer to add.
478 *
479 * The integer will be encoded and added to the CBOR output.
480 *
481 * This function figures out the size and the sign and encodes in the
482 * correct minimal CBOR. Specifically, it will select CBOR major type
483 * 0 or 1 based on sign and will encode to 1, 2, 4 or 8 bytes
484 * depending on the value of the integer. Values less than 24
485 * effectively encode to one byte because they are encoded in with the
486 * CBOR major type. This is a neat and efficient characteristic of
487 * CBOR that can be taken advantage of when designing CBOR-based
488 * protocols. If integers like tags can be kept between -23 and 23
489 * they will be encoded in one byte including the major type.
490 *
491 * If you pass a smaller int, say an @c int16_t or a small value, say
492 * 100, the encoding will still be CBOR's most compact that can
493 * represent the value. For example, CBOR always encodes the value 0
494 * as one byte, 0x00. The representation as 0x00 includes
495 * identification of the type as an integer too as the major type for
496 * an integer is 0. See [RFC 8949]
497 * (https://tools.ietf.org/html/rfc8949) Appendix A for more examples
498 * of CBOR encoding. This compact encoding is also preferred
499 * serialization CBOR as per section 34.1 in RFC 8949.
500 *
501 * There are no functions to add @c int16_t or @c int32_t because they
502 * are not necessary because this always encodes to the smallest
503 * number of bytes based on the value (If this code is running on a
504 * 32-bit machine having a way to add 32-bit integers would reduce
505 * code size some).
506 *
507 * If the encoding context is in an error state, this will do
508 * nothing. If an error occurs when adding this integer, the internal
509 * error flag will be set, and the error will be returned when
510 * QCBOREncode_Finish() is called.
511 *
512 * See also QCBOREncode_AddUInt64().
Michael Eckel5c531332020-03-02 01:35:30 +0100513 */
Laurence Lundblade3eead482023-12-16 20:53:22 -0700514void
515QCBOREncode_AddInt64(QCBOREncodeContext *pCtx, int64_t nNum);
Michael Eckel5c531332020-03-02 01:35:30 +0100516
Laurence Lundblade3eead482023-12-16 20:53:22 -0700517static void
518QCBOREncode_AddInt64ToMap(QCBOREncodeContext *pCtx, const char *szLabel, int64_t uNum);
Michael Eckel5c531332020-03-02 01:35:30 +0100519
Laurence Lundblade3eead482023-12-16 20:53:22 -0700520static void
521QCBOREncode_AddInt64ToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, int64_t uNum);
Michael Eckel5c531332020-03-02 01:35:30 +0100522
523
524/**
Laurence Lundblade3eead482023-12-16 20:53:22 -0700525 * @brief Add an unsigned 64-bit integer to the encoded output.
526 *
527 * @param[in] pCtx The encoding context to add the integer to.
528 * @param[in] uNum The integer to add.
529 *
530 * The integer will be encoded and added to the CBOR output.
531 *
532 * The only reason so use this function is for integers larger than
533 * @c INT64_MAX and smaller than @c UINT64_MAX. Otherwise
534 * QCBOREncode_AddInt64() will work fine.
535 *
536 * Error handling is the same as for QCBOREncode_AddInt64().
Michael Eckel5c531332020-03-02 01:35:30 +0100537 */
Laurence Lundbladecbd7d132024-05-19 11:11:22 -0700538static void
Laurence Lundblade3eead482023-12-16 20:53:22 -0700539QCBOREncode_AddUInt64(QCBOREncodeContext *pCtx, uint64_t uNum);
Michael Eckel5c531332020-03-02 01:35:30 +0100540
Laurence Lundblade3eead482023-12-16 20:53:22 -0700541static void
542QCBOREncode_AddUInt64ToMap(QCBOREncodeContext *pCtx, const char *szLabel, uint64_t uNum);
Michael Eckel5c531332020-03-02 01:35:30 +0100543
Laurence Lundblade3eead482023-12-16 20:53:22 -0700544static void
545QCBOREncode_AddUInt64ToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, uint64_t uNum);
Michael Eckel5c531332020-03-02 01:35:30 +0100546
547
548/**
Laurence Lundblade3eead482023-12-16 20:53:22 -0700549 * @brief Add a UTF-8 text string to the encoded output.
550 *
551 * @param[in] pCtx The encoding context to add the text to.
552 * @param[in] Text Pointer and length of text to add.
553 *
554 * The text passed in must be unencoded UTF-8 according to [RFC 3629]
555 * (https://tools.ietf.org/html/rfc3629). There is no NULL
556 * termination. The text is added as CBOR major type 3.
557 *
558 * If called with @c nBytesLen equal to 0, an empty string will be
559 * added. When @c nBytesLen is 0, @c pBytes may be @c NULL.
560 *
561 * Note that the restriction of the buffer length to a @c uint32_t is
562 * entirely intentional as this encoder is not capable of encoding
563 * lengths greater. This limit to 4GB for a text string should not be
564 * a problem.
565 *
566 * Text lines in Internet protocols (on the wire) are delimited by
567 * either a CRLF or just an LF. Officially many protocols specify
568 * CRLF, but implementations often work with either. CBOR type 3 text
569 * can be either line ending, even a mixture of both.
570 *
571 * Operating systems usually have a line end convention. Windows uses
572 * CRLF. Linux and MacOS use LF. Some applications on a given OS may
573 * work with either and some may not.
574 *
575 * The majority of use cases and CBOR protocols using type 3 text will
576 * work with either line ending. However, some use cases or protocols
577 * may not work with either in which case translation to and/or from
578 * the local line end convention, typically that of the OS, is
579 * necessary.
580 *
581 * QCBOR does no line ending translation for type 3 text when encoding
582 * and decoding.
583 *
584 * Error handling is the same as QCBOREncode_AddInt64().
Michael Eckel5c531332020-03-02 01:35:30 +0100585 */
Laurence Lundblade3eead482023-12-16 20:53:22 -0700586static void
587QCBOREncode_AddText(QCBOREncodeContext *pCtx, UsefulBufC Text);
Michael Eckel5c531332020-03-02 01:35:30 +0100588
Laurence Lundblade3eead482023-12-16 20:53:22 -0700589static void
590QCBOREncode_AddTextToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Text);
Michael Eckel5c531332020-03-02 01:35:30 +0100591
Laurence Lundblade3eead482023-12-16 20:53:22 -0700592static void
593QCBOREncode_AddTextToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Text);
Michael Eckel5c531332020-03-02 01:35:30 +0100594
595
596/**
Laurence Lundblade3eead482023-12-16 20:53:22 -0700597 * @brief Add a UTF-8 text string to the encoded output.
598 *
599 * @param[in] pCtx The encoding context to add the text to.
600 * @param[in] szString Null-terminated text to add.
601 *
602 * This works the same as QCBOREncode_AddText().
Michael Eckel5c531332020-03-02 01:35:30 +0100603 */
Laurence Lundblade3eead482023-12-16 20:53:22 -0700604static void
605QCBOREncode_AddSZString(QCBOREncodeContext *pCtx, const char *szString);
Michael Eckel5c531332020-03-02 01:35:30 +0100606
Laurence Lundblade3eead482023-12-16 20:53:22 -0700607static void
608QCBOREncode_AddSZStringToMap(QCBOREncodeContext *pCtx, const char *szLabel, const char *szString);
Michael Eckel5c531332020-03-02 01:35:30 +0100609
Laurence Lundblade3eead482023-12-16 20:53:22 -0700610static void
611QCBOREncode_AddSZStringToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, const char *szString);
Michael Eckel5c531332020-03-02 01:35:30 +0100612
613
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200614#ifndef USEFULBUF_DISABLE_ALL_FLOAT
Michael Eckel5c531332020-03-02 01:35:30 +0100615/**
Laurence Lundblade3eead482023-12-16 20:53:22 -0700616 * @brief Add a double-precision floating-point number to the encoded output.
617 *
618 * @param[in] pCtx The encoding context to add the double to.
619 * @param[in] dNum The double-precision number to add.
620 *
621 * This encodes and outputs a floating-point number. CBOR major type 7
622 * is used.
623 *
624 * This implements preferred serialization, selectively encoding the
625 * double-precision floating-point number as either double-precision,
626 * single-precision or half-precision. Infinity, NaN and 0 are always
627 * encoded as half-precision. If no precision will be lost in the
628 * conversion to half-precision, then it will be converted and
629 * encoded. If not and no precision will be lost in conversion to
630 * single-precision, then it will be converted and encoded. If not,
631 * then no conversion is performed, and it encoded as a
632 * double-precision.
633 *
634 * Half-precision floating-point numbers take up 2 bytes, half that of
635 * single-precision, one quarter of double-precision
636 *
637 * This automatically reduces the size of encoded CBOR, maybe even by
638 * four if most of values are 0, infinity or NaN.
639 *
640 * When decoded, QCBOR will usually return these values as
641 * double-precision.
642 *
643 * It is possible to disable this preferred serialization when compiling
644 * QCBOR. In that case, this functions the same as
645 * QCBOREncode_AddDoubleNoPreferred().
646 *
647 * Error handling is the same as QCBOREncode_AddInt64().
648 *
649 * See also QCBOREncode_AddDoubleNoPreferred(), QCBOREncode_AddFloat()
650 * and QCBOREncode_AddFloatNoPreferred() and @ref Floating-Point.
Michael Eckel5c531332020-03-02 01:35:30 +0100651 */
Laurence Lundblade8d9e0cd2024-05-25 18:12:19 -0700652static void
Laurence Lundblade3eead482023-12-16 20:53:22 -0700653QCBOREncode_AddDouble(QCBOREncodeContext *pCtx, double dNum);
Michael Eckel5c531332020-03-02 01:35:30 +0100654
Laurence Lundblade3eead482023-12-16 20:53:22 -0700655static void
656QCBOREncode_AddDoubleToMap(QCBOREncodeContext *pCtx, const char *szLabel, double dNum);
Michael Eckel5c531332020-03-02 01:35:30 +0100657
Laurence Lundblade3eead482023-12-16 20:53:22 -0700658static void
659QCBOREncode_AddDoubleToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, double dNum);
Michael Eckel5c531332020-03-02 01:35:30 +0100660
661
662/**
Laurence Lundblade3eead482023-12-16 20:53:22 -0700663 * @brief Add a single-precision floating-point number to the encoded output.
664 *
665 * @param[in] pCtx The encoding context to add the double to.
666 * @param[in] fNum The single-precision number to add.
667 *
668 * This is identical to QCBOREncode_AddDouble() except the input is
669 * single-precision.
670 *
671 * See also QCBOREncode_AddDouble(), QCBOREncode_AddDoubleNoPreferred(),
672 * and QCBOREncode_AddFloatNoPreferred() and @ref Floating-Point.
673 */
Laurence Lundblade8d9e0cd2024-05-25 18:12:19 -0700674static void
Laurence Lundblade3eead482023-12-16 20:53:22 -0700675QCBOREncode_AddFloat(QCBOREncodeContext *pCtx, float fNum);
Laurence Lundblade32f3e622020-07-13 20:35:11 -0700676
Laurence Lundblade3eead482023-12-16 20:53:22 -0700677static void
678QCBOREncode_AddFloatToMap(QCBOREncodeContext *pCtx, const char *szLabel, float fNum);
Laurence Lundblade32f3e622020-07-13 20:35:11 -0700679
Laurence Lundblade3eead482023-12-16 20:53:22 -0700680static void
681QCBOREncode_AddFloatToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, float dNum);
Laurence Lundbladeb275cdc2020-07-12 12:34:38 -0700682
683
Laurence Lundblade32f3e622020-07-13 20:35:11 -0700684/**
Laurence Lundblade3eead482023-12-16 20:53:22 -0700685 * @brief Add a double-precision floating-point number without preferred encoding.
686 *
687 * @param[in] pCtx The encoding context to add the double to.
688 * @param[in] dNum The double-precision number to add.
689 *
690 * This always outputs the number as a 64-bit double-precision.
691 * Preferred serialization is not used.
692 *
693 * Error handling is the same as QCBOREncode_AddInt64().
694 *
695 * See also QCBOREncode_AddDouble(), QCBOREncode_AddFloat(), and
696 * QCBOREncode_AddFloatNoPreferred() and @ref Floating-Point.
697 */
Laurence Lundbladecbd7d132024-05-19 11:11:22 -0700698static void
Laurence Lundblade3eead482023-12-16 20:53:22 -0700699QCBOREncode_AddDoubleNoPreferred(QCBOREncodeContext *pCtx, double dNum);
Laurence Lundbladeb275cdc2020-07-12 12:34:38 -0700700
Laurence Lundblade3eead482023-12-16 20:53:22 -0700701static void
702QCBOREncode_AddDoubleNoPreferredToMap(QCBOREncodeContext *pCtx, const char *szLabel, double dNum);
Laurence Lundblade32f3e622020-07-13 20:35:11 -0700703
Laurence Lundblade3eead482023-12-16 20:53:22 -0700704static void
705QCBOREncode_AddDoubleNoPreferredToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, double dNum);
Laurence Lundblade32f3e622020-07-13 20:35:11 -0700706
707
708/**
Laurence Lundblade3eead482023-12-16 20:53:22 -0700709 * @brief Add a single-precision floating-point number without preferred encoding.
710 *
711 * @param[in] pCtx The encoding context to add the double to.
712 * @param[in] fNum The single-precision number to add.
713 *
714 * This always outputs the number as a 32-bit single-precision.
715 * Preferred serialization is not used.
716 *
717 * Error handling is the same as QCBOREncode_AddInt64().
718 *
719 * See also QCBOREncode_AddDouble(), QCBOREncode_AddFloat(), and
720 * QCBOREncode_AddDoubleNoPreferred() and @ref Floating-Point.
721 */
Laurence Lundbladecbd7d132024-05-19 11:11:22 -0700722static void
Laurence Lundblade3eead482023-12-16 20:53:22 -0700723QCBOREncode_AddFloatNoPreferred(QCBOREncodeContext *pCtx, float fNum);
Laurence Lundblade32f3e622020-07-13 20:35:11 -0700724
Laurence Lundblade3eead482023-12-16 20:53:22 -0700725static void
726QCBOREncode_AddFloatNoPreferredToMap(QCBOREncodeContext *pCtx, const char *szLabel, float fNum);
Laurence Lundblade32f3e622020-07-13 20:35:11 -0700727
Laurence Lundblade3eead482023-12-16 20:53:22 -0700728static void
729QCBOREncode_AddFloatNoPreferredToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, float fNum);
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +0200730#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
Laurence Lundbladeb275cdc2020-07-12 12:34:38 -0700731
732
Michael Eckel5c531332020-03-02 01:35:30 +0100733/**
Laurence Lundblade3eead482023-12-16 20:53:22 -0700734 * @brief Add an optional tag.
735 *
736 * @param[in] pCtx The encoding context to add the tag to.
737 * @param[in] uTag The tag to add
738 *
739 * This outputs a CBOR major type 6 item that tags the next data item
740 * that is output usually to indicate it is some new data type.
741 *
742 * For many of the common standard tags, a function to encode data
743 * using it is provided and this is not needed. For example,
744 * QCBOREncode_AddDateEpoch() already exists to output integers
745 * representing dates with the right tag.
746 *
747 * The tag is applied to the next data item added to the encoded
748 * output. That data item that is to be tagged can be of any major
749 * CBOR type. Any number of tags can be added to a data item by
750 * calling this multiple times before the data item is added.
751 *
752 * See @ref Tags-Overview for discussion of creating new non-standard
753 * tags. See QCBORDecode_GetNext() for discussion of decoding custom
754 * tags.
Michael Eckel5c531332020-03-02 01:35:30 +0100755 */
Laurence Lundbladecbd7d132024-05-19 11:11:22 -0700756static void
Laurence Lundblade3eead482023-12-16 20:53:22 -0700757QCBOREncode_AddTag(QCBOREncodeContext *pCtx, uint64_t uTag);
Laurence Lundblade46d63e92021-05-13 11:37:10 -0700758
759
Michael Eckel5c531332020-03-02 01:35:30 +0100760/**
Laurence Lundblade3eead482023-12-16 20:53:22 -0700761 * @brief Add an epoch-based date.
762 *
763 * @param[in] pCtx The encoding context to add the date to.
764 * @param[in] uTagRequirement Either @ref QCBOR_ENCODE_AS_TAG or
765 * @ref QCBOR_ENCODE_AS_BORROWED.
766 * @param[in] nDate Number of seconds since 1970-01-01T00:00Z
767 * in UTC time.
768 *
769 * As per RFC 8949 this is similar to UNIX/Linux/POSIX dates. This is
770 * the most compact way to specify a date and time in CBOR. Note that
771 * this is always UTC and does not include the time zone. Use
772 * QCBOREncode_AddDateString() if you want to include the time zone.
773 *
774 * The preferred integer serialization rules apply here so the date will be
775 * encoded in a minimal number of bytes. Until about the year 2106
776 * these dates will encode in 6 bytes -- one byte for the tag, one
777 * byte for the type and 4 bytes for the integer. After that it will
778 * encode to 10 bytes.
779 *
780 * Negative values are supported for dates before 1970.
781 *
782 * If you care about leap-seconds and that level of accuracy, make sure
783 * the system you are running this code on does it correctly. This code
784 * just takes the value passed in.
785 *
786 * This implementation cannot encode fractional seconds using float or
787 * double even though that is allowed by CBOR, but you can encode them
788 * if you want to by calling QCBOREncode_AddTag() and QCBOREncode_AddDouble().
789 *
790 * Error handling is the same as QCBOREncode_AddInt64().
791 *
792 * See also QCBOREncode_AddTDaysEpoch().
Michael Eckel5c531332020-03-02 01:35:30 +0100793 */
Laurence Lundblade3eead482023-12-16 20:53:22 -0700794static void
795QCBOREncode_AddTDateEpoch(QCBOREncodeContext *pCtx,
796 uint8_t uTagRequirement,
797 int64_t nDate);
Michael Eckel5c531332020-03-02 01:35:30 +0100798
Laurence Lundblade3eead482023-12-16 20:53:22 -0700799static void
800QCBOREncode_AddTDateEpochToMapSZ(QCBOREncodeContext *pCtx,
801 const char *szLabel,
802 uint8_t uTagRequirement,
803 int64_t nDate);
Michael Eckel5c531332020-03-02 01:35:30 +0100804
Laurence Lundblade3eead482023-12-16 20:53:22 -0700805static void
806QCBOREncode_AddTDateEpochToMapN(QCBOREncodeContext *pCtx,
807 int64_t nLabel,
808 uint8_t uTagRequirement,
809 int64_t nDate);
810
811
812static void
813QCBOREncode_AddDateEpoch(QCBOREncodeContext *pCtx,
814 int64_t nDate);
815
816static void
817QCBOREncode_AddDateEpochToMap(QCBOREncodeContext *pCtx,
818 const char *szLabel,
819 int64_t nDate);
820
821static void
822QCBOREncode_AddDateEpochToMapN(QCBOREncodeContext *pCtx,
823 int64_t nLabel,
824 int64_t nDate);
825
Michael Eckel5c531332020-03-02 01:35:30 +0100826
827
Michael Eckel5c531332020-03-02 01:35:30 +0100828/**
Laurence Lundblade3eead482023-12-16 20:53:22 -0700829 * @brief Add an epoch-based day-count date.
830 *
831 * @param[in] pCtx The encoding context to add the date to.
832 * @param[in] uTagRequirement Either @ref QCBOR_ENCODE_AS_TAG or
833 * @ref QCBOR_ENCODE_AS_BORROWED.
834 * @param[in] nDays Number of days before or after 1970-01-0.
835 *
836 * This date format is described in
837 * [RFC 8943] (https://tools.ietf.org/html/rfc8943).
838 *
839 * The preferred integer serialization rules apply here so the date
840 * will be encoded in a minimal number of bytes. Until about the year
841 * 2149 these dates will encode in 4 bytes -- one byte for the tag,
842 * one byte for the type and 2 bytes for the integer.
843 *
844 * See also QCBOREncode_AddTDateEpoch().
845 */
846static void
847QCBOREncode_AddTDaysEpoch(QCBOREncodeContext *pCtx,
848 uint8_t uTagRequirement,
849 int64_t nDays);
Laurence Lundbladeb24faef2022-04-26 11:03:08 -0600850
Laurence Lundblade3eead482023-12-16 20:53:22 -0700851static void
852QCBOREncode_AddTDaysEpochToMapSZ(QCBOREncodeContext *pCtx,
853 const char *szLabel,
854 uint8_t uTagRequirement,
855 int64_t nDays);
Laurence Lundbladeb24faef2022-04-26 11:03:08 -0600856
Laurence Lundblade3eead482023-12-16 20:53:22 -0700857static void
858QCBOREncode_AddTDaysEpochToMapN(QCBOREncodeContext *pCtx,
859 int64_t nLabel,
860 uint8_t uTagRequirement,
861 int64_t nDays);
Laurence Lundbladeb24faef2022-04-26 11:03:08 -0600862
Laurence Lundbladeb24faef2022-04-26 11:03:08 -0600863
Laurence Lundbladeb24faef2022-04-26 11:03:08 -0600864
Laurence Lundbladeb24faef2022-04-26 11:03:08 -0600865
Laurence Lundblade3eead482023-12-16 20:53:22 -0700866/**
867 * @brief Add a byte string to the encoded output.
868 *
869 * @param[in] pCtx The encoding context to add the bytes to.
870 * @param[in] Bytes Pointer and length of the input data.
871 *
872 * Simply adds the bytes to the encoded output as CBOR major type 2.
873 *
874 * If called with @c Bytes.len equal to 0, an empty string will be
875 * added. When @c Bytes.len is 0, @c Bytes.ptr may be @c NULL.
876 *
877 * Error handling is the same as QCBOREncode_AddInt64().
878 */
879static void
880QCBOREncode_AddBytes(QCBOREncodeContext *pCtx, UsefulBufC Bytes);
Laurence Lundbladeb24faef2022-04-26 11:03:08 -0600881
Laurence Lundblade3eead482023-12-16 20:53:22 -0700882static void
883QCBOREncode_AddBytesToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Bytes);
884
885static void
886QCBOREncode_AddBytesToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Bytes);
887
888
889/**
890 * @brief Set up to write a byte string value directly to encoded output.
891 *
892 * @param[in] pCtx The encoding context to add the bytes to.
893 * @param[out] pPlace Pointer and length of place to write byte string value.
894 *
895 * QCBOREncode_AddBytes() is the normal way to encode a byte string.
896 * This is for special cases and by passes some of the pointer safety.
897 *
898 * The purpose of this is to output the bytes that make up a byte
899 * string value directly to the QCBOR output buffer so you don't need
900 * to have a copy of it in memory. This is particularly useful if the
901 * byte string is large, for example, the encrypted payload of a
902 * COSE_Encrypt message. The payload encryption algorithm can output
903 * directly to the encoded CBOR buffer, perhaps by making it the
904 * output buffer for some function (e.g. symmetric encryption) or by
905 * multiple writes.
906 *
907 * The pointer in @c pPlace is where to start writing. Writing is just
908 * copying bytes to the location by the pointer in \c pPlace. Writing
909 * past the length in @c pPlace will be writing off the end of the
910 * output buffer.
911 *
912 * If there is no room in the output buffer @ref NULLUsefulBuf will be
913 * returned and there is no need to call QCBOREncode_CloseBytes().
914 *
915 * The byte string must be closed by calling QCBOREncode_CloseBytes().
916 *
917 * Warning: this bypasses some of the usual checks provided by QCBOR
918 * against writing off the end of the encoded output buffer.
Laurence Lundbladeb24faef2022-04-26 11:03:08 -0600919 */
920void
921QCBOREncode_OpenBytes(QCBOREncodeContext *pCtx, UsefulBuf *pPlace);
922
923static void
Laurence Lundblade3eead482023-12-16 20:53:22 -0700924QCBOREncode_OpenBytesInMapSZ(QCBOREncodeContext *pCtx,
925 const char *szLabel,
926 UsefulBuf *pPlace);
Laurence Lundbladeb24faef2022-04-26 11:03:08 -0600927
928static void
Laurence Lundblade3eead482023-12-16 20:53:22 -0700929QCBOREncode_OpenBytesInMapN(QCBOREncodeContext *pCtx,
930 int64_t nLabel,
931 UsefulBuf *pPlace);
Laurence Lundbladeb24faef2022-04-26 11:03:08 -0600932
933
934/**
Laurence Lundblade3eead482023-12-16 20:53:22 -0700935 * @brief Close out a byte string written directly to encoded output.
936 *
937 * @param[in] pCtx The encoding context to add the bytes to.
938 * @param[out] uAmount The number of bytes written, the length of the
939 * byte string.
940 *
941 * This closes out a call to QCBOREncode_OpenBytes(). This inserts a
942 * CBOR header at the front of the byte string value to make it a
943 * well-formed byte string.
944 *
945 * If there was no call to QCBOREncode_OpenBytes() then @ref
946 * QCBOR_ERR_TOO_MANY_CLOSES is set.
Laurence Lundbladeb24faef2022-04-26 11:03:08 -0600947 */
Laurence Lundblade3eead482023-12-16 20:53:22 -0700948void
949QCBOREncode_CloseBytes(QCBOREncodeContext *pCtx, size_t uAmount);
Laurence Lundbladeb24faef2022-04-26 11:03:08 -0600950
951
952/**
Laurence Lundblade3eead482023-12-16 20:53:22 -0700953 * @brief Add a binary UUID to the encoded output.
954 *
955 * @param[in] pCtx The encoding context to add the UUID to.
956 * @param[in] uTagRequirement Either @ref QCBOR_ENCODE_AS_TAG or
957 * @ref QCBOR_ENCODE_AS_BORROWED.
958 * @param[in] Bytes Pointer and length of the binary UUID.
959 *
960 * A binary UUID as defined in [RFC 4122]
961 * (https://tools.ietf.org/html/rfc4122) is added to the output.
962 *
963 * It is output as CBOR major type 2, a binary string, with tag @ref
964 * CBOR_TAG_BIN_UUID indicating the binary string is a UUID.
Michael Eckel5c531332020-03-02 01:35:30 +0100965 */
Laurence Lundblade3eead482023-12-16 20:53:22 -0700966static void
967QCBOREncode_AddTBinaryUUID(QCBOREncodeContext *pCtx,
968 uint8_t uTagRequirement,
969 UsefulBufC Bytes);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -0700970
Laurence Lundblade3eead482023-12-16 20:53:22 -0700971static void
972QCBOREncode_AddTBinaryUUIDToMapSZ(QCBOREncodeContext *pCtx,
973 const char *szLabel,
974 uint8_t uTagRequirement,
975 UsefulBufC Bytes);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -0700976
Laurence Lundblade3eead482023-12-16 20:53:22 -0700977static void
978QCBOREncode_AddTBinaryUUIDToMapN(QCBOREncodeContext *pCtx,
979 int64_t nLabel,
980 uint8_t uTagRequirement,
981 UsefulBufC Bytes);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -0700982
983
Laurence Lundblade3eead482023-12-16 20:53:22 -0700984static void
985QCBOREncode_AddBinaryUUID(QCBOREncodeContext *pCtx, UsefulBufC Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +0100986
Laurence Lundblade3eead482023-12-16 20:53:22 -0700987static void
988QCBOREncode_AddBinaryUUIDToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +0100989
Laurence Lundblade3eead482023-12-16 20:53:22 -0700990static void
991QCBOREncode_AddBinaryUUIDToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +0100992
993
994/**
Laurence Lundblade3eead482023-12-16 20:53:22 -0700995 * @brief Add a positive big number to the encoded output.
996 *
997 * @param[in] pCtx The encoding context to add the big number to.
998 * @param[in] uTagRequirement Either @ref QCBOR_ENCODE_AS_TAG or
999 * @ref QCBOR_ENCODE_AS_BORROWED.
1000 * @param[in] Bytes Pointer and length of the big number.
1001 *
1002 * Big numbers are integers larger than 64-bits. Their format is
1003 * described in [RFC 8949] (https://tools.ietf.org/html/rfc8949).
1004 *
1005 * It is output as CBOR major type 2, a binary string, with tag
1006 * @ref CBOR_TAG_POS_BIGNUM indicating the binary string is a positive
1007 * big number.
1008 *
1009 * Often big numbers are used to represent cryptographic keys,
1010 * however, COSE which defines representations for keys chose not to
1011 * use this particular type.
Michael Eckel5c531332020-03-02 01:35:30 +01001012 */
Laurence Lundblade3eead482023-12-16 20:53:22 -07001013static void
1014QCBOREncode_AddTPositiveBignum(QCBOREncodeContext *pCtx,
1015 uint8_t uTagRequirement,
1016 UsefulBufC Bytes);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001017
Laurence Lundblade3eead482023-12-16 20:53:22 -07001018static void
1019QCBOREncode_AddTPositiveBignumToMapSZ(QCBOREncodeContext *pCtx,
1020 const char *szLabel,
1021 uint8_t uTagRequirement,
1022 UsefulBufC Bytes);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001023
Laurence Lundblade3eead482023-12-16 20:53:22 -07001024static void
1025QCBOREncode_AddTPositiveBignumToMapN(QCBOREncodeContext *pCtx,
1026 int64_t nLabel,
1027 uint8_t uTagRequirement,
1028 UsefulBufC Bytes);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001029
1030
Laurence Lundblade3eead482023-12-16 20:53:22 -07001031static void
1032QCBOREncode_AddPositiveBignum(QCBOREncodeContext *pCtx,
1033 UsefulBufC Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01001034
Laurence Lundblade3eead482023-12-16 20:53:22 -07001035static void
1036QCBOREncode_AddPositiveBignumToMap(QCBOREncodeContext *pCtx,
1037 const char *szLabel,
1038 UsefulBufC Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01001039
Laurence Lundblade3eead482023-12-16 20:53:22 -07001040static void
1041QCBOREncode_AddPositiveBignumToMapN(QCBOREncodeContext *pCtx,
1042 int64_t nLabel,
1043 UsefulBufC Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01001044
1045
1046/**
Laurence Lundblade3eead482023-12-16 20:53:22 -07001047 * @brief Add a negative big number to the encoded output.
1048 *
1049 * @param[in] pCtx The encoding context to add the big number to.
1050 * @param[in] uTagRequirement Either @ref QCBOR_ENCODE_AS_TAG or
1051 * @ref QCBOR_ENCODE_AS_BORROWED.
1052 * @param[in] Bytes Pointer and length of the big number.
1053 *
1054 * Big numbers are integers larger than 64-bits. Their format is
1055 * described in [RFC 8949] (https://tools.ietf.org/html/rfc8949).
1056 *
1057 * It is output as CBOR major type 2, a binary string, with tag
1058 * @ref CBOR_TAG_NEG_BIGNUM indicating the binary string is a negative
1059 * big number.
1060 *
1061 * Often big numbers are used to represent cryptographic keys,
1062 * however, COSE which defines representations for keys chose not to
1063 * use this particular type.
Michael Eckel5c531332020-03-02 01:35:30 +01001064 */
Laurence Lundblade3eead482023-12-16 20:53:22 -07001065static void
1066QCBOREncode_AddTNegativeBignum(QCBOREncodeContext *pCtx,
1067 uint8_t uTagRequirement,
1068 UsefulBufC Bytes);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001069
Laurence Lundblade3eead482023-12-16 20:53:22 -07001070static void
1071QCBOREncode_AddTNegativeBignumToMapSZ(QCBOREncodeContext *pCtx,
1072 const char *szLabel,
1073 uint8_t uTagRequirement,
1074 UsefulBufC Bytes);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001075
Laurence Lundblade3eead482023-12-16 20:53:22 -07001076static void
1077QCBOREncode_AddTNegativeBignumToMapN(QCBOREncodeContext *pCtx,
1078 int64_t nLabel,
1079 uint8_t uTagRequirement,
1080 UsefulBufC Bytes);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001081
1082
Laurence Lundblade3eead482023-12-16 20:53:22 -07001083static void
1084QCBOREncode_AddNegativeBignum(QCBOREncodeContext *pCtx,
1085 UsefulBufC Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01001086
Laurence Lundblade3eead482023-12-16 20:53:22 -07001087static void
1088QCBOREncode_AddNegativeBignumToMap(QCBOREncodeContext *pCtx,
1089 const char *szLabel,
1090 UsefulBufC Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01001091
Laurence Lundblade3eead482023-12-16 20:53:22 -07001092static void
1093QCBOREncode_AddNegativeBignumToMapN(QCBOREncodeContext *pCtx,
1094 int64_t nLabel,
1095 UsefulBufC Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01001096
1097
Laurence Lundbladedd6e76e2021-03-10 01:54:01 -07001098#ifndef QCBOR_DISABLE_EXP_AND_MANTISSA
Michael Eckel5c531332020-03-02 01:35:30 +01001099/**
Laurence Lundblade3eead482023-12-16 20:53:22 -07001100 * @brief Add a decimal fraction to the encoded output.
1101 *
1102 * @param[in] pCtx Encoding context to add the decimal fraction to.
1103 * @param[in] uTagRequirement Either @ref QCBOR_ENCODE_AS_TAG or
1104 * @ref QCBOR_ENCODE_AS_BORROWED.
1105 * @param[in] nMantissa The mantissa.
1106 * @param[in] nBase10Exponent The exponent.
1107 *
1108 * The value is nMantissa * 10 ^ nBase10Exponent.
1109 *
1110 * A decimal fraction is good for exact representation of some values
1111 * that can't be represented exactly with standard C (IEEE 754)
1112 * floating-point numbers. Much larger and much smaller numbers can
1113 * also be represented than floating-point because of the larger
1114 * number of bits in the exponent.
1115 *
1116 * The decimal fraction is conveyed as two integers, a mantissa and a
1117 * base-10 scaling factor.
1118 *
1119 * For example, 273.15 is represented by the two integers 27315 and -2.
1120 *
1121 * The exponent and mantissa have the range from @c INT64_MIN to
1122 * @c INT64_MAX for both encoding and decoding (CBOR allows
1123 * @c -UINT64_MAX to @c UINT64_MAX, but this implementation doesn't
1124 * support this range to reduce code size and interface complexity a
1125 * little).
1126 *
1127 * CBOR Preferred serialization of the integers is used, thus they
1128 * will be encoded in the smallest number of bytes possible.
1129 *
1130 * See also QCBOREncode_AddDecimalFractionBigNum() for a decimal
1131 * fraction with arbitrarily large precision and
1132 * QCBOREncode_AddBigFloat().
1133 *
1134 * There is no representation of positive or negative infinity or NaN
1135 * (Not a Number). Use QCBOREncode_AddDouble() to encode them.
1136 *
1137 * See @ref expAndMantissa for decoded representation.
Michael Eckel5c531332020-03-02 01:35:30 +01001138 */
Laurence Lundblade3eead482023-12-16 20:53:22 -07001139static void
1140QCBOREncode_AddTDecimalFraction(QCBOREncodeContext *pCtx,
1141 uint8_t uTagRequirement,
1142 int64_t nMantissa,
1143 int64_t nBase10Exponent);
1144
1145static void
1146QCBOREncode_AddTDecimalFractionToMapSZ(QCBOREncodeContext *pCtx,
1147 const char *szLabel,
1148 uint8_t uTagRequirement,
1149 int64_t nMantissa,
1150 int64_t nBase10Exponent);
1151
1152static void
1153QCBOREncode_AddTDecimalFractionToMapN(QCBOREncodeContext *pCtx,
1154 int64_t nLabel,
1155 uint8_t uTagRequirement,
1156 int64_t nMantissa,
1157 int64_t nBase10Exponent);
1158
1159
1160static void
1161QCBOREncode_AddDecimalFraction(QCBOREncodeContext *pCtx,
1162 int64_t nMantissa,
1163 int64_t nBase10Exponent);
1164
1165static void
1166QCBOREncode_AddDecimalFractionToMap(QCBOREncodeContext *pCtx,
1167 const char *szLabel,
1168 int64_t nMantissa,
1169 int64_t nBase10Exponent);
1170
1171static void
1172QCBOREncode_AddDecimalFractionToMapN(QCBOREncodeContext *pCtx,
1173 int64_t nLabel,
1174 int64_t nMantissa,
1175 int64_t nBase10Exponent);
1176
1177
1178/**
1179 * @brief Add a decimal fraction with a big number mantissa to the encoded output.
1180 *
1181 * @param[in] pCtx Encoding context to add the decimal fraction to.
1182 * @param[in] uTagRequirement Either @ref QCBOR_ENCODE_AS_TAG or
1183 * @ref QCBOR_ENCODE_AS_BORROWED.
1184 * @param[in] Mantissa The mantissa.
1185 * @param[in] bIsNegative false if mantissa is positive, true if negative.
1186 * @param[in] nBase10Exponent The exponent.
1187 *
1188 * This is the same as QCBOREncode_AddDecimalFraction() except the
1189 * mantissa is a big number (See QCBOREncode_AddPositiveBignum())
1190 * allowing for arbitrarily large precision.
1191 *
1192 * See @ref expAndMantissa for decoded representation.
1193 */
1194static void
1195QCBOREncode_AddTDecimalFractionBigNum(QCBOREncodeContext *pCtx,
1196 uint8_t uTagRequirement,
1197 UsefulBufC Mantissa,
1198 bool bIsNegative,
1199 int64_t nBase10Exponent);
1200
1201static void
1202QCBOREncode_AddTDecimalFractionBigNumToMapSZ(QCBOREncodeContext *pCtx,
1203 const char *szLabel,
1204 uint8_t uTagRequirement,
1205 UsefulBufC Mantissa,
1206 bool bIsNegative,
1207 int64_t nBase10Exponent);
1208
1209static void
1210QCBOREncode_AddTDecimalFractionBigNumToMapN(QCBOREncodeContext *pCtx,
1211 int64_t nLabel,
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001212 uint8_t uTagRequirement,
Laurence Lundblade3eead482023-12-16 20:53:22 -07001213 UsefulBufC Mantissa,
1214 bool bIsNegative,
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001215 int64_t nBase10Exponent);
1216
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001217
Laurence Lundblade3eead482023-12-16 20:53:22 -07001218static void
1219QCBOREncode_AddDecimalFractionBigNum(QCBOREncodeContext *pCtx,
1220 UsefulBufC Mantissa,
1221 bool bIsNegative,
1222 int64_t nBase10Exponent);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001223
Laurence Lundblade3eead482023-12-16 20:53:22 -07001224static void
1225QCBOREncode_AddDecimalFractionBigNumToMapSZ(QCBOREncodeContext *pCtx,
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07001226 const char *szLabel,
Laurence Lundblade3eead482023-12-16 20:53:22 -07001227 UsefulBufC Mantissa,
1228 bool bIsNegative,
1229 int64_t nBase10Exponent);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001230
Laurence Lundblade3eead482023-12-16 20:53:22 -07001231static void
1232QCBOREncode_AddDecimalFractionBigNumToMapN(QCBOREncodeContext *pCtx,
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001233 int64_t nLabel,
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001234 UsefulBufC Mantissa,
1235 bool bIsNegative,
Laurence Lundblade3eead482023-12-16 20:53:22 -07001236 int64_t nBase10Exponent);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001237
Laurence Lundblade3eead482023-12-16 20:53:22 -07001238/**
1239 * @brief Add a big floating-point number to the encoded output.
1240 *
1241 * @param[in] pCtx The encoding context to add the bigfloat to.
1242 * @param[in] uTagRequirement Either @ref QCBOR_ENCODE_AS_TAG or
1243 * @ref QCBOR_ENCODE_AS_BORROWED.
1244 * @param[in] nMantissa The mantissa.
1245 * @param[in] nBase2Exponent The exponent.
1246 *
1247 * The value is nMantissa * 2 ^ nBase2Exponent.
1248 *
1249 * "Bigfloats", as CBOR terms them, are similar to IEEE floating-point
1250 * numbers in having a mantissa and base-2 exponent, but they are not
1251 * supported by hardware or encoded the same. They explicitly use two
1252 * CBOR-encoded integers to convey the mantissa and exponent, each of
1253 * which can be 8, 16, 32 or 64 bits. With both the mantissa and
1254 * exponent 64 bits they can express more precision and a larger range
1255 * than an IEEE double floating-point number. See
1256 * QCBOREncode_AddBigFloatBigNum() for even more precision.
1257 *
1258 * For example, 1.5 would be represented by a mantissa of 3 and an
1259 * exponent of -1.
1260 *
1261 * The exponent and mantissa have the range from @c INT64_MIN to
1262 * @c INT64_MAX for both encoding and decoding (CBOR allows @c
1263 * -UINT64_MAX to @c UINT64_MAX, but this implementation doesn't
1264 * support this range to reduce code size and interface complexity a
1265 * little).
1266 *
1267 * CBOR preferred serialization of the integers is used, thus they will
1268 * be encoded in the smallest number of bytes possible.
1269 *
1270 * This can also be used to represent floating-point numbers in
1271 * environments that don't support IEEE 754.
1272 *
1273 * See @ref expAndMantissa for decoded representation.
1274 */
1275static void
1276QCBOREncode_AddTBigFloat(QCBOREncodeContext *pCtx,
1277 uint8_t uTagRequirement,
1278 int64_t nMantissa,
1279 int64_t nBase2Exponent);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001280
Laurence Lundblade3eead482023-12-16 20:53:22 -07001281static void
1282QCBOREncode_AddTBigFloatToMapSZ(QCBOREncodeContext *pCtx,
1283 const char *szLabel,
1284 uint8_t uTagRequirement,
1285 int64_t nMantissa,
1286 int64_t nBase2Exponent);
1287
1288static void
1289QCBOREncode_AddTBigFloatToMapN(QCBOREncodeContext *pCtx,
1290 int64_t nLabel,
1291 uint8_t uTagRequirement,
1292 int64_t nMantissa,
1293 int64_t nBase2Exponent);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001294
1295
Laurence Lundblade3eead482023-12-16 20:53:22 -07001296static void
1297QCBOREncode_AddBigFloat(QCBOREncodeContext *pCtx,
1298 int64_t nMantissa,
1299 int64_t nBase2Exponent);
Michael Eckel5c531332020-03-02 01:35:30 +01001300
Laurence Lundblade3eead482023-12-16 20:53:22 -07001301static void
1302QCBOREncode_AddBigFloatToMap(QCBOREncodeContext *pCtx,
1303 const char *szLabel,
1304 int64_t nMantissa,
1305 int64_t nBase2Exponent);
Michael Eckel5c531332020-03-02 01:35:30 +01001306
Laurence Lundblade3eead482023-12-16 20:53:22 -07001307static void
1308QCBOREncode_AddBigFloatToMapN(QCBOREncodeContext *pCtx,
1309 int64_t nLabel,
1310 int64_t nMantissa,
1311 int64_t nBase2Exponent);
1312
1313/**
1314 * @brief Add a big floating-point number with a big number mantissa to
1315 * the encoded output.
1316 *
1317 * @param[in] pCtx The encoding context to add the bigfloat to.
1318 * @param[in] uTagRequirement Either @ref QCBOR_ENCODE_AS_TAG or
1319 * @ref QCBOR_ENCODE_AS_BORROWED.
1320 * @param[in] Mantissa The mantissa.
1321 * @param[in] bIsNegative false if mantissa is positive, true if negative.
1322 * @param[in] nBase2Exponent The exponent.
1323 *
1324 * This is the same as QCBOREncode_AddBigFloat() except the mantissa
1325 * is a big number (See QCBOREncode_AddPositiveBignum()) allowing for
1326 * arbitrary precision.
1327 *
1328 * See @ref expAndMantissa for decoded representation.
1329 */
1330static void
1331QCBOREncode_AddTBigFloatBigNum(QCBOREncodeContext *pCtx,
1332 uint8_t uTagRequirement,
1333 UsefulBufC Mantissa,
1334 bool bIsNegative,
1335 int64_t nBase2Exponent);
1336
1337static void
1338QCBOREncode_AddTBigFloatBigNumToMapSZ(QCBOREncodeContext *pCtx,
1339 const char *szLabel,
1340 uint8_t uTagRequirement,
1341 UsefulBufC Mantissa,
1342 bool bIsNegative,
1343 int64_t nBase2Exponent);
1344
1345static void
1346QCBOREncode_AddTBigFloatBigNumToMapN(QCBOREncodeContext *pCtx,
1347 int64_t nLabel,
1348 uint8_t uTagRequirement,
1349 UsefulBufC Mantissa,
1350 bool bIsNegative,
1351 int64_t nBase2Exponent);
1352
1353
1354static void
1355QCBOREncode_AddBigFloatBigNum(QCBOREncodeContext *pCtx,
1356 UsefulBufC Mantissa,
1357 bool bIsNegative,
1358 int64_t nBase2Exponent);
1359
1360static void
1361QCBOREncode_AddBigFloatBigNumToMap(QCBOREncodeContext *pCtx,
1362 const char *szLabel,
1363 UsefulBufC Mantissa,
1364 bool bIsNegative,
1365 int64_t nBase2Exponent);
1366
1367static void
1368QCBOREncode_AddBigFloatBigNumToMapN(QCBOREncodeContext *pCtx,
1369 int64_t nLabel,
1370 UsefulBufC Mantissa,
1371 bool bIsNegative,
1372 int64_t nBase2Exponent);
Laurence Lundbladedd6e76e2021-03-10 01:54:01 -07001373#endif /* QCBOR_DISABLE_EXP_AND_MANTISSA */
Michael Eckel5c531332020-03-02 01:35:30 +01001374
1375
1376/**
Laurence Lundblade3eead482023-12-16 20:53:22 -07001377 * @brief Add a text URI to the encoded output.
1378 *
1379 * @param[in] pCtx The encoding context to add the URI to.
1380 * @param[in] uTagRequirement Either @ref QCBOR_ENCODE_AS_TAG or
1381 * @ref QCBOR_ENCODE_AS_BORROWED.
1382 * @param[in] URI Pointer and length of the URI.
1383 *
1384 * The format of URI must be per [RFC 3986]
1385 * (https://tools.ietf.org/html/rfc3986).
1386 *
1387 * It is output as CBOR major type 3, a text string, with tag @ref
1388 * CBOR_TAG_URI indicating the text string is a URI.
1389 *
1390 * A URI in a NULL-terminated string, @c szURI, can be easily added with
1391 * this code:
1392 *
1393 * QCBOREncode_AddURI(pCtx, UsefulBuf_FromSZ(szURI));
Michael Eckel5c531332020-03-02 01:35:30 +01001394 */
Laurence Lundblade3eead482023-12-16 20:53:22 -07001395static void
1396QCBOREncode_AddTURI(QCBOREncodeContext *pCtx,
1397 uint8_t uTagRequirement,
1398 UsefulBufC URI);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001399
Laurence Lundblade3eead482023-12-16 20:53:22 -07001400static void
1401QCBOREncode_AddTURIToMapSZ(QCBOREncodeContext *pCtx,
1402 const char *szLabel,
1403 uint8_t uTagRequirement,
1404 UsefulBufC URI);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001405
Laurence Lundblade3eead482023-12-16 20:53:22 -07001406static void
1407QCBOREncode_AddTURIToMapN(QCBOREncodeContext *pCtx,
1408 int64_t nLabel,
1409 uint8_t uTagRequirement,
1410 UsefulBufC URI);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001411
1412
Laurence Lundblade3eead482023-12-16 20:53:22 -07001413static void
1414QCBOREncode_AddURI(QCBOREncodeContext *pCtx,
1415 UsefulBufC URI);
Michael Eckel5c531332020-03-02 01:35:30 +01001416
Laurence Lundblade3eead482023-12-16 20:53:22 -07001417static void
1418QCBOREncode_AddURIToMap(QCBOREncodeContext *pCtx,
1419 const char *szLabel,
1420 UsefulBufC URI);
Michael Eckel5c531332020-03-02 01:35:30 +01001421
Laurence Lundblade3eead482023-12-16 20:53:22 -07001422static void
1423QCBOREncode_AddURIToMapN(QCBOREncodeContext *pCtx,
1424 int64_t nLabel,
1425 UsefulBufC URI);
Michael Eckel5c531332020-03-02 01:35:30 +01001426
1427
1428/**
Laurence Lundblade3eead482023-12-16 20:53:22 -07001429 * @brief Add Base64-encoded text to encoded output.
1430 *
1431 * @param[in] pCtx The encoding context to add the base-64 text to.
1432 * @param[in] uTagRequirement Either @ref QCBOR_ENCODE_AS_TAG or
1433 * @ref QCBOR_ENCODE_AS_BORROWED.
1434 * @param[in] B64Text Pointer and length of the base-64 encoded text.
1435 *
1436 * The text content is Base64 encoded data per [RFC 4648]
1437 * (https://tools.ietf.org/html/rfc4648).
1438 *
1439 * It is output as CBOR major type 3, a text string, with tag @ref
1440 * CBOR_TAG_B64 indicating the text string is Base64 encoded.
Michael Eckel5c531332020-03-02 01:35:30 +01001441 */
Laurence Lundblade3eead482023-12-16 20:53:22 -07001442static void
1443QCBOREncode_AddTB64Text(QCBOREncodeContext *pCtx,
1444 uint8_t uTagRequirement,
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001445 UsefulBufC B64Text);
1446
Laurence Lundblade3eead482023-12-16 20:53:22 -07001447static void
1448QCBOREncode_AddTB64TextToMapSZ(QCBOREncodeContext *pCtx,
1449 const char *szLabel,
1450 uint8_t uTagRequirement,
1451 UsefulBufC B64Text);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001452
Laurence Lundblade3eead482023-12-16 20:53:22 -07001453static void
1454QCBOREncode_AddTB64TextToMapN(QCBOREncodeContext *pCtx,
1455 int64_t nLabel,
1456 uint8_t uTagRequirement,
1457 UsefulBufC B64Text);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001458
1459
Laurence Lundblade3eead482023-12-16 20:53:22 -07001460static void
1461QCBOREncode_AddB64Text(QCBOREncodeContext *pCtx,
1462 UsefulBufC B64Text);
Michael Eckel5c531332020-03-02 01:35:30 +01001463
Laurence Lundblade3eead482023-12-16 20:53:22 -07001464static void
1465QCBOREncode_AddB64TextToMap(QCBOREncodeContext *pCtx,
1466 const char *szLabel,
1467 UsefulBufC B64Text);
Michael Eckel5c531332020-03-02 01:35:30 +01001468
Laurence Lundblade3eead482023-12-16 20:53:22 -07001469static void
1470QCBOREncode_AddB64TextToMapN(QCBOREncodeContext *pCtx,
1471 int64_t nLabel,
1472 UsefulBufC B64Text);
Michael Eckel5c531332020-03-02 01:35:30 +01001473
1474
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001475
Michael Eckel5c531332020-03-02 01:35:30 +01001476/**
Laurence Lundblade3eead482023-12-16 20:53:22 -07001477 * @brief Add base64url encoded data to encoded output.
1478 *
1479 * @param[in] pCtx The encoding context to add the base64url to.
1480 * @param[in] uTagRequirement Either @ref QCBOR_ENCODE_AS_TAG or
1481 * @ref QCBOR_ENCODE_AS_BORROWED.
1482 * @param[in] B64Text Pointer and length of the base64url encoded text.
1483 *
1484 * The text content is base64URL encoded text as per [RFC 4648]
1485 * (https://tools.ietf.org/html/rfc4648).
1486 *
1487 * It is output as CBOR major type 3, a text string, with tag
1488 * @ref CBOR_TAG_B64URL indicating the text string is a Base64url
1489 * encoded.
Michael Eckel5c531332020-03-02 01:35:30 +01001490 */
Laurence Lundblade3eead482023-12-16 20:53:22 -07001491static void
1492QCBOREncode_AddTB64URLText(QCBOREncodeContext *pCtx,
1493 uint8_t uTagRequirement,
1494 UsefulBufC B64Text);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001495
Laurence Lundblade3eead482023-12-16 20:53:22 -07001496static void
1497QCBOREncode_AddTB64URLTextToMapSZ(QCBOREncodeContext *pCtx,
1498 const char *szLabel,
1499 uint8_t uTagRequirement,
1500 UsefulBufC B64Text);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001501
Laurence Lundblade3eead482023-12-16 20:53:22 -07001502static void
1503QCBOREncode_AddTB64URLTextToMapN(QCBOREncodeContext *pCtx,
1504 int64_t nLabel,
1505 uint8_t uTagRequirement,
1506 UsefulBufC B64Text);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001507
1508
Laurence Lundblade3eead482023-12-16 20:53:22 -07001509static void
1510QCBOREncode_AddB64URLText(QCBOREncodeContext *pCtx,
1511 UsefulBufC B64Text);
Michael Eckel5c531332020-03-02 01:35:30 +01001512
Laurence Lundblade3eead482023-12-16 20:53:22 -07001513static void
1514QCBOREncode_AddB64URLTextToMap(QCBOREncodeContext *pCtx,
1515 const char *szLabel,
1516 UsefulBufC B64Text);
Michael Eckel5c531332020-03-02 01:35:30 +01001517
Laurence Lundblade3eead482023-12-16 20:53:22 -07001518static void
1519QCBOREncode_AddB64URLTextToMapN(QCBOREncodeContext *pCtx,
1520 int64_t nLabel,
1521 UsefulBufC B64Text);
Michael Eckel5c531332020-03-02 01:35:30 +01001522
1523
1524/**
Laurence Lundblade3eead482023-12-16 20:53:22 -07001525 * @brief Add Perl Compatible Regular Expression.
1526 *
1527 * @param[in] pCtx Encoding context to add the regular expression to.
1528 * @param[in] uTagRequirement Either @ref QCBOR_ENCODE_AS_TAG or
1529 * @ref QCBOR_ENCODE_AS_BORROWED.
1530 * @param[in] Regex Pointer and length of the regular expression.
1531 *
1532 * The text content is Perl Compatible Regular
1533 * Expressions (PCRE) / JavaScript syntax [ECMA262].
1534 *
1535 * It is output as CBOR major type 3, a text string, with tag @ref
1536 * CBOR_TAG_REGEX indicating the text string is a regular expression.
Michael Eckel5c531332020-03-02 01:35:30 +01001537 */
Laurence Lundblade3eead482023-12-16 20:53:22 -07001538static void
1539QCBOREncode_AddTRegex(QCBOREncodeContext *pCtx,
1540 uint8_t uTagRequirement,
1541 UsefulBufC Regex);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001542
Laurence Lundblade3eead482023-12-16 20:53:22 -07001543static void
1544QCBOREncode_AddTRegexToMapSZ(QCBOREncodeContext *pCtx,
1545 const char *szLabel,
1546 uint8_t uTagRequirement,
1547 UsefulBufC Regex);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001548
Laurence Lundblade3eead482023-12-16 20:53:22 -07001549static void
1550QCBOREncode_AddTRegexToMapN(QCBOREncodeContext *pCtx,
1551 int64_t nLabel,
1552 uint8_t uTagRequirement,
1553 UsefulBufC Regex);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001554
1555
Laurence Lundblade3eead482023-12-16 20:53:22 -07001556static void
1557QCBOREncode_AddRegex(QCBOREncodeContext *pCtx,
1558 UsefulBufC Regex);
Michael Eckel5c531332020-03-02 01:35:30 +01001559
Laurence Lundblade3eead482023-12-16 20:53:22 -07001560static void
1561QCBOREncode_AddRegexToMap(QCBOREncodeContext *pCtx,
1562 const char *szLabel,
1563 UsefulBufC Regex);
Michael Eckel5c531332020-03-02 01:35:30 +01001564
Laurence Lundblade3eead482023-12-16 20:53:22 -07001565static void
1566QCBOREncode_AddRegexToMapN(QCBOREncodeContext *pCtx,
1567 int64_t nLabel,
1568 UsefulBufC Regex);
Michael Eckel5c531332020-03-02 01:35:30 +01001569
1570
1571/**
Laurence Lundblade3eead482023-12-16 20:53:22 -07001572 * @brief MIME encoded data to the encoded output.
1573 *
1574 * @param[in] pCtx The encoding context to add the MIME data to.
1575 * @param[in] uTagRequirement Either @ref QCBOR_ENCODE_AS_TAG or
1576 * @ref QCBOR_ENCODE_AS_BORROWED.
1577 * @param[in] MIMEData Pointer and length of the MIME data.
1578 *
1579 * The text content is in MIME format per [RFC 2045]
1580 * (https://tools.ietf.org/html/rfc2045) including the headers.
1581 *
1582 * It is output as CBOR major type 2, a binary string, with tag
1583 * @ref CBOR_TAG_BINARY_MIME indicating the string is MIME data. This
1584 * outputs tag 257, not tag 36, as it can carry any type of MIME
1585 * binary, 7-bit, 8-bit, quoted-printable and base64 where tag 36
1586 * cannot.
1587 *
1588 * Previous versions of QCBOR, those before spiffy decode, output tag
1589 * 36. Decoding supports both tag 36 and 257. (if the old behavior
1590 * with tag 36 is needed, copy the inline functions below and change
1591 * the tag number).
1592 *
1593 * See also QCBORDecode_GetMIMEMessage() and
1594 * @ref QCBOR_TYPE_BINARY_MIME.
1595 *
1596 * This does no translation of line endings. See QCBOREncode_AddText()
1597 * for a discussion of line endings in CBOR.
Michael Eckel5c531332020-03-02 01:35:30 +01001598 */
Laurence Lundblade3eead482023-12-16 20:53:22 -07001599static void
1600QCBOREncode_AddTMIMEData(QCBOREncodeContext *pCtx,
1601 uint8_t uTagRequirement,
1602 UsefulBufC MIMEData);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001603
Laurence Lundblade3eead482023-12-16 20:53:22 -07001604static void
1605QCBOREncode_AddTMIMEDataToMapSZ(QCBOREncodeContext *pCtx,
1606 const char *szLabel,
1607 uint8_t uTagRequirement,
1608 UsefulBufC MIMEData);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001609
Laurence Lundblade3eead482023-12-16 20:53:22 -07001610static void
1611QCBOREncode_AddTMIMEDataToMapN(QCBOREncodeContext *pCtx,
1612 int64_t nLabel,
1613 uint8_t uTagRequirement,
1614 UsefulBufC MIMEData);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001615
1616
Laurence Lundblade3eead482023-12-16 20:53:22 -07001617static void
1618QCBOREncode_AddMIMEData(QCBOREncodeContext *pCtx,
1619 UsefulBufC MIMEData);
Michael Eckel5c531332020-03-02 01:35:30 +01001620
Laurence Lundblade3eead482023-12-16 20:53:22 -07001621static void
1622QCBOREncode_AddMIMEDataToMap(QCBOREncodeContext *pCtx,
1623 const char *szLabel,
1624 UsefulBufC MIMEData);
Michael Eckel5c531332020-03-02 01:35:30 +01001625
Laurence Lundblade3eead482023-12-16 20:53:22 -07001626static void
1627QCBOREncode_AddMIMEDataToMapN(QCBOREncodeContext *pCtx,
1628 int64_t nLabel,
1629 UsefulBufC MIMEData);
Michael Eckel5c531332020-03-02 01:35:30 +01001630
1631
1632/**
Laurence Lundblade3eead482023-12-16 20:53:22 -07001633 * @brief Add an RFC 3339 date string
1634 *
1635 * @param[in] pCtx The encoding context to add the date to.
1636 * @param[in] uTagRequirement Either @ref QCBOR_ENCODE_AS_TAG or
1637 * @ref QCBOR_ENCODE_AS_BORROWED.
1638 * @param[in] szDate Null-terminated string with date to add.
1639 *
1640 * The string szDate should be in the form of [RFC 3339]
1641 * (https://tools.ietf.org/html/rfc3339) as defined by section 3.3 in
1642 * [RFC 4287] (https://tools.ietf.org/html/rfc4287). This is as
1643 * described in section 3.4.1 in [RFC 8949]
1644 * (https://tools.ietf.org/html/rfc8949).
1645 *
1646 * Note that this function doesn't validate the format of the date
1647 * string at all. If you add an incorrect format date string, the
1648 * generated CBOR will be incorrect and the receiver may not be able
1649 * to handle it.
1650 *
1651 * Error handling is the same as QCBOREncode_AddInt64().
1652 *
1653 * See also QCBOREncode_AddTDayString().
Michael Eckel5c531332020-03-02 01:35:30 +01001654 */
Laurence Lundblade3eead482023-12-16 20:53:22 -07001655static void
1656QCBOREncode_AddTDateString(QCBOREncodeContext *pCtx,
1657 uint8_t uTagRequirement,
1658 const char *szDate);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001659
Laurence Lundblade3eead482023-12-16 20:53:22 -07001660static void
1661QCBOREncode_AddTDateStringToMapSZ(QCBOREncodeContext *pCtx,
1662 const char *szLabel,
1663 uint8_t uTagRequirement,
1664 const char *szDate);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001665
Laurence Lundblade3eead482023-12-16 20:53:22 -07001666static void
1667QCBOREncode_AddTDateStringToMapN(QCBOREncodeContext *pCtx,
1668 int64_t nLabel,
1669 uint8_t uTagRequirement,
1670 const char *szDate);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07001671
1672
Laurence Lundblade3eead482023-12-16 20:53:22 -07001673static void
1674QCBOREncode_AddDateString(QCBOREncodeContext *pCtx,
1675 const char *szDate);
Michael Eckel5c531332020-03-02 01:35:30 +01001676
Laurence Lundblade3eead482023-12-16 20:53:22 -07001677static void
1678QCBOREncode_AddDateStringToMap(QCBOREncodeContext *pCtx,
1679 const char *szLabel,
1680 const char *szDate);
Michael Eckel5c531332020-03-02 01:35:30 +01001681
Laurence Lundblade3eead482023-12-16 20:53:22 -07001682static void
1683QCBOREncode_AddDateStringToMapN(QCBOREncodeContext *pCtx,
1684 int64_t nLabel,
1685 const char *szDate);
Michael Eckel5c531332020-03-02 01:35:30 +01001686
Laurence Lundblade46d63e92021-05-13 11:37:10 -07001687
1688/**
Laurence Lundblade3eead482023-12-16 20:53:22 -07001689 * @brief Add a date-only string.
1690 *
1691 * @param[in] pCtx The encoding context to add the date to.
1692 * @param[in] uTagRequirement Either @ref QCBOR_ENCODE_AS_TAG or
1693 * @ref QCBOR_ENCODE_AS_BORROWED.
1694 * @param[in] szDate Null-terminated string with date to add.
1695 *
1696 * This date format is described in
1697 * [RFC 8943] (https://tools.ietf.org/html/rfc8943), but that mainly
1698 * references RFC 3339. The string szDate must be in the forrm
1699 * specified the ABNF for a full-date in
1700 * [RFC 3339] (https://tools.ietf.org/html/rfc3339). Examples of this
1701 * are "1985-04-12" and "1937-01-01". The time and the time zone are
1702 * never included.
1703 *
1704 * Note that this function doesn't validate the format of the date
1705 * string at all. If you add an incorrect format date string, the
1706 * generated CBOR will be incorrect and the receiver may not be able
1707 * to handle it.
1708 *
1709 * Error handling is the same as QCBOREncode_AddInt64().
1710 *
1711 * See also QCBOREncode_AddTDateString().
Laurence Lundblade46d63e92021-05-13 11:37:10 -07001712 */
1713static void
1714QCBOREncode_AddTDaysString(QCBOREncodeContext *pCtx,
1715 uint8_t uTagRequirement,
1716 const char *szDate);
1717
1718static void
1719QCBOREncode_AddTDaysStringToMapSZ(QCBOREncodeContext *pCtx,
1720 const char *szLabel,
1721 uint8_t uTagRequirement,
1722 const char *szDate);
1723
1724static void
1725QCBOREncode_AddTDaysStringToMapN(QCBOREncodeContext *pCtx,
1726 int64_t nLabel,
1727 uint8_t uTagRequirement,
1728 const char *szDate);
1729
1730
Michael Eckel5c531332020-03-02 01:35:30 +01001731/**
Laurence Lundblade3eead482023-12-16 20:53:22 -07001732 * @brief Add a standard Boolean.
1733 *
1734 * @param[in] pCtx The encoding context to add the Boolean to.
1735 * @param[in] b true or false from @c <stdbool.h>.
1736 *
1737 * Adds a Boolean value as CBOR major type 7.
1738 *
1739 * Error handling is the same as QCBOREncode_AddInt64().
Michael Eckel5c531332020-03-02 01:35:30 +01001740 */
Laurence Lundblade3eead482023-12-16 20:53:22 -07001741static void
1742QCBOREncode_AddBool(QCBOREncodeContext *pCtx, bool b);
Michael Eckel5c531332020-03-02 01:35:30 +01001743
Laurence Lundblade3eead482023-12-16 20:53:22 -07001744static void
1745QCBOREncode_AddBoolToMap(QCBOREncodeContext *pCtx, const char *szLabel, bool b);
Michael Eckel5c531332020-03-02 01:35:30 +01001746
Laurence Lundblade3eead482023-12-16 20:53:22 -07001747static void
1748QCBOREncode_AddBoolToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, bool b);
Michael Eckel5c531332020-03-02 01:35:30 +01001749
1750
Michael Eckel5c531332020-03-02 01:35:30 +01001751/**
Laurence Lundblade3eead482023-12-16 20:53:22 -07001752 * @brief Add a NULL to the encoded output.
1753 *
1754 * @param[in] pCtx The encoding context to add the NULL to.
1755 *
1756 * Adds the NULL value as CBOR major type 7.
1757 *
1758 * This NULL doesn't have any special meaning in CBOR such as a
1759 * terminating value for a string or an empty value.
1760 *
1761 * Error handling is the same as QCBOREncode_AddInt64().
Michael Eckel5c531332020-03-02 01:35:30 +01001762 */
Laurence Lundblade3eead482023-12-16 20:53:22 -07001763static void
1764QCBOREncode_AddNULL(QCBOREncodeContext *pCtx);
Michael Eckel5c531332020-03-02 01:35:30 +01001765
Laurence Lundblade3eead482023-12-16 20:53:22 -07001766static void
1767QCBOREncode_AddNULLToMap(QCBOREncodeContext *pCtx, const char *szLabel);
Michael Eckel5c531332020-03-02 01:35:30 +01001768
Laurence Lundblade3eead482023-12-16 20:53:22 -07001769static void
1770QCBOREncode_AddNULLToMapN(QCBOREncodeContext *pCtx, int64_t nLabel);
Michael Eckel5c531332020-03-02 01:35:30 +01001771
1772
1773/**
Laurence Lundblade3eead482023-12-16 20:53:22 -07001774 * @brief Add an "undef" to the encoded output.
1775 *
1776 * @param[in] pCtx The encoding context to add the "undef" to.
1777 *
1778 * Adds the undef value as CBOR major type 7.
1779 *
1780 * Note that this value will not translate to JSON.
1781 *
1782 * This Undef doesn't have any special meaning in CBOR such as a
1783 * terminating value for a string or an empty value.
1784 *
1785 * Error handling is the same as QCBOREncode_AddInt64().
Michael Eckel5c531332020-03-02 01:35:30 +01001786 */
Laurence Lundblade3eead482023-12-16 20:53:22 -07001787static void
1788QCBOREncode_AddUndef(QCBOREncodeContext *pCtx);
Michael Eckel5c531332020-03-02 01:35:30 +01001789
Laurence Lundblade3eead482023-12-16 20:53:22 -07001790static void
1791QCBOREncode_AddUndefToMap(QCBOREncodeContext *pCtx, const char *szLabel);
Michael Eckel5c531332020-03-02 01:35:30 +01001792
Laurence Lundblade3eead482023-12-16 20:53:22 -07001793static void
1794QCBOREncode_AddUndefToMapN(QCBOREncodeContext *pCtx, int64_t nLabel);
Michael Eckel5c531332020-03-02 01:35:30 +01001795
1796
1797/**
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07001798 * @brief Add a simple value.
1799 *
1800 * @param[in] pMe The encode context.
1801 * @param[in] uNum The simple value.
1802 *
Laurence Lundblade3888f002024-06-12 21:20:56 -07001803 * QCBOREncode_AddBool(), QCBOREncode_AddUndef() and
1804 * QCBOREncode_AddNull() are preferred to this for the simple values
1805 * defined in RFC 8949, but this can be used for them too.
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07001806 *
Laurence Lundblade3888f002024-06-12 21:20:56 -07001807 * The main purpose of this is to add simple values beyond those in
1808 * defined RFC 8949. Note that simple values must be registered with
1809 * IANA. Those in the range of 0 to 19 must be standardized. Those in
1810 * the range of 32 to 255 do not require a standard, but must be
1811 * publically specified. There is no range of values for proprietary
1812 * use. See
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07001813 * https://www.iana.org/assignments/cbor-simple-values/cbor-simple-values.xhtml
1814 */
1815static void
Laurence Lundblade3888f002024-06-12 21:20:56 -07001816QCBOREncode_AddSimple(QCBOREncodeContext *pMe, const uint8_t uNum);
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07001817
1818static void
1819QCBOREncode_AddSimpleToMap(QCBOREncodeContext *pMe,
1820 const char *szLabel,
1821 const uint8_t uSimple);
1822
1823static void
1824QCBOREncode_AddSimpleToMapN(QCBOREncodeContext *pMe,
1825 const int64_t nLabel,
1826 const uint8_t uSimple);
1827
1828
1829/**
Laurence Lundblade3eead482023-12-16 20:53:22 -07001830 * @brief Indicates that the next items added are in an array.
1831 *
1832 * @param[in] pCtx The encoding context to open the array in.
1833 *
1834 * Arrays are the basic CBOR aggregate or structure type. Call this
1835 * function to start or open an array. Then call the various
1836 * @c QCBOREncode_AddXxx() functions to add the items that go into the
1837 * array. Then call QCBOREncode_CloseArray() when all items have been
1838 * added. The data items in the array can be of any type and can be of
1839 * mixed types.
1840 *
1841 * Nesting of arrays and maps is allowed and supported just by calling
1842 * QCBOREncode_OpenArray() again before calling
1843 * QCBOREncode_CloseArray(). While CBOR has no limit on nesting, this
1844 * implementation does in order to keep it smaller and simpler. The
1845 * limit is @ref QCBOR_MAX_ARRAY_NESTING. This is the max number of
1846 * times this can be called without calling
1847 * QCBOREncode_CloseArray(). QCBOREncode_Finish() will return
1848 * @ref QCBOR_ERR_ARRAY_NESTING_TOO_DEEP when it is called as this
1849 * function just sets an error state and returns no value when this
1850 * occurs.
1851 *
1852 * If you try to add more than @ref QCBOR_MAX_ITEMS_IN_ARRAY items to
1853 * a single array or map, @ref QCBOR_ERR_ARRAY_TOO_LONG will be
1854 * returned when QCBOREncode_Finish() is called.
1855 *
1856 * An array itself must have a label if it is being added to a map.
1857 * Note that array elements do not have labels (but map elements do).
1858 *
1859 * An array itself may be tagged by calling QCBOREncode_AddTag()
1860 * before this call.
Michael Eckel5c531332020-03-02 01:35:30 +01001861 */
Laurence Lundblade3eead482023-12-16 20:53:22 -07001862static void
1863QCBOREncode_OpenArray(QCBOREncodeContext *pCtx);
Michael Eckel5c531332020-03-02 01:35:30 +01001864
Laurence Lundblade3eead482023-12-16 20:53:22 -07001865static void
1866QCBOREncode_OpenArrayInMap(QCBOREncodeContext *pCtx, const char *szLabel);
Michael Eckel5c531332020-03-02 01:35:30 +01001867
Laurence Lundblade3eead482023-12-16 20:53:22 -07001868static void
1869QCBOREncode_OpenArrayInMapN(QCBOREncodeContext *pCtx, int64_t nLabel);
Michael Eckel5c531332020-03-02 01:35:30 +01001870
1871
1872/**
Laurence Lundblade3eead482023-12-16 20:53:22 -07001873 * @brief Close an open array.
1874 *
1875 * @param[in] pCtx The encoding context to close the array in.
1876 *
1877 * The closes an array opened by QCBOREncode_OpenArray(). It reduces
1878 * nesting level by one. All arrays (and maps) must be closed before
1879 * calling QCBOREncode_Finish().
1880 *
1881 * When an error occurs as a result of this call, the encoder records
1882 * the error and enters the error state. The error will be returned
1883 * when QCBOREncode_Finish() is called.
1884 *
1885 * If this has been called more times than QCBOREncode_OpenArray(), then
1886 * @ref QCBOR_ERR_TOO_MANY_CLOSES will be returned when QCBOREncode_Finish()
1887 * is called.
1888 *
1889 * If this is called and it is not an array that is currently open,
1890 * @ref QCBOR_ERR_CLOSE_MISMATCH will be returned when
1891 * QCBOREncode_Finish() is called.
Michael Eckel5c531332020-03-02 01:35:30 +01001892 */
Laurence Lundblade3eead482023-12-16 20:53:22 -07001893static void
1894QCBOREncode_CloseArray(QCBOREncodeContext *pCtx);
Michael Eckel5c531332020-03-02 01:35:30 +01001895
1896
Laurence Lundblade85a18ca2023-11-27 21:25:10 -07001897
1898
Michael Eckel5c531332020-03-02 01:35:30 +01001899/**
Laurence Lundblade3eead482023-12-16 20:53:22 -07001900 * @brief Indicates that the next items added are in a map.
1901 *
1902 * @param[in] pCtx The encoding context to open the map in.
1903 *
1904 * See QCBOREncode_OpenArray() for more information, particularly
1905 * error handling.
1906 *
1907 * CBOR maps are an aggregate type where each item in the map consists
1908 * of a label and a value. They are similar to JSON objects.
1909 *
1910 * The value can be any CBOR type including another map.
1911 *
1912 * The label can also be any CBOR type, but in practice they are
1913 * typically, integers as this gives the most compact output. They
1914 * might also be text strings which gives readability and translation
1915 * to JSON.
1916 *
1917 * Every @c QCBOREncode_AddXxx() call has one version that ends with
1918 * @c InMap for adding items to maps with string labels and one that
1919 * ends with @c InMapN that is for adding with integer labels.
1920 *
1921 * RFC 8949 uses the term "key" instead of "label".
1922 *
1923 * If you wish to use map labels that are neither integer labels nor
1924 * text strings, then just call the QCBOREncode_AddXxx() function
1925 * explicitly to add the label. Then call it again to add the value.
1926 *
1927 * See the [RFC 8949] (https://tools.ietf.org/html/rfc8949) for a lot
1928 * more information on creating maps.
Michael Eckel5c531332020-03-02 01:35:30 +01001929 */
Laurence Lundblade3eead482023-12-16 20:53:22 -07001930static void
1931QCBOREncode_OpenMap(QCBOREncodeContext *pCtx);
Michael Eckel5c531332020-03-02 01:35:30 +01001932
Laurence Lundblade3eead482023-12-16 20:53:22 -07001933static void
1934QCBOREncode_OpenMapInMap(QCBOREncodeContext *pCtx, const char *szLabel);
Michael Eckel5c531332020-03-02 01:35:30 +01001935
Laurence Lundblade3eead482023-12-16 20:53:22 -07001936static void
1937QCBOREncode_OpenMapInMapN(QCBOREncodeContext *pCtx, int64_t nLabel);
Michael Eckel5c531332020-03-02 01:35:30 +01001938
1939
Michael Eckel5c531332020-03-02 01:35:30 +01001940/**
Laurence Lundblade3eead482023-12-16 20:53:22 -07001941 * @brief Close an open map.
1942 *
1943 * @param[in] pCtx The encoding context to close the map in.
1944 *
1945 * This closes a map opened by QCBOREncode_OpenMap(). It reduces
1946 * nesting level by one.
1947 *
1948 * When an error occurs as a result of this call, the encoder records
1949 * the error and enters the error state. The error will be returned
1950 * when QCBOREncode_Finish() is called.
1951 *
1952 * If this has been called more times than QCBOREncode_OpenMap(), then
1953 * @ref QCBOR_ERR_TOO_MANY_CLOSES will be returned when
1954 * QCBOREncode_Finish() is called.
1955 *
1956 * If this is called and it is not a map that is currently open,
1957 * @ref QCBOR_ERR_CLOSE_MISMATCH will be returned when
1958 * QCBOREncode_Finish() is called.
Michael Eckel5c531332020-03-02 01:35:30 +01001959 */
Laurence Lundblade3eead482023-12-16 20:53:22 -07001960static void
1961QCBOREncode_CloseMap(QCBOREncodeContext *pCtx);
Michael Eckel5c531332020-03-02 01:35:30 +01001962
1963
1964/**
Laurence Lundblade85a18ca2023-11-27 21:25:10 -07001965 * @brief Indicates that the next items added are in an indefinite length array.
1966 *
1967 * @param[in] pCtx The encoding context to open the array in.
1968 *
1969 * This is the same as QCBOREncode_OpenArray() except the array is
1970 * indefinite length.
1971 *
1972 * This must be closed with QCBOREncode_CloseArrayIndefiniteLength().
1973 */
Laurence Lundblade3eead482023-12-16 20:53:22 -07001974static void
1975QCBOREncode_OpenArrayIndefiniteLength(QCBOREncodeContext *pCtx);
Laurence Lundblade85a18ca2023-11-27 21:25:10 -07001976
Laurence Lundblade3eead482023-12-16 20:53:22 -07001977static void
1978QCBOREncode_OpenArrayIndefiniteLengthInMap(QCBOREncodeContext *pCtx,
1979 const char *szLabel);
Laurence Lundblade85a18ca2023-11-27 21:25:10 -07001980
1981static void
1982QCBOREncode_OpenArrayIndefiniteLengthInMapN(QCBOREncodeContext *pCtx,
1983 int64_t nLabel);
1984
1985
1986/**
1987 * @brief Close an open indefinite length array.
1988 *
1989 * @param[in] pCtx The encoding context to close the array in.
1990 *
1991 * This is the same as QCBOREncode_CloseArray(), but the open array
1992 * that is being close must be of indefinite length.
1993 */
1994static void
1995QCBOREncode_CloseArrayIndefiniteLength(QCBOREncodeContext *pCtx);
1996
1997
1998/**
1999 * @brief Indicates that the next items added are in an indefinite length map.
2000 *
2001 * @param[in] pCtx The encoding context to open the map in.
2002 *
2003 * This is the same as QCBOREncode_OpenMap() except the array is
2004 * indefinite length.
2005 *
2006 * This must be closed with QCBOREncode_CloseMapIndefiniteLength().
2007 */
Laurence Lundblade3eead482023-12-16 20:53:22 -07002008static void
2009QCBOREncode_OpenMapIndefiniteLength(QCBOREncodeContext *pCtx);
Laurence Lundblade85a18ca2023-11-27 21:25:10 -07002010
Laurence Lundblade3eead482023-12-16 20:53:22 -07002011static void
2012QCBOREncode_OpenMapIndefiniteLengthInMap(QCBOREncodeContext *pCtx,
2013 const char *szLabel);
Laurence Lundblade85a18ca2023-11-27 21:25:10 -07002014
2015static void
2016QCBOREncode_OpenMapIndefiniteLengthInMapN(QCBOREncodeContext *pCtx,
2017 int64_t nLabel);
2018
2019
2020/**
2021 * @brief Close an open indefinite length map.
2022 *
2023 * @param[in] pCtx The encoding context to close the map in.
2024 *
2025 * This is the same as QCBOREncode_CloseMap(), but the open map that
2026 * is being close must be of indefinite length.
2027 */
2028static void
2029QCBOREncode_CloseMapIndefiniteLength(QCBOREncodeContext *pCtx);
2030
2031
2032
2033
2034/**
Laurence Lundblade3eead482023-12-16 20:53:22 -07002035 * @brief Indicate start of encoded CBOR to be wrapped in a bstr.
2036 *
2037 * @param[in] pCtx The encoding context to open the bstr-wrapped CBOR in.
2038 *
2039 * All added encoded items between this call and a call to
2040 * QCBOREncode_CloseBstrWrap2() will be wrapped in a bstr. They will
2041 * appear in the final output as a byte string. That byte string will
2042 * contain encoded CBOR. This increases nesting level by one.
2043 *
2044 * The typical use case is for encoded CBOR that is to be
2045 * cryptographically hashed, as part of a [RFC 8152, COSE]
2046 * (https://tools.ietf.org/html/rfc8152) implementation. The wrapping
2047 * byte string is taken as input by the hash function (which is why it
2048 * is returned by QCBOREncode_CloseBstrWrap2()). It is also easy to
2049 * recover on decoding with standard CBOR decoders.
2050 *
2051 * Using QCBOREncode_BstrWrap() and QCBOREncode_CloseBstrWrap2()
2052 * avoids having to encode the items first in one buffer (e.g., the
2053 * COSE payload) and then add that buffer as a bstr to another
2054 * encoding (e.g. the COSE to-be-signed bytes, the @c Sig_structure)
2055 * potentially halving the memory needed.
2056 *
2057 * CBOR by nature must be decoded item by item in order from the
2058 * start. By wrapping some CBOR in a byte string, the decoding of
2059 * that wrapped CBOR can be skipped. This is another use of wrapping,
2060 * perhaps because the CBOR is large and deeply nested. Perhaps APIs
2061 * for handling one defined CBOR message that is being embedded in
2062 * another only take input as a byte string. Perhaps the desire is to
2063 * be able to decode the out layer even in the wrapped has errors.
Michael Eckel5c531332020-03-02 01:35:30 +01002064 */
Laurence Lundblade3eead482023-12-16 20:53:22 -07002065static void
2066QCBOREncode_BstrWrap(QCBOREncodeContext *pCtx);
Michael Eckel5c531332020-03-02 01:35:30 +01002067
Laurence Lundblade3eead482023-12-16 20:53:22 -07002068static void
2069QCBOREncode_BstrWrapInMap(QCBOREncodeContext *pCtx, const char *szLabel);
Michael Eckel5c531332020-03-02 01:35:30 +01002070
Laurence Lundblade3eead482023-12-16 20:53:22 -07002071static void
2072QCBOREncode_BstrWrapInMapN(QCBOREncodeContext *pCtx, int64_t nLabel);
Michael Eckel5c531332020-03-02 01:35:30 +01002073
2074
2075/**
Laurence Lundblade3eead482023-12-16 20:53:22 -07002076 * @brief Close a wrapping bstr.
2077 *
2078 * @param[in] pCtx The encoding context to close of bstr wrapping in.
2079 * @param[in] bIncludeCBORHead Include the encoded CBOR head of the bstr
2080 * as well as the bytes in @c pWrappedCBOR.
2081 * @param[out] pWrappedCBOR A @ref UsefulBufC containing wrapped bytes.
2082 *
2083 * The closes a wrapping bstr opened by QCBOREncode_BstrWrap(). It reduces
2084 * nesting level by one.
2085 *
2086 * A pointer and length of the enclosed encoded CBOR is returned in @c
2087 * *pWrappedCBOR if it is not @c NULL. The main purpose of this is so
2088 * this data can be hashed (e.g., with SHA-256) as part of a [RFC
2089 * 8152, COSE] (https://tools.ietf.org/html/rfc8152)
2090 * implementation. **WARNING**, this pointer and length should be used
2091 * right away before any other calls to @c QCBOREncode_CloseXxx() as
2092 * they will move data around and the pointer and length will no
2093 * longer be to the correct encoded CBOR.
2094 *
2095 * When an error occurs as a result of this call, the encoder records
2096 * the error and enters the error state. The error will be returned
2097 * when QCBOREncode_Finish() is called.
2098 *
2099 * If this has been called more times than QCBOREncode_BstrWrap(),
2100 * then @ref QCBOR_ERR_TOO_MANY_CLOSES will be returned when
2101 * QCBOREncode_Finish() is called.
2102 *
2103 * If this is called and it is not a wrapping bstr that is currently
2104 * open, @ref QCBOR_ERR_CLOSE_MISMATCH will be returned when
2105 * QCBOREncode_Finish() is called.
2106 *
2107 * QCBOREncode_CloseBstrWrap() is a deprecated version of this function
2108 * that is equivalent to the call with @c bIncludeCBORHead @c true.
Michael Eckel5c531332020-03-02 01:35:30 +01002109 */
Laurence Lundblade3eead482023-12-16 20:53:22 -07002110void
2111QCBOREncode_CloseBstrWrap2(QCBOREncodeContext *pCtx, bool bIncludeCBORHead, UsefulBufC *pWrappedCBOR);
Michael Eckel5c531332020-03-02 01:35:30 +01002112
Laurence Lundblade3eead482023-12-16 20:53:22 -07002113static void
2114QCBOREncode_CloseBstrWrap(QCBOREncodeContext *pCtx, UsefulBufC *pWrappedCBOR);
Michael Eckel5c531332020-03-02 01:35:30 +01002115
2116
2117/**
Laurence Lundblade8d3b8552021-06-10 11:11:54 -07002118 * @brief Cancel byte string wrapping.
2119 *
2120 * @param[in] pCtx The encoding context.
2121 *
2122 * This cancels QCBOREncode_BstrWrap() making tghe encoding as if it
2123 * were never called.
2124 *
2125 * WARNING: This does not work on QCBOREncode_BstrWrapInMap()
2126 * or QCBOREncode_BstrWrapInMapN() and there is no error detection
2127 * of an attempt at their use.
2128 *
2129 * This only works if nothing has been added into the wrapped byte
2130 * string. If something has been added, this sets the error
2131 * @ref QCBOR_ERR_CANNOT_CANCEL.
2132 */
Laurence Lundblade3eead482023-12-16 20:53:22 -07002133void
2134QCBOREncode_CancelBstrWrap(QCBOREncodeContext *pCtx);
Laurence Lundblade8d3b8552021-06-10 11:11:54 -07002135
2136
2137/**
Laurence Lundblade3eead482023-12-16 20:53:22 -07002138 * @brief Add some already-encoded CBOR bytes.
2139 *
2140 * @param[in] pCtx The encoding context to add the already-encode CBOR to.
2141 * @param[in] Encoded The already-encoded CBOR to add to the context.
2142 *
2143 * The encoded CBOR being added must be fully conforming CBOR. It must
2144 * be complete with no arrays or maps that are incomplete. While this
2145 * encoder doesn't ever produce indefinite lengths, it is OK for the
2146 * raw CBOR added here to have indefinite lengths.
2147 *
2148 * The raw CBOR added here is not checked in anyway. If it is not
2149 * conforming or has open arrays or such, the final encoded CBOR
2150 * will probably be wrong or not what was intended.
2151 *
2152 * If the encoded CBOR being added here contains multiple items, they
2153 * must be enclosed in a map or array. At the top level the raw
2154 * CBOR must be a single data item.
Michael Eckel5c531332020-03-02 01:35:30 +01002155 */
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07002156void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002157QCBOREncode_AddEncoded(QCBOREncodeContext *pCtx, UsefulBufC Encoded);
Michael Eckel5c531332020-03-02 01:35:30 +01002158
Laurence Lundblade3eead482023-12-16 20:53:22 -07002159static void
2160QCBOREncode_AddEncodedToMap(QCBOREncodeContext *pCtx, const char *szLabel, UsefulBufC Encoded);
Michael Eckel5c531332020-03-02 01:35:30 +01002161
Laurence Lundblade3eead482023-12-16 20:53:22 -07002162static void
2163QCBOREncode_AddEncodedToMapN(QCBOREncodeContext *pCtx, int64_t nLabel, UsefulBufC Encoded);
Michael Eckel5c531332020-03-02 01:35:30 +01002164
2165
2166/**
Laurence Lundblade3eead482023-12-16 20:53:22 -07002167 * @brief Get the encoded result.
2168 *
2169 * @param[in] pCtx The context to finish encoding with.
2170 * @param[out] pEncodedCBOR Structure in which the pointer and length of
2171 * the encoded CBOR is returned.
2172 *
2173 * @retval QCBOR_SUCCESS Encoded CBOR is returned.
2174 *
2175 * @retval QCBOR_ERR_TOO_MANY_CLOSES Nesting error
2176 *
2177 * @retval QCBOR_ERR_CLOSE_MISMATCH Nesting error
2178 *
2179 * @retval QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN Nesting error
2180 *
2181 * @retval QCBOR_ERR_BUFFER_TOO_LARGE Encoded output buffer size
2182 *
2183 * @retval QCBOR_ERR_BUFFER_TOO_SMALL Encoded output buffer size
2184 *
2185 * @retval QCBOR_ERR_ARRAY_NESTING_TOO_DEEP Implementation limit
2186 *
2187 * @retval QCBOR_ERR_ARRAY_TOO_LONG Implementation limit
2188 *
2189 * On success, the pointer and length of the encoded CBOR are returned
2190 * in @c *pEncodedCBOR. The pointer is the same pointer that was passed
2191 * in to QCBOREncode_Init(). Note that it is not const when passed to
2192 * QCBOREncode_Init(), but it is const when returned here. The length
2193 * will be smaller than or equal to the length passed in when
2194 * QCBOREncode_Init() as this is the length of the actual result, not
2195 * the size of the buffer it was written to.
2196 *
2197 * If a @c NULL was passed for @c Storage.ptr when QCBOREncode_Init()
2198 * was called, @c NULL will be returned here, but the length will be
2199 * that of the CBOR that would have been encoded.
2200 *
2201 * Encoding errors primarily manifest here as most other encoding function
2202 * do no return an error. They just set the error state in the encode
2203 * context after which no encoding function does anything.
2204 *
2205 * Three types of errors manifest here. The first type are nesting
2206 * errors where the number of @c QCBOREncode_OpenXxx() calls do not
2207 * match the number @c QCBOREncode_CloseXxx() calls. The solution is to
2208 * fix the calling code.
2209 *
2210 * The second type of error is because the buffer given is either too
2211 * small or too large. The remedy is to give a correctly sized buffer.
2212 *
2213 * The third type are due to limits in this implementation.
2214 * @ref QCBOR_ERR_ARRAY_NESTING_TOO_DEEP can be worked around by
2215 * encoding the CBOR in two (or more) phases and adding the CBOR from
2216 * the first phase to the second with @c QCBOREncode_AddEncoded().
2217 *
2218 * If an error is returned, the buffer may have partially encoded
2219 * incorrect CBOR in it and it should not be used. Likewise, the length
2220 * may be incorrect and should not be used.
2221 *
2222 * Note that the error could have occurred in one of the many
2223 * @c QCBOREncode_AddXxx() calls long before QCBOREncode_Finish() was
2224 * called. This error handling reduces the CBOR implementation size
2225 * but makes debugging harder.
2226 *
2227 * This may be called multiple times. It will always return the
2228 * same. It can also be interleaved with calls to
2229 * QCBOREncode_FinishGetSize().
2230 *
2231 * QCBOREncode_GetErrorState() can be called to get the current
2232 * error state in order to abort encoding early as an optimization, but
2233 * calling it is is never required.
Michael Eckel5c531332020-03-02 01:35:30 +01002234 */
Laurence Lundblade3eead482023-12-16 20:53:22 -07002235QCBORError
2236QCBOREncode_Finish(QCBOREncodeContext *pCtx, UsefulBufC *pEncodedCBOR);
Michael Eckel5c531332020-03-02 01:35:30 +01002237
2238
2239/**
Laurence Lundblade3eead482023-12-16 20:53:22 -07002240 * @brief Get the encoded CBOR and error status.
2241 *
2242 * @param[in] pCtx The context to finish encoding with.
2243 * @param[out] uEncodedLen The length of the encoded or potentially
2244 * encoded CBOR in bytes.
2245 *
2246 * @return The same errors as QCBOREncode_Finish().
2247 *
2248 * This functions the same as QCBOREncode_Finish(), but only returns the
2249 * size of the encoded output.
Michael Eckel5c531332020-03-02 01:35:30 +01002250 */
Laurence Lundblade3eead482023-12-16 20:53:22 -07002251QCBORError
2252QCBOREncode_FinishGetSize(QCBOREncodeContext *pCtx, size_t *uEncodedLen);
Michael Eckel5c531332020-03-02 01:35:30 +01002253
2254
2255/**
Laurence Lundblade3eead482023-12-16 20:53:22 -07002256 * @brief Indicate whether output buffer is NULL or not.
2257 *
2258 * @param[in] pCtx The encoding context.
2259 *
2260 * @return 1 if the output buffer is @c NULL.
2261 *
2262 * Sometimes a @c NULL input buffer is given to QCBOREncode_Init() so
2263 * that the size of the generated CBOR can be calculated without
2264 * allocating a buffer for it. This returns 1 when the output buffer
2265 * is @c NULL and 0 when it is not.
Michael Eckel5c531332020-03-02 01:35:30 +01002266 */
Laurence Lundblade3eead482023-12-16 20:53:22 -07002267static int
2268QCBOREncode_IsBufferNULL(QCBOREncodeContext *pCtx);
2269
2270
2271/**
2272 * @brief Get the encoding error state.
2273 *
2274 * @param[in] pCtx The encoding context.
2275 *
2276 * @return One of @ref QCBORError. See return values from
2277 * QCBOREncode_Finish()
2278 *
2279 * Normally encoding errors need only be handled at the end of
2280 * encoding when QCBOREncode_Finish() is called. This can be called to
2281 * get the error result before finish should there be a need to halt
2282 * encoding before QCBOREncode_Finish() is called.
2283 */
2284static QCBORError
2285QCBOREncode_GetErrorState(QCBOREncodeContext *pCtx);
2286
2287
2288/**
2289 * Encode the "head" of a CBOR data item.
2290 *
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002291 * @param Buffer Buffer to output the encoded head to; must be
Laurence Lundblade3eead482023-12-16 20:53:22 -07002292 * @ref QCBOR_HEAD_BUFFER_SIZE bytes in size.
2293 * @param uMajorType One of CBOR_MAJOR_TYPE_XX.
2294 * @param uMinLen The minimum number of bytes to encode uNumber. Almost
2295 * always this is 0 to use preferred
2296 * serialization. If this is 4, then even the
2297 * values 0xffff and smaller will be encoded in 4
2298 * bytes. This is used primarily when encoding a
2299 * float or double put into uNumber as the leading
2300 * zero bytes for them must be encoded.
2301 * @param uNumber The numeric argument part of the CBOR head.
2302 * @return Pointer and length of the encoded head or
2303 * @ref NULLUsefulBufC if the output buffer is too small.
2304 *
2305 * Callers do not to need to call this for normal CBOR encoding. Note
2306 * that it doesn't even take a @ref QCBOREncodeContext argument.
2307 *
2308 * This encodes the major type and argument part of a data item. The
2309 * argument is an integer that is usually either the value or the length
2310 * of the data item.
2311 *
2312 * This is exposed in the public interface to allow hashing of some CBOR
2313 * data types, bstr in particular, a chunk at a time so the full CBOR
2314 * doesn't have to be encoded in a contiguous buffer.
2315 *
2316 * For example, if you have a 100,000 byte binary blob in a buffer that
2317 * needs to be a bstr encoded and then hashed. You could allocate a
2318 * 100,010 byte buffer and encode it normally. Alternatively, you can
2319 * encode the head in a 10 byte buffer with this function, hash that and
2320 * then hash the 100,000 bytes using the same hash context.
Laurence Lundblade3eead482023-12-16 20:53:22 -07002321 */
2322UsefulBufC
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002323QCBOREncode_EncodeHead(UsefulBuf Buffer,
Laurence Lundblade3eead482023-12-16 20:53:22 -07002324 uint8_t uMajorType,
2325 uint8_t uMinLen,
2326 uint64_t uNumber);
Michael Eckel5c531332020-03-02 01:35:30 +01002327
2328
Michael Eckel5c531332020-03-02 01:35:30 +01002329
2330
Laurence Lundblade45d5e482020-09-15 21:15:15 -07002331/* =========================================================================
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002332 BEGINNING OF PRIVATE IMPLEMENTATION
Laurence Lundblade45d5e482020-09-15 21:15:15 -07002333 ========================================================================= */
Michael Eckel5c531332020-03-02 01:35:30 +01002334
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002335/* Semi-private funcion used by public inline functions. See qcbor_encode.c */
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07002336void QCBOREncode_Private_AppendCBORHead(QCBOREncodeContext *pMe,
2337 const uint8_t uMajorType,
2338 const uint64_t uArgument,
2339 const uint8_t uMinLen);
2340
2341
2342/* Semi-private funcion used by public inline functions. See qcbor_encode.c */
Laurence Lundblade3eead482023-12-16 20:53:22 -07002343void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002344QCBOREncode_Private_AddBuffer(QCBOREncodeContext *pCtx,
2345 uint8_t uMajorType,
2346 UsefulBufC Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01002347
2348
Laurence Lundblade8d9e0cd2024-05-25 18:12:19 -07002349/* Semi-private function for adding a double with preferred encoding. See qcbor_encode.c */
2350void
2351QCBOREncode_Private_AddPreferredDouble(QCBOREncodeContext *pMe, const double dNum);
2352
2353
2354/* Semi-private function for adding a float with preferred encoding. See qcbor_encode.c */
2355void
2356QCBOREncode_Private_AddPreferredFloat(QCBOREncodeContext *pMe, const float fNum);
2357
2358
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002359/* Semi-private funcion used by public inline functions. See qcbor_encode.c */
Laurence Lundblade3eead482023-12-16 20:53:22 -07002360void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002361QCBOREncode_Private_OpenMapOrArray(QCBOREncodeContext *pCtx,
2362 uint8_t uMajorType);
Michael Eckel5c531332020-03-02 01:35:30 +01002363
2364
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002365/* Semi-private funcion used by public inline functions. See qcbor_encode.c */
Laurence Lundblade3eead482023-12-16 20:53:22 -07002366void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002367QCBOREncode_Private_OpenMapOrArrayIndefiniteLength(QCBOREncodeContext *pCtx,
2368 uint8_t uMajorType);
Michael Eckel5c531332020-03-02 01:35:30 +01002369
2370
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002371/* Semi-private funcion used by public inline functions. See qcbor_encode.c */
Laurence Lundblade3eead482023-12-16 20:53:22 -07002372void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002373QCBOREncode_Private_CloseMapOrArray(QCBOREncodeContext *pCtx,
2374 uint8_t uMajorType);
Michael Eckel5c531332020-03-02 01:35:30 +01002375
2376
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002377/* Semi-private funcion used by public inline functions. See qcbor_encode.c */
Laurence Lundblade3eead482023-12-16 20:53:22 -07002378void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002379QCBOREncode_Private_CloseMapOrArrayIndefiniteLength(QCBOREncodeContext *pCtx,
2380 uint8_t uMajorType);
Michael Eckel5c531332020-03-02 01:35:30 +01002381
2382
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002383/* Semi-private funcion used by public inline functions. See qcbor_encode.c */
Laurence Lundblade3eead482023-12-16 20:53:22 -07002384void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002385QCBOREncode_Private_AddExpMantissa(QCBOREncodeContext *pCtx,
Laurence Lundblade3eead482023-12-16 20:53:22 -07002386 uint64_t uTag,
2387 UsefulBufC BigNumMantissa,
2388 bool bBigNumIsNegative,
2389 int64_t nMantissa,
2390 int64_t nExponent);
Michael Eckel5c531332020-03-02 01:35:30 +01002391
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07002392
2393/**
2394 * @brief Semi-private method to add simple items and floating-point.
2395 *
2396 * @param[in] pMe The encoding context.
2397 * @param[in] uMinLen Minimum encoding size for uNum. Usually 0.
2398 * @param[in] uArgument The value to add.
2399 *
2400 * This is used to add simple types like true and false and float-point
2401 * values, both of which are type 7.
2402 *
2403 * Call QCBOREncode_AddBool(), QCBOREncode_AddNULL(),
2404 * QCBOREncode_AddUndef() QCBOREncode_AddDouble() instead of this.
2405 *
2406 * Error handling is the same as QCBOREncode_AddInt64().
2407 */
2408static inline void
2409QCBOREncode_Private_AddType7(QCBOREncodeContext *pMe,
2410 const uint8_t uMinLen,
2411 const uint64_t uArgument)
2412{
2413 QCBOREncode_Private_AppendCBORHead(pMe, CBOR_MAJOR_TYPE_SIMPLE, uArgument, uMinLen);
2414}
2415
2416
Michael Eckel5c531332020-03-02 01:35:30 +01002417/**
Laurence Lundblade3eead482023-12-16 20:53:22 -07002418 * @brief Semi-private method to add only the type and length of a byte string.
2419 *
2420 * @param[in] pCtx The context to initialize.
2421 * @param[in] Bytes Pointer and length of the input data.
2422 *
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002423 * This will be removed in QCBOR 2.0. It was never a public function.
2424 *
Laurence Lundblade3eead482023-12-16 20:53:22 -07002425 * This is the same as QCBOREncode_AddBytes() except it only adds the
2426 * CBOR encoding for the type and the length. It doesn't actually add
2427 * the bytes. You can't actually produce correct CBOR with this and
2428 * the rest of this API. It is only used for a special case where the
2429 * valid CBOR is created manually by putting this type and length in
2430 * and then adding the actual bytes. In particular, when only a hash
2431 * of the encoded CBOR is needed, where the type and header are hashed
2432 * separately and then the bytes is hashed. This makes it possible to
2433 * implement COSE Sign1 with only one copy of the payload in the
2434 * output buffer, rather than two, roughly cutting memory use in half.
2435 *
2436 * This is only used for this odd case, but this is a supported
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07002437 * tested function for QCBOR 1.0.
Laurence Lundblade3eead482023-12-16 20:53:22 -07002438 *
2439 * See also QCBOREncode_EncodeHead().
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002440 */
2441static void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002442QCBOREncode_AddBytesLenOnly(QCBOREncodeContext *pCtx,
2443 UsefulBufC Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01002444
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002445static void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002446QCBOREncode_AddBytesLenOnlyToMap(QCBOREncodeContext *pCtx,
2447 const char *szLabel,
2448 UsefulBufC Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01002449
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002450static void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002451QCBOREncode_AddBytesLenOnlyToMapN(QCBOREncodeContext *pCtx,
2452 int64_t nLabel,
2453 UsefulBufC Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01002454
2455
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07002456/* Forward declaration */
2457static void
2458QCBOREncode_AddSZString(QCBOREncodeContext *pMe, const char *szString);
2459
Michael Eckel5c531332020-03-02 01:35:30 +01002460
2461
2462
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002463static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002464QCBOREncode_AddInt64ToMap(QCBOREncodeContext *pMe,
2465 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002466 const int64_t uNum)
Michael Eckel5c531332020-03-02 01:35:30 +01002467{
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07002468 QCBOREncode_AddSZString(pMe, szLabel);
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07002469 QCBOREncode_AddInt64(pMe, uNum);
Michael Eckel5c531332020-03-02 01:35:30 +01002470}
2471
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002472static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002473QCBOREncode_AddInt64ToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002474 const int64_t nLabel,
2475 const int64_t uNum)
Michael Eckel5c531332020-03-02 01:35:30 +01002476{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07002477 QCBOREncode_AddInt64(pMe, nLabel);
2478 QCBOREncode_AddInt64(pMe, uNum);
Michael Eckel5c531332020-03-02 01:35:30 +01002479}
2480
2481
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002482static inline void
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07002483QCBOREncode_AddUInt64(QCBOREncodeContext *pMe, const uint64_t uValue)
2484{
2485 QCBOREncode_Private_AppendCBORHead(pMe, CBOR_MAJOR_TYPE_POSITIVE_INT, uValue, 0);
2486}
2487
2488
2489static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002490QCBOREncode_AddUInt64ToMap(QCBOREncodeContext *pMe,
2491 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002492 const uint64_t uNum)
Michael Eckel5c531332020-03-02 01:35:30 +01002493{
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07002494 QCBOREncode_AddSZString(pMe, szLabel);
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07002495 QCBOREncode_AddUInt64(pMe, uNum);
Michael Eckel5c531332020-03-02 01:35:30 +01002496}
2497
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002498static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002499QCBOREncode_AddUInt64ToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002500 const int64_t nLabel,
2501 const uint64_t uNum)
Michael Eckel5c531332020-03-02 01:35:30 +01002502{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07002503 QCBOREncode_AddInt64(pMe, nLabel);
2504 QCBOREncode_AddUInt64(pMe, uNum);
Michael Eckel5c531332020-03-02 01:35:30 +01002505}
2506
2507
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002508static inline void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002509QCBOREncode_AddText(QCBOREncodeContext *pMe, const UsefulBufC Text)
Michael Eckel5c531332020-03-02 01:35:30 +01002510{
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002511 QCBOREncode_Private_AddBuffer(pMe, CBOR_MAJOR_TYPE_TEXT_STRING, Text);
Michael Eckel5c531332020-03-02 01:35:30 +01002512}
2513
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002514static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002515QCBOREncode_AddTextToMap(QCBOREncodeContext *pMe,
2516 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002517 const UsefulBufC Text)
Michael Eckel5c531332020-03-02 01:35:30 +01002518{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07002519 QCBOREncode_AddText(pMe, UsefulBuf_FromSZ(szLabel));
2520 QCBOREncode_AddText(pMe, Text);
Michael Eckel5c531332020-03-02 01:35:30 +01002521}
2522
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002523static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002524QCBOREncode_AddTextToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002525 const int64_t nLabel,
2526 const UsefulBufC Text)
Michael Eckel5c531332020-03-02 01:35:30 +01002527{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07002528 QCBOREncode_AddInt64(pMe, nLabel);
2529 QCBOREncode_AddText(pMe, Text);
Michael Eckel5c531332020-03-02 01:35:30 +01002530}
2531
2532
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002533inline static void
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07002534QCBOREncode_AddSZString(QCBOREncodeContext *pMe, const char *szString)
Michael Eckel5c531332020-03-02 01:35:30 +01002535{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07002536 QCBOREncode_AddText(pMe, UsefulBuf_FromSZ(szString));
Michael Eckel5c531332020-03-02 01:35:30 +01002537}
2538
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002539static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002540QCBOREncode_AddSZStringToMap(QCBOREncodeContext *pMe,
2541 const char *szLabel,
2542 const char *szString)
Michael Eckel5c531332020-03-02 01:35:30 +01002543{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07002544 QCBOREncode_AddSZString(pMe, szLabel);
2545 QCBOREncode_AddSZString(pMe, szString);
Michael Eckel5c531332020-03-02 01:35:30 +01002546}
2547
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002548static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002549QCBOREncode_AddSZStringToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002550 const int64_t nLabel,
Laurence Lundblade3eead482023-12-16 20:53:22 -07002551 const char *szString)
Michael Eckel5c531332020-03-02 01:35:30 +01002552{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07002553 QCBOREncode_AddInt64(pMe, nLabel);
2554 QCBOREncode_AddSZString(pMe, szString);
Michael Eckel5c531332020-03-02 01:35:30 +01002555}
2556
2557
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07002558
2559/*
2560 * Public functions for adding a tag. See qcbor/qcbor_encode.h
2561 */
2562static inline void
2563QCBOREncode_AddTag(QCBOREncodeContext *pMe, const uint64_t uTag)
2564{
2565 QCBOREncode_Private_AppendCBORHead(pMe, CBOR_MAJOR_TYPE_TAG, uTag, 0);
2566}
2567
2568
2569
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +02002570#ifndef USEFULBUF_DISABLE_ALL_FLOAT
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07002571
2572static inline void
2573QCBOREncode_AddDoubleNoPreferred(QCBOREncodeContext *pMe, const double dNum)
2574{
2575 QCBOREncode_Private_AddType7(pMe,
2576 sizeof(uint64_t),
2577 UsefulBufUtil_CopyDoubleToUint64(dNum));
2578}
2579
2580static inline void
2581QCBOREncode_AddFloatNoPreferred(QCBOREncodeContext *pMe, const float fNum)
2582{
2583 QCBOREncode_Private_AddType7(pMe,
2584 sizeof(uint32_t),
2585 UsefulBufUtil_CopyFloatToUint32(fNum));
2586}
2587
2588
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002589static inline void
Laurence Lundblade8d9e0cd2024-05-25 18:12:19 -07002590QCBOREncode_AddDouble(QCBOREncodeContext *pMe, const double dNum)
2591{
2592#ifndef QCBOR_DISABLE_PREFERRED_FLOAT
2593 QCBOREncode_Private_AddPreferredDouble(pMe, dNum);
2594#else /* QCBOR_DISABLE_PREFERRED_FLOAT */
2595 QCBOREncode_AddDoubleNoPreferred(pMe, dNum);
2596#endif /* QCBOR_DISABLE_PREFERRED_FLOAT */
2597}
2598
2599static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002600QCBOREncode_AddDoubleToMap(QCBOREncodeContext *pMe,
2601 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002602 const double dNum)
Michael Eckel5c531332020-03-02 01:35:30 +01002603{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07002604 QCBOREncode_AddSZString(pMe, szLabel);
2605 QCBOREncode_AddDouble(pMe, dNum);
Michael Eckel5c531332020-03-02 01:35:30 +01002606}
2607
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002608static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002609QCBOREncode_AddDoubleToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002610 const int64_t nLabel,
2611 const double dNum)
Michael Eckel5c531332020-03-02 01:35:30 +01002612{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07002613 QCBOREncode_AddInt64(pMe, nLabel);
2614 QCBOREncode_AddDouble(pMe, dNum);
Michael Eckel5c531332020-03-02 01:35:30 +01002615}
2616
Laurence Lundblade8d9e0cd2024-05-25 18:12:19 -07002617
2618static inline void
2619QCBOREncode_AddFloat(QCBOREncodeContext *pMe, const float fNum)
2620{
2621#ifndef QCBOR_DISABLE_PREFERRED_FLOAT
2622 QCBOREncode_Private_AddPreferredFloat(pMe, fNum);
2623#else /* QCBOR_DISABLE_PREFERRED_FLOAT */
2624 QCBOREncode_AddFloatNoPreferred(pMe, fNum);
2625#endif /* QCBOR_DISABLE_PREFERRED_FLOAT */
2626}
2627
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002628static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002629QCBOREncode_AddFloatToMap(QCBOREncodeContext *pMe,
2630 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002631 const float dNum)
Laurence Lundbladeb275cdc2020-07-12 12:34:38 -07002632{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07002633 QCBOREncode_AddSZString(pMe, szLabel);
2634 QCBOREncode_AddFloat(pMe, dNum);
Laurence Lundbladeb275cdc2020-07-12 12:34:38 -07002635}
2636
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002637static inline void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002638QCBOREncode_AddFloatToMapN(QCBOREncodeContext *pMe,
2639 const int64_t nLabel,
2640 const float fNum)
Laurence Lundbladeb275cdc2020-07-12 12:34:38 -07002641{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07002642 QCBOREncode_AddInt64(pMe, nLabel);
2643 QCBOREncode_AddFloat(pMe, fNum);
Laurence Lundbladeb275cdc2020-07-12 12:34:38 -07002644}
2645
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002646static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002647QCBOREncode_AddDoubleNoPreferredToMap(QCBOREncodeContext *pMe,
2648 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002649 const double dNum)
Laurence Lundblade32f3e622020-07-13 20:35:11 -07002650{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07002651 QCBOREncode_AddSZString(pMe, szLabel);
2652 QCBOREncode_AddDoubleNoPreferred(pMe, dNum);
Laurence Lundblade32f3e622020-07-13 20:35:11 -07002653}
2654
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002655static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002656QCBOREncode_AddDoubleNoPreferredToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002657 const int64_t nLabel,
2658 const double dNum)
Laurence Lundblade32f3e622020-07-13 20:35:11 -07002659{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07002660 QCBOREncode_AddInt64(pMe, nLabel);
2661 QCBOREncode_AddDoubleNoPreferred(pMe, dNum);
Laurence Lundblade32f3e622020-07-13 20:35:11 -07002662}
2663
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002664static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002665QCBOREncode_AddFloatNoPreferredToMap(QCBOREncodeContext *pMe,
2666 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002667 const float dNum)
Laurence Lundblade32f3e622020-07-13 20:35:11 -07002668{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07002669 QCBOREncode_AddSZString(pMe, szLabel);
2670 QCBOREncode_AddFloatNoPreferred(pMe, dNum);
Laurence Lundblade32f3e622020-07-13 20:35:11 -07002671}
2672
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002673static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002674QCBOREncode_AddFloatNoPreferredToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002675 const int64_t nLabel,
2676 const float dNum)
Laurence Lundblade32f3e622020-07-13 20:35:11 -07002677{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07002678 QCBOREncode_AddInt64(pMe, nLabel);
2679 QCBOREncode_AddFloatNoPreferred(pMe, dNum);
Laurence Lundblade32f3e622020-07-13 20:35:11 -07002680}
Máté Tóth-Pálef5f07a2021-09-17 19:31:37 +02002681#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
Laurence Lundblade32f3e622020-07-13 20:35:11 -07002682
Michael Eckel5c531332020-03-02 01:35:30 +01002683
Laurence Lundblade9b334962020-08-27 10:55:53 -07002684
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07002685
2686
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002687static inline void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002688QCBOREncode_AddTDateEpoch(QCBOREncodeContext *pMe,
2689 const uint8_t uTag,
2690 const int64_t nDate)
Laurence Lundblade9b334962020-08-27 10:55:53 -07002691{
2692 if(uTag == QCBOR_ENCODE_AS_TAG) {
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002693 QCBOREncode_AddTag(pMe, CBOR_TAG_DATE_EPOCH);
Laurence Lundblade9b334962020-08-27 10:55:53 -07002694 }
Laurence Lundblade45d5e482020-09-15 21:15:15 -07002695 QCBOREncode_AddInt64(pMe, nDate);
Laurence Lundblade9b334962020-08-27 10:55:53 -07002696}
2697
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002698static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002699QCBOREncode_AddTDateEpochToMapSZ(QCBOREncodeContext *pMe,
2700 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002701 const uint8_t uTag,
2702 const int64_t nDate)
Laurence Lundblade9b334962020-08-27 10:55:53 -07002703{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002704 QCBOREncode_AddSZString(pMe, szLabel);
Laurence Lundblade45d5e482020-09-15 21:15:15 -07002705 QCBOREncode_AddTDateEpoch(pMe, uTag, nDate);
Laurence Lundblade9b334962020-08-27 10:55:53 -07002706}
2707
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002708static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002709QCBOREncode_AddTDateEpochToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002710 const int64_t nLabel,
2711 const uint8_t uTag,
2712 const int64_t nDate)
Laurence Lundblade9b334962020-08-27 10:55:53 -07002713{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002714 QCBOREncode_AddInt64(pMe, nLabel);
Laurence Lundblade45d5e482020-09-15 21:15:15 -07002715 QCBOREncode_AddTDateEpoch(pMe, uTag, nDate);
Laurence Lundblade9b334962020-08-27 10:55:53 -07002716}
2717
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002718static inline void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002719QCBOREncode_AddDateEpoch(QCBOREncodeContext *pMe,
2720 const int64_t nDate)
Michael Eckel5c531332020-03-02 01:35:30 +01002721{
Laurence Lundblade45d5e482020-09-15 21:15:15 -07002722 QCBOREncode_AddTDateEpoch(pMe, QCBOR_ENCODE_AS_TAG, nDate);
Michael Eckel5c531332020-03-02 01:35:30 +01002723}
2724
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002725static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002726QCBOREncode_AddDateEpochToMap(QCBOREncodeContext *pMe,
2727 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002728 const int64_t nDate)
Michael Eckel5c531332020-03-02 01:35:30 +01002729{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002730 QCBOREncode_AddSZString(pMe, szLabel);
Laurence Lundblade45d5e482020-09-15 21:15:15 -07002731 QCBOREncode_AddDateEpoch(pMe, nDate);
Michael Eckel5c531332020-03-02 01:35:30 +01002732}
2733
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002734static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002735QCBOREncode_AddDateEpochToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002736 const int64_t nLabel,
2737 const int64_t nDate)
Michael Eckel5c531332020-03-02 01:35:30 +01002738{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002739 QCBOREncode_AddInt64(pMe, nLabel);
Laurence Lundblade45d5e482020-09-15 21:15:15 -07002740 QCBOREncode_AddDateEpoch(pMe, nDate);
Michael Eckel5c531332020-03-02 01:35:30 +01002741}
2742
2743
Laurence Lundblade46d63e92021-05-13 11:37:10 -07002744static inline void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002745QCBOREncode_AddTDaysEpoch(QCBOREncodeContext *pMe,
2746 const uint8_t uTag,
2747 const int64_t nDays)
Laurence Lundblade46d63e92021-05-13 11:37:10 -07002748{
2749 if(uTag == QCBOR_ENCODE_AS_TAG) {
2750 QCBOREncode_AddTag(pMe, CBOR_TAG_DAYS_EPOCH);
2751 }
2752 QCBOREncode_AddInt64(pMe, nDays);
2753}
2754
2755static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002756QCBOREncode_AddTDaysEpochToMapSZ(QCBOREncodeContext *pMe,
2757 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002758 const uint8_t uTag,
2759 const int64_t nDays)
Laurence Lundblade46d63e92021-05-13 11:37:10 -07002760{
2761 QCBOREncode_AddSZString(pMe, szLabel);
2762 QCBOREncode_AddTDaysEpoch(pMe, uTag, nDays);
2763}
2764
2765static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002766QCBOREncode_AddTDaysEpochToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002767 const int64_t nLabel,
2768 const uint8_t uTag,
2769 const int64_t nDays)
Laurence Lundblade46d63e92021-05-13 11:37:10 -07002770{
2771 QCBOREncode_AddInt64(pMe, nLabel);
2772 QCBOREncode_AddTDaysEpoch(pMe, uTag, nDays);
2773}
2774
Laurence Lundblade9b334962020-08-27 10:55:53 -07002775
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002776static inline void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002777QCBOREncode_AddBytes(QCBOREncodeContext *pMe,
2778 const UsefulBufC Bytes)
Michael Eckel5c531332020-03-02 01:35:30 +01002779{
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002780 QCBOREncode_Private_AddBuffer(pMe, CBOR_MAJOR_TYPE_BYTE_STRING, Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01002781}
2782
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002783static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002784QCBOREncode_AddBytesToMap(QCBOREncodeContext *pMe,
2785 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002786 const UsefulBufC Bytes)
Michael Eckel5c531332020-03-02 01:35:30 +01002787{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002788 QCBOREncode_AddSZString(pMe, szLabel);
2789 QCBOREncode_AddBytes(pMe, Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01002790}
2791
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002792static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002793QCBOREncode_AddBytesToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002794 const int64_t nLabel,
2795 const UsefulBufC Bytes)
Michael Eckel5c531332020-03-02 01:35:30 +01002796{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002797 QCBOREncode_AddInt64(pMe, nLabel);
2798 QCBOREncode_AddBytes(pMe, Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01002799}
2800
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002801static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002802QCBOREncode_OpenBytesInMapSZ(QCBOREncodeContext *pMe,
2803 const char *szLabel,
2804 UsefulBuf *pPlace)
Laurence Lundbladeb24faef2022-04-26 11:03:08 -06002805{
2806 QCBOREncode_AddSZString(pMe, szLabel);
2807 QCBOREncode_OpenBytes(pMe, pPlace);
2808}
2809
2810static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002811QCBOREncode_OpenBytesInMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002812 const int64_t nLabel,
Laurence Lundblade3eead482023-12-16 20:53:22 -07002813 UsefulBuf *pPlace)
Laurence Lundbladeb24faef2022-04-26 11:03:08 -06002814{
2815 QCBOREncode_AddInt64(pMe, nLabel);
2816 QCBOREncode_OpenBytes(pMe, pPlace);
2817}
2818
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07002819
2820/*
2821 * Public functions for adding only a byte string length. See qcbor/qcbor_encode.h
2822 */
Laurence Lundbladeb24faef2022-04-26 11:03:08 -06002823static inline void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002824QCBOREncode_AddBytesLenOnly(QCBOREncodeContext *pMe, const UsefulBufC Bytes)
Michael Eckel5c531332020-03-02 01:35:30 +01002825{
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07002826 QCBOREncode_Private_AppendCBORHead(pMe, CBOR_MAJOR_TYPE_BYTE_STRING, Bytes.len, 0);
Michael Eckel5c531332020-03-02 01:35:30 +01002827}
2828
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07002829
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002830static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002831QCBOREncode_AddBytesLenOnlyToMap(QCBOREncodeContext *pMe,
2832 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002833 const UsefulBufC Bytes)
Michael Eckel5c531332020-03-02 01:35:30 +01002834{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002835 QCBOREncode_AddSZString(pMe, szLabel);
2836 QCBOREncode_AddBytesLenOnly(pMe, Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01002837}
2838
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002839static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002840QCBOREncode_AddBytesLenOnlyToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002841 const int64_t nLabel,
2842 const UsefulBufC Bytes)
Michael Eckel5c531332020-03-02 01:35:30 +01002843{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002844 QCBOREncode_AddInt64(pMe, nLabel);
2845 QCBOREncode_AddBytesLenOnly(pMe, Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01002846}
2847
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002848
2849static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002850QCBOREncode_AddTBinaryUUID(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002851 const uint8_t uTagRequirement,
2852 const UsefulBufC Bytes)
Michael Eckel5c531332020-03-02 01:35:30 +01002853{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002854 if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
2855 QCBOREncode_AddTag(pMe, CBOR_TAG_BIN_UUID);
2856 }
2857 QCBOREncode_AddBytes(pMe, Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01002858}
2859
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002860static inline void
2861QCBOREncode_AddTBinaryUUIDToMapSZ(QCBOREncodeContext *pMe,
2862 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002863 const uint8_t uTagRequirement,
2864 const UsefulBufC Bytes)
Michael Eckel5c531332020-03-02 01:35:30 +01002865{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002866 QCBOREncode_AddSZString(pMe, szLabel);
2867 QCBOREncode_AddTBinaryUUID(pMe, uTagRequirement, Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01002868}
2869
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002870static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002871QCBOREncode_AddTBinaryUUIDToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002872 const int64_t nLabel,
2873 const uint8_t uTagRequirement,
2874 const UsefulBufC Bytes)
Michael Eckel5c531332020-03-02 01:35:30 +01002875{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002876 QCBOREncode_AddInt64(pMe, nLabel);
2877 QCBOREncode_AddTBinaryUUID(pMe, uTagRequirement, Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01002878}
2879
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002880static inline void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002881QCBOREncode_AddBinaryUUID(QCBOREncodeContext *pMe, const UsefulBufC Bytes)
Michael Eckel5c531332020-03-02 01:35:30 +01002882{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002883 QCBOREncode_AddTBinaryUUID(pMe, QCBOR_ENCODE_AS_TAG, Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01002884}
2885
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002886static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002887QCBOREncode_AddBinaryUUIDToMap(QCBOREncodeContext *pMe,
2888 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002889 const UsefulBufC Bytes)
Michael Eckel5c531332020-03-02 01:35:30 +01002890{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002891 QCBOREncode_AddTBinaryUUIDToMapSZ(pMe, szLabel, QCBOR_ENCODE_AS_TAG, Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01002892}
2893
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002894static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002895QCBOREncode_AddBinaryUUIDToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002896 const int64_t nLabel,
2897 const UsefulBufC Bytes)
Michael Eckel5c531332020-03-02 01:35:30 +01002898{
Laurence Lundblade3eead482023-12-16 20:53:22 -07002899 QCBOREncode_AddTBinaryUUIDToMapN(pMe,
2900 nLabel,
2901 QCBOR_ENCODE_AS_TAG,
2902 Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01002903}
2904
2905
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002906static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002907QCBOREncode_AddTPositiveBignum(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002908 const uint8_t uTagRequirement,
2909 const UsefulBufC Bytes)
Michael Eckel5c531332020-03-02 01:35:30 +01002910{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002911 if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
2912 QCBOREncode_AddTag(pMe, CBOR_TAG_POS_BIGNUM);
2913 }
2914 QCBOREncode_AddBytes(pMe, Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01002915}
2916
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002917static inline void
2918QCBOREncode_AddTPositiveBignumToMapSZ(QCBOREncodeContext *pMe,
2919 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002920 const uint8_t uTagRequirement,
2921 const UsefulBufC Bytes)
Michael Eckel5c531332020-03-02 01:35:30 +01002922{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002923 QCBOREncode_AddSZString(pMe, szLabel);
2924 QCBOREncode_AddTPositiveBignum(pMe, uTagRequirement, Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01002925}
2926
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002927static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002928QCBOREncode_AddTPositiveBignumToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002929 const int64_t nLabel,
2930 const uint8_t uTagRequirement,
2931 const UsefulBufC Bytes)
Michael Eckel5c531332020-03-02 01:35:30 +01002932{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002933 QCBOREncode_AddInt64(pMe, nLabel);
2934 QCBOREncode_AddTPositiveBignum(pMe, uTagRequirement, Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01002935}
2936
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002937static inline void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002938QCBOREncode_AddPositiveBignum(QCBOREncodeContext *pMe, const UsefulBufC Bytes)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002939{
2940 QCBOREncode_AddTPositiveBignum(pMe, QCBOR_ENCODE_AS_TAG, Bytes);
2941}
2942
2943static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002944QCBOREncode_AddPositiveBignumToMap(QCBOREncodeContext *pMe,
2945 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002946 const UsefulBufC Bytes)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002947{
Laurence Lundblade3eead482023-12-16 20:53:22 -07002948 QCBOREncode_AddTPositiveBignumToMapSZ(pMe,
2949 szLabel,
2950 QCBOR_ENCODE_AS_TAG,
2951 Bytes);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002952}
2953
2954static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002955QCBOREncode_AddPositiveBignumToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002956 const int64_t nLabel,
2957 const UsefulBufC Bytes)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002958{
Laurence Lundblade3eead482023-12-16 20:53:22 -07002959 QCBOREncode_AddTPositiveBignumToMapN(pMe,
2960 nLabel,
2961 QCBOR_ENCODE_AS_TAG,
2962 Bytes);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002963}
2964
2965
2966static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002967QCBOREncode_AddTNegativeBignum(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002968 const uint8_t uTagRequirement,
2969 const UsefulBufC Bytes)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002970{
2971 if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
2972 QCBOREncode_AddTag(pMe, CBOR_TAG_NEG_BIGNUM);
2973 }
2974 QCBOREncode_AddBytes(pMe, Bytes);
2975}
2976
2977static inline void
2978QCBOREncode_AddTNegativeBignumToMapSZ(QCBOREncodeContext *pMe,
2979 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002980 const uint8_t uTagRequirement,
2981 const UsefulBufC Bytes)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002982{
2983 QCBOREncode_AddSZString(pMe, szLabel);
2984 QCBOREncode_AddTNegativeBignum(pMe, uTagRequirement, Bytes);
2985}
2986
2987static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07002988QCBOREncode_AddTNegativeBignumToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002989 const int64_t nLabel,
2990 const uint8_t uTagRequirement,
2991 const UsefulBufC Bytes)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002992{
2993 QCBOREncode_AddInt64(pMe, nLabel);
2994 QCBOREncode_AddTNegativeBignum(pMe, uTagRequirement, Bytes);
2995}
2996
2997static inline void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07002998QCBOREncode_AddNegativeBignum(QCBOREncodeContext *pMe, const UsefulBufC Bytes)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002999{
3000 QCBOREncode_AddTNegativeBignum(pMe, QCBOR_ENCODE_AS_TAG, Bytes);
3001}
3002
3003static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003004QCBOREncode_AddNegativeBignumToMap(QCBOREncodeContext *pMe,
3005 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003006 const UsefulBufC Bytes)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003007{
Laurence Lundblade3eead482023-12-16 20:53:22 -07003008 QCBOREncode_AddTNegativeBignumToMapSZ(pMe,
3009 szLabel,
3010 QCBOR_ENCODE_AS_TAG,
3011 Bytes);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003012}
3013
3014static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003015QCBOREncode_AddNegativeBignumToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003016 const int64_t nLabel,
3017 const UsefulBufC Bytes)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003018{
Laurence Lundblade3eead482023-12-16 20:53:22 -07003019 QCBOREncode_AddTNegativeBignumToMapN(pMe,
3020 nLabel,
3021 QCBOR_ENCODE_AS_TAG,
3022 Bytes);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003023}
3024
3025
Michael Eckel5c531332020-03-02 01:35:30 +01003026
Laurence Lundbladedd6e76e2021-03-10 01:54:01 -07003027#ifndef QCBOR_DISABLE_EXP_AND_MANTISSA
Michael Eckel5c531332020-03-02 01:35:30 +01003028
Laurence Lundblade45d5e482020-09-15 21:15:15 -07003029static inline void
3030QCBOREncode_AddTDecimalFraction(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003031 const uint8_t uTagRequirement,
3032 const int64_t nMantissa,
3033 const int64_t nBase10Exponent)
Michael Eckel5c531332020-03-02 01:35:30 +01003034{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003035 uint64_t uTag;
3036 if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
3037 uTag = CBOR_TAG_DECIMAL_FRACTION;
3038 } else {
3039 uTag = CBOR_TAG_INVALID64;
3040 }
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003041 QCBOREncode_Private_AddExpMantissa(pMe,
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003042 uTag,
Michael Eckel5c531332020-03-02 01:35:30 +01003043 NULLUsefulBufC,
3044 false,
3045 nMantissa,
3046 nBase10Exponent);
3047}
3048
Laurence Lundblade45d5e482020-09-15 21:15:15 -07003049static inline void
3050QCBOREncode_AddTDecimalFractionToMapSZ(QCBOREncodeContext *pMe,
3051 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003052 const uint8_t uTagRequirement,
3053 const int64_t nMantissa,
3054 const int64_t nBase10Exponent)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003055{
3056 QCBOREncode_AddSZString(pMe, szLabel);
Laurence Lundblade3eead482023-12-16 20:53:22 -07003057 QCBOREncode_AddTDecimalFraction(pMe,
3058 uTagRequirement,
3059 nMantissa,
3060 nBase10Exponent);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003061}
3062
Laurence Lundblade45d5e482020-09-15 21:15:15 -07003063static inline void
3064QCBOREncode_AddTDecimalFractionToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003065 const int64_t nLabel,
3066 const uint8_t uTagRequirement,
3067 const int64_t nMantissa,
3068 const int64_t nBase10Exponent)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003069{
3070 QCBOREncode_AddInt64(pMe, nLabel);
Laurence Lundblade3eead482023-12-16 20:53:22 -07003071 QCBOREncode_AddTDecimalFraction(pMe,
3072 uTagRequirement,
3073 nMantissa,
3074 nBase10Exponent);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003075}
3076
Laurence Lundblade45d5e482020-09-15 21:15:15 -07003077static inline void
3078QCBOREncode_AddDecimalFraction(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003079 const int64_t nMantissa,
3080 const int64_t nBase10Exponent)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003081{
Laurence Lundblade3eead482023-12-16 20:53:22 -07003082 QCBOREncode_AddTDecimalFraction(pMe,
3083 QCBOR_ENCODE_AS_TAG,
3084 nMantissa,
3085 nBase10Exponent);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003086}
3087
Laurence Lundblade45d5e482020-09-15 21:15:15 -07003088static inline void
3089QCBOREncode_AddDecimalFractionToMap(QCBOREncodeContext *pMe,
3090 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003091 const int64_t nMantissa,
3092 const int64_t nBase10Exponent)
Michael Eckel5c531332020-03-02 01:35:30 +01003093{
Laurence Lundblade3eead482023-12-16 20:53:22 -07003094 QCBOREncode_AddTDecimalFractionToMapSZ(pMe,
3095 szLabel,
3096 QCBOR_ENCODE_AS_TAG,
3097 nMantissa,
3098 nBase10Exponent);
Michael Eckel5c531332020-03-02 01:35:30 +01003099}
3100
Laurence Lundblade45d5e482020-09-15 21:15:15 -07003101static inline void
3102QCBOREncode_AddDecimalFractionToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003103 const int64_t nLabel,
3104 const int64_t nMantissa,
3105 const int64_t nBase10Exponent)
Michael Eckel5c531332020-03-02 01:35:30 +01003106{
Laurence Lundblade3eead482023-12-16 20:53:22 -07003107 QCBOREncode_AddTDecimalFractionToMapN(pMe,
3108 nLabel,
3109 QCBOR_ENCODE_AS_TAG,
3110 nMantissa,
3111 nBase10Exponent);
Michael Eckel5c531332020-03-02 01:35:30 +01003112}
3113
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003114
3115
Laurence Lundblade45d5e482020-09-15 21:15:15 -07003116static inline void
3117QCBOREncode_AddTDecimalFractionBigNum(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003118 const uint8_t uTagRequirement,
3119 const UsefulBufC Mantissa,
3120 const bool bIsNegative,
3121 const int64_t nBase10Exponent)
Michael Eckel5c531332020-03-02 01:35:30 +01003122{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003123 uint64_t uTag;
3124 if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
3125 uTag = CBOR_TAG_DECIMAL_FRACTION;
3126 } else {
3127 uTag = CBOR_TAG_INVALID64;
3128 }
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003129 QCBOREncode_Private_AddExpMantissa(pMe,
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003130 uTag,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003131 Mantissa,
3132 bIsNegative,
Michael Eckel5c531332020-03-02 01:35:30 +01003133 0,
3134 nBase10Exponent);
3135}
3136
Laurence Lundblade45d5e482020-09-15 21:15:15 -07003137static inline void
3138QCBOREncode_AddTDecimalFractionBigNumToMapSZ(QCBOREncodeContext *pMe,
3139 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003140 const uint8_t uTagRequirement,
3141 const UsefulBufC Mantissa,
3142 const bool bIsNegative,
3143 const int64_t nBase10Exponent)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003144{
3145 QCBOREncode_AddSZString(pMe, szLabel);
Laurence Lundblade3eead482023-12-16 20:53:22 -07003146 QCBOREncode_AddTDecimalFractionBigNum(pMe,
3147 uTagRequirement,
3148 Mantissa,
3149 bIsNegative,
3150 nBase10Exponent);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003151}
3152
Laurence Lundblade45d5e482020-09-15 21:15:15 -07003153static inline void
3154QCBOREncode_AddTDecimalFractionBigNumToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003155 const int64_t nLabel,
3156 const uint8_t uTagRequirement,
3157 const UsefulBufC Mantissa,
3158 const bool bIsNegative,
3159 const int64_t nBase10Exponent)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003160{
3161 QCBOREncode_AddInt64(pMe, nLabel);
Laurence Lundblade3eead482023-12-16 20:53:22 -07003162 QCBOREncode_AddTDecimalFractionBigNum(pMe,
3163 uTagRequirement,
3164 Mantissa,
3165 bIsNegative,
3166 nBase10Exponent);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003167}
3168
Laurence Lundblade45d5e482020-09-15 21:15:15 -07003169static inline void
3170QCBOREncode_AddDecimalFractionBigNum(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003171 const UsefulBufC Mantissa,
3172 const bool bIsNegative,
3173 const int64_t nBase10Exponent)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003174{
Laurence Lundblade3eead482023-12-16 20:53:22 -07003175 QCBOREncode_AddTDecimalFractionBigNum(pMe,
3176 QCBOR_ENCODE_AS_TAG,
3177 Mantissa,
3178 bIsNegative,
3179 nBase10Exponent);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003180}
3181
Laurence Lundblade45d5e482020-09-15 21:15:15 -07003182static inline void
3183QCBOREncode_AddDecimalFractionBigNumToMapSZ(QCBOREncodeContext *pMe,
3184 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003185 const UsefulBufC Mantissa,
3186 const bool bIsNegative,
3187 const int64_t nBase10Exponent)
Michael Eckel5c531332020-03-02 01:35:30 +01003188{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003189 QCBOREncode_AddTDecimalFractionBigNumToMapSZ(pMe,
3190 szLabel,
3191 QCBOR_ENCODE_AS_TAG,
3192 Mantissa,
3193 bIsNegative,
3194 nBase10Exponent);
Michael Eckel5c531332020-03-02 01:35:30 +01003195}
3196
Laurence Lundblade45d5e482020-09-15 21:15:15 -07003197static inline void
3198QCBOREncode_AddDecimalFractionBigNumToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003199 const int64_t nLabel,
3200 const UsefulBufC Mantissa,
3201 const bool bIsNegative,
3202 const int64_t nBase2Exponent)
Michael Eckel5c531332020-03-02 01:35:30 +01003203{
Laurence Lundblade45d5e482020-09-15 21:15:15 -07003204 QCBOREncode_AddTDecimalFractionBigNumToMapN(pMe,
3205 nLabel,
3206 QCBOR_ENCODE_AS_TAG,
3207 Mantissa,
3208 bIsNegative,
3209 nBase2Exponent);
Michael Eckel5c531332020-03-02 01:35:30 +01003210}
3211
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003212
3213
3214
3215
Laurence Lundblade45d5e482020-09-15 21:15:15 -07003216static inline void
3217QCBOREncode_AddTBigFloat(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003218 const uint8_t uTagRequirement,
3219 const int64_t nMantissa,
3220 const int64_t nBase2Exponent)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003221{
3222 uint64_t uTag;
3223 if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
3224 uTag = CBOR_TAG_BIGFLOAT;
3225 } else {
3226 uTag = CBOR_TAG_INVALID64;
3227 }
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003228 QCBOREncode_Private_AddExpMantissa(pMe,
Laurence Lundblade3eead482023-12-16 20:53:22 -07003229 uTag,
3230 NULLUsefulBufC,
3231 false,
3232 nMantissa,
3233 nBase2Exponent);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003234}
3235
Laurence Lundblade45d5e482020-09-15 21:15:15 -07003236static inline void
3237QCBOREncode_AddTBigFloatToMapSZ(QCBOREncodeContext *pMe,
3238 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003239 const uint8_t uTagRequirement,
3240 const int64_t nMantissa,
3241 const int64_t nBase2Exponent)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003242{
3243 QCBOREncode_AddSZString(pMe, szLabel);
3244 QCBOREncode_AddTBigFloat(pMe, uTagRequirement, nMantissa, nBase2Exponent);
3245}
3246
Laurence Lundblade45d5e482020-09-15 21:15:15 -07003247static inline void
3248QCBOREncode_AddTBigFloatToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003249 const int64_t nLabel,
3250 const uint8_t uTagRequirement,
3251 const int64_t nMantissa,
3252 const int64_t nBase2Exponent)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003253{
3254 QCBOREncode_AddInt64(pMe, nLabel);
3255 QCBOREncode_AddTBigFloat(pMe, uTagRequirement, nMantissa, nBase2Exponent);
3256}
3257
Laurence Lundblade45d5e482020-09-15 21:15:15 -07003258static inline void
3259QCBOREncode_AddBigFloat(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003260 const int64_t nMantissa,
3261 const int64_t nBase2Exponent)
Michael Eckel5c531332020-03-02 01:35:30 +01003262{
Laurence Lundblade3eead482023-12-16 20:53:22 -07003263 QCBOREncode_AddTBigFloat(pMe,
3264 QCBOR_ENCODE_AS_TAG,
3265 nMantissa,
3266 nBase2Exponent);
Michael Eckel5c531332020-03-02 01:35:30 +01003267}
3268
Laurence Lundblade45d5e482020-09-15 21:15:15 -07003269static inline void
3270QCBOREncode_AddBigFloatToMap(QCBOREncodeContext *pMe,
3271 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003272 const int64_t nMantissa,
3273 const int64_t nBase2Exponent)
Michael Eckel5c531332020-03-02 01:35:30 +01003274{
Laurence Lundblade3eead482023-12-16 20:53:22 -07003275 QCBOREncode_AddTBigFloatToMapSZ(pMe,
3276 szLabel,
3277 QCBOR_ENCODE_AS_TAG,
3278 nMantissa,
3279 nBase2Exponent);
Michael Eckel5c531332020-03-02 01:35:30 +01003280}
3281
Laurence Lundblade45d5e482020-09-15 21:15:15 -07003282static inline void
3283QCBOREncode_AddBigFloatToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003284 const int64_t nLabel,
3285 const int64_t nMantissa,
3286 const int64_t nBase2Exponent)
Michael Eckel5c531332020-03-02 01:35:30 +01003287{
Laurence Lundblade3eead482023-12-16 20:53:22 -07003288 QCBOREncode_AddTBigFloatToMapN(pMe,
3289 nLabel,
3290 QCBOR_ENCODE_AS_TAG,
3291 nMantissa,
3292 nBase2Exponent);
Michael Eckel5c531332020-03-02 01:35:30 +01003293}
3294
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003295
3296
Laurence Lundblade45d5e482020-09-15 21:15:15 -07003297static inline void
3298QCBOREncode_AddTBigFloatBigNum(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003299 const uint8_t uTagRequirement,
3300 const UsefulBufC Mantissa,
3301 const bool bIsNegative,
3302 const int64_t nBase2Exponent)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003303{
3304 uint64_t uTag;
3305 if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
3306 uTag = CBOR_TAG_BIGFLOAT;
3307 } else {
3308 uTag = CBOR_TAG_INVALID64;
3309 }
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003310 QCBOREncode_Private_AddExpMantissa(pMe,
Laurence Lundblade3eead482023-12-16 20:53:22 -07003311 uTag,
3312 Mantissa,
3313 bIsNegative,
3314 0,
3315 nBase2Exponent);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003316}
3317
Laurence Lundblade45d5e482020-09-15 21:15:15 -07003318static inline void
3319QCBOREncode_AddTBigFloatBigNumToMapSZ(QCBOREncodeContext *pMe,
3320 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003321 const uint8_t uTagRequirement,
3322 const UsefulBufC Mantissa,
3323 const bool bIsNegative,
3324 const int64_t nBase2Exponent)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003325{
3326 QCBOREncode_AddSZString(pMe, szLabel);
Laurence Lundblade3eead482023-12-16 20:53:22 -07003327 QCBOREncode_AddTBigFloatBigNum(pMe,
3328 uTagRequirement,
3329 Mantissa,
3330 bIsNegative,
3331 nBase2Exponent);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003332}
3333
Laurence Lundblade45d5e482020-09-15 21:15:15 -07003334static inline void
3335QCBOREncode_AddTBigFloatBigNumToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003336 const int64_t nLabel,
3337 const uint8_t uTagRequirement,
3338 const UsefulBufC Mantissa,
3339 const bool bIsNegative,
3340 const int64_t nBase2Exponent)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003341{
3342 QCBOREncode_AddInt64(pMe, nLabel);
Laurence Lundblade3eead482023-12-16 20:53:22 -07003343 QCBOREncode_AddTBigFloatBigNum(pMe,
3344 uTagRequirement,
3345 Mantissa,
3346 bIsNegative,
3347 nBase2Exponent);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003348}
3349
3350
Laurence Lundblade45d5e482020-09-15 21:15:15 -07003351static inline void
3352QCBOREncode_AddBigFloatBigNum(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003353 const UsefulBufC Mantissa,
3354 const bool bIsNegative,
3355 const int64_t nBase2Exponent)
Michael Eckel5c531332020-03-02 01:35:30 +01003356{
Laurence Lundblade3eead482023-12-16 20:53:22 -07003357 QCBOREncode_AddTBigFloatBigNum(pMe,
3358 QCBOR_ENCODE_AS_TAG,
3359 Mantissa, bIsNegative,
3360 nBase2Exponent);
Michael Eckel5c531332020-03-02 01:35:30 +01003361}
3362
Laurence Lundblade45d5e482020-09-15 21:15:15 -07003363static inline void
3364QCBOREncode_AddBigFloatBigNumToMap(QCBOREncodeContext *pMe,
3365 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003366 const UsefulBufC Mantissa,
3367 const bool bIsNegative,
3368 const int64_t nBase2Exponent)
Michael Eckel5c531332020-03-02 01:35:30 +01003369{
Laurence Lundblade3eead482023-12-16 20:53:22 -07003370 QCBOREncode_AddTBigFloatBigNumToMapSZ(pMe,
3371 szLabel,
3372 QCBOR_ENCODE_AS_TAG,
3373 Mantissa,
3374 bIsNegative,
3375 nBase2Exponent);
Michael Eckel5c531332020-03-02 01:35:30 +01003376}
3377
Laurence Lundblade45d5e482020-09-15 21:15:15 -07003378static inline void
3379QCBOREncode_AddBigFloatBigNumToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003380 const int64_t nLabel,
3381 const UsefulBufC Mantissa,
3382 const bool bIsNegative,
3383 const int64_t nBase2Exponent)
Michael Eckel5c531332020-03-02 01:35:30 +01003384{
Laurence Lundblade3eead482023-12-16 20:53:22 -07003385 QCBOREncode_AddTBigFloatBigNumToMapN(pMe,
3386 nLabel,
3387 QCBOR_ENCODE_AS_TAG,
3388 Mantissa,
3389 bIsNegative,
3390 nBase2Exponent);
Michael Eckel5c531332020-03-02 01:35:30 +01003391}
Laurence Lundbladedd6e76e2021-03-10 01:54:01 -07003392#endif /* QCBOR_DISABLE_EXP_AND_MANTISSA */
Michael Eckel5c531332020-03-02 01:35:30 +01003393
3394
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003395static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003396QCBOREncode_AddTURI(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003397 const uint8_t uTagRequirement,
3398 const UsefulBufC URI)
Michael Eckel5c531332020-03-02 01:35:30 +01003399{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003400 if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
3401 QCBOREncode_AddTag(pMe, CBOR_TAG_URI);
3402 }
3403 QCBOREncode_AddText(pMe, URI);
Michael Eckel5c531332020-03-02 01:35:30 +01003404}
3405
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003406static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003407QCBOREncode_AddTURIToMapSZ(QCBOREncodeContext *pMe,
3408 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003409 const uint8_t uTagRequirement,
3410 const UsefulBufC URI)
Michael Eckel5c531332020-03-02 01:35:30 +01003411{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003412 QCBOREncode_AddSZString(pMe, szLabel);
3413 QCBOREncode_AddTURI(pMe, uTagRequirement, URI);
Michael Eckel5c531332020-03-02 01:35:30 +01003414}
3415
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003416static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003417QCBOREncode_AddTURIToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003418 const int64_t nLabel,
3419 const uint8_t uTagRequirement,
3420 const UsefulBufC URI)
Michael Eckel5c531332020-03-02 01:35:30 +01003421{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003422 QCBOREncode_AddInt64(pMe, nLabel);
3423 QCBOREncode_AddTURI(pMe, uTagRequirement, URI);
3424}
3425
3426static inline void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003427QCBOREncode_AddURI(QCBOREncodeContext *pMe, const UsefulBufC URI)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003428{
3429 QCBOREncode_AddTURI(pMe, QCBOR_ENCODE_AS_TAG, URI);
3430}
3431
3432static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003433QCBOREncode_AddURIToMap(QCBOREncodeContext *pMe,
3434 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003435 const UsefulBufC URI)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003436{
3437 QCBOREncode_AddTURIToMapSZ(pMe, szLabel, QCBOR_ENCODE_AS_TAG, URI);
3438}
3439
3440static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003441QCBOREncode_AddURIToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003442 const int64_t nLabel,
3443 const UsefulBufC URI)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003444{
3445 QCBOREncode_AddTURIToMapN(pMe, nLabel, QCBOR_ENCODE_AS_TAG, URI);
Michael Eckel5c531332020-03-02 01:35:30 +01003446}
3447
3448
3449
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003450static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003451QCBOREncode_AddTB64Text(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003452 const uint8_t uTagRequirement,
3453 const UsefulBufC B64Text)
Michael Eckel5c531332020-03-02 01:35:30 +01003454{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003455 if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
3456 QCBOREncode_AddTag(pMe, CBOR_TAG_B64);
3457 }
3458 QCBOREncode_AddText(pMe, B64Text);
Michael Eckel5c531332020-03-02 01:35:30 +01003459}
3460
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003461static inline void
3462QCBOREncode_AddTB64TextToMapSZ(QCBOREncodeContext *pMe,
3463 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003464 const uint8_t uTagRequirement,
3465 const UsefulBufC B64Text)
Michael Eckel5c531332020-03-02 01:35:30 +01003466{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003467 QCBOREncode_AddSZString(pMe, szLabel);
3468 QCBOREncode_AddTB64Text(pMe, uTagRequirement, B64Text);
Michael Eckel5c531332020-03-02 01:35:30 +01003469}
3470
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003471static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003472QCBOREncode_AddTB64TextToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003473 const int64_t nLabel,
3474 const uint8_t uTagRequirement,
3475 const UsefulBufC B64Text)
Michael Eckel5c531332020-03-02 01:35:30 +01003476{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003477 QCBOREncode_AddInt64(pMe, nLabel);
3478 QCBOREncode_AddTB64Text(pMe, uTagRequirement, B64Text);
3479}
3480
3481static inline void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003482QCBOREncode_AddB64Text(QCBOREncodeContext *pMe, const UsefulBufC B64Text)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003483{
3484 QCBOREncode_AddTB64Text(pMe, QCBOR_ENCODE_AS_TAG, B64Text);
3485}
3486
3487static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003488QCBOREncode_AddB64TextToMap(QCBOREncodeContext *pMe,
3489 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003490 const UsefulBufC B64Text)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003491{
3492 QCBOREncode_AddTB64TextToMapSZ(pMe, szLabel, QCBOR_ENCODE_AS_TAG, B64Text);
3493}
3494
3495static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003496QCBOREncode_AddB64TextToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003497 const int64_t nLabel,
3498 const UsefulBufC B64Text)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003499{
3500 QCBOREncode_AddTB64TextToMapN(pMe, nLabel, QCBOR_ENCODE_AS_TAG, B64Text);
Michael Eckel5c531332020-03-02 01:35:30 +01003501}
3502
3503
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003504
3505static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003506QCBOREncode_AddTB64URLText(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003507 const uint8_t uTagRequirement,
3508 const UsefulBufC B64Text)
Michael Eckel5c531332020-03-02 01:35:30 +01003509{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003510 if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
3511 QCBOREncode_AddTag(pMe, CBOR_TAG_B64URL);
3512 }
3513 QCBOREncode_AddText(pMe, B64Text);
Michael Eckel5c531332020-03-02 01:35:30 +01003514}
3515
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003516static inline void
3517QCBOREncode_AddTB64URLTextToMapSZ(QCBOREncodeContext *pMe,
3518 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003519 const uint8_t uTagRequirement,
3520 const UsefulBufC B64Text)
Michael Eckel5c531332020-03-02 01:35:30 +01003521{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003522 QCBOREncode_AddSZString(pMe, szLabel);
3523 QCBOREncode_AddTB64URLText(pMe, uTagRequirement, B64Text);
Michael Eckel5c531332020-03-02 01:35:30 +01003524}
3525
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003526static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003527QCBOREncode_AddTB64URLTextToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003528 const int64_t nLabel,
3529 const uint8_t uTagRequirement,
3530 const UsefulBufC B64Text)
Michael Eckel5c531332020-03-02 01:35:30 +01003531{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003532 QCBOREncode_AddInt64(pMe, nLabel);
3533 QCBOREncode_AddTB64URLText(pMe, uTagRequirement, B64Text);
3534}
3535
3536static inline void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003537QCBOREncode_AddB64URLText(QCBOREncodeContext *pMe, const UsefulBufC B64Text)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003538{
3539 QCBOREncode_AddTB64URLText(pMe, QCBOR_ENCODE_AS_TAG, B64Text);
3540}
3541
3542static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003543QCBOREncode_AddB64URLTextToMap(QCBOREncodeContext *pMe,
3544 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003545 const UsefulBufC B64Text)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003546{
Laurence Lundblade3eead482023-12-16 20:53:22 -07003547 QCBOREncode_AddTB64URLTextToMapSZ(pMe,
3548 szLabel,
3549 QCBOR_ENCODE_AS_TAG,
3550 B64Text);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003551}
3552
3553static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003554QCBOREncode_AddB64URLTextToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003555 const int64_t nLabel,
3556 const UsefulBufC B64Text)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003557{
3558 QCBOREncode_AddTB64URLTextToMapN(pMe, nLabel, QCBOR_ENCODE_AS_TAG, B64Text);
Michael Eckel5c531332020-03-02 01:35:30 +01003559}
3560
3561
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003562
3563static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003564QCBOREncode_AddTRegex(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003565 const uint8_t uTagRequirement,
3566 const UsefulBufC Bytes)
Michael Eckel5c531332020-03-02 01:35:30 +01003567{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003568 if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
3569 QCBOREncode_AddTag(pMe, CBOR_TAG_REGEX);
3570 }
3571 QCBOREncode_AddText(pMe, Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01003572}
3573
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003574static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003575QCBOREncode_AddTRegexToMapSZ(QCBOREncodeContext *pMe,
3576 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003577 const uint8_t uTagRequirement,
3578 const UsefulBufC Bytes)
Michael Eckel5c531332020-03-02 01:35:30 +01003579{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003580 QCBOREncode_AddSZString(pMe, szLabel);
3581 QCBOREncode_AddTRegex(pMe, uTagRequirement, Bytes);
Michael Eckel5c531332020-03-02 01:35:30 +01003582}
3583
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003584static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003585QCBOREncode_AddTRegexToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003586 const int64_t nLabel,
3587 const uint8_t uTagRequirement,
3588 const UsefulBufC Bytes)
Michael Eckel5c531332020-03-02 01:35:30 +01003589{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003590 QCBOREncode_AddInt64(pMe, nLabel);
3591 QCBOREncode_AddTRegex(pMe, uTagRequirement, Bytes);
3592}
3593
3594static inline void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003595QCBOREncode_AddRegex(QCBOREncodeContext *pMe, const UsefulBufC Bytes)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003596{
3597 QCBOREncode_AddTRegex(pMe, QCBOR_ENCODE_AS_TAG, Bytes);
3598}
3599
3600static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003601QCBOREncode_AddRegexToMap(QCBOREncodeContext *pMe,
3602 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003603 const UsefulBufC Bytes)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003604{
3605 QCBOREncode_AddTRegexToMapSZ(pMe, szLabel, QCBOR_ENCODE_AS_TAG, Bytes);
3606}
3607
3608static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003609QCBOREncode_AddRegexToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003610 const int64_t nLabel,
3611 const UsefulBufC Bytes)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003612{
3613 QCBOREncode_AddTRegexToMapN(pMe, nLabel, QCBOR_ENCODE_AS_TAG, Bytes);
3614
Michael Eckel5c531332020-03-02 01:35:30 +01003615}
3616
3617
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003618static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003619QCBOREncode_AddTMIMEData(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003620 const uint8_t uTagRequirement,
3621 const UsefulBufC MIMEData)
Michael Eckel5c531332020-03-02 01:35:30 +01003622{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003623 if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
Laurence Lundblade4982f412020-09-18 23:02:18 -07003624 QCBOREncode_AddTag(pMe, CBOR_TAG_BINARY_MIME);
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003625 }
Laurence Lundblade4982f412020-09-18 23:02:18 -07003626 QCBOREncode_AddBytes(pMe, MIMEData);
Michael Eckel5c531332020-03-02 01:35:30 +01003627}
3628
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003629static inline void
3630QCBOREncode_AddTMIMEDataToMapSZ(QCBOREncodeContext *pMe,
3631 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003632 const uint8_t uTagRequirement,
3633 const UsefulBufC MIMEData)
Michael Eckel5c531332020-03-02 01:35:30 +01003634{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003635 QCBOREncode_AddSZString(pMe, szLabel);
3636 QCBOREncode_AddTMIMEData(pMe, uTagRequirement, MIMEData);
Michael Eckel5c531332020-03-02 01:35:30 +01003637}
3638
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003639static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003640QCBOREncode_AddTMIMEDataToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003641 const int64_t nLabel,
3642 const uint8_t uTagRequirement,
3643 const UsefulBufC MIMEData)
Michael Eckel5c531332020-03-02 01:35:30 +01003644{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003645 QCBOREncode_AddInt64(pMe, nLabel);
3646 QCBOREncode_AddTMIMEData(pMe, uTagRequirement, MIMEData);
3647}
3648
3649static inline void
3650QCBOREncode_AddMIMEData(QCBOREncodeContext *pMe, UsefulBufC MIMEData)
3651{
3652 QCBOREncode_AddTMIMEData(pMe, QCBOR_ENCODE_AS_TAG, MIMEData);
3653}
3654
3655static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003656QCBOREncode_AddMIMEDataToMap(QCBOREncodeContext *pMe,
3657 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003658 const UsefulBufC MIMEData)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003659{
3660 QCBOREncode_AddTMIMEDataToMapSZ(pMe, szLabel, QCBOR_ENCODE_AS_TAG, MIMEData);
3661}
3662
3663static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003664QCBOREncode_AddMIMEDataToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003665 const int64_t nLabel,
3666 const UsefulBufC MIMEData)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003667{
3668 QCBOREncode_AddTMIMEDataToMapN(pMe, nLabel, QCBOR_ENCODE_AS_TAG, MIMEData);
Michael Eckel5c531332020-03-02 01:35:30 +01003669}
3670
3671
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003672static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003673QCBOREncode_AddTDateString(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003674 const uint8_t uTagRequirement,
Laurence Lundblade3eead482023-12-16 20:53:22 -07003675 const char *szDate)
Michael Eckel5c531332020-03-02 01:35:30 +01003676{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003677 if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
3678 QCBOREncode_AddTag(pMe, CBOR_TAG_DATE_STRING);
3679 }
3680 QCBOREncode_AddSZString(pMe, szDate);
Michael Eckel5c531332020-03-02 01:35:30 +01003681}
3682
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003683static inline void
3684QCBOREncode_AddTDateStringToMapSZ(QCBOREncodeContext *pMe,
3685 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003686 const uint8_t uTagRequirement,
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003687 const char *szDate)
Michael Eckel5c531332020-03-02 01:35:30 +01003688{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003689 QCBOREncode_AddSZString(pMe, szLabel);
3690 QCBOREncode_AddTDateString(pMe, uTagRequirement, szDate);
Michael Eckel5c531332020-03-02 01:35:30 +01003691}
3692
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003693static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003694QCBOREncode_AddTDateStringToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003695 const int64_t nLabel,
3696 const uint8_t uTagRequirement,
Laurence Lundblade3eead482023-12-16 20:53:22 -07003697 const char *szDate)
Michael Eckel5c531332020-03-02 01:35:30 +01003698{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003699 QCBOREncode_AddInt64(pMe, nLabel);
3700 QCBOREncode_AddTDateString(pMe, uTagRequirement, szDate);
3701}
3702
3703static inline void
3704QCBOREncode_AddDateString(QCBOREncodeContext *pMe, const char *szDate)
3705{
3706 QCBOREncode_AddTDateString(pMe, QCBOR_ENCODE_AS_TAG, szDate);
3707}
3708
3709static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003710QCBOREncode_AddDateStringToMap(QCBOREncodeContext *pMe,
3711 const char *szLabel,
3712 const char *szDate)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003713{
3714 QCBOREncode_AddTDateStringToMapSZ(pMe, szLabel, QCBOR_ENCODE_AS_TAG, szDate);
3715}
3716
3717static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003718QCBOREncode_AddDateStringToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003719 const int64_t nLabel,
Laurence Lundblade3eead482023-12-16 20:53:22 -07003720 const char *szDate)
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003721{
3722 QCBOREncode_AddTDateStringToMapN(pMe, nLabel, QCBOR_ENCODE_AS_TAG, szDate);
Michael Eckel5c531332020-03-02 01:35:30 +01003723}
3724
3725
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003726static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003727QCBOREncode_AddTDaysString(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003728 const uint8_t uTagRequirement,
Laurence Lundblade3eead482023-12-16 20:53:22 -07003729 const char *szDate)
Laurence Lundblade46d63e92021-05-13 11:37:10 -07003730{
3731 if(uTagRequirement == QCBOR_ENCODE_AS_TAG) {
3732 QCBOREncode_AddTag(pMe, CBOR_TAG_DAYS_STRING);
3733 }
3734 QCBOREncode_AddSZString(pMe, szDate);
3735}
3736
3737static inline void
3738QCBOREncode_AddTDaysStringToMapSZ(QCBOREncodeContext *pMe,
3739 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003740 const uint8_t uTagRequirement,
Laurence Lundblade46d63e92021-05-13 11:37:10 -07003741 const char *szDate)
3742{
3743 QCBOREncode_AddSZString(pMe, szLabel);
3744 QCBOREncode_AddTDaysString(pMe, uTagRequirement, szDate);
3745}
3746
3747static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003748QCBOREncode_AddTDaysStringToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003749 const int64_t nLabel,
3750 const uint8_t uTagRequirement,
Laurence Lundblade3eead482023-12-16 20:53:22 -07003751 const char *szDate)
Laurence Lundblade46d63e92021-05-13 11:37:10 -07003752{
3753 QCBOREncode_AddInt64(pMe, nLabel);
3754 QCBOREncode_AddTDaysString(pMe, uTagRequirement, szDate);
3755}
3756
3757
Laurence Lundblade46d63e92021-05-13 11:37:10 -07003758static inline void
Laurence Lundblade3888f002024-06-12 21:20:56 -07003759QCBOREncode_AddSimple(QCBOREncodeContext *pMe, const uint8_t uNum)
Michael Eckel5c531332020-03-02 01:35:30 +01003760{
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07003761 /* This check often is optimized out because uNum is known at compile time. */
3762#ifndef QCBOR_DISABLE_ENCODE_USAGE_GUARDS
3763 if(uNum >= CBOR_SIMPLEV_RESERVED_START && uNum <= CBOR_SIMPLEV_RESERVED_END) {
3764 pMe->uError = QCBOR_ERR_ENCODE_UNSUPPORTED;
3765 return;
3766 }
3767#endif /* !QCBOR_DISABLE_ENCODE_USAGE_GUARDS */
3768
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003769 QCBOREncode_Private_AddType7(pMe, 0, uNum);
Michael Eckel5c531332020-03-02 01:35:30 +01003770}
3771
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003772static inline void
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07003773QCBOREncode_AddSimpleToMap(QCBOREncodeContext *pMe,
Laurence Lundblade3888f002024-06-12 21:20:56 -07003774 const char *szLabel,
3775 const uint8_t uSimple)
Michael Eckel5c531332020-03-02 01:35:30 +01003776{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003777 QCBOREncode_AddSZString(pMe, szLabel);
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07003778 QCBOREncode_AddSimple(pMe, uSimple);
Michael Eckel5c531332020-03-02 01:35:30 +01003779}
3780
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003781static inline void
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07003782QCBOREncode_AddSimpleToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade3888f002024-06-12 21:20:56 -07003783 const int64_t nLabel,
3784 const uint8_t uSimple)
Michael Eckel5c531332020-03-02 01:35:30 +01003785{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003786 QCBOREncode_AddInt64(pMe, nLabel);
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07003787 QCBOREncode_AddSimple(pMe, uSimple);
Michael Eckel5c531332020-03-02 01:35:30 +01003788}
3789
3790
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003791static inline void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003792QCBOREncode_AddBool(QCBOREncodeContext *pMe, const bool b)
Michael Eckel5c531332020-03-02 01:35:30 +01003793{
3794 uint8_t uSimple = CBOR_SIMPLEV_FALSE;
3795 if(b) {
3796 uSimple = CBOR_SIMPLEV_TRUE;
3797 }
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07003798 QCBOREncode_AddSimple(pMe, uSimple);
Michael Eckel5c531332020-03-02 01:35:30 +01003799}
3800
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003801static inline void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003802QCBOREncode_AddBoolToMap(QCBOREncodeContext *pMe, const char *szLabel, const bool b)
Michael Eckel5c531332020-03-02 01:35:30 +01003803{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003804 QCBOREncode_AddSZString(pMe, szLabel);
3805 QCBOREncode_AddBool(pMe, b);
Michael Eckel5c531332020-03-02 01:35:30 +01003806}
3807
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003808static inline void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003809QCBOREncode_AddBoolToMapN(QCBOREncodeContext *pMe, const int64_t nLabel, const bool b)
Michael Eckel5c531332020-03-02 01:35:30 +01003810{
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003811 QCBOREncode_AddInt64(pMe, nLabel);
3812 QCBOREncode_AddBool(pMe, b);
Michael Eckel5c531332020-03-02 01:35:30 +01003813}
3814
3815
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003816static inline void
3817QCBOREncode_AddNULL(QCBOREncodeContext *pMe)
Michael Eckel5c531332020-03-02 01:35:30 +01003818{
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07003819 QCBOREncode_AddSimple(pMe, CBOR_SIMPLEV_NULL);
Michael Eckel5c531332020-03-02 01:35:30 +01003820}
3821
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003822static inline void
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003823QCBOREncode_AddNULLToMap(QCBOREncodeContext *pMe, const char *szLabel)
Michael Eckel5c531332020-03-02 01:35:30 +01003824{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003825 QCBOREncode_AddSZString(pMe, szLabel);
3826 QCBOREncode_AddNULL(pMe);
Michael Eckel5c531332020-03-02 01:35:30 +01003827}
3828
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003829static inline void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003830QCBOREncode_AddNULLToMapN(QCBOREncodeContext *pMe, const int64_t nLabel)
Michael Eckel5c531332020-03-02 01:35:30 +01003831{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003832 QCBOREncode_AddInt64(pMe, nLabel);
3833 QCBOREncode_AddNULL(pMe);
Michael Eckel5c531332020-03-02 01:35:30 +01003834}
3835
3836
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003837static inline void
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003838QCBOREncode_AddUndef(QCBOREncodeContext *pMe)
Michael Eckel5c531332020-03-02 01:35:30 +01003839{
Laurence Lundbladecbd7d132024-05-19 11:11:22 -07003840 QCBOREncode_AddSimple(pMe, CBOR_SIMPLEV_UNDEF);
Michael Eckel5c531332020-03-02 01:35:30 +01003841}
3842
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003843static inline void
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003844QCBOREncode_AddUndefToMap(QCBOREncodeContext *pMe, const char *szLabel)
Michael Eckel5c531332020-03-02 01:35:30 +01003845{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003846 QCBOREncode_AddSZString(pMe, szLabel);
3847 QCBOREncode_AddUndef(pMe);
Michael Eckel5c531332020-03-02 01:35:30 +01003848}
3849
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003850static inline void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003851QCBOREncode_AddUndefToMapN(QCBOREncodeContext *pMe, const int64_t nLabel)
Michael Eckel5c531332020-03-02 01:35:30 +01003852{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003853 QCBOREncode_AddInt64(pMe, nLabel);
3854 QCBOREncode_AddUndef(pMe);
Michael Eckel5c531332020-03-02 01:35:30 +01003855}
3856
3857
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003858static inline void
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003859QCBOREncode_OpenArray(QCBOREncodeContext *pMe)
Michael Eckel5c531332020-03-02 01:35:30 +01003860{
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003861 QCBOREncode_Private_OpenMapOrArray(pMe, CBOR_MAJOR_TYPE_ARRAY);
Michael Eckel5c531332020-03-02 01:35:30 +01003862}
3863
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003864static inline void
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003865QCBOREncode_OpenArrayInMap(QCBOREncodeContext *pMe, const char *szLabel)
Michael Eckel5c531332020-03-02 01:35:30 +01003866{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003867 QCBOREncode_AddSZString(pMe, szLabel);
3868 QCBOREncode_OpenArray(pMe);
Michael Eckel5c531332020-03-02 01:35:30 +01003869}
3870
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003871static inline void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003872QCBOREncode_OpenArrayInMapN(QCBOREncodeContext *pMe, const int64_t nLabel)
Michael Eckel5c531332020-03-02 01:35:30 +01003873{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003874 QCBOREncode_AddInt64(pMe, nLabel);
3875 QCBOREncode_OpenArray(pMe);
Michael Eckel5c531332020-03-02 01:35:30 +01003876}
3877
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003878static inline void
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003879QCBOREncode_CloseArray(QCBOREncodeContext *pMe)
Michael Eckel5c531332020-03-02 01:35:30 +01003880{
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003881 QCBOREncode_Private_CloseMapOrArray(pMe, CBOR_MAJOR_TYPE_ARRAY);
Michael Eckel5c531332020-03-02 01:35:30 +01003882}
3883
3884
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003885static inline void
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003886QCBOREncode_OpenMap(QCBOREncodeContext *pMe)
Michael Eckel5c531332020-03-02 01:35:30 +01003887{
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003888 QCBOREncode_Private_OpenMapOrArray(pMe, CBOR_MAJOR_TYPE_MAP);
Michael Eckel5c531332020-03-02 01:35:30 +01003889}
3890
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003891static inline void
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003892QCBOREncode_OpenMapInMap(QCBOREncodeContext *pMe, const char *szLabel)
Michael Eckel5c531332020-03-02 01:35:30 +01003893{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003894 QCBOREncode_AddSZString(pMe, szLabel);
3895 QCBOREncode_OpenMap(pMe);
Michael Eckel5c531332020-03-02 01:35:30 +01003896}
3897
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003898static inline void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003899QCBOREncode_OpenMapInMapN(QCBOREncodeContext *pMe, const int64_t nLabel)
Michael Eckel5c531332020-03-02 01:35:30 +01003900{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003901 QCBOREncode_AddInt64(pMe, nLabel);
3902 QCBOREncode_OpenMap(pMe);
Michael Eckel5c531332020-03-02 01:35:30 +01003903}
3904
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003905static inline void
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003906QCBOREncode_CloseMap(QCBOREncodeContext *pMe)
Michael Eckel5c531332020-03-02 01:35:30 +01003907{
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003908 QCBOREncode_Private_CloseMapOrArray(pMe, CBOR_MAJOR_TYPE_MAP);
Michael Eckel5c531332020-03-02 01:35:30 +01003909}
3910
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003911static inline void
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003912QCBOREncode_OpenArrayIndefiniteLength(QCBOREncodeContext *pMe)
Michael Eckel5c531332020-03-02 01:35:30 +01003913{
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003914 QCBOREncode_Private_OpenMapOrArrayIndefiniteLength(pMe, CBOR_MAJOR_NONE_TYPE_ARRAY_INDEFINITE_LEN);
Michael Eckel5c531332020-03-02 01:35:30 +01003915}
3916
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003917static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003918QCBOREncode_OpenArrayIndefiniteLengthInMap(QCBOREncodeContext *pMe,
3919 const char *szLabel)
Michael Eckel5c531332020-03-02 01:35:30 +01003920{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003921 QCBOREncode_AddSZString(pMe, szLabel);
3922 QCBOREncode_OpenArrayIndefiniteLength(pMe);
Michael Eckel5c531332020-03-02 01:35:30 +01003923}
3924
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003925static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003926QCBOREncode_OpenArrayIndefiniteLengthInMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003927 const int64_t nLabel)
Michael Eckel5c531332020-03-02 01:35:30 +01003928{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003929 QCBOREncode_AddInt64(pMe, nLabel);
3930 QCBOREncode_OpenArrayIndefiniteLength(pMe);
Michael Eckel5c531332020-03-02 01:35:30 +01003931}
3932
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003933static inline void
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003934QCBOREncode_CloseArrayIndefiniteLength(QCBOREncodeContext *pMe)
Michael Eckel5c531332020-03-02 01:35:30 +01003935{
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003936 QCBOREncode_Private_CloseMapOrArrayIndefiniteLength(pMe, CBOR_MAJOR_NONE_TYPE_ARRAY_INDEFINITE_LEN);
Michael Eckel5c531332020-03-02 01:35:30 +01003937}
3938
3939
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003940static inline void
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003941QCBOREncode_OpenMapIndefiniteLength(QCBOREncodeContext *pMe)
Michael Eckel5c531332020-03-02 01:35:30 +01003942{
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003943 QCBOREncode_Private_OpenMapOrArrayIndefiniteLength(pMe, CBOR_MAJOR_NONE_TYPE_MAP_INDEFINITE_LEN);
Michael Eckel5c531332020-03-02 01:35:30 +01003944}
3945
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003946static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003947QCBOREncode_OpenMapIndefiniteLengthInMap(QCBOREncodeContext *pMe,
3948 const char *szLabel)
Michael Eckel5c531332020-03-02 01:35:30 +01003949{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003950 QCBOREncode_AddSZString(pMe, szLabel);
3951 QCBOREncode_OpenMapIndefiniteLength(pMe);
Michael Eckel5c531332020-03-02 01:35:30 +01003952}
3953
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003954static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003955QCBOREncode_OpenMapIndefiniteLengthInMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003956 const int64_t nLabel)
Michael Eckel5c531332020-03-02 01:35:30 +01003957{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003958 QCBOREncode_AddInt64(pMe, nLabel);
3959 QCBOREncode_OpenMapIndefiniteLength(pMe);
Michael Eckel5c531332020-03-02 01:35:30 +01003960}
3961
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003962static inline void
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003963QCBOREncode_CloseMapIndefiniteLength(QCBOREncodeContext *pMe)
Michael Eckel5c531332020-03-02 01:35:30 +01003964{
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003965 QCBOREncode_Private_CloseMapOrArrayIndefiniteLength(pMe, CBOR_MAJOR_NONE_TYPE_MAP_INDEFINITE_LEN);
Michael Eckel5c531332020-03-02 01:35:30 +01003966}
3967
3968
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003969static inline void
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003970QCBOREncode_BstrWrap(QCBOREncodeContext *pMe)
Michael Eckel5c531332020-03-02 01:35:30 +01003971{
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003972 QCBOREncode_Private_OpenMapOrArray(pMe, CBOR_MAJOR_TYPE_BYTE_STRING);
Michael Eckel5c531332020-03-02 01:35:30 +01003973}
3974
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003975static inline void
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003976QCBOREncode_BstrWrapInMap(QCBOREncodeContext *pMe, const char *szLabel)
Michael Eckel5c531332020-03-02 01:35:30 +01003977{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003978 QCBOREncode_AddSZString(pMe, szLabel);
3979 QCBOREncode_BstrWrap(pMe);
Michael Eckel5c531332020-03-02 01:35:30 +01003980}
3981
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003982static inline void
Laurence Lundblade8e36f812024-01-26 10:59:29 -07003983QCBOREncode_BstrWrapInMapN(QCBOREncodeContext *pMe, const int64_t nLabel)
Michael Eckel5c531332020-03-02 01:35:30 +01003984{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003985 QCBOREncode_AddInt64(pMe, nLabel);
3986 QCBOREncode_BstrWrap(pMe);
Michael Eckel5c531332020-03-02 01:35:30 +01003987}
3988
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003989static inline void
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003990QCBOREncode_CloseBstrWrap(QCBOREncodeContext *pMe, UsefulBufC *pWrappedCBOR)
Michael Eckel5c531332020-03-02 01:35:30 +01003991{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07003992 QCBOREncode_CloseBstrWrap2(pMe, true, pWrappedCBOR);
Michael Eckel5c531332020-03-02 01:35:30 +01003993}
3994
3995
Michael Eckel5c531332020-03-02 01:35:30 +01003996
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07003997static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07003998QCBOREncode_AddEncodedToMap(QCBOREncodeContext *pMe,
3999 const char *szLabel,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07004000 const UsefulBufC Encoded)
Michael Eckel5c531332020-03-02 01:35:30 +01004001{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07004002 QCBOREncode_AddSZString(pMe, szLabel);
4003 QCBOREncode_AddEncoded(pMe, Encoded);
Michael Eckel5c531332020-03-02 01:35:30 +01004004}
4005
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07004006static inline void
Laurence Lundblade3eead482023-12-16 20:53:22 -07004007QCBOREncode_AddEncodedToMapN(QCBOREncodeContext *pMe,
Laurence Lundblade8e36f812024-01-26 10:59:29 -07004008 const int64_t nLabel,
4009 const UsefulBufC Encoded)
Michael Eckel5c531332020-03-02 01:35:30 +01004010{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07004011 QCBOREncode_AddInt64(pMe, nLabel);
4012 QCBOREncode_AddEncoded(pMe, Encoded);
Michael Eckel5c531332020-03-02 01:35:30 +01004013}
4014
4015
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07004016static inline int
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07004017QCBOREncode_IsBufferNULL(QCBOREncodeContext *pMe)
Michael Eckel5c531332020-03-02 01:35:30 +01004018{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07004019 return UsefulOutBuf_IsBufferNULL(&(pMe->OutBuf));
Michael Eckel5c531332020-03-02 01:35:30 +01004020}
4021
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07004022static inline QCBORError
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07004023QCBOREncode_GetErrorState(QCBOREncodeContext *pMe)
Michael Eckel5c531332020-03-02 01:35:30 +01004024{
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07004025 if(UsefulOutBuf_GetError(&(pMe->OutBuf))) {
Laurence Lundbladef2f0c3f2024-04-12 13:01:54 -07004026 /* Items didn't fit in the buffer. This check catches this
4027 * condition for all the appends and inserts so checks aren't
4028 * needed when the appends and inserts are performed. And of
4029 * course UsefulBuf will never overrun the input buffer given to
4030 * it. No complex analysis of the error handling in this file is
4031 * needed to know that is true. Just read the UsefulBuf code.
4032 */
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07004033 pMe->uError = QCBOR_ERR_BUFFER_TOO_SMALL;
Laurence Lundbladef2f0c3f2024-04-12 13:01:54 -07004034 /* QCBOR_ERR_BUFFER_TOO_SMALL masks other errors, but that is
4035 * OK. Once the caller fixes this, they'll be unmasked.
4036 */
Michael Eckel5c531332020-03-02 01:35:30 +01004037 }
4038
Laurence Lundblade6416a0f2020-09-19 23:26:34 -07004039 return (QCBORError)pMe->uError;
Michael Eckel5c531332020-03-02 01:35:30 +01004040}
4041
4042
Laurence Lundblade45d5e482020-09-15 21:15:15 -07004043/* ========================================================================
4044 END OF PRIVATE INLINE IMPLEMENTATION
4045 ======================================================================== */
Michael Eckel5c531332020-03-02 01:35:30 +01004046
4047#ifdef __cplusplus
4048}
4049#endif
4050
Laurence Lundblade844bb5c2020-03-01 17:27:25 -08004051#endif /* qcbor_encode_h */