xref: /openbsd/lib/libcbor/src/cbor/data.h (revision 9e5c2ddc)
1da0d961cSdjm /*
2*9e5c2ddcSdjm  * Copyright (c) 2014-2019 Pavel Kalvoda <me@pavelkalvoda.com>
3da0d961cSdjm  *
4da0d961cSdjm  * libcbor is free software; you can redistribute it and/or modify
5da0d961cSdjm  * it under the terms of the MIT license. See LICENSE for details.
6da0d961cSdjm  */
7da0d961cSdjm 
8da0d961cSdjm #ifndef LIBCBOR_DATA_H
9da0d961cSdjm #define LIBCBOR_DATA_H
10da0d961cSdjm 
11*9e5c2ddcSdjm #include <stdbool.h>
12da0d961cSdjm #include <stddef.h>
13da0d961cSdjm #include <stdint.h>
14*9e5c2ddcSdjm #include <stdlib.h>
15da0d961cSdjm 
16da0d961cSdjm #ifdef __cplusplus
17da0d961cSdjm extern "C" {
18da0d961cSdjm #endif
19da0d961cSdjm 
20da0d961cSdjm typedef const unsigned char* cbor_data;
21da0d961cSdjm typedef unsigned char* cbor_mutable_data;
22da0d961cSdjm 
23da0d961cSdjm /** Specifies the Major type of ::cbor_item_t */
24da0d961cSdjm typedef enum cbor_type {
25da0d961cSdjm   CBOR_TYPE_UINT /** 0 - positive integers */
26*9e5c2ddcSdjm   ,
27*9e5c2ddcSdjm   CBOR_TYPE_NEGINT /** 1 - negative integers*/
28*9e5c2ddcSdjm   ,
29*9e5c2ddcSdjm   CBOR_TYPE_BYTESTRING /** 2 - byte strings */
30*9e5c2ddcSdjm   ,
31*9e5c2ddcSdjm   CBOR_TYPE_STRING /** 3 - strings */
32*9e5c2ddcSdjm   ,
33*9e5c2ddcSdjm   CBOR_TYPE_ARRAY /** 4 - arrays */
34*9e5c2ddcSdjm   ,
35*9e5c2ddcSdjm   CBOR_TYPE_MAP /** 5 - maps */
36*9e5c2ddcSdjm   ,
37*9e5c2ddcSdjm   CBOR_TYPE_TAG /** 6 - tags  */
38*9e5c2ddcSdjm   ,
39*9e5c2ddcSdjm   CBOR_TYPE_FLOAT_CTRL /** 7 - decimals and special values (true, false, nil,
40*9e5c2ddcSdjm                           ...) */
41da0d961cSdjm } cbor_type;
42da0d961cSdjm 
43da0d961cSdjm /** Possible decoding errors */
44da0d961cSdjm typedef enum {
45*9e5c2ddcSdjm   CBOR_ERR_NONE,
46*9e5c2ddcSdjm   CBOR_ERR_NOTENOUGHDATA,
47*9e5c2ddcSdjm   CBOR_ERR_NODATA,
48*9e5c2ddcSdjm   CBOR_ERR_MALFORMATED,
49*9e5c2ddcSdjm   CBOR_ERR_MEMERROR /** Memory error - item allocation failed. Is it too big for
50*9e5c2ddcSdjm                        your allocator? */
51*9e5c2ddcSdjm   ,
52*9e5c2ddcSdjm   CBOR_ERR_SYNTAXERROR /** Stack parsing algorithm failed */
53da0d961cSdjm } cbor_error_code;
54da0d961cSdjm 
55da0d961cSdjm /** Possible widths of #CBOR_TYPE_UINT items */
56da0d961cSdjm typedef enum {
57*9e5c2ddcSdjm   CBOR_INT_8,
58*9e5c2ddcSdjm   CBOR_INT_16,
59*9e5c2ddcSdjm   CBOR_INT_32,
60*9e5c2ddcSdjm   CBOR_INT_64
61da0d961cSdjm } cbor_int_width;
62da0d961cSdjm 
63da0d961cSdjm /** Possible widths of #CBOR_TYPE_FLOAT_CTRL items */
64da0d961cSdjm typedef enum {
65da0d961cSdjm   CBOR_FLOAT_0 /** Internal use - ctrl and special values */
66*9e5c2ddcSdjm   ,
67*9e5c2ddcSdjm   CBOR_FLOAT_16 /** Half float */
68*9e5c2ddcSdjm   ,
69*9e5c2ddcSdjm   CBOR_FLOAT_32 /** Single float */
70*9e5c2ddcSdjm   ,
71*9e5c2ddcSdjm   CBOR_FLOAT_64 /** Double */
72da0d961cSdjm } cbor_float_width;
73da0d961cSdjm 
74da0d961cSdjm /** Metadata for dynamically sized types */
75da0d961cSdjm typedef enum {
76*9e5c2ddcSdjm   _CBOR_METADATA_DEFINITE,
77*9e5c2ddcSdjm   _CBOR_METADATA_INDEFINITE
78da0d961cSdjm } _cbor_dst_metadata;
79da0d961cSdjm 
80da0d961cSdjm /** Semantic mapping for CTRL simple values */
81da0d961cSdjm typedef enum {
82da0d961cSdjm   CBOR_CTRL_NONE = 0,
83da0d961cSdjm   CBOR_CTRL_FALSE = 20,
84da0d961cSdjm   CBOR_CTRL_TRUE = 21,
85da0d961cSdjm   CBOR_CTRL_NULL = 22,
86da0d961cSdjm   CBOR_CTRL_UNDEF = 23
87da0d961cSdjm } _cbor_ctrl;
88da0d961cSdjm 
89da0d961cSdjm /** Integers specific metadata */
90da0d961cSdjm struct _cbor_int_metadata {
91da0d961cSdjm   cbor_int_width width;
92da0d961cSdjm };
93da0d961cSdjm 
94da0d961cSdjm /** Bytestrings specific metadata */
95da0d961cSdjm struct _cbor_bytestring_metadata {
96da0d961cSdjm   size_t length;
97da0d961cSdjm   _cbor_dst_metadata type;
98da0d961cSdjm };
99da0d961cSdjm 
100da0d961cSdjm /** Strings specific metadata */
101da0d961cSdjm struct _cbor_string_metadata {
102da0d961cSdjm   size_t length;
103*9e5c2ddcSdjm   size_t codepoint_count; /* Sum of chunks' codepoint_counts for indefinite
104*9e5c2ddcSdjm                              strings */
105da0d961cSdjm   _cbor_dst_metadata type;
106da0d961cSdjm };
107da0d961cSdjm 
108da0d961cSdjm /** Arrays specific metadata */
109da0d961cSdjm struct _cbor_array_metadata {
110da0d961cSdjm   size_t allocated;
111da0d961cSdjm   size_t end_ptr;
112da0d961cSdjm   _cbor_dst_metadata type;
113da0d961cSdjm };
114da0d961cSdjm 
115da0d961cSdjm /** Maps specific metadata */
116da0d961cSdjm struct _cbor_map_metadata {
117da0d961cSdjm   size_t allocated;
118da0d961cSdjm   size_t end_ptr;
119da0d961cSdjm   _cbor_dst_metadata type;
120da0d961cSdjm };
121da0d961cSdjm 
122da0d961cSdjm /** Arrays specific metadata
123da0d961cSdjm  *
124da0d961cSdjm  * The pointer is included - cbor_item_metadata is
125da0d961cSdjm  * 2 * sizeof(size_t) + sizeof(_cbor_string_type_metadata),
126da0d961cSdjm  * lets use the space
127da0d961cSdjm  */
128da0d961cSdjm struct _cbor_tag_metadata {
129da0d961cSdjm   struct cbor_item_t* tagged_item;
130da0d961cSdjm   uint64_t value;
131da0d961cSdjm };
132da0d961cSdjm 
133da0d961cSdjm /** Floats specific metadata - includes CTRL values */
134da0d961cSdjm struct _cbor_float_ctrl_metadata {
135da0d961cSdjm   cbor_float_width width;
136da0d961cSdjm   uint8_t ctrl;
137da0d961cSdjm };
138da0d961cSdjm 
139da0d961cSdjm /** Raw memory casts helper */
140da0d961cSdjm union _cbor_float_helper {
141da0d961cSdjm   float as_float;
142da0d961cSdjm   uint32_t as_uint;
143da0d961cSdjm };
144da0d961cSdjm 
145da0d961cSdjm /** Raw memory casts helper */
146da0d961cSdjm union _cbor_double_helper {
147da0d961cSdjm   double as_double;
148da0d961cSdjm   uint64_t as_uint;
149da0d961cSdjm };
150da0d961cSdjm 
151*9e5c2ddcSdjm /** Union of metadata across all possible types - discriminated in #cbor_item_t
152*9e5c2ddcSdjm  */
153da0d961cSdjm union cbor_item_metadata {
154da0d961cSdjm   struct _cbor_int_metadata int_metadata;
155da0d961cSdjm   struct _cbor_bytestring_metadata bytestring_metadata;
156da0d961cSdjm   struct _cbor_string_metadata string_metadata;
157da0d961cSdjm   struct _cbor_array_metadata array_metadata;
158da0d961cSdjm   struct _cbor_map_metadata map_metadata;
159da0d961cSdjm   struct _cbor_tag_metadata tag_metadata;
160da0d961cSdjm   struct _cbor_float_ctrl_metadata float_ctrl_metadata;
161da0d961cSdjm };
162da0d961cSdjm 
163da0d961cSdjm /** The item handle */
164da0d961cSdjm typedef struct cbor_item_t {
165da0d961cSdjm   /** Discriminated by type */
166da0d961cSdjm   union cbor_item_metadata metadata;
167da0d961cSdjm   /** Reference count - initialize to 0 */
168da0d961cSdjm   size_t refcount;
169da0d961cSdjm   /** Major type discriminator */
170da0d961cSdjm   cbor_type type;
171da0d961cSdjm   /** Raw data block - interpretation depends on metadata */
172da0d961cSdjm   unsigned char* data;
173da0d961cSdjm } cbor_item_t;
174da0d961cSdjm 
175da0d961cSdjm /** Defines cbor_item_t#data structure for indefinite strings and bytestrings
176da0d961cSdjm  *
177da0d961cSdjm  * Used to cast the raw representation for a sane manipulation
178da0d961cSdjm  */
179da0d961cSdjm struct cbor_indefinite_string_data {
180da0d961cSdjm   size_t chunk_count;
181da0d961cSdjm   size_t chunk_capacity;
182da0d961cSdjm   cbor_item_t** chunks;
183da0d961cSdjm };
184da0d961cSdjm 
185da0d961cSdjm /** High-level decoding error */
186da0d961cSdjm struct cbor_error {
187da0d961cSdjm   /** Aproximate position */
188da0d961cSdjm   size_t position;
189da0d961cSdjm   /** Description */
190da0d961cSdjm   cbor_error_code code;
191da0d961cSdjm };
192da0d961cSdjm 
193da0d961cSdjm /** Simple pair of items for use in maps */
194da0d961cSdjm struct cbor_pair {
195da0d961cSdjm   cbor_item_t *key, *value;
196da0d961cSdjm };
197da0d961cSdjm 
198da0d961cSdjm /** High-level decoding result */
199da0d961cSdjm struct cbor_load_result {
200da0d961cSdjm   /** Error indicator */
201da0d961cSdjm   struct cbor_error error;
202da0d961cSdjm   /** Number of bytes read*/
203da0d961cSdjm   size_t read;
204da0d961cSdjm };
205da0d961cSdjm 
206da0d961cSdjm /** Streaming decoder result - status */
207da0d961cSdjm enum cbor_decoder_status {
208da0d961cSdjm   CBOR_DECODER_FINISHED /** OK, finished */
209*9e5c2ddcSdjm   ,
210*9e5c2ddcSdjm   CBOR_DECODER_NEDATA /** Not enough data - mismatch with MTB */
211*9e5c2ddcSdjm   ,
212*9e5c2ddcSdjm   CBOR_DECODER_EBUFFER /** Buffer manipulation problem */
213*9e5c2ddcSdjm   ,
214*9e5c2ddcSdjm   CBOR_DECODER_ERROR /** Malformed or reserved MTB/value */
215da0d961cSdjm };
216da0d961cSdjm 
217da0d961cSdjm /** Streaming decoder result */
218da0d961cSdjm struct cbor_decoder_result {
219da0d961cSdjm   /** Bytes read */
220da0d961cSdjm   size_t read;
221da0d961cSdjm   /** The result */
222da0d961cSdjm   enum cbor_decoder_status status;
223*9e5c2ddcSdjm   /** When status == CBOR_DECODER_NEDATA,
224*9e5c2ddcSdjm    *  the minimum number of bytes required to continue parsing */
225*9e5c2ddcSdjm   size_t required;
226da0d961cSdjm };
227da0d961cSdjm 
228da0d961cSdjm #ifdef __cplusplus
229da0d961cSdjm }
230da0d961cSdjm #endif
231da0d961cSdjm 
232da0d961cSdjm #endif  // LIBCBOR_DATA_H
233