blob: 7de8c6cc8f1515d738784143256c97a8cf51d9c6 [file] [log] [blame]
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001/*==============================================================================
Laurence Lundbladed92a6162018-11-01 11:38:35 +07002 Copyright (c) 2016-2018, The Linux Foundation.
Laurence Lundbladef0ea5f32019-01-11 20:10:26 -08003 Copyright (c) 2018-2019, Laurence Lundblade.
Laurence Lundbladed92a6162018-11-01 11:38:35 +07004 All rights reserved.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08005
Laurence Lundblade0dbc9172018-11-01 14:17:21 +07006Redistribution and use in source and binary forms, with or without
7modification, are permitted provided that the following conditions are
8met:
9 * Redistributions of source code must retain the above copyright
10 notice, this list of conditions and the following disclaimer.
11 * Redistributions in binary form must reproduce the above
12 copyright notice, this list of conditions and the following
13 disclaimer in the documentation and/or other materials provided
14 with the distribution.
15 * Neither the name of The Linux Foundation nor the names of its
16 contributors, nor the name "Laurence Lundblade" may be used to
17 endorse or promote products derived from this software without
18 specific prior written permission.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080019
Laurence Lundblade0dbc9172018-11-01 14:17:21 +070020THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
21WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
22MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
23ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
24BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
27BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
29OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
30IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Laurence Lundblade9e3651c2018-10-10 11:49:55 +080031 ==============================================================================*/
32
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080033#include "qcbor_decode_tests.h"
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -080034#include "qcbor.h"
Laurence Lundbladed4728fd2018-12-17 15:15:56 -080035#include <string.h>
Laurence Lundblade9e3651c2018-10-10 11:49:55 +080036#include <math.h> // for fabs()
Laurence Lundbladebb1062e2019-08-12 23:28:54 -070037#include "not_well_formed_cbor.h"
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -080038
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080039
Laurence Lundbladea2e29072018-12-30 09:20:06 -080040#ifdef PRINT_FUNCTIONS_FOR_DEBUGGING
Laurence Lundblade20db9c92018-12-17 11:40:37 -080041#include <stdio.h>
Laurence Lundbladea2e29072018-12-30 09:20:06 -080042
43static void PrintUsefulBufC(const char *szLabel, UsefulBufC Buf)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080044{
45 if(szLabel) {
46 printf("%s ", szLabel);
47 }
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -080048
Laurence Lundblade570fab52018-10-13 18:28:27 +080049 size_t i;
Laurence Lundbladea2e29072018-12-30 09:20:06 -080050 for(i = 0; i < Buf.len; i++) {
51 uint8_t Z = ((uint8_t *)Buf.ptr)[i];
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080052 printf("%02x ", Z);
53 }
54 printf("\n");
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -080055
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080056 fflush(stdout);
57}
Laurence Lundbladea2e29072018-12-30 09:20:06 -080058
59/*static void printencoded(const char *szLabel, const uint8_t *pEncoded, size_t nLen)
60{
61 PrintUsefulBufC(szLabel, (UsefulBufC){pEncoded, nLen});
62}*/
Laurence Lundblade20db9c92018-12-17 11:40:37 -080063#endif
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080064
65
Laurence Lundbladeb836efb2018-10-28 20:09:58 +070066static const uint8_t spExpectedEncodedInts[] = {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080067 0x98, 0x2f, 0x3b, 0x7f, 0xff, 0xff, 0xff, 0xff,
68 0xff, 0xff, 0xff, 0x3b, 0x00, 0x00, 0x00, 0x01,
69 0x00, 0x00, 0x00, 0x00, 0x3a, 0xff, 0xff, 0xff,
70 0xff, 0x3a, 0xff, 0xff, 0xff, 0xfe, 0x3a, 0xff,
71 0xff, 0xff, 0xfd, 0x3a, 0x7f, 0xff, 0xff, 0xff,
72 0x3a, 0x7f, 0xff, 0xff, 0xfe, 0x3a, 0x00, 0x01,
73 0x00, 0x01, 0x3a, 0x00, 0x01, 0x00, 0x00, 0x39,
74 0xff, 0xff, 0x39, 0xff, 0xfe, 0x39, 0xff, 0xfd,
75 0x39, 0x01, 0x00, 0x38, 0xff, 0x38, 0xfe, 0x38,
76 0xfd, 0x38, 0x18, 0x37, 0x36, 0x20, 0x00, 0x00,
77 0x01, 0x16, 0x17, 0x18, 0x18, 0x18, 0x19, 0x18,
78 0x1a, 0x18, 0xfe, 0x18, 0xff, 0x19, 0x01, 0x00,
79 0x19, 0x01, 0x01, 0x19, 0xff, 0xfe, 0x19, 0xff,
80 0xff, 0x1a, 0x00, 0x01, 0x00, 0x00, 0x1a, 0x00,
81 0x01, 0x00, 0x01, 0x1a, 0x00, 0x01, 0x00, 0x02,
82 0x1a, 0x7f, 0xff, 0xff, 0xff, 0x1a, 0x7f, 0xff,
83 0xff, 0xff, 0x1a, 0x80, 0x00, 0x00, 0x00, 0x1a,
84 0x80, 0x00, 0x00, 0x01, 0x1a, 0xff, 0xff, 0xff,
85 0xfe, 0x1a, 0xff, 0xff, 0xff, 0xff, 0x1b, 0x00,
86 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x1b,
87 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
88 0x1b, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
89 0xff, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
90 0xff, 0xff};
91
92
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080093// return CBOR error or -1 if type of value doesn't match
94
95static int IntegerValuesParseTestInternal(QCBORDecodeContext *pDCtx)
96{
97 QCBORItem Item;
98 int nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080099
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800100 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
101 return nCBORError;
102 if(Item.uDataType != QCBOR_TYPE_ARRAY)
103 return -1;
104
105 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
106 return nCBORError;
107 if(Item.uDataType != QCBOR_TYPE_INT64 || // Todo; fix this for 32-bit machines
Laurence Lundblade570fab52018-10-13 18:28:27 +0800108 Item.val.int64 != -9223372036854775807LL - 1)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800109 return -1;
110
111 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
112 return nCBORError;
113 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade570fab52018-10-13 18:28:27 +0800114 Item.val.int64 != -4294967297)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800115 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800116
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800117 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
118 return nCBORError;
119 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade570fab52018-10-13 18:28:27 +0800120 Item.val.int64 != -4294967296)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800121 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800122
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800123 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
124 return nCBORError;
125 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade570fab52018-10-13 18:28:27 +0800126 Item.val.int64 != -4294967295)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800127 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800128
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800129 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
130 return nCBORError;
131 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade570fab52018-10-13 18:28:27 +0800132 Item.val.int64 != -4294967294)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800133 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800134
135
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800136 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
137 return nCBORError;
138 if(Item.uDataType != QCBOR_TYPE_INT64 ||
139 Item.val.int64 != -2147483648)
140 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800141
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800142 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
143 return nCBORError;
144 if(Item.uDataType != QCBOR_TYPE_INT64 ||
145 Item.val.int64 != -2147483647)
146 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800147
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800148 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
149 return nCBORError;
150 if(Item.uDataType != QCBOR_TYPE_INT64 ||
151 Item.val.int64 != -65538)
152 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800153
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800154 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
155 return nCBORError;
156 if(Item.uDataType != QCBOR_TYPE_INT64 ||
157 Item.val.int64 != -65537)
158 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800159
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800160 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
161 return nCBORError;
162 if(Item.uDataType != QCBOR_TYPE_INT64 ||
163 Item.val.int64 != -65536)
164 return -1;
165
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800166
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800167 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
168 return nCBORError;
169 if(Item.uDataType != QCBOR_TYPE_INT64 ||
170 Item.val.int64 != -65535)
171 return -1;
172
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800173
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800174 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
175 return nCBORError;
176 if(Item.uDataType != QCBOR_TYPE_INT64 ||
177 Item.val.int64 != -65534)
178 return -1;
179
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800180
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800181 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
182 return nCBORError;
183 if(Item.uDataType != QCBOR_TYPE_INT64 ||
184 Item.val.int64 != -257)
185 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800186
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800187 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
188 return nCBORError;
189 if(Item.uDataType != QCBOR_TYPE_INT64 ||
190 Item.val.int64 != -256)
191 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800192
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800193 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
194 return nCBORError;
195 if(Item.uDataType != QCBOR_TYPE_INT64 ||
196 Item.val.int64 != -255)
197 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800198
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800199 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
200 return nCBORError;
201 if(Item.uDataType != QCBOR_TYPE_INT64 ||
202 Item.val.int64 != -254)
203 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800204
205
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800206 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
207 return nCBORError;
208 if(Item.uDataType != QCBOR_TYPE_INT64 ||
209 Item.val.int64 != -25)
210 return -1;
211
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800212
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800213 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
214 return nCBORError;
215 if(Item.uDataType != QCBOR_TYPE_INT64 ||
216 Item.val.int64 != -24)
217 return -1;
218
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800219
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800220 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
221 return nCBORError;
222 if(Item.uDataType != QCBOR_TYPE_INT64 ||
223 Item.val.int64 != -23)
224 return -1;
225
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800226
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800227 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
228 return nCBORError;
229 if(Item.uDataType != QCBOR_TYPE_INT64 ||
230 Item.val.int64 != -1)
231 return -1;
232
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800233
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800234 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
235 return nCBORError;
236 if(Item.uDataType != QCBOR_TYPE_INT64 ||
237 Item.val.int64 != 0)
238 return -1;
239
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800240
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800241 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
242 return nCBORError;
243 if(Item.uDataType != QCBOR_TYPE_INT64 ||
244 Item.val.int64 != 0)
245 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800246
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800247 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
248 return nCBORError;
249 if(Item.uDataType != QCBOR_TYPE_INT64 ||
250 Item.val.int64 != 1)
251 return -1;
252
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800253
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800254 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
255 return nCBORError;
256 if(Item.uDataType != QCBOR_TYPE_INT64 ||
257 Item.val.int64 != 22)
258 return -1;
259
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800260
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800261 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
262 return nCBORError;
263 if(Item.uDataType != QCBOR_TYPE_INT64 ||
264 Item.val.int64 != 23)
265 return -1;
266
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800267
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800268 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
269 return nCBORError;
270 if(Item.uDataType != QCBOR_TYPE_INT64 ||
271 Item.val.int64 != 24)
272 return -1;
273
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800274
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800275 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
276 return nCBORError;
277 if(Item.uDataType != QCBOR_TYPE_INT64 ||
278 Item.val.int64 != 25)
279 return -1;
280
281 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
282 return nCBORError;
283 if(Item.uDataType != QCBOR_TYPE_INT64 ||
284 Item.val.int64 != 26)
285 return -1;
286
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800287
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800288 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
289 return nCBORError;
290 if(Item.uDataType != QCBOR_TYPE_INT64 ||
291 Item.val.int64 != 254)
292 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800293
294
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800295 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
296 return nCBORError;
297 if(Item.uDataType != QCBOR_TYPE_INT64 ||
298 Item.val.int64 != 255)
299 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800300
301
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800302 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
303 return nCBORError;
304 if(Item.uDataType != QCBOR_TYPE_INT64 ||
305 Item.val.int64 != 256)
306 return -1;
307
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800308
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800309 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
310 return nCBORError;
311 if(Item.uDataType != QCBOR_TYPE_INT64 ||
312 Item.val.int64 != 257)
313 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800314
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800315 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
316 return nCBORError;
317 if(Item.uDataType != QCBOR_TYPE_INT64 ||
318 Item.val.int64 != 65534)
319 return -1;
320
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800321
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800322 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
323 return nCBORError;
324 if(Item.uDataType != QCBOR_TYPE_INT64 ||
325 Item.val.int64 != 65535)
326 return -1;
327
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800328
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800329 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
330 return nCBORError;
331 if(Item.uDataType != QCBOR_TYPE_INT64 ||
332 Item.val.int64 != 65536)
333 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800334
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800335 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
336 return nCBORError;
337 if(Item.uDataType != QCBOR_TYPE_INT64 ||
338 Item.val.int64 != 65537)
339 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800340
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800341 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
342 return nCBORError;
343 if(Item.uDataType != QCBOR_TYPE_INT64 ||
344 Item.val.int64 != 65538)
345 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800346
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800347 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
348 return nCBORError;
349 if(Item.uDataType != QCBOR_TYPE_INT64 ||
350 Item.val.int64 != 2147483647)
351 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800352
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800353 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
354 return nCBORError;
355 if(Item.uDataType != QCBOR_TYPE_INT64 ||
356 Item.val.int64 != 2147483647)
357 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800358
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800359 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
360 return nCBORError;
361 if(Item.uDataType != QCBOR_TYPE_INT64 ||
362 Item.val.int64 != 2147483648)
363 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800364
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800365 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
366 return nCBORError;
367 if(Item.uDataType != QCBOR_TYPE_INT64 ||
368 Item.val.int64 != 2147483649)
369 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800370
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800371 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
372 return nCBORError;
373 if(Item.uDataType != QCBOR_TYPE_INT64 ||
374 Item.val.int64 != 4294967294)
375 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800376
377
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800378 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
379 return nCBORError;
380 if(Item.uDataType != QCBOR_TYPE_INT64 ||
381 Item.val.int64 != 4294967295)
382 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800383
384
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800385 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
386 return nCBORError;
387 if(Item.uDataType != QCBOR_TYPE_INT64 ||
388 Item.val.int64 != 4294967296)
389 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800390
391
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800392 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
393 return nCBORError;
394 if(Item.uDataType != QCBOR_TYPE_INT64 ||
395 Item.val.int64 != 4294967297)
396 return -1;
397
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800398
399
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800400 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
401 return nCBORError;
402 if(Item.uDataType != QCBOR_TYPE_INT64 ||
403 Item.val.int64 != 9223372036854775807LL)
404 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800405
406
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800407 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
408 return nCBORError;
409 if(Item.uDataType != QCBOR_TYPE_UINT64 ||
410 Item.val.uint64 != 18446744073709551615ULL)
411 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800412
413
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800414 if(QCBORDecode_Finish(pDCtx) != QCBOR_SUCCESS) {
415 return -1;
416 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800417
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800418 return 0;
419}
420
421
Laurence Lundblade21d1d812019-09-28 22:47:49 -1000422// The largest negative int possible in CBOR.
423// Not possible in C.
424static const uint8_t spTooBigNegative[] = {
425 0x3b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
426};
427
428
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800429/*
430 Tests the decoding of lots of different integers sizes
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +0800431 and values.
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800432 */
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800433int IntegerValuesParseTest()
434{
Laurence Lundblade21d1d812019-09-28 22:47:49 -1000435 int nReturn;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800436 QCBORDecodeContext DCtx;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800437
Laurence Lundblade21d1d812019-09-28 22:47:49 -1000438 QCBORDecode_Init(&DCtx,
439 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spExpectedEncodedInts),
440 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800441
Laurence Lundblade21d1d812019-09-28 22:47:49 -1000442 // The really big test of all successes
443 nReturn = IntegerValuesParseTestInternal(&DCtx);
444 if(nReturn) {
445 return nReturn;
446 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800447
Laurence Lundblade21d1d812019-09-28 22:47:49 -1000448 // The one large negative integer that can be parsed
449 QCBORDecode_Init(&DCtx,
450 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spTooBigNegative),
451 QCBOR_DECODE_MODE_NORMAL);
452
453 QCBORItem item;
454 if(QCBORDecode_GetNext(&DCtx, &item) != QCBOR_ERR_INT_OVERFLOW) {
455 nReturn = -4000;
456 }
457
458 return(nReturn);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800459}
460
461
462/*
463 Creates a simple CBOR array and returns it in *pEncoded. The array is malloced
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800464 and needs to be freed. This is used by several tests.
465
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800466 Two of the inputs can be set. Two other items in the array are fixed.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800467
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800468 */
469
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800470static uint8_t spSimpleArrayBuffer[50];
471
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800472static int CreateSimpleArray(int nInt1, int nInt2, uint8_t **pEncoded, size_t *pEncodedLen)
473{
474 QCBOREncodeContext ECtx;
475 int nReturn = -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800476
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800477 *pEncoded = NULL;
478 *pEncodedLen = INT32_MAX;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800479
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800480 // loop runs CBOR encoding twice. First with no buffer to
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800481 // calculate the length so buffer can be allocated correctly,
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800482 // and last with the buffer to do the actual encoding
483 do {
Laurence Lundblade0595e932018-11-02 22:22:47 +0700484 QCBOREncode_Init(&ECtx, (UsefulBuf){*pEncoded, *pEncodedLen});
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800485 QCBOREncode_OpenArray(&ECtx);
486 QCBOREncode_AddInt64(&ECtx, nInt1);
487 QCBOREncode_AddInt64(&ECtx, nInt2);
488 QCBOREncode_AddBytes(&ECtx, ((UsefulBufC) {"galactic", 8}));
489 QCBOREncode_AddBytes(&ECtx, ((UsefulBufC) {"haven token", 11}));
490 QCBOREncode_CloseArray(&ECtx);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800491
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800492 if(QCBOREncode_FinishGetSize(&ECtx, pEncodedLen))
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800493 goto Done;
494
495 if(*pEncoded != NULL) {
496 nReturn = 0;
497 goto Done;
498 }
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800499
500 // Use static buffer to avoid dependency on malloc()
501 if(*pEncodedLen > sizeof(spSimpleArrayBuffer)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800502 goto Done;
503 }
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800504 *pEncoded = spSimpleArrayBuffer;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800505
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800506 } while(1);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800507
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800508Done:
509 return nReturn;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800510}
511
512
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800513/*
514 {"first integer": 42,
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900515 "an array of two strings": [
516 "string1", "string2"
517 ],
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800518 "map in a map": {
519 "bytes 1": h'78787878',
520 "bytes 2": h'79797979',
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900521 "another int": 98,
522 "text 2": "lies, damn lies and statistics"
523 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800524 }
525 */
526
527static uint8_t pValidMapEncoded[] = {
Laurence Lundbladeb836efb2018-10-28 20:09:58 +0700528 0xa3, 0x6d, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x69, 0x6e,
529 0x74, 0x65, 0x67, 0x65, 0x72, 0x18, 0x2a, 0x77, 0x61, 0x6e,
530 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20,
531 0x74, 0x77, 0x6f, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
532 0x73, 0x82, 0x67, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x31,
533 0x67, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x32, 0x6c, 0x6d,
534 0x61, 0x70, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x6d, 0x61,
535 0x70, 0xa4, 0x67, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x31,
536 0x44, 0x78, 0x78, 0x78, 0x78, 0x67, 0x62, 0x79, 0x74, 0x65,
537 0x73, 0x20, 0x32, 0x44, 0x79, 0x79, 0x79, 0x79, 0x6b, 0x61,
538 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x74,
539 0x18, 0x62, 0x66, 0x74, 0x65, 0x78, 0x74, 0x20, 0x32, 0x78,
540 0x1e, 0x6c, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x64, 0x61, 0x6d,
541 0x6e, 0x20, 0x6c, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64,
542 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63,
543 0x73 } ;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800544
545static int ParseOrderedArray(const uint8_t *pEncoded, size_t nLen, int64_t *pInt1, int64_t *pInt2, const uint8_t **pBuf3, size_t *pBuf3Len, const uint8_t **pBuf4, size_t *pBuf4Len)
546{
547 QCBORDecodeContext DCtx;
548 QCBORItem Item;
549 int nReturn = -1; // assume error until success
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800550
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800551 QCBORDecode_Init(&DCtx, (UsefulBufC){pEncoded, nLen}, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800552
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800553 // Make sure the first thing is a map
554 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 || Item.uDataType != QCBOR_TYPE_ARRAY)
555 goto Done;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800556
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800557 // First integer
Laurence Lundblade12b495d2018-12-17 11:15:54 -0800558 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 || Item.uDataType != QCBOR_TYPE_INT64)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800559 goto Done;
560 *pInt1 = Item.val.int64;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800561
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800562 // Second integer
563 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 || Item.uDataType != QCBOR_TYPE_INT64)
564 goto Done;
565 *pInt2 = Item.val.int64;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800566
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800567 // First string
568 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 || Item.uDataType != QCBOR_TYPE_BYTE_STRING)
569 goto Done;
570 *pBuf3 = Item.val.string.ptr;
571 *pBuf3Len = Item.val.string.len;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800572
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800573 // Second string
574 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 || Item.uDataType != QCBOR_TYPE_BYTE_STRING)
575 goto Done;
576 *pBuf4 = Item.val.string.ptr;
577 *pBuf4Len = Item.val.string.len;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800578
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800579 nReturn = 0;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800580
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800581Done:
582 return(nReturn);
583}
584
585
586
Laurence Lundblade9e3651c2018-10-10 11:49:55 +0800587
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800588int SimpleArrayTest()
589{
590 uint8_t *pEncoded;
591 size_t nEncodedLen;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800592
Laurence Lundblade5e390822019-01-06 12:35:01 -0800593 int64_t i1=0, i2=0;
594 size_t i3=0, i4=0;
595 const uint8_t *s3= (uint8_t *)"";
596 const uint8_t *s4= (uint8_t *)"";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800597
598
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800599 if(CreateSimpleArray(23, 6000, &pEncoded, &nEncodedLen) < 0) {
600 return(-1);
601 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800602
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800603 ParseOrderedArray(pEncoded, nEncodedLen, &i1, &i2, &s3, &i3, &s4, &i4);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800604
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800605 if(i1 != 23 ||
606 i2 != 6000 ||
607 i3 != 8 ||
608 i4 != 11 ||
Laurence Lundbladea44d5062018-10-17 18:45:12 +0530609 memcmp("galactic", s3, 8) !=0 ||
610 memcmp("haven token", s4, 11) !=0) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800611 return(-1);
612 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800613
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800614 return(0);
615}
616
617
Laurence Lundblade9916b1b2019-09-07 22:33:25 -0700618/*
619 [
620 0,
621 [],
622 [
623 [],
624 [
625 0
626 ],
627 {},
628 {
629 1: {},
630 2: {},
631 3: []
632 }
633 ]
634 ]
635 */
636static uint8_t sEmpties[] = {0x83, 0x00, 0x80, 0x84, 0x80, 0x81, 0x00, 0xa0,
637 0xa3, 0x01, 0xa0, 0x02, 0xa0, 0x03, 0x80};
638
639int EmptyMapsAndArraysTest()
640{
641 QCBORDecodeContext DCtx;
642 QCBORItem Item;
643
644 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(sEmpties), QCBOR_DECODE_MODE_NORMAL);
645
646 // Array with 3 items
647 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
648 Item.uDataType != QCBOR_TYPE_ARRAY ||
649 Item.uNestingLevel != 0 ||
650 Item.uNextNestLevel != 1 ||
651 Item.val.uCount != 3) {
652 return -1;
653 }
654
655 // An integer 0
656 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
657 Item.uDataType != QCBOR_TYPE_INT64 ||
658 Item.uNestingLevel != 1 ||
659 Item.uNextNestLevel != 1 ||
660 Item.val.uint64 != 0) {
661 return -2;
662 }
663
664 // An empty array
665 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
666 Item.uDataType != QCBOR_TYPE_ARRAY ||
667 Item.uNestingLevel != 1 ||
668 Item.uNextNestLevel != 1 ||
669 Item.val.uCount != 0) {
670 return -3;
671 }
672
673 // An array with 4 items
674 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
675 Item.uDataType != QCBOR_TYPE_ARRAY ||
676 Item.uNestingLevel != 1 ||
677 Item.uNextNestLevel != 2 ||
678 Item.val.uCount != 4) {
679 return -4;
680 }
681
682 // An empty array
683 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
684 Item.uDataType != QCBOR_TYPE_ARRAY ||
685 Item.uNestingLevel != 2 ||
686 Item.uNextNestLevel != 2 ||
687 Item.val.uCount != 0) {
688 return -5;
689 }
690
691 // An array with 1 item
692 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
693 Item.uDataType != QCBOR_TYPE_ARRAY ||
694 Item.uNestingLevel != 2 ||
695 Item.uNextNestLevel != 3 ||
696 Item.val.uCount != 1) {
697 return -6;
698 }
699
700 // An integer 0
701 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
702 Item.uDataType != QCBOR_TYPE_INT64 ||
703 Item.uNestingLevel != 3 ||
704 Item.uNextNestLevel != 2 ||
705 Item.val.uint64 != 0) {
706 return -7;
707 }
708
709 // An empty map
710 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
711 Item.uDataType != QCBOR_TYPE_MAP ||
712 Item.uNestingLevel != 2 ||
713 Item.uNextNestLevel != 2 ||
714 Item.val.uCount != 0) {
715 return -8;
716 }
717
718 // An map with 3 items
719 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
720 Item.uDataType != QCBOR_TYPE_MAP ||
721 Item.uNestingLevel != 2 ||
722 Item.uNextNestLevel != 3 ||
723 Item.val.uCount != 3) {
724 return -9;
725 }
726
727 // An empty map
728 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
729 Item.uDataType != QCBOR_TYPE_MAP ||
730 Item.uNestingLevel != 3 ||
731 Item.uNextNestLevel != 3 ||
732 Item.val.uCount != 0) {
733 return -10;
734 }
735
736 // An empty map
737 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
738 Item.uDataType != QCBOR_TYPE_MAP ||
739 Item.uNestingLevel != 3 ||
740 Item.uNextNestLevel != 3 ||
741 Item.val.uCount != 0) {
742 return -11;
743 }
744
745 // An empty array
746 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
747 Item.uDataType != QCBOR_TYPE_ARRAY ||
748 Item.uNestingLevel != 3 ||
749 Item.uNextNestLevel != 0 ||
750 Item.val.uCount != 0) {
751 return -12;
752 }
753
754 if(QCBORDecode_Finish(&DCtx) != QCBOR_SUCCESS) {
755 return -13;
756 }
757
758 return 0;
759}
760
Laurence Lundblade9e3651c2018-10-10 11:49:55 +0800761
Laurence Lundbladeb836efb2018-10-28 20:09:58 +0700762static uint8_t spDeepArrays[] = {0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80};
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800763
764int ParseDeepArrayTest()
765{
766 QCBORDecodeContext DCtx;
767 int nReturn = 0;
768 int i;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800769
Laurence Lundbladeb836efb2018-10-28 20:09:58 +0700770 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spDeepArrays), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800771
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800772 for(i = 0; i < 10; i++) {
773 QCBORItem Item;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800774
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800775 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
776 Item.uDataType != QCBOR_TYPE_ARRAY ||
777 Item.uNestingLevel != i) {
778 nReturn = -1;
779 break;
780 }
781 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800782
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800783 return(nReturn);
784}
785
Laurence Lundblade972e59c2018-11-11 15:57:23 +0700786// Big enough to test nesting to the depth of 24
787static uint8_t spTooDeepArrays[] = {0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
788 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
789 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
790 0x80};
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800791
792int ParseTooDeepArrayTest()
793{
794 QCBORDecodeContext DCtx;
795 int nReturn = 0;
796 int i;
797 QCBORItem Item;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800798
799
Laurence Lundbladeb836efb2018-10-28 20:09:58 +0700800 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spTooDeepArrays), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800801
Laurence Lundblade972e59c2018-11-11 15:57:23 +0700802 for(i = 0; i < QCBOR_MAX_ARRAY_NESTING1; i++) {
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800803
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800804 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
805 Item.uDataType != QCBOR_TYPE_ARRAY ||
806 Item.uNestingLevel != i) {
807 nReturn = -1;
808 break;
809 }
810 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800811
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800812 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_ARRAY_NESTING_TOO_DEEP)
813 nReturn = -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800814
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800815 return(nReturn);
816}
817
818
819
820
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800821int ShortBufferParseTest()
822{
Laurence Lundbladebb1062e2019-08-12 23:28:54 -0700823 int nResult = 0;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800824
Laurence Lundbladebb1062e2019-08-12 23:28:54 -0700825 for(int nNum = sizeof(spExpectedEncodedInts)-1; nNum; nNum--) {
826 QCBORDecodeContext DCtx;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800827
Laurence Lundbladebb1062e2019-08-12 23:28:54 -0700828 QCBORDecode_Init(&DCtx, (UsefulBufC){spExpectedEncodedInts, nNum}, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800829
Laurence Lundbladebb1062e2019-08-12 23:28:54 -0700830 const QCBORError nErr = IntegerValuesParseTestInternal(&DCtx);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800831
Laurence Lundbladebb1062e2019-08-12 23:28:54 -0700832 if(nErr != QCBOR_ERR_HIT_END && nErr != QCBOR_ERR_NO_MORE_ITEMS) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800833 nResult = -1;
834 goto Done;
835 }
836 }
837Done:
838 return nResult;
839}
840
841
Laurence Lundblade9e3651c2018-10-10 11:49:55 +0800842
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800843int ShortBufferParseTest2()
844{
845 uint8_t *pEncoded;
846 int nReturn;
847 size_t nEncodedLen;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800848
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800849 int64_t i1, i2;
850 size_t i3, i4;
851 const uint8_t *s3, *s4;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800852
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800853 nReturn = 0;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800854
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800855 if(CreateSimpleArray(23, 6000, &pEncoded, &nEncodedLen) < 0) {
856 return(-1);
857 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800858
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800859 for(nEncodedLen--; nEncodedLen; nEncodedLen--) {
860 int nResult = ParseOrderedArray(pEncoded, (uint32_t)nEncodedLen, &i1, &i2, &s3, &i3, &s4, &i4);
861 if(nResult == 0) {
862 nReturn = -1;
863 }
864 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800865
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800866 return(nReturn);
867}
868
Laurence Lundbladefab1b522018-10-19 13:40:52 +0530869/*
870 Decode and thoroughly check a moderately complex
871 set of maps
872 */
Laurence Lundbladeea567ac2018-12-09 14:03:21 -0800873static int ParseMapTest1(QCBORDecodeMode nMode)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800874{
875 QCBORDecodeContext DCtx;
876 QCBORItem Item;
877 int nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800878
Laurence Lundbladeea567ac2018-12-09 14:03:21 -0800879 QCBORDecode_Init(&DCtx, (UsefulBufC){pValidMapEncoded, sizeof(pValidMapEncoded)}, nMode);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800880
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900881 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800882 return nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900883 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800884 if(Item.uDataType != QCBOR_TYPE_MAP ||
885 Item.val.uCount != 3)
886 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800887
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900888 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800889 return nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900890 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800891 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800892 Item.uDataType != QCBOR_TYPE_INT64 ||
893 Item.val.int64 != 42 ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +0530894 Item.uDataAlloc ||
895 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900896 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("first integer"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800897 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900898 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800899
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900900 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800901 return nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900902 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800903 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +0530904 Item.uDataAlloc ||
905 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900906 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("an array of two strings")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800907 Item.uDataType != QCBOR_TYPE_ARRAY ||
908 Item.val.uCount != 2)
909 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800910
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900911 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800912 return nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900913 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800914 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +0530915 Item.uDataAlloc ||
916 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900917 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("string1"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800918 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900919 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800920
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900921 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800922 return nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900923 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800924 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +0530925 Item.uDataAlloc ||
926 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900927 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("string2"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800928 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900929 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800930
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900931 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800932 return nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900933 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800934 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +0530935 Item.uDataAlloc ||
936 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900937 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("map in a map")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800938 Item.uDataType != QCBOR_TYPE_MAP ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900939 Item.val.uCount != 4) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800940 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900941 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800942
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900943 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800944 return nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900945 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800946 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900947 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("bytes 1"))||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800948 Item.uDataType != QCBOR_TYPE_BYTE_STRING ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +0530949 Item.uDataAlloc ||
950 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900951 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("xxxx"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800952 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900953 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800954
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900955 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800956 return nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900957 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800958 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900959 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("bytes 2")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800960 Item.uDataType != QCBOR_TYPE_BYTE_STRING ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +0530961 Item.uDataAlloc ||
962 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900963 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("yyyy"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800964 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900965 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800966
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900967 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800968 return nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900969 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800970 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +0530971 Item.uDataAlloc ||
972 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900973 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("another int")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800974 Item.uDataType != QCBOR_TYPE_INT64 ||
975 Item.val.int64 != 98)
976 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800977
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900978 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800979 return nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900980 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800981 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900982 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("text 2"))||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800983 Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +0530984 Item.uDataAlloc ||
985 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900986 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("lies, damn lies and statistics"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800987 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900988 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800989
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800990 return 0;
991}
992
993
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900994/*
995 Decode and thoroughly check a moderately complex
996 set of maps
997 */
998int ParseMapAsArrayTest()
999{
1000 QCBORDecodeContext DCtx;
1001 QCBORItem Item;
1002 int nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001003
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001004 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapEncoded), QCBOR_DECODE_MODE_MAP_AS_ARRAY);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001005
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001006 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
1007 return nCBORError;
1008 }
Laurence Lundbladed61cbf32018-12-09 11:42:21 -08001009 if(Item.uDataType != QCBOR_TYPE_MAP_AS_ARRAY ||
1010 Item.val.uCount != 6) {
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001011 return -1;
1012 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001013
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001014 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
1015 return nCBORError;
1016 }
1017 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
1018 Item.uDataAlloc ||
1019 Item.uLabelAlloc ||
1020 Item.uLabelType != QCBOR_TYPE_NONE ||
1021 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("first integer"))) {
1022 return -2;
1023 }
1024
1025 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
1026 return nCBORError;
1027 }
1028 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1029 Item.uDataType != QCBOR_TYPE_INT64 ||
1030 Item.val.int64 != 42 ||
1031 Item.uDataAlloc ||
1032 Item.uLabelAlloc) {
1033 return -3;
1034 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001035
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001036 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
1037 return nCBORError;
1038 }
1039 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1040 Item.uDataAlloc ||
1041 Item.uLabelAlloc ||
1042 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("an array of two strings")) ||
1043 Item.uDataType != QCBOR_TYPE_TEXT_STRING) {
1044 return -4;
1045 }
1046
1047 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
1048 return nCBORError;
1049 }
1050 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1051 Item.uDataAlloc ||
1052 Item.uLabelAlloc ||
1053 Item.uDataType != QCBOR_TYPE_ARRAY ||
1054 Item.val.uCount != 2) {
1055 return -5;
1056 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001057
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001058 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
1059 return nCBORError;
1060 }
1061 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
1062 Item.val.string.len != 7 ||
1063 Item.uDataAlloc ||
1064 Item.uLabelAlloc ||
1065 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("string1"))) {
1066 return -6;
1067 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001068
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001069 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
1070 return nCBORError;
1071 }
1072 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
1073 Item.uDataAlloc ||
1074 Item.uLabelAlloc ||
1075 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("string2"))) {
1076 return -7;
1077 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001078
1079
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001080 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
1081 return nCBORError;
1082 }
1083 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1084 Item.uDataAlloc ||
1085 Item.uLabelAlloc ||
1086 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("map in a map"))) {
1087 return -8;
1088 }
1089
1090 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
1091 return nCBORError;
1092 }
1093 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1094 Item.uDataAlloc ||
1095 Item.uLabelAlloc ||
Laurence Lundbladed61cbf32018-12-09 11:42:21 -08001096 Item.uDataType != QCBOR_TYPE_MAP_AS_ARRAY ||
1097 Item.val.uCount != 8) {
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001098 return -9;
1099 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001100
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001101 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
1102 return nCBORError;
1103 }
1104 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1105 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("bytes 1"))||
1106 Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
1107 Item.uDataAlloc ||
1108 Item.uLabelAlloc) {
1109 return -10;
1110 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001111
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001112 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
1113 return nCBORError;
1114 }
1115 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1116 Item.uDataType != QCBOR_TYPE_BYTE_STRING ||
1117 Item.uDataAlloc ||
1118 Item.uLabelAlloc ||
1119 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("xxxx"))) {
1120 return -11;
1121 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001122
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001123 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
1124 return nCBORError;
1125 }
1126 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1127 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("bytes 2")) ||
1128 Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
1129 Item.uDataAlloc ||
1130 Item.uLabelAlloc) {
1131 return -12;
1132 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001133
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001134 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
1135 return nCBORError;
1136 }
1137 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1138 Item.uDataType != QCBOR_TYPE_BYTE_STRING ||
1139 Item.uDataAlloc ||
1140 Item.uLabelAlloc ||
1141 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("yyyy"))) {
1142 return -13;
1143 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001144
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001145 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
1146 return nCBORError;
1147 }
1148 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1149 Item.uDataAlloc ||
1150 Item.uLabelAlloc ||
1151 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("another int")) ||
1152 Item.uDataType != QCBOR_TYPE_TEXT_STRING) {
1153 return -14;
1154 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001155
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001156 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
1157 return nCBORError;
1158 }
1159 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1160 Item.uDataAlloc ||
1161 Item.uLabelAlloc ||
1162 Item.uDataType != QCBOR_TYPE_INT64 ||
1163 Item.val.int64 != 98) {
1164 return -15;
1165 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001166
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001167 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
1168 return nCBORError;
1169 }
1170 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1171 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("text 2"))||
1172 Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
1173 Item.uDataAlloc ||
1174 Item.uLabelAlloc) {
1175 return -16;
1176 }
1177
1178 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
1179 return nCBORError;
1180 }
1181 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1182 Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
1183 Item.uDataAlloc ||
1184 Item.uLabelAlloc ||
1185 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("lies, damn lies and statistics"))) {
1186 return -17;
1187 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001188
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001189 return 0;
1190}
1191
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001192
1193/*
Laurence Lundbladefab1b522018-10-19 13:40:52 +05301194 Fully or partially decode pValidMapEncoded. When
1195 partially decoding check for the right error code.
1196 How much partial decoding depends on nLevel.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001197
Laurence Lundbladefab1b522018-10-19 13:40:52 +05301198 The partial decodes test error conditions of
1199 incomplete encoded input.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001200
Laurence Lundbladefab1b522018-10-19 13:40:52 +05301201 This could be combined with the above test
1202 and made prettier and maybe a little more
1203 thorough.
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001204 */
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001205static int ExtraBytesTest(int nLevel)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001206{
1207 QCBORDecodeContext DCtx;
1208 QCBORItem Item;
1209 int nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001210
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001211 QCBORDecode_Init(&DCtx, (UsefulBufC){pValidMapEncoded, sizeof(pValidMapEncoded)}, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001212
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001213 if(nLevel < 1) {
1214 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_EXTRA_BYTES) {
1215 return -1;
1216 } else {
1217 return 0;
1218 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001219 }
Laurence Lundbladefab1b522018-10-19 13:40:52 +05301220
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001221
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001222 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001223 return nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001224 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001225 if(Item.uDataType != QCBOR_TYPE_MAP ||
1226 Item.val.uCount != 3)
1227 return -1;
1228
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001229 if(nLevel < 2) {
1230 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1231 return -1;
1232 } else {
1233 return 0;
1234 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001235 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001236
1237
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001238 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001239 return nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001240 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001241 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001242 Item.uDataType != QCBOR_TYPE_INT64 ||
1243 Item.val.uCount != 42 ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001244 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("first integer"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001245 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001246 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001247
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001248 if(nLevel < 3) {
1249 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1250 return -1;
1251 } else {
1252 return 0;
1253 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001254 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001255
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001256 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001257 return nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001258 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001259 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001260 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("an array of two strings")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001261 Item.uDataType != QCBOR_TYPE_ARRAY ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001262 Item.val.uCount != 2) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001263 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001264 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001265
1266
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001267 if(nLevel < 4) {
1268 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1269 return -1;
1270 } else {
1271 return 0;
1272 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001273 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001274
1275
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001276 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001277 return nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001278 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001279 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001280 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("string1"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001281 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001282 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001283
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001284 if(nLevel < 5) {
1285 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1286 return -1;
1287 } else {
1288 return 0;
1289 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001290 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001291
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001292 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001293 return nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001294 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001295 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001296 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("string2"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001297 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001298 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001299
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001300 if(nLevel < 6) {
1301 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1302 return -1;
1303 } else {
1304 return 0;
1305 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001306 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001307
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001308 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001309 return nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001310 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001311 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001312 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("map in a map")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001313 Item.uDataType != QCBOR_TYPE_MAP ||
1314 Item.val.uCount != 4)
1315 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001316
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001317 if(nLevel < 7) {
1318 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1319 return -1;
1320 } else {
1321 return 0;
1322 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001323 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001324
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001325 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001326 return nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001327 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001328 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001329 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("bytes 1")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001330 Item.uDataType != QCBOR_TYPE_BYTE_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001331 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("xxxx"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001332 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001333 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001334
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001335 if(nLevel < 8) {
1336 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1337 return -1;
1338 } else {
1339 return 0;
1340 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001341 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001342
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001343 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001344 return nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001345 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001346 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001347 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("bytes 2")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001348 Item.uDataType != QCBOR_TYPE_BYTE_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001349 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("yyyy"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001350 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001351 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001352
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001353 if(nLevel < 9) {
1354 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1355 return -1;
1356 } else {
1357 return 0;
1358 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001359 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001360
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001361 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001362 return nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001363 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001364 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001365 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("another int")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001366 Item.uDataType != QCBOR_TYPE_INT64 ||
1367 Item.val.int64 != 98)
1368 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001369
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001370 if(nLevel < 10) {
1371 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1372 return -1;
1373 } else {
1374 return 0;
1375 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001376 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001377
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001378 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001379 return nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001380 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001381 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001382 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("text 2"))||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001383 Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001384 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("lies, damn lies and statistics"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001385 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001386 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001387
Laurence Lundbladefab1b522018-10-19 13:40:52 +05301388 if(QCBORDecode_Finish(&DCtx)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001389 return -1;
1390 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001391
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001392 return 0;
1393}
1394
1395
1396
1397
1398int ParseMapTest()
1399{
Laurence Lundbladefab1b522018-10-19 13:40:52 +05301400 // Parse a moderatly complex map structure very thoroughl
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08001401 int n = ParseMapTest1(QCBOR_DECODE_MODE_NORMAL);
1402
1403 n = ParseMapTest1(QCBOR_DECODE_MODE_MAP_STRINGS_ONLY);
1404
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001405 if(!n) {
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001406 for(int i = 0; i < 10; i++) {
1407 n = ExtraBytesTest(i);
1408 if(n) {
1409 break;
1410 }
1411 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001412 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001413
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001414 return(n);
1415}
1416
1417
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07001418static uint8_t spSimpleValues[] = {0x8a, 0xf4, 0xf5, 0xf6, 0xf7, 0xff, 0xe0, 0xf3, 0xf8, 0x00, 0xf8, 0x13, 0xf8, 0x1f, 0xf8, 0x20, 0xf8, 0xff};
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001419
1420int ParseSimpleTest()
1421{
1422 QCBORDecodeContext DCtx;
1423 QCBORItem Item;
1424 int nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001425
1426
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07001427 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spSimpleValues), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001428
1429
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001430 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
1431 return nCBORError;
1432 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
1433 Item.val.uCount != 10)
1434 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001435
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001436 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
1437 return nCBORError;
1438 if(Item.uDataType != QCBOR_TYPE_FALSE)
1439 return -1;
1440
1441 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
1442 return nCBORError;
1443 if(Item.uDataType != QCBOR_TYPE_TRUE)
1444 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001445
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001446 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
1447 return nCBORError;
1448 if(Item.uDataType != QCBOR_TYPE_NULL)
1449 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001450
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001451 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
1452 return nCBORError;
1453 if(Item.uDataType != QCBOR_TYPE_UNDEF)
1454 return -1;
1455
1456 // A break
Laurence Lundblade9e3651c2018-10-10 11:49:55 +08001457 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_BAD_BREAK)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001458 return -1;
1459
1460 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
1461 return nCBORError;
1462 if(Item.uDataType != QCBOR_TYPE_UKNOWN_SIMPLE || Item.val.uSimple != 0)
1463 return -1;
1464
1465 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
1466 return nCBORError;
1467 if(Item.uDataType != QCBOR_TYPE_UKNOWN_SIMPLE || Item.val.uSimple != 19)
1468 return -1;
1469
Laurence Lundblade077475f2019-04-26 09:06:33 -07001470 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_BAD_TYPE_7)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001471 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001472
Laurence Lundblade077475f2019-04-26 09:06:33 -07001473 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_BAD_TYPE_7)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001474 return -1;
1475
Laurence Lundblade077475f2019-04-26 09:06:33 -07001476 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_BAD_TYPE_7)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001477 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001478
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001479 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
1480 return nCBORError;
1481 if(Item.uDataType != QCBOR_TYPE_UKNOWN_SIMPLE || Item.val.uSimple != 32)
1482 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001483
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001484 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
1485 return nCBORError;
1486 if(Item.uDataType != QCBOR_TYPE_UKNOWN_SIMPLE || Item.val.uSimple != 255)
1487 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001488
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001489 return 0;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001490
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001491}
1492
1493
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001494static int IsNotWellFormedError(QCBORError nErr)
1495{
1496 switch(nErr){
1497 case QCBOR_ERR_INDEFINITE_STRING_CHUNK:
1498 case QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN:
1499 case QCBOR_ERR_UNSUPPORTED:
1500 case QCBOR_ERR_HIT_END:
1501 case QCBOR_ERR_BAD_TYPE_7:
1502 case QCBOR_ERR_BAD_BREAK:
1503 case QCBOR_ERR_EXTRA_BYTES:
1504 case QCBOR_ERR_BAD_INT:
1505 return 1;
1506 default:
1507 return 0;
1508 }
1509}
1510
1511
1512int NotWellFormedTests()
1513{
1514 // Loop over all the not-well-formed instance of CBOR
1515 // that are test vectors in not_well_formed_cbor.h
1516 const uint16_t nArraySize = sizeof(paNotWellFormedCBOR)/sizeof(struct someBinaryBytes);
1517 for(uint16_t nIterate = 0; nIterate < nArraySize; nIterate++) {
1518 const struct someBinaryBytes *pBytes = &paNotWellFormedCBOR[nIterate];
1519 const UsefulBufC Input = (UsefulBufC){pBytes->p, pBytes->n};
1520
1521 // Set up decoder context. String allocator needed for indefinite string test cases
1522 QCBORDecodeContext DCtx;
1523 QCBORDecode_Init(&DCtx, Input, QCBOR_DECODE_MODE_NORMAL);
1524 UsefulBuf_MAKE_STACK_UB(Pool, 100);
1525 QCBORDecode_SetMemPool(&DCtx, Pool, 0);
1526
1527 // Loop getting items until no more to get
1528 QCBORError nCBORError;
1529 do {
1530 QCBORItem Item;
1531
1532 nCBORError = QCBORDecode_GetNext(&DCtx, &Item);
1533 } while(nCBORError == QCBOR_SUCCESS);
1534
1535 // Every test vector must fail with
1536 // a not-well-formed error. If not
1537 // this test fails.
1538 if(!IsNotWellFormedError(nCBORError)) {
1539 // Return index of failure in the error code
1540 return 2000 + nIterate;
1541 }
1542 }
1543 return 0;
1544}
1545
1546
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001547struct FailInput {
Laurence Lundblade3a6042e2019-06-28 19:58:04 -07001548 UsefulBufC Input; // CBOR to decode
1549 QCBORError nError; // The error expected
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001550};
1551
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001552struct FailInput Failures[] = {
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001553 // Most of this is copied from not_well_formed.h. Here the error code
1554 // returned is also checked.
1555
1556 // Indefinite length strings must be closed off
1557 // An indefinite length byte string not closed off
1558 { {(uint8_t[]){0x5f, 0x41, 0x00}, 3}, QCBOR_ERR_HIT_END },
1559 // An indefinite length text string not closed off
1560 { {(uint8_t[]){0x7f, 0x61, 0x00}, 3}, QCBOR_ERR_HIT_END },
1561
1562
1563 // All the chunks in an indefinite length string must be of the type of indefinite length string
1564 // indefinite length byte string with text string chunk
1565 { {(uint8_t[]){0x5f, 0x61, 0x00, 0xff}, 4}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1566 // indefinite length text string with a byte string chunk
1567 { {(uint8_t[]){0x7f, 0x41, 0x00, 0xff}, 4}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1568 // indefinite length byte string with an positive integer chunk
1569 { {(uint8_t[]){0x5f, 0x00, 0xff}, 3}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1570 // indefinite length byte string with an negative integer chunk
1571 { {(uint8_t[]){0x5f, 0x21, 0xff}, 3}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1572 // indefinite length byte string with an array chunk
1573 { {(uint8_t[]){0x5f, 0x80, 0xff}, 3}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1574 // indefinite length byte string with an map chunk
1575 { {(uint8_t[]){0x5f, 0xa0, 0xff}, 3}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1576 // indefinite length byte string with tagged integer chunk
1577 { {(uint8_t[]){0x5f, 0xc0, 0x00, 0xff}, 4}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1578 // indefinite length byte string with an simple type chunk
1579 { {(uint8_t[]){0x5f, 0xe0, 0xff}, 3}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1580 { {(uint8_t[]){0x5f, 0x5f, 0x41, 0x00, 0xff, 0xff}, 6}, QCBOR_ERR_INDEFINITE_STRING_CHUNK},
1581 // indefinite length text string with indefinite string inside
1582 { {(uint8_t[]){0x7f, 0x7f, 0x61, 0x00, 0xff, 0xff}, 6}, QCBOR_ERR_INDEFINITE_STRING_CHUNK},
1583
1584
1585 // Definte length maps and arrays must be closed by having the right number of items
1586 // A definte length array that is supposed to have 1 item, but has none
1587 { {(uint8_t[]){0x81}, 1}, QCBOR_ERR_HIT_END },
1588 // A definte length array that is supposed to have 2 items, but has only 1
1589 { {(uint8_t[]){0x82, 0x00}, 2}, QCBOR_ERR_HIT_END },
1590 // A definte length array that is supposed to have 511 items, but has only 1
1591 { {(uint8_t[]){0x9a, 0x01, 0xff, 0x00}, 4}, QCBOR_ERR_HIT_END },
1592 // A definte length map that is supposed to have 1 item, but has none
1593 { {(uint8_t[]){0xa1}, 1}, QCBOR_ERR_HIT_END },
1594 // A definte length map that is supposed to have s item, but has only 1
1595 { {(uint8_t[]){0xa2, 0x01, 0x02}, 3}, QCBOR_ERR_HIT_END },
1596
1597
1598 // Indefinte length maps and arrays must be ended by a break
1599 // Indefinite length array with zero items and no break
1600 { {(uint8_t[]){0x9f}, 1}, QCBOR_ERR_HIT_END },
1601 // Indefinite length array with two items and no break
1602 { {(uint8_t[]){0x9f, 0x01, 0x02}, 3}, QCBOR_ERR_HIT_END },
1603 // Indefinite length map with zero items and no break
1604 { {(uint8_t[]){0xbf}, 1}, QCBOR_ERR_HIT_END },
1605 // Indefinite length map with two items and no break
1606 { {(uint8_t[]){0xbf, 0x01, 0x02, 0x01, 0x02}, 5}, QCBOR_ERR_HIT_END },
1607
1608
1609 // Nested maps and arrays must be closed off (some extra nested test vectors)
1610 // Unclosed indefinite array containing a close definite array
1611 { {(uint8_t[]){0x9f, 0x80, 0x00}, 3}, QCBOR_ERR_HIT_END },
1612 // Definite length array containing an unclosed indefinite array
1613 { {(uint8_t[]){0x81, 0x9f}, 2}, QCBOR_ERR_HIT_END },
1614 // Deeply nested definite length arrays with deepest one unclosed
1615 { {(uint8_t[]){0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81}, 9}, QCBOR_ERR_HIT_END },
1616 // Deeply nested indefinite length arrays with deepest one unclosed
1617 { {(uint8_t[]){0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0xff, 0xff, 0xff, 0xff}, 9}, QCBOR_ERR_HIT_END },
1618 // Mixed nesting with indefinite unclosed
1619 { {(uint8_t[]){0x9f, 0x81, 0x9f, 0x81, 0x9f, 0x9f, 0xff, 0xff, 0xff}, 9}, QCBOR_ERR_BAD_BREAK }, // TODO: think through this one
1620 // Mixed nesting with definite unclosed
1621 { {(uint8_t[]){0x9f, 0x82, 0x9f, 0x81, 0x9f, 0x9f, 0xff, 0xff, 0xff, 0xff}, 10}, QCBOR_ERR_BAD_BREAK }, // TODO: think through this one
1622
1623
1624 // The "argument" for the data item is incomplete
1625 // Positive integer missing 1 byte argument
1626 { {(uint8_t[]){0x18}, 1}, QCBOR_ERR_HIT_END },
1627 // Positive integer missing 2 byte argument
1628 { {(uint8_t[]){0x19}, 1}, QCBOR_ERR_HIT_END },
1629 // Positive integer missing 4 byte argument
1630 { {(uint8_t[]){0x1a}, 1}, QCBOR_ERR_HIT_END },
1631 // Positive integer missing 8 byte argument
1632 { {(uint8_t[]){0x1b}, 1}, QCBOR_ERR_HIT_END },
1633 // Positive integer missing 1 byte of 2 byte argument
1634 { {(uint8_t[]){0x19, 0x01}, 2}, QCBOR_ERR_HIT_END },
1635 // Positive integer missing 2 bytes of 4 byte argument
1636 { {(uint8_t[]){0x1a, 0x01, 0x02}, 3}, QCBOR_ERR_HIT_END },
1637 // Positive integer missing 1 bytes of 7 byte argument
1638 { {(uint8_t[]){0x1b, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 8}, QCBOR_ERR_HIT_END },
1639 // Negative integer missing 1 byte argument
1640 { {(uint8_t[]){0x38}, 1}, QCBOR_ERR_HIT_END },
1641 // Binary string missing 1 byte argument
1642 { {(uint8_t[]){0x58}, 1}, QCBOR_ERR_HIT_END },
1643 // Text string missing 1 byte argument
1644 { {(uint8_t[]){0x78}, 1}, QCBOR_ERR_HIT_END },
1645 // Array missing 1 byte argument
1646 { {(uint8_t[]){0x98}, 1}, QCBOR_ERR_HIT_END },
1647 // Map missing 1 byte argument
1648 { {(uint8_t[]){0xb8}, 1}, QCBOR_ERR_HIT_END },
1649 // Tag missing 1 byte argument
1650 { {(uint8_t[]){0xd8}, 1}, QCBOR_ERR_HIT_END },
1651 // Simple missing 1 byte argument
1652 { {(uint8_t[]){0xf8}, 1}, QCBOR_ERR_HIT_END },
1653
1654
1655 // Breaks must not occur in definite length arrays and maps
1656 // Array of length 1 with sole member replaced by a break
1657 { {(uint8_t[]){0x81, 0xff}, 2}, QCBOR_ERR_BAD_BREAK },
1658 // Array of length 2 with 2nd member replaced by a break
1659 { {(uint8_t[]){0x82, 0x00, 0xff}, 3}, QCBOR_ERR_BAD_BREAK },
1660 // Map of length 1 with sole member label replaced by a break
1661 { {(uint8_t[]){0xa1, 0xff}, 2}, QCBOR_ERR_BAD_BREAK },
1662 // Map of length 1 with sole member label replaced by break
1663 // Alternate representation that some decoders handle difference
1664 { {(uint8_t[]){0xa1, 0xff, 0x00}, 3}, QCBOR_ERR_BAD_BREAK },
1665 // Array of length 1 with 2nd member value replaced by a break
1666 { {(uint8_t[]){0xa1, 0x00, 0xff}, 3}, QCBOR_ERR_BAD_BREAK },
1667 // Map of length 2 with 2nd member replaced by a break
1668 { {(uint8_t[]){0xa2, 0x00, 0x00, 0xff}, 4}, QCBOR_ERR_BAD_BREAK },
1669
1670
1671 // Breaks must not occur on their own out of an indefinite length data item
1672 // A bare break is not well formed
1673 { {(uint8_t[]){0xff}, 1}, QCBOR_ERR_BAD_BREAK },
1674 // A bare break after a zero length definite length array
1675 { {(uint8_t[]){0x80, 0xff}, 2}, QCBOR_ERR_BAD_BREAK },
1676 // A bare break after a zero length indefinite length map
1677 { {(uint8_t[]){0x9f, 0xff, 0xff}, 3}, QCBOR_ERR_BAD_BREAK },
1678
1679
1680 // Forbidden two byte encodings of simple types
1681 // Must use 0xe0 instead
1682 { {(uint8_t[]){0xf8, 0x00}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1683 // Should use 0xe1 instead
1684 { {(uint8_t[]){0xf8, 0x01}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1685 // Should use 0xe2 instead
1686 { {(uint8_t[]){0xf8, 0x02}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1687 // Should use 0xe3 instead
1688 { {(uint8_t[]){0xf8, 0x03}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1689 // Should use 0xe4 instead
1690 { {(uint8_t[]){0xf8, 0x04}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1691 // Should use 0xe5 instead
1692 { {(uint8_t[]){0xf8, 0x05}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1693 // Should use 0xe6 instead
1694 { {(uint8_t[]){0xf8, 0x06}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1695 // Should use 0xe7 instead
1696 { {(uint8_t[]){0xf8, 0x07}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1697 // Should use 0xe8 instead
1698 { {(uint8_t[]){0xf8, 0x08}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1699 // Should use 0xe9 instead
1700 { {(uint8_t[]){0xf8, 0x09}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1701 // Should use 0xea instead
1702 { {(uint8_t[]){0xf8, 0x0a}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1703 // Should use 0xeb instead
1704 { {(uint8_t[]){0xf8, 0x0b}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1705 // Should use 0xec instead
1706 { {(uint8_t[]){0xf8, 0x0c}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1707 // Should use 0xed instead
1708 { {(uint8_t[]){0xf8, 0x0d}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1709 // Should use 0xee instead
1710 { {(uint8_t[]){0xf8, 0x0e}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1711 // Should use 0xef instead
1712 { {(uint8_t[]){0xf8, 0x0f}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1713 // Should use 0xf0 instead
1714 { {(uint8_t[]){0xf8, 0x10}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1715 // Should use 0xf1 instead
1716 { {(uint8_t[]){0xf8, 0x11}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1717 // Should use 0xf2 instead
1718 { {(uint8_t[]){0xf8, 0x12}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1719 // Must use 0xf3 instead
1720 { {(uint8_t[]){0xf8, 0x13}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1721 // Must use 0xf4 instead
1722 { {(uint8_t[]){0xf8, 0x14}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1723 // Must use 0xf5 instead
1724 { {(uint8_t[]){0xf8, 0x15}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1725 // Must use 0xf6 instead
1726 { {(uint8_t[]){0xf8, 0x16}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1727 // Must use 0xf7 instead
1728 { {(uint8_t[]){0xf8, 0x17}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1729 // Must use 0xf8 instead
1730 { {(uint8_t[]){0xf8, 0x18}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1731
1732
1733 // Integers with additional info indefinite length
1734 // Positive integer with additional info indefinite length
1735 { {(uint8_t[]){0x1f}, 1}, QCBOR_ERR_BAD_INT },
1736 // Negative integer with additional info indefinite length
1737 { {(uint8_t[]){0x3f}, 1}, QCBOR_ERR_BAD_INT },
1738 // CBOR tag with "argument" an indefinite length
1739 { {(uint8_t[]){0xdf, 0x00}, 2}, QCBOR_ERR_BAD_INT },
1740 // CBOR tag with "argument" an indefinite length alternate vector
1741 { {(uint8_t[]){0xdf}, 1}, QCBOR_ERR_BAD_INT },
1742
1743
1744 // Missing bytes from a deterministic length string
1745 // A byte string is of length 1 without the 1 byte
1746 { {(uint8_t[]){0x41}, 1}, QCBOR_ERR_HIT_END },
1747 // A text string is of length 1 without the 1 byte
1748 { {(uint8_t[]){0x61}, 1}, QCBOR_ERR_HIT_END },
1749 // Byte string should have 2^32-1 bytes, but has one
1750 { {(uint8_t[]){0x5a, 0xff, 0xff, 0xff, 0xff, 0x00}, 6}, QCBOR_ERR_HIT_END },
1751 // Byte string should have 2^32-1 bytes, but has one
1752 { {(uint8_t[]){0x7a, 0xff, 0xff, 0xff, 0xff, 0x00}, 6}, QCBOR_ERR_HIT_END },
1753
1754
1755 // Use of unassigned additional information values
1756 // Major type positive integer with reserved value 28
1757 { {(uint8_t[]){0x1c}, 1}, QCBOR_ERR_UNSUPPORTED },
1758 // Major type positive integer with reserved value 29
1759 { {(uint8_t[]){0x1d}, 1}, QCBOR_ERR_UNSUPPORTED },
1760 // Major type positive integer with reserved value 30
1761 { {(uint8_t[]){0x1e}, 1}, QCBOR_ERR_UNSUPPORTED },
1762 // Major type negative integer with reserved value 28
1763 { {(uint8_t[]){0x3c}, 1}, QCBOR_ERR_UNSUPPORTED },
1764 // Major type negative integer with reserved value 29
1765 { {(uint8_t[]){0x3d}, 1}, QCBOR_ERR_UNSUPPORTED },
1766 // Major type negative integer with reserved value 30
1767 { {(uint8_t[]){0x3e}, 1}, QCBOR_ERR_UNSUPPORTED },
1768 // Major type byte string with reserved value 28 length
1769 { {(uint8_t[]){0x5c}, 1}, QCBOR_ERR_UNSUPPORTED },
1770 // Major type byte string with reserved value 29 length
1771 { {(uint8_t[]){0x5d}, 1}, QCBOR_ERR_UNSUPPORTED },
1772 // Major type byte string with reserved value 30 length
1773 { {(uint8_t[]){0x5e}, 1}, QCBOR_ERR_UNSUPPORTED },
1774 // Major type text string with reserved value 28 length
1775 { {(uint8_t[]){0x7c}, 1}, QCBOR_ERR_UNSUPPORTED },
1776 // Major type text string with reserved value 29 length
1777 { {(uint8_t[]){0x7d}, 1}, QCBOR_ERR_UNSUPPORTED },
1778 // Major type text string with reserved value 30 length
1779 { {(uint8_t[]){0x7e}, 1}, QCBOR_ERR_UNSUPPORTED },
1780 // Major type array with reserved value 28 length
1781 { {(uint8_t[]){0x9c}, 1}, QCBOR_ERR_UNSUPPORTED },
1782 // Major type array with reserved value 29 length
1783 { {(uint8_t[]){0x9d}, 1}, QCBOR_ERR_UNSUPPORTED },
1784 // Major type array with reserved value 30 length
1785 { {(uint8_t[]){0x9e}, 1}, QCBOR_ERR_UNSUPPORTED },
1786 // Major type map with reserved value 28 length
1787 { {(uint8_t[]){0xbc}, 1}, QCBOR_ERR_UNSUPPORTED },
1788 // Major type map with reserved value 29 length
1789 { {(uint8_t[]){0xbd}, 1}, QCBOR_ERR_UNSUPPORTED },
1790 // Major type map with reserved value 30 length
1791 { {(uint8_t[]){0xbe}, 1}, QCBOR_ERR_UNSUPPORTED },
1792 // Major type tag with reserved value 28 length
1793 { {(uint8_t[]){0xdc}, 1}, QCBOR_ERR_UNSUPPORTED },
1794 // Major type tag with reserved value 29 length
1795 { {(uint8_t[]){0xdd}, 1}, QCBOR_ERR_UNSUPPORTED },
1796 // Major type tag with reserved value 30 length
1797 { {(uint8_t[]){0xde}, 1}, QCBOR_ERR_UNSUPPORTED },
1798 // Major type simple with reserved value 28 length
1799 { {(uint8_t[]){0xfc}, 1}, QCBOR_ERR_UNSUPPORTED },
1800 // Major type simple with reserved value 29 length
1801 { {(uint8_t[]){0xfd}, 1}, QCBOR_ERR_UNSUPPORTED },
1802 // Major type simple with reserved value 30 length
1803 { {(uint8_t[]){0xfe}, 1}, QCBOR_ERR_UNSUPPORTED },
1804
1805
1806 // Maps must have an even number of data items (key & value)
1807 // Map with 1 item when it should have 2
1808 { {(uint8_t[]){0xa1, 0x00}, 2}, QCBOR_ERR_HIT_END },
1809 // Map with 3 item when it should have 4
1810 { {(uint8_t[]){0xa2, 0x00, 0x00, 0x00}, 2}, QCBOR_ERR_HIT_END },
1811 // Map with 1 item when it should have 2
1812 { {(uint8_t[]){0xbf, 0x00, 0xff}, 3}, QCBOR_ERR_BAD_BREAK },
1813 // Map with 3 item when it should have 4
1814 { {(uint8_t[]){0xbf, 0x00, 0x00, 0x00, 0xff}, 5}, QCBOR_ERR_BAD_BREAK },
1815
1816
1817 // In addition to not-well-formed, some invalid CBOR
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001818 { {(uint8_t[]){0xc0, 0x00}, 2}, QCBOR_ERR_BAD_OPT_TAG }, // Text-based date, with an integer
1819 { {(uint8_t[]){0xc1, 0x41, 0x33}, 3}, QCBOR_ERR_BAD_OPT_TAG }, // Epoch date, with an byte string
1820 { {(uint8_t[]){0xc1, 0xc0, 0x00}, 3}, QCBOR_ERR_BAD_OPT_TAG }, // tagged as both epoch and string dates
Laurence Lundblade3a6042e2019-06-28 19:58:04 -07001821 { {(uint8_t[]){0xc2, 0x00}, 2}, QCBOR_ERR_BAD_OPT_TAG }, // big num tagged an int, not a byte string
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001822};
1823
Laurence Lundblade3a6042e2019-06-28 19:58:04 -07001824int DecodeFailureTests()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001825{
Laurence Lundblade3a6042e2019-06-28 19:58:04 -07001826 // Loop over the failures
1827 const struct FailInput * const pFEnd = &Failures[0] +
1828 sizeof(Failures)/sizeof(struct FailInput);
Laurence Lundblade3a6042e2019-06-28 19:58:04 -07001829 for(const struct FailInput *pF = &Failures[0]; pF < pFEnd ;pF++) {
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001830
Laurence Lundbladee9482dd2019-10-11 12:58:46 -07001831 // Set up the decoding context including a memory pool so that
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001832 // indefinite length items can be checked
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001833 QCBORDecodeContext DCtx;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001834 QCBORDecode_Init(&DCtx, pF->Input, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001835 UsefulBuf_MAKE_STACK_UB(Pool, 100);
1836 QCBORError nCBORError = QCBORDecode_SetMemPool(&DCtx, Pool, 0);
1837 if(nCBORError) {
1838 return -9;
1839 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001840
Laurence Lundbladee9482dd2019-10-11 12:58:46 -07001841 // Iterate until there is an error of some sort error
1842 QCBORItem Item;
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001843 do {
Laurence Lundbladee9482dd2019-10-11 12:58:46 -07001844 // Set to something none-zero other than QCBOR_TYPE_NONE
1845 memset(&Item, 0x33, sizeof(Item));
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001846
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001847 nCBORError = QCBORDecode_GetNext(&DCtx, &Item);
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001848 } while(nCBORError == QCBOR_SUCCESS);
Laurence Lundblade3a6042e2019-06-28 19:58:04 -07001849
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001850 // Must get the expected error or the this test fails
Laurence Lundbladee9482dd2019-10-11 12:58:46 -07001851 // The data and label type must also be QCBOR_TYPE_NONE
1852 if(nCBORError != pF->nError ||
1853 Item.uDataType != QCBOR_TYPE_NONE ||
1854 Item.uLabelType != QCBOR_TYPE_NONE) {
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001855 // return index of CBOR + 1000
1856 return 1000 + (int)(pF - &Failures[0]);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001857 }
1858 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001859
Laurence Lundblade3a6042e2019-06-28 19:58:04 -07001860 // Corrupt the UsefulInputBuf and see that
1861 // it reflected correctly for CBOR decoding
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001862 {
1863 QCBORDecodeContext DCtx;
Laurence Lundblade3a6042e2019-06-28 19:58:04 -07001864 QCBORItem Item;
1865 QCBORError nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001866
Laurence Lundblade3a6042e2019-06-28 19:58:04 -07001867 QCBORDecode_Init(&DCtx,
1868 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spSimpleValues),
1869 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001870
1871 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
1872 return nCBORError;
1873 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
Laurence Lundblade3a6042e2019-06-28 19:58:04 -07001874 Item.val.uCount != 10) {
1875 // This wasn't supposed to happen
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001876 return -1;
Laurence Lundblade3a6042e2019-06-28 19:58:04 -07001877 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001878
Laurence Lundblade3a6042e2019-06-28 19:58:04 -07001879 DCtx.InBuf.magic = 0; // Reach in and corrupt the UsefulInputBuf
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001880
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001881 nCBORError = QCBORDecode_GetNext(&DCtx, &Item);
Laurence Lundblade3a6042e2019-06-28 19:58:04 -07001882 if(nCBORError != QCBOR_ERR_HIT_END) {
1883 // Did not get back the error expected
1884 return -2;
1885 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001886 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001887
Laurence Lundblade3a6042e2019-06-28 19:58:04 -07001888 return 0;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001889}
1890
1891
Laurence Lundbladea2e29072018-12-30 09:20:06 -08001892/* Try all 256 values of the byte at nLen including recursing for
1893 each of the values to try values at nLen+1 ... up to nLenMax
1894 */
1895static void ComprehensiveInputRecurser(uint8_t *pBuf, int nLen, int nLenMax)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001896{
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001897 if(nLen >= nLenMax) {
1898 return;
1899 }
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -08001900
Laurence Lundbladea2e29072018-12-30 09:20:06 -08001901 for(int inputByte = 0; inputByte < 256; inputByte++) {
1902 // Set up the input
1903 pBuf[nLen] = inputByte;
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -08001904 const UsefulBufC Input = {pBuf, nLen+1};
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -08001905
Laurence Lundbladea2e29072018-12-30 09:20:06 -08001906 // Get ready to parse
1907 QCBORDecodeContext DCtx;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001908 QCBORDecode_Init(&DCtx, Input, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001909
Laurence Lundbladea2e29072018-12-30 09:20:06 -08001910 // Parse by getting the next item until an error occurs
1911 // Just about every possible decoder error can occur here
1912 // The goal of this test is not to check for the correct
1913 // error since that is not really possible. It is to
1914 // see that there is no crash on hostile input.
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001915 while(1) {
Laurence Lundbladea2e29072018-12-30 09:20:06 -08001916 QCBORItem Item;
1917 QCBORError nCBORError = QCBORDecode_GetNext(&DCtx, &Item);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001918 if(nCBORError != QCBOR_SUCCESS) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001919 break;
1920 }
1921 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001922
Laurence Lundbladea2e29072018-12-30 09:20:06 -08001923 ComprehensiveInputRecurser(pBuf, nLen+1, nLenMax);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001924 }
1925}
1926
1927
1928/*
Laurence Lundbladea2e29072018-12-30 09:20:06 -08001929 Public function for initialization. See header qcbor.h
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001930 */
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001931int ComprehensiveInputTest()
1932{
Laurence Lundbladea2e29072018-12-30 09:20:06 -08001933 // Size 2 tests 64K inputs and runs quickly
1934 uint8_t pBuf[2];
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001935
Laurence Lundbladea2e29072018-12-30 09:20:06 -08001936 ComprehensiveInputRecurser(pBuf, 0, sizeof(pBuf));
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001937
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001938 return 0;
1939}
1940
Laurence Lundbladea2e29072018-12-30 09:20:06 -08001941
1942/*
1943 Public function for initialization. See header qcbor.h
1944 */
1945int BigComprehensiveInputTest()
1946{
1947 // size 3 tests 16 million inputs and runs OK
1948 // in seconds on fast machines. Size 4 takes
1949 // 10+ minutes and 5 half a day on fast
1950 // machines. This test is kept separate from
1951 // the others so as to no slow down the use
1952 // of them as a very frequent regression.
1953 uint8_t pBuf[3]; //
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -08001954
Laurence Lundbladea2e29072018-12-30 09:20:06 -08001955 ComprehensiveInputRecurser(pBuf, 0, sizeof(pBuf));
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -08001956
Laurence Lundbladea2e29072018-12-30 09:20:06 -08001957 return 0;
1958}
1959
1960
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07001961static uint8_t spDateTestInput[] = {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001962 0xc0, // tag for string date
1963 0x6a, '1','9','8','5','-','0','4','-','1','2', // Date string
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001964
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001965 0xc1, // tag for epoch date
1966 0x1a, 0x53, 0x72, 0x4E, 0x00, // Epoch date 1400000000; Tue, 13 May 2014 16:53:20 GMT
1967
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07001968 // CBOR_TAG_B64
1969 0xc1, 0xcf, 0xd8, 0x22, // 0xee, // Epoch date with extra tags TODO: fix this test
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001970 0x1a, 0x53, 0x72, 0x4E, 0x01,
1971
1972 0xc1, // tag for epoch date
1973 0x1b, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, // Too large integer
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001974
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001975 0xc1, // tag for epoch date
1976 0xfa, 0x3f, 0x8c, 0xcc, 0xcd, // double with value 1.1
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001977
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001978 0xc1, // tag for epoch date
Laurence Lundbladea1ad8782019-11-08 00:12:11 -08001979 0xfa, 0x7f, 0x7f, 0xff, 0xff, // 3.4028234663852886e+38 too large
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001980
Laurence Lundbladea1ad8782019-11-08 00:12:11 -08001981 0xc1, // tag for epoch date
1982 0xfb, 0x43, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 9223372036854775808.000000 just barely too large
1983 //0xfa, 0x7f, 0x7f, 0xff, 0xff // 3.4028234663852886e+38 too large
1984
1985 0xc1, // tag for epoch date
1986 0xfb, 0x43, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe // 9223372036854773760 largest supported
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001987};
1988
1989
1990// have to check float expected only to within an epsilon
1991int CHECK_EXPECTED_DOUBLE(double val, double expected) {
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001992
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001993 double diff = val - expected;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001994
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001995 diff = fabs(diff);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001996
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001997 return diff > 0.0000001;
1998}
1999
2000
2001int DateParseTest()
2002{
2003 QCBORDecodeContext DCtx;
2004 QCBORItem Item;
2005 int nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002006
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002007 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spDateTestInput), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002008
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002009 const uint64_t uTags[] = {15};
2010 QCBORTagListIn TagList = {1, uTags};
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002011
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002012 QCBORDecode_SetCallerConfiguredTagList(&DCtx, &TagList);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002013
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002014 // String date
2015 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2016 return -1;
2017 if(Item.uDataType != QCBOR_TYPE_DATE_STRING ||
Laurence Lundblade9e3651c2018-10-10 11:49:55 +08002018 UsefulBuf_Compare(Item.val.dateString, UsefulBuf_FromSZ("1985-04-12"))){
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002019 return -2;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002020 }
2021
2022 // Epoch date
2023 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002024 return -3;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002025 if(Item.uDataType != QCBOR_TYPE_DATE_EPOCH ||
2026 Item.val.epochDate.nSeconds != 1400000000 ||
2027 Item.val.epochDate.fSecondsFraction != 0 ) {
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002028 return -4;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002029 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002030
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002031 // Epoch date with extra CBOR_TAG_B64 tag that doesn't really mean anything
2032 // but want to be sure extra tag doesn't cause a problem
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002033 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002034 return -5;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002035 if(Item.uDataType != QCBOR_TYPE_DATE_EPOCH ||
2036 Item.val.epochDate.nSeconds != 1400000001 ||
2037 Item.val.epochDate.fSecondsFraction != 0 ||
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002038 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_B64)) {
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002039 return -6;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002040 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002041
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002042 // Epoch date that is too large for our representation
2043 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_DATE_OVERFLOW) {
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002044 return -7;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002045 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002046
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002047 // Epoch date in float format with fractional seconds
2048 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002049 return -8;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002050 if(Item.uDataType != QCBOR_TYPE_DATE_EPOCH ||
2051 Item.val.epochDate.nSeconds != 1 ||
2052 CHECK_EXPECTED_DOUBLE(Item.val.epochDate.fSecondsFraction, 0.1 )) {
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002053 return -9;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002054 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002055
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002056 // Epoch date float that is too large for our representation
2057 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_DATE_OVERFLOW) {
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002058 return -10;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002059 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002060
Laurence Lundbladea1ad8782019-11-08 00:12:11 -08002061 // Epoch date double that is just slightly too large
2062 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_DATE_OVERFLOW) {
2063 return -11;
2064 }
2065
2066 // Largest double epoch date supported
2067 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_SUCCESS ||
2068 Item.uDataType != QCBOR_TYPE_DATE_EPOCH ||
2069 Item.val.epochDate.nSeconds != 9223372036854773760 ||
2070 Item.val.epochDate.nSeconds == 0) {
2071 return -12;
2072 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002073 // TODO: could use a few more tests with float, double, and half precsion and negative (but coverage is still pretty good)
2074
2075 return 0;
2076}
2077
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002078// Really simple basic input for tagging test
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002079static uint8_t spOptTestInput[] = {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002080 0xd9, 0xd9, 0xf7, // CBOR magic number
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002081 0x81, // Array of one
2082 0xd8, 0x04, // non-preferred serialization of tag 4
2083 0x82, 0x01, 0x03}; // fraction 1/3
2084
2085static uint8_t spEncodedLargeTag[] = {0xdb, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x80};
2086
2087// 0x9192939495969798, 0x88, 0x01, 0x04
2088static uint8_t spLotsOfTags[] = {0xdb, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0xd8, 0x88, 0xc5, 0xc4, 0x80};
2089
2090/*
2091 The cbor.me parse of this.
2092 55799(55799(55799({6(7(-23)): 5859837686836516696(7({7(-20): 11({17(-18): 17(17(17("Organization"))),
2093 9(-17): 773("SSG"), -15: 4(5(6(7(8(9(10(11(12(13(14(15("Confusion")))))))))))), 17(-16): 17("San Diego"),
2094 17(-14): 17("US")}), 23(-19): 19({-11: 9({-9: -7}),
2095 90599561(90599561(90599561(-10))): 12(h'0102030405060708090A')})})),
2096 16(-22): 23({11(8(7(-5))): 8(-3)})})))
2097 */
2098static uint8_t spCSRWithTags[] = {
2099 0xd9, 0xd9, 0xf7, 0xd9, 0xd9, 0xf7, 0xd9, 0xd9, 0xf7, 0xa2,
2100 0xc6, 0xc7, 0x36,
2101 0xdb, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0xc7, 0xa2,
2102 0xda, 0x00, 0x00, 0x00, 0x07, 0x33,
2103 0xcb, 0xa5,
2104 0xd1, 0x31,
2105 0xd1, 0xd1, 0xd1, 0x6c,
2106 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
2107 0xc9, 0x30,
2108 0xd9, 0x03, 0x05, 0x63,
2109 0x53, 0x53, 0x47,
2110 0x2e,
2111 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0x69,
2112 0x43, 0x6f, 0x6e, 0x66, 0x75, 0x73, 0x69, 0x6f, 0x6e,
2113 0xd1, 0x2f,
2114 0xd1, 0x69,
2115 0x53, 0x61, 0x6e, 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f,
2116 0xd1, 0x2d,
2117 0xd1, 0x62,
2118 0x55, 0x53,
2119 0xd7, 0x32,
2120 0xd3, 0xa2,
2121 0x2a,
2122 0xc9, 0xa1,
2123 0x28,
2124 0x26,
2125 0xda, 0x05, 0x66, 0x70, 0x89, 0xda, 0x05, 0x66, 0x70, 0x89, 0xda, 0x05, 0x66, 0x70, 0x89, 0x29,
2126 0xcc, 0x4a,
2127 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,0x07, 0x08, 0x09, 0x0a,
2128 0xd0, 0x35,
2129 0xd7, 0xa1,
2130 0xcb, 0xc8, 0xc7, 0x24,
2131 0xc8, 0x22};
2132
2133static int CheckCSRMaps(QCBORDecodeContext *pDC);
2134
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002135
2136int OptTagParseTest()
2137{
2138 QCBORDecodeContext DCtx;
2139 QCBORItem Item;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002140
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002141 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spOptTestInput), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002142
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002143 //-------------------------
2144 // This text matches the magic number tag and the fraction tag
2145 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2146 return -2;
2147 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002148 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002149 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_CBOR_MAGIC)) {
2150 return -3;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002151 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002152
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002153 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2154 return -4;
2155 }
2156 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
2157 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_FRACTION) ||
2158 Item.val.uCount != 2) {
2159 return -5;
2160 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002161
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002162 // --------------------------------
2163 // This test decodes the very large tag, but it is not in
2164 // any list so it is ignored.
2165 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spEncodedLargeTag), QCBOR_DECODE_MODE_NORMAL);
2166 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2167 return -6;
2168 }
2169 if(Item.uTagBits) {
2170 return -7;
2171 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002172
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002173 // ----------------------------------
2174 // This test sets up a caller-config list that includes the very large tage and then matches it.
2175 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spEncodedLargeTag), QCBOR_DECODE_MODE_NORMAL);
2176 const uint64_t puList[] = {0x9192939495969798, 257};
2177 const QCBORTagListIn TL = {2, puList};
2178 QCBORDecode_SetCallerConfiguredTagList(&DCtx, &TL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002179
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002180 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2181 return -8;
2182 }
2183 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
2184 !QCBORDecode_IsTagged(&DCtx, &Item, 0x9192939495969798) ||
2185 QCBORDecode_IsTagged(&DCtx, &Item, 257) ||
2186 QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_BIGFLOAT) ||
2187 Item.val.uCount != 0) {
2188 return -9;
2189 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002190
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002191 //------------------------
2192 // This test sets up a caller-configured list, and looks up something not in it
2193 const uint64_t puLongList[17] = {1,2,1};
2194 const QCBORTagListIn TLLong = {17, puLongList};
2195 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spEncodedLargeTag), QCBOR_DECODE_MODE_NORMAL);
2196 QCBORDecode_SetCallerConfiguredTagList(&DCtx, &TLLong);
2197 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2198 return -11;
2199 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002200
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002201 // -----------------------
2202 // This tests retrievel of the full tag list
2203 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spLotsOfTags), QCBOR_DECODE_MODE_NORMAL);
2204 uint64_t puTags[16];
2205 QCBORTagListOut Out = {0, 4, puTags};
2206 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2207 return -12;
2208 }
2209 if(puTags[0] != 0x9192939495969798 ||
2210 puTags[1] != 0x88 ||
2211 puTags[2] != 0x05 ||
2212 puTags[3] != 0x04) {
2213 return -13;
2214 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002215
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002216 // ----------------------
2217 // This text if too small of an out list
2218 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spLotsOfTags), QCBOR_DECODE_MODE_NORMAL);
2219 QCBORTagListOut OutSmall = {0, 3, puTags};
2220 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &OutSmall) != QCBOR_ERR_TOO_MANY_TAGS) {
2221 return -14;
2222 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002223
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002224 // ---------------
2225 // Parse a version of the "CSR" that has had a ton of tags randomly inserted
2226 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRWithTags), QCBOR_DECODE_MODE_NORMAL);
2227 int n = CheckCSRMaps(&DCtx);
2228 if(n) {
2229 return n-2000;
2230 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002231
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002232 Out = (QCBORTagListOut){0,16, puTags};
2233 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRWithTags), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002234
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002235 const uint64_t puTagList[] = {773, 1, 90599561};
2236 const QCBORTagListIn TagList = {3, puTagList};
2237 QCBORDecode_SetCallerConfiguredTagList(&DCtx, &TagList);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002238
2239
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002240 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2241 return -100;
2242 }
2243 if(Item.uDataType != QCBOR_TYPE_MAP ||
2244 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_CBOR_MAGIC) ||
2245 QCBORDecode_IsTagged(&DCtx, &Item, 90599561) ||
2246 QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_DATE_EPOCH) ||
2247 Item.val.uCount != 2 ||
2248 puTags[0] != CBOR_TAG_CBOR_MAGIC ||
2249 puTags[1] != CBOR_TAG_CBOR_MAGIC ||
2250 puTags[2] != CBOR_TAG_CBOR_MAGIC ||
2251 Out.uNumUsed != 3) {
2252 return -101;
2253 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002254
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002255 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2256 return -102;
2257 }
2258 if(Item.uDataType != QCBOR_TYPE_MAP ||
2259 QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_CBOR_MAGIC) ||
2260 QCBORDecode_IsTagged(&DCtx, &Item, 6) ||
2261 QCBORDecode_IsTagged(&DCtx, &Item, 7) || // item is tagged 7, but 7 is not configured to be recognized
2262 Item.val.uCount != 2 ||
2263 puTags[0] != 5859837686836516696 ||
2264 puTags[1] != 7 ||
2265 Out.uNumUsed != 2) {
2266 return -103;
2267 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002268
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002269 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2270 return -104;
2271 }
2272 if(Item.uDataType != QCBOR_TYPE_MAP ||
2273 Item.uTagBits ||
2274 Item.val.uCount != 5 ||
2275 puTags[0] != 0x0b ||
2276 Out.uNumUsed != 1) {
2277 return -105;
2278 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002279
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002280 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2281 return -106;
2282 }
2283 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
2284 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_COSE_MAC0) ||
2285 Item.val.string.len != 12 ||
2286 puTags[0] != CBOR_TAG_COSE_MAC0 ||
2287 puTags[1] != CBOR_TAG_COSE_MAC0 ||
2288 puTags[2] != CBOR_TAG_COSE_MAC0 ||
2289 Out.uNumUsed != 3) {
2290 return -105;
2291 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002292
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002293 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2294 return -107;
2295 }
2296 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
2297 !QCBORDecode_IsTagged(&DCtx, &Item, 773) ||
2298 Item.val.string.len != 3 ||
2299 puTags[0] != 773 ||
2300 Out.uNumUsed != 1) {
2301 return -108;
2302 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002303
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002304 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2305 return -109;
2306 }
2307 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
2308 !QCBORDecode_IsTagged(&DCtx, &Item, 4) ||
2309 Item.val.string.len != 9 ||
2310 puTags[0] != 4 ||
2311 puTags[11] != 0x0f ||
2312 Out.uNumUsed != 12) {
2313 return -110;
2314 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002315
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002316 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2317 return -111;
2318 }
2319 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
2320 !QCBORDecode_IsTagged(&DCtx, &Item, 17) ||
2321 Item.val.string.len != 9 ||
2322 puTags[0] != 17 ||
2323 Out.uNumUsed != 1) {
2324 return -112;
2325 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002326
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002327 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2328 return -111;
2329 }
2330 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
2331 !QCBORDecode_IsTagged(&DCtx, &Item, 17) ||
2332 Item.val.string.len != 2 ||
2333 puTags[0] != 17 ||
2334 Out.uNumUsed != 1) {
2335 return -112;
2336 }
2337
2338 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2339 return -113;
2340 }
2341 if(Item.uDataType != QCBOR_TYPE_MAP ||
2342 QCBORDecode_IsTagged(&DCtx, &Item, 19) ||
2343 Item.val.uCount != 2 ||
2344 puTags[0] != 19 ||
2345 Out.uNumUsed != 1) {
2346 return -114;
2347 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002348
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002349 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2350 return -115;
2351 }
2352 if(Item.uDataType != QCBOR_TYPE_MAP ||
2353 QCBORDecode_IsTagged(&DCtx, &Item, 9) ||
2354 Item.uTagBits ||
2355 Item.val.uCount != 1 ||
2356 puTags[0] != 9 ||
2357 Out.uNumUsed != 1) {
2358 return -116;
2359 }
2360
2361 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2362 return -116;
2363 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002364 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002365 Item.val.int64 != -7 ||
2366 Item.uTagBits ||
2367 Out.uNumUsed != 0) {
2368 return -117;
2369 }
2370
2371 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2372 return -118;
2373 }
2374 if(Item.uDataType != QCBOR_TYPE_BYTE_STRING ||
2375 Item.val.string.len != 10 ||
2376 Item.uTagBits ||
2377 puTags[0] != 12 ||
2378 Out.uNumUsed != 1) {
2379 return -119;
2380 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002381
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002382 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2383 return -120;
2384 }
2385 if(Item.uDataType != QCBOR_TYPE_MAP ||
2386 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_ENC_AS_B16) ||
2387 Item.val.uCount != 1 ||
2388 puTags[0] != 0x17 ||
2389 Out.uNumUsed != 1) {
2390 return -121;
2391 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002392
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002393 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2394 return -122;
2395 }
2396 if(Item.uDataType != QCBOR_TYPE_INT64 ||
2397 QCBORDecode_IsTagged(&DCtx, &Item, 8) ||
2398 Item.val.int64 != -3 ||
2399 puTags[0] != 8 ||
2400 Out.uNumUsed != 1) {
2401 return -123;
2402 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002403
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002404 if(QCBORDecode_Finish(&DCtx)) {
2405 return -124;
2406 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002407
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002408 return 0;
2409}
2410
2411
2412
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002413
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002414static uint8_t spBigNumInput[] = {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002415 0x83,
2416 0xC2, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2417 0xC3, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2418 0xA4,
2419 0x63, 0x42, 0x4E, 0x2B,
2420 0xC2, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2421 0x18, 0x40,
2422 0xC2, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2423 0x63, 0x42, 0x4E, 0x2D,
2424 0xC3, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2425 0x38, 0x3F,
2426 0xC3, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
2427
2428
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002429static uint8_t spBigNum[] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002430
2431
2432int BignumParseTest()
2433{
2434 QCBORDecodeContext DCtx;
2435 QCBORItem Item;
2436 int nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002437
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002438 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNumInput), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002439
2440
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002441 //
2442 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2443 return -1;
2444 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
2445 return -1;
2446 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002447
2448 //
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002449 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2450 return -1;
2451 if(Item.uDataType != QCBOR_TYPE_POSBIGNUM ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002452 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002453 return -1;
2454 }
2455
2456 //
2457 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2458 return -1;
2459 if(Item.uDataType != QCBOR_TYPE_NEGBIGNUM ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002460 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002461 return -1;
2462 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002463
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002464 //
2465 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2466 return -1;
2467 if(Item.uDataType != QCBOR_TYPE_MAP) {
2468 return -1;
2469 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002470
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002471 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2472 return -1;
2473 if(Item.uDataType != QCBOR_TYPE_POSBIGNUM ||
2474 Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002475 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002476 return -1;
2477 }
2478
2479 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2480 return -1;
2481 if(Item.uDataType != QCBOR_TYPE_POSBIGNUM ||
2482 Item.uLabelType != QCBOR_TYPE_INT64 ||
2483 Item.label.int64 != 64 ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002484 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002485 return -1;
2486 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002487
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002488 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2489 return -1;
2490 if(Item.uDataType != QCBOR_TYPE_NEGBIGNUM ||
2491 Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002492 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002493 return -1;
2494 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002495
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002496 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2497 return -1;
2498 if(Item.uDataType != QCBOR_TYPE_NEGBIGNUM ||
2499 Item.uLabelType != QCBOR_TYPE_INT64 ||
2500 Item.label.int64 != -64 ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002501 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002502 return -1;
2503 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002504
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002505 return 0;
2506}
2507
2508
2509
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302510static int CheckItemWithIntLabel(QCBORDecodeContext *pCtx, uint8_t uDataType, uint8_t uNestingLevel, uint8_t uNextNest, int64_t nLabel, QCBORItem *pItem)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002511{
2512 QCBORItem Item;
2513 int nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002514
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002515 if((nCBORError = QCBORDecode_GetNext(pCtx, &Item))) return -1;
2516 if(Item.uDataType != uDataType) return -1;
2517 if(uNestingLevel > 0) {
2518 if(Item.uLabelType != QCBOR_TYPE_INT64 && Item.uLabelType != QCBOR_TYPE_UINT64) return -1;
2519 if(Item.uLabelType == QCBOR_TYPE_INT64) {
2520 if(Item.label.int64 != nLabel) return -1;
2521 } else {
Laurence Lundblade570fab52018-10-13 18:28:27 +08002522 if(Item.label.uint64 != (uint64_t)nLabel) return -1;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002523 }
2524 }
2525 if(Item.uNestingLevel != uNestingLevel) return -1;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302526 if(Item.uNextNestLevel != uNextNest) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002527
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002528 if(pItem) {
2529 *pItem = Item;
2530 }
2531 return 0;
2532}
2533
2534
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002535// Same code checks definite and indefinite length versions of the map
2536static int CheckCSRMaps(QCBORDecodeContext *pDC)
2537{
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302538 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 0, 1, 0, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002539
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302540 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 1, 2, -23, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002541
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302542 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 2, 3, -20, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002543
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302544 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_TEXT_STRING, 3, 3, -18, NULL)) return -1;
2545 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_TEXT_STRING, 3, 3, -17, NULL)) return -1;
2546 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_TEXT_STRING, 3, 3, -15, NULL)) return -1;
2547 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_TEXT_STRING, 3, 3, -16, NULL)) return -1;
2548 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_TEXT_STRING, 3, 2, -14, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002549
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302550 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 2, 3, -19, NULL)) return -1;
2551 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 3, 4, -11, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002552
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302553 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_INT64, 4, 3, -9, NULL)) return -1;
2554 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_BYTE_STRING, 3, 1, -10, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002555
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302556 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 1, 2, -22, NULL)) return -1;
2557 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_INT64, 2, 0, -5, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002558
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002559 if(QCBORDecode_Finish(pDC)) return -2;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002560
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002561 return 0;
2562}
2563
2564
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002565/*
2566// cbor.me decoded output
2567{
2568 -23: {
2569 -20: {
2570 -18: "Organization",
2571 -17: "SSG",
2572 -15: "Confusion",
2573 -16: "San Diego",
2574 -14: "US"
2575 },
2576 -19: {
2577 -11: {
2578 -9: -7
2579 },
2580 -10: '\u0001\u0002\u0003\u0004\u0005\u0006\a\b\t\n'
2581 }
2582 },
2583 -22: {
2584 -5: -3
2585 }
2586}
2587 */
2588
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002589
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002590static uint8_t spCSRInput[] = {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002591 0xa2, 0x36, 0xa2, 0x33, 0xa5, 0x31, 0x6c, 0x4f,
2592 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74,
2593 0x69, 0x6f, 0x6e, 0x30, 0x63, 0x53, 0x53, 0x47,
2594 0x2e, 0x69, 0x43, 0x6f, 0x6e, 0x66, 0x75, 0x73,
2595 0x69, 0x6f, 0x6e, 0x2f, 0x69, 0x53, 0x61, 0x6e,
2596 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x2d, 0x62,
2597 0x55, 0x53, 0x32, 0xa2, 0x2a, 0xa1, 0x28, 0x26,
2598 0x29, 0x4a, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
2599 0x07, 0x08, 0x09, 0x0a, 0x35, 0xa1, 0x24, 0x22};
2600
2601int NestedMapTest()
2602{
2603 QCBORDecodeContext DCtx;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002604
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002605 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRInput), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002606
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002607 return CheckCSRMaps(&DCtx);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002608}
2609
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08002610
2611
2612int StringDecoderModeFailTest()
2613{
2614 QCBORDecodeContext DCtx;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002615
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08002616 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRInput), QCBOR_DECODE_MODE_MAP_STRINGS_ONLY);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002617
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08002618 QCBORItem Item;
2619 QCBORError nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002620
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08002621 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2622 return -1;
2623 }
2624 if(Item.uDataType != QCBOR_TYPE_MAP) {
2625 return -2;
2626 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002627
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08002628 nCBORError = QCBORDecode_GetNext(&DCtx, &Item);
2629 if(nCBORError != QCBOR_ERR_MAP_LABEL_TYPE) {
2630 return -3;
2631 }
2632
2633 return 0;
2634}
2635
2636
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002637// Same map as above, but using indefinite lengths
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002638static uint8_t spCSRInputIndefLen[] = {
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002639 0xbf, 0x36, 0xbf, 0x33, 0xbf, 0x31, 0x6c, 0x4f,
2640 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74,
2641 0x69, 0x6f, 0x6e, 0x30, 0x63, 0x53, 0x53, 0x47,
2642 0x2e, 0x69, 0x43, 0x6f, 0x6e, 0x66, 0x75, 0x73,
2643 0x69, 0x6f, 0x6e, 0x2f, 0x69, 0x53, 0x61, 0x6e,
2644 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x2d, 0x62,
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002645 0x55, 0x53, 0xff, 0x32, 0xbf, 0x2a, 0xbf, 0x28,
2646 0x26, 0xff, 0x29, 0x4a, 0x01, 0x02, 0x03, 0x04,
2647 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0xff, 0xff,
2648 0x35, 0xbf, 0x24, 0x22, 0xff, 0xff};
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002649
2650int NestedMapTestIndefLen()
2651{
2652 QCBORDecodeContext DCtx;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002653
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002654 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRInputIndefLen), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002655
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002656 return CheckCSRMaps(&DCtx);
2657}
2658
2659
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002660
Laurence Lundblade17ede402018-10-13 11:43:07 +08002661static UsefulBufC make_nested_indefinite_arrays(int n, UsefulBuf Storage)
2662{
2663 UsefulOutBuf UOB;
2664 UsefulOutBuf_Init(&UOB, Storage);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002665
Laurence Lundblade17ede402018-10-13 11:43:07 +08002666 int i;
2667 for(i = 0; i < n; i++) {
2668 UsefulOutBuf_AppendByte(&UOB, 0x9f);
2669 }
2670
2671 for(i = 0; i < n; i++) {
2672 UsefulOutBuf_AppendByte(&UOB, 0xff);
2673 }
2674 return UsefulOutBuf_OutUBuf(&UOB);
2675}
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002676
2677
Laurence Lundblade17ede402018-10-13 11:43:07 +08002678static int parse_indeflen_nested(UsefulBufC Nested, int nNestLevel)
2679{
2680 QCBORDecodeContext DC;
2681 QCBORDecode_Init(&DC, Nested, 0);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002682
Laurence Lundblade17ede402018-10-13 11:43:07 +08002683 int j;
2684 for(j = 0; j < nNestLevel; j++) {
2685 QCBORItem Item;
2686 int nReturn = QCBORDecode_GetNext(&DC, &Item);
2687 if(j >= QCBOR_MAX_ARRAY_NESTING) {
2688 // Should be in error
2689 if(nReturn != QCBOR_ERR_ARRAY_NESTING_TOO_DEEP) {
2690 return -4;
2691 } else {
2692 return 0; // Decoding doesn't recover after an error
2693 }
2694 } else {
2695 // Should be no error
2696 if(nReturn) {
2697 return -9; // Should not have got an error
2698 }
2699 }
2700 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
2701 return -7;
2702 }
2703 }
2704 int nReturn = QCBORDecode_Finish(&DC);
2705 if(nReturn) {
2706 return -3;
2707 }
2708 return 0;
2709}
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002710
2711
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302712int IndefiniteLengthNestTest()
Laurence Lundblade17ede402018-10-13 11:43:07 +08002713{
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05302714 UsefulBuf_MAKE_STACK_UB(Storage, 50);
Laurence Lundblade17ede402018-10-13 11:43:07 +08002715 int i;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002716 for(i=1; i < QCBOR_MAX_ARRAY_NESTING+4; i++) {
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -08002717 const UsefulBufC Nested = make_nested_indefinite_arrays(i, Storage);
Laurence Lundblade17ede402018-10-13 11:43:07 +08002718 int nReturn = parse_indeflen_nested(Nested, i);
2719 if(nReturn) {
2720 return nReturn;
2721 }
2722 }
2723 return 0;
2724}
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002725
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002726
Laurence Lundblade6de37062018-10-15 12:22:42 +05302727
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002728static const uint8_t spIndefiniteArray[] = {0x9f, 0x01, 0x82, 0x02, 0x03, 0xff}; // [1, [2, 3]]
2729static const uint8_t spIndefiniteArrayBad1[] = {0x9f}; // No closing break
2730static const uint8_t spIndefiniteArrayBad2[] = {0x9f, 0x9f, 0x02, 0xff}; // Not enough closing breaks
2731static const uint8_t spIndefiniteArrayBad3[] = {0x9f, 0x02, 0xff, 0xff}; // Too many closing breaks
2732static const uint8_t spIndefiniteArrayBad4[] = {0x81, 0x9f}; // Unclosed indeflen inside def len
2733static const uint8_t spIndefiniteArrayBad5[] = {0x9f, 0xd1, 0xff}; // confused tag
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002734
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302735int IndefiniteLengthArrayMapTest()
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002736{
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002737 int nResult;
2738 // --- first test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002739 UsefulBufC IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArray);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002740
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002741 // Decode it and see if it is OK
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05302742 UsefulBuf_MAKE_STACK_UB(MemPool, 150);
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002743 QCBORDecodeContext DC;
2744 QCBORItem Item;
2745 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002746
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002747 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002748
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002749 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302750
2751 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
2752 Item.uNestingLevel != 0 ||
2753 Item.uNextNestLevel != 1) {
2754 return -111;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002755 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002756
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002757 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302758 if(Item.uDataType != QCBOR_TYPE_INT64 ||
2759 Item.uNestingLevel != 1 ||
2760 Item.uNextNestLevel != 1) {
2761 return -2;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002762 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002763
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002764 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302765 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
2766 Item.uNestingLevel != 1 ||
2767 Item.uNextNestLevel != 2) {
2768 return -3;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002769 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002770
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002771 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade12b495d2018-12-17 11:15:54 -08002772 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade6de37062018-10-15 12:22:42 +05302773 Item.uNestingLevel != 2 ||
2774 Item.uNextNestLevel != 2) {
2775 return -4;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002776 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002777
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002778 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade12b495d2018-12-17 11:15:54 -08002779 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade6de37062018-10-15 12:22:42 +05302780 Item.uNestingLevel != 2 ||
2781 Item.uNextNestLevel != 0) {
2782 return -5;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002783 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002784
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002785 if(QCBORDecode_Finish(&DC)) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302786 return -6;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002787 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002788
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002789 // --- next test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002790 IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArrayBad1);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002791
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002792 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002793
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002794 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002795
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002796 nResult = QCBORDecode_GetNext(&DC, &Item);
2797 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302798 return -7;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002799 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002800
Laurence Lundblade570fab52018-10-13 18:28:27 +08002801 nResult = QCBORDecode_Finish(&DC);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302802 if(nResult != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
2803 return -8;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002804 }
2805
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002806
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002807 // --- next test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002808 IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArrayBad2);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002809
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002810 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002811
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002812 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002813
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002814 nResult = QCBORDecode_GetNext(&DC, &Item);
2815 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302816 return -9;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002817 }
2818
2819 nResult = QCBORDecode_GetNext(&DC, &Item);
2820 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302821 return -10;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002822 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002823
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002824 nResult = QCBORDecode_GetNext(&DC, &Item);
2825 if(nResult || Item.uDataType != QCBOR_TYPE_INT64) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302826 return -11;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002827 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002828
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002829 nResult = QCBORDecode_Finish(&DC);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302830 if(nResult != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
2831 return -12;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002832 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002833
2834
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002835 // --- next test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002836 IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArrayBad3);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002837
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002838 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002839
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002840 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002841
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002842 nResult = QCBORDecode_GetNext(&DC, &Item);
2843 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302844 return -13;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002845 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002846
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002847 nResult = QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302848 if(nResult != QCBOR_ERR_BAD_BREAK) {
2849 return -14;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002850 }
Laurence Lundblade6de37062018-10-15 12:22:42 +05302851
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002852
Laurence Lundblade570fab52018-10-13 18:28:27 +08002853 // --- next test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002854 IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArrayBad4);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002855
Laurence Lundblade570fab52018-10-13 18:28:27 +08002856 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002857
Laurence Lundblade570fab52018-10-13 18:28:27 +08002858 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002859
Laurence Lundblade570fab52018-10-13 18:28:27 +08002860 nResult = QCBORDecode_GetNext(&DC, &Item);
2861 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302862 return -15;
Laurence Lundblade570fab52018-10-13 18:28:27 +08002863 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002864
Laurence Lundblade570fab52018-10-13 18:28:27 +08002865 nResult = QCBORDecode_GetNext(&DC, &Item);
2866 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302867 return -16;
Laurence Lundblade570fab52018-10-13 18:28:27 +08002868 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002869
Laurence Lundblade570fab52018-10-13 18:28:27 +08002870 nResult = QCBORDecode_Finish(&DC);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302871 if(nResult != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
2872 return -17;
Laurence Lundblade570fab52018-10-13 18:28:27 +08002873 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002874
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05302875 // --- next test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002876 IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArrayBad5);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002877
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05302878 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002879
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05302880 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002881
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05302882 nResult = QCBORDecode_GetNext(&DC, &Item);
2883 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302884 return -18;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05302885 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002886
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05302887 nResult = QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302888 if(nResult != QCBOR_ERR_BAD_BREAK) {
2889 return -19;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05302890 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002891
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002892 return 0;
2893}
2894
Laurence Lundblade17ede402018-10-13 11:43:07 +08002895
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002896static const uint8_t spIndefiniteLenString[] = {
Laurence Lundblade17ede402018-10-13 11:43:07 +08002897 0x81, // Array of length one
2898 0x7f, // text string marked with indefinite length
2899 0x65, 0x73, 0x74, 0x72, 0x65, 0x61, // first segment
2900 0x64, 0x6d, 0x69, 0x6e, 0x67, // second segment
2901 0xff // ending break
2902};
2903
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002904static const uint8_t spIndefiniteLenStringBad2[] = {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302905 0x81, // Array of length one
2906 0x7f, // text string marked with indefinite length
2907 0x65, 0x73, 0x74, 0x72, 0x65, 0x61, // first segment
2908 0x44, 0x6d, 0x69, 0x6e, 0x67, // second segment of wrong type
2909 0xff // ending break
2910};
2911
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002912static const uint8_t spIndefiniteLenStringBad3[] = {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302913 0x81, // Array of length one
2914 0x7f, // text string marked with indefinite length
2915 0x01, 0x02, // Not a string
2916 0xff // ending break
2917};
2918
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002919static const uint8_t spIndefiniteLenStringBad4[] = {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302920 0x81, // Array of length one
2921 0x7f, // text string marked with indefinite length
2922 0x65, 0x73, 0x74, 0x72, 0x65, 0x61, // first segment
2923 0x64, 0x6d, 0x69, 0x6e, 0x67, // second segment
2924 // missing end of string
2925};
2926
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002927static const uint8_t spIndefiniteLenStringLabel[] = {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302928 0xa1, // Array of length one
2929 0x7f, // text string marked with indefinite length
2930 0x65, 0x73, 0x74, 0x72, 0x75, 0x75, // first segment
2931 0x64, 0x6d, 0x69, 0x6e, 0x67, // second segment
2932 0xff, // ending break
2933 0x01 // integer being labeled.
2934};
2935
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08002936static UsefulBufC MakeIndefiniteBigBstr(UsefulBuf Storage) // TODO: size this
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302937{
2938 UsefulOutBuf UOB;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002939
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302940 UsefulOutBuf_Init(&UOB, Storage);
2941 UsefulOutBuf_AppendByte(&UOB, 0x81);
2942 UsefulOutBuf_AppendByte(&UOB, 0x5f);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002943
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302944 int i = 0;
2945 for(int nChunkSize = 1; nChunkSize <= 128; nChunkSize *= 2) {
2946 UsefulOutBuf_AppendByte(&UOB, 0x58);
2947 UsefulOutBuf_AppendByte(&UOB, (uint8_t)nChunkSize);
2948 for(int j = 0; j < nChunkSize; j++ ) {
2949 UsefulOutBuf_AppendByte(&UOB, i);
2950 i++;
2951 }
2952 }
2953 UsefulOutBuf_AppendByte(&UOB, 0xff);
2954
2955 return UsefulOutBuf_OutUBuf(&UOB);
2956}
2957
2958static int CheckBigString(UsefulBufC BigString)
2959{
2960 if(BigString.len != 255) {
2961 return 1;
2962 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002963
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302964 for(uint8_t i = 0; i < 255; i++){
2965 if(((const uint8_t *)BigString.ptr)[i] != i) {
2966 return 1;
2967 }
2968 }
2969 return 0;
2970}
2971
Laurence Lundblade7e0d13b2018-10-16 19:54:13 +05302972
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302973int IndefiniteLengthStringTest()
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05302974{
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302975 QCBORDecodeContext DC;
2976 QCBORItem Item;
Laurence Lundblade7e0d13b2018-10-16 19:54:13 +05302977 // big enough for MakeIndefiniteBigBstr() + MemPool overhead
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08002978 UsefulBuf_MAKE_STACK_UB(MemPool, 350);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002979
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302980 // --- Simple normal indefinite length string ------
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002981 UsefulBufC IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteLenString);
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302982 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002983
Laurence Lundblade7e0d13b2018-10-16 19:54:13 +05302984 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302985 return -1;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05302986 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002987
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302988 if(QCBORDecode_GetNext(&DC, &Item)) {
2989 return -2;
2990 }
2991 if(Item.uDataType != QCBOR_TYPE_ARRAY || Item.uDataAlloc) {
2992 return -3;
2993 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002994
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302995 if(QCBORDecode_GetNext(&DC, &Item)) {
2996 return -4;
2997 }
2998 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING || !Item.uDataAlloc) {
2999 return -5;
3000 }
3001 if(QCBORDecode_Finish(&DC)) {
3002 return -6;
3003 }
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303004
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303005 // ----- types mismatch ---
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003006 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteLenStringBad2), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003007
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303008 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
3009 return -7;
3010 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003011
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303012 if(QCBORDecode_GetNext(&DC, &Item)) {
3013 return -8;
3014 }
3015 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
3016 return -9;
3017 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003018
Laurence Lundblade30816f22018-11-10 13:40:22 +07003019 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_ERR_INDEFINITE_STRING_CHUNK) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303020 return -10;
3021 }
3022
3023 // ----- not a string ---
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003024 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteLenStringBad3), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003025
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303026 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
3027 return -11;
3028 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003029
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303030 if(QCBORDecode_GetNext(&DC, &Item)) {
3031 return -12;
3032 }
3033 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
3034 return -13;
3035 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003036
Laurence Lundblade30816f22018-11-10 13:40:22 +07003037 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_ERR_INDEFINITE_STRING_CHUNK) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303038 return -14;
3039 }
3040
3041 // ----- no end -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003042 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteLenStringBad4), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003043
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303044 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
3045 return -15;
3046 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003047
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303048 if(QCBORDecode_GetNext(&DC, &Item)) {
3049 return -16;
3050 }
3051 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
3052 return -17;
3053 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003054
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303055 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_ERR_HIT_END) {
3056 return -18;
3057 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003058
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303059 // ------ Don't set a string allocator and see an error -----
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303060 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003061
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303062 QCBORDecode_GetNext(&DC, &Item);
3063 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303064 return -19;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303065 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003066
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303067 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_ERR_NO_STRING_ALLOCATOR) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303068 return -20;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303069 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003070
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303071 // ----- Mempool is way too small -----
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003072 UsefulBuf_MAKE_STACK_UB(MemPoolTooSmall, QCBOR_DECODE_MIN_MEM_POOL_SIZE-1);
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303073
3074 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
3075 if(!QCBORDecode_SetMemPool(&DC, MemPoolTooSmall, false)) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303076 return -21;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303077 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003078
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303079 // ----- Mempool is way too small -----
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05303080 UsefulBuf_MAKE_STACK_UB(BigIndefBStrStorage, 290);
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -08003081 const UsefulBufC BigIndefBStr = MakeIndefiniteBigBstr(BigIndefBStrStorage);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003082
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05303083 UsefulBuf_MAKE_STACK_UB(MemPoolSmall, 80); // 80 is big enough for MemPool overhead, but not BigIndefBStr
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003084
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303085 QCBORDecode_Init(&DC, BigIndefBStr, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303086 if(QCBORDecode_SetMemPool(&DC, MemPoolSmall, false)) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303087 return -22;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303088 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003089
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303090 QCBORDecode_GetNext(&DC, &Item);
3091 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303092 return -23;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303093 }
Laurence Lundblade30816f22018-11-10 13:40:22 +07003094 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_ERR_STRING_ALLOCATE) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303095 return -24;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303096 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003097
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303098 // ---- big bstr -----
3099 QCBORDecode_Init(&DC, BigIndefBStr, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003100
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303101 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
3102 return -25;
3103 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003104
Laurence Lundblade7e0d13b2018-10-16 19:54:13 +05303105 if(QCBORDecode_GetNext(&DC, &Item)) {
3106 return -26;
3107 }
3108 if(Item.uDataType != QCBOR_TYPE_ARRAY || Item.uDataAlloc) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303109 return -26;
3110 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003111
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303112 if(QCBORDecode_GetNext(&DC, &Item)) {
3113 return -27;
3114 }
Laurence Lundblade7e0d13b2018-10-16 19:54:13 +05303115 if(Item.uDataType != QCBOR_TYPE_BYTE_STRING || !Item.uDataAlloc || Item.uNestingLevel != 1) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303116 return -28;
3117 }
3118 if(CheckBigString(Item.val.string)) {
3119 return -3;
3120 }
3121 if(QCBORDecode_Finish(&DC)) {
3122 return -29;
3123 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003124
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303125 // --- label is an indefinite length string ------
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003126 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteLenStringLabel), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003127
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303128 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
3129 return -30;
3130 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003131
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303132 QCBORDecode_GetNext(&DC, &Item);
3133 if(Item.uDataType != QCBOR_TYPE_MAP) {
3134 return -31;
3135 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003136
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303137 if(QCBORDecode_GetNext(&DC, &Item)){
3138 return -32;
3139 }
3140 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING || Item.uDataType != QCBOR_TYPE_INT64 ||
3141 Item.uDataAlloc || !Item.uLabelAlloc ||
3142 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("struuming"))) {
3143 return -33;
3144 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003145
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303146 if(QCBORDecode_Finish(&DC)) {
3147 return -34;
3148 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003149
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003150 return 0;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08003151}
3152
3153
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303154int AllocAllStringsTest()
3155{
3156 QCBORDecodeContext DC;
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003157 QCBORError nCBORError;
3158
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003159
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303160 // First test, use the "CSRMap" as easy input and checking
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003161 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRInput), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003162
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003163 UsefulBuf_MAKE_STACK_UB(Pool, sizeof(spCSRInput) + QCBOR_DECODE_MIN_MEM_POOL_SIZE);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003164
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003165 nCBORError = QCBORDecode_SetMemPool(&DC, Pool, 1); // Turn on copying.
3166 if(nCBORError) {
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303167 return -1;
3168 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003169
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003170 if(CheckCSRMaps(&DC)) {
3171 return -2;
3172 }
3173
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303174 // Next parse, save pointers to a few strings, destroy original and see all is OK.
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003175 UsefulBuf_MAKE_STACK_UB(CopyOfStorage, sizeof(pValidMapEncoded) + QCBOR_DECODE_MIN_MEM_POOL_SIZE);
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -08003176 const UsefulBufC CopyOf = UsefulBuf_Copy(CopyOfStorage, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapEncoded));
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08003177
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303178 QCBORDecode_Init(&DC, CopyOf, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -08003179 UsefulBuf_Set(Pool, '/');
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303180 QCBORDecode_SetMemPool(&DC, Pool, 1); // Turn on copying.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003181
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303182 QCBORItem Item1, Item2, Item3, Item4;
3183 if((nCBORError = QCBORDecode_GetNext(&DC, &Item1)))
3184 return nCBORError;
3185 if(Item1.uDataType != QCBOR_TYPE_MAP ||
3186 Item1.val.uCount != 3)
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003187 return -3;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303188 if((nCBORError = QCBORDecode_GetNext(&DC, &Item1)))
3189 return nCBORError;
3190 if((nCBORError = QCBORDecode_GetNext(&DC, &Item2)))
3191 return nCBORError;
3192 if((nCBORError = QCBORDecode_GetNext(&DC, &Item3)))
3193 return nCBORError;
3194 if((nCBORError = QCBORDecode_GetNext(&DC, &Item4)))
3195 return nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003196
Laurence Lundblade05ec57b2018-10-21 01:50:03 +05303197 UsefulBuf_Set(CopyOfStorage, '_');
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003198
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303199 if(Item1.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303200 Item1.uDataType != QCBOR_TYPE_INT64 ||
3201 Item1.val.int64 != 42 ||
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003202 Item1.uDataAlloc != 0 ||
3203 Item1.uLabelAlloc == 0 ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003204 UsefulBuf_Compare(Item1.label.string, UsefulBuf_FromSZ("first integer"))) {
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003205 return -4;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003206 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003207
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303208
3209 if(Item2.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003210 UsefulBuf_Compare(Item2.label.string, UsefulBuf_FromSZ("an array of two strings")) ||
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303211 Item2.uDataType != QCBOR_TYPE_ARRAY ||
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003212 Item2.uDataAlloc != 0 ||
3213 Item2.uLabelAlloc == 0 ||
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303214 Item2.val.uCount != 2)
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003215 return -5;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003216
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303217 if(Item3.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003218 Item3.uDataAlloc == 0 ||
3219 Item3.uLabelAlloc != 0 ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003220 UsefulBuf_Compare(Item3.val.string, UsefulBuf_FromSZ("string1"))) {
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003221 return -6;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003222 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003223
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303224 if(Item4.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003225 Item4.uDataAlloc == 0 ||
3226 Item4.uLabelAlloc != 0 ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003227 UsefulBuf_Compare(Item4.val.string, UsefulBuf_FromSZ("string2"))) {
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003228 return -7;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003229 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003230
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303231 // Next parse with a pool that is too small
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003232 UsefulBuf_MAKE_STACK_UB(SmallPool, QCBOR_DECODE_MIN_MEM_POOL_SIZE + 1);
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05303233 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapEncoded), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303234 QCBORDecode_SetMemPool(&DC, SmallPool, 1); // Turn on copying.
3235 if((nCBORError = QCBORDecode_GetNext(&DC, &Item1)))
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003236 return -8;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303237 if(Item1.uDataType != QCBOR_TYPE_MAP ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003238 Item1.val.uCount != 3) {
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003239 return -9;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003240 }
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303241 if(!(nCBORError = QCBORDecode_GetNext(&DC, &Item1))){
3242 if(!(nCBORError = QCBORDecode_GetNext(&DC, &Item2))) {
3243 if(!(nCBORError = QCBORDecode_GetNext(&DC, &Item3))) {
3244 nCBORError = QCBORDecode_GetNext(&DC, &Item4);
3245 }
3246 }
3247 }
Laurence Lundblade30816f22018-11-10 13:40:22 +07003248 if(nCBORError != QCBOR_ERR_STRING_ALLOCATE) {
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003249 return -10;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303250 }
3251
3252 return 0;
3253}
3254
Laurence Lundbladef6531662018-12-04 10:42:22 +09003255
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303256
3257int MemPoolTest(void)
Laurence Lundblade0155b622018-10-12 20:04:37 +08003258{
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003259 // Set up the decoder with a tiny bit of CBOR to parse because
3260 // nothing can be done with it unless that is set up.
Laurence Lundbladef6531662018-12-04 10:42:22 +09003261 QCBORDecodeContext DC;
3262 const uint8_t pMinimalCBOR[] = {0xa0}; // One empty map
3263 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pMinimalCBOR),0);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003264
Laurence Lundbladef6531662018-12-04 10:42:22 +09003265 // Set up an memory pool of 100 bytes
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003266 // Then fish into the internals of the decode context
3267 // to get the allocator function so it can be called directly.
3268 // Also figure out how much pool is available for use
3269 // buy subtracting out the overhead.
Laurence Lundbladef6531662018-12-04 10:42:22 +09003270 UsefulBuf_MAKE_STACK_UB(Pool, 100);
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003271 QCBORError nError = QCBORDecode_SetMemPool(&DC, Pool, 0);
3272 if(nError) {
3273 return -9;
3274 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003275 QCBORStringAllocate pAlloc = DC.StringAllocator.pfAllocator;
3276 void *pAllocCtx = DC.StringAllocator.pAllocateCxt;
3277 size_t uAvailPool = Pool.len - QCBOR_DECODE_MIN_MEM_POOL_SIZE;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003278
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003279 // First test -- ask for one more byte than available and see failure
3280 UsefulBuf Allocated = (*pAlloc)(pAllocCtx, NULL, uAvailPool+1);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003281 if(!UsefulBuf_IsNULL(Allocated)) {
3282 return -1;
3283 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003284
Laurence Lundbladef6531662018-12-04 10:42:22 +09003285 // Re do the set up for the next test that will do a successful alloc,
3286 // a fail, a free and then success
Laurence Lundbladef6531662018-12-04 10:42:22 +09003287 QCBORDecode_SetMemPool(&DC, Pool, 0);
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003288 pAlloc = DC.StringAllocator.pfAllocator;
3289 pAllocCtx = DC.StringAllocator.pAllocateCxt;
3290 uAvailPool = Pool.len - QCBOR_DECODE_MIN_MEM_POOL_SIZE;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003291
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003292 // Allocate one byte less than available and see success
3293 Allocated = (pAlloc)(pAllocCtx, NULL, uAvailPool-1);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003294 if(UsefulBuf_IsNULL(Allocated)) { // expected to succeed
3295 return -2;
3296 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003297 // Ask for some more and see failure
3298 UsefulBuf Allocated2 = (*pAlloc)(pAllocCtx, NULL, uAvailPool/2);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003299 if(!UsefulBuf_IsNULL(Allocated2)) { // expected to fail
3300 return -3;
3301 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003302 // Free the first allocate, retry the second and see success
3303 (*pAlloc)(pAllocCtx, Allocated.ptr, 0); // Free
3304 Allocated = (*pAlloc)(pAllocCtx, NULL, uAvailPool/2);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003305 if(UsefulBuf_IsNULL(Allocated)) { // succeed because of the free
3306 return -4;
3307 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003308
Laurence Lundbladef6531662018-12-04 10:42:22 +09003309 // Re do set up for next test that involves a successful alloc,
3310 // and a successful realloc and a failed realloc
3311 QCBORDecode_SetMemPool(&DC, Pool, 0);
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003312 pAlloc = DC.StringAllocator.pfAllocator;
3313 pAllocCtx = DC.StringAllocator.pAllocateCxt;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003314
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003315 // Allocate half the pool and see success
3316 Allocated = (*pAlloc)(pAllocCtx, NULL, uAvailPool/2);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003317 if(UsefulBuf_IsNULL(Allocated)) { // expected to succeed
3318 return -5;
3319 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003320 // Reallocate to take up the whole pool and see success
3321 Allocated2 = (*pAlloc)(pAllocCtx, Allocated.ptr, uAvailPool);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003322 if(UsefulBuf_IsNULL(Allocated2)) {
3323 return -6;
3324 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003325 // Make sure its the same pointer and the size is right
Laurence Lundbladef6531662018-12-04 10:42:22 +09003326 if(Allocated2.ptr != Allocated.ptr || Allocated2.len != uAvailPool) {
3327 return -7;
3328 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003329 // Try to allocate more to be sure there is failure after a realloc
3330 UsefulBuf Allocated3 = (*pAlloc)(pAllocCtx, Allocated.ptr, uAvailPool+1);
3331 if(!UsefulBuf_IsNULL(Allocated3)) {
Laurence Lundbladef6531662018-12-04 10:42:22 +09003332 return -8;
3333 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003334
Laurence Lundbladef6531662018-12-04 10:42:22 +09003335 return 0;
3336}
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08003337
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003338
3339/* Just enough of an allocator to test configuration of one */
3340static UsefulBuf AllocateTestFunction(void *pCtx, void *pOldMem, size_t uNewSize)
3341{
3342 (void)pOldMem; // unused variable
3343
3344 if(uNewSize) {
3345 // Assumes the context pointer is the buffer and
3346 // nothing too big will ever be asked for.
3347 // This is only good for this basic test!
3348 return (UsefulBuf) {pCtx, uNewSize};
3349 } else {
3350 return NULLUsefulBuf;
3351 }
3352}
3353
3354
3355int SetUpAllocatorTest(void)
3356{
3357 // Set up the decoder with a tiny bit of CBOR to parse because
3358 // nothing can be done with it unless that is set up.
3359 QCBORDecodeContext DC;
3360 const uint8_t pMinimalCBOR[] = {0x62, 0x48, 0x69}; // "Hi"
3361 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pMinimalCBOR),0);
3362
3363 uint8_t pAllocatorBuffer[50];
3364
3365 // This is really just to test that this call works.
3366 // The full functionality of string allocators is tested
3367 // elsewhere with the MemPool internal allocator.
3368 QCBORDecode_SetUpAllocator(&DC, AllocateTestFunction, pAllocatorBuffer, 1);
3369
3370 QCBORItem Item;
3371 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_SUCCESS) {
3372 return -1;
3373 }
3374
3375 if(Item.uDataAlloc == 0 ||
3376 Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
3377 Item.val.string.ptr != pAllocatorBuffer) {
3378 return -2;
3379 }
3380
3381 if(QCBORDecode_Finish(&DC) != QCBOR_SUCCESS) {
3382 return -3;
3383 }
3384
3385 return 0;
3386}
3387