blob: 5c8a4a5367920216bdb0161b62b9c967df300957 [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
1979 0xfa, 0x7f, 0x7f, 0xff, 0xff // 3.4028234663852886e+38 too large
1980
1981};
1982
1983
1984// have to check float expected only to within an epsilon
1985int CHECK_EXPECTED_DOUBLE(double val, double expected) {
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001986
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001987 double diff = val - expected;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001988
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001989 diff = fabs(diff);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001990
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001991 return diff > 0.0000001;
1992}
1993
1994
1995int DateParseTest()
1996{
1997 QCBORDecodeContext DCtx;
1998 QCBORItem Item;
1999 int nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002000
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002001 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spDateTestInput), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002002
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002003 const uint64_t uTags[] = {15};
2004 QCBORTagListIn TagList = {1, uTags};
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002005
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002006 QCBORDecode_SetCallerConfiguredTagList(&DCtx, &TagList);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002007
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002008 // String date
2009 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2010 return -1;
2011 if(Item.uDataType != QCBOR_TYPE_DATE_STRING ||
Laurence Lundblade9e3651c2018-10-10 11:49:55 +08002012 UsefulBuf_Compare(Item.val.dateString, UsefulBuf_FromSZ("1985-04-12"))){
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002013 return -2;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002014 }
2015
2016 // Epoch date
2017 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002018 return -3;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002019 if(Item.uDataType != QCBOR_TYPE_DATE_EPOCH ||
2020 Item.val.epochDate.nSeconds != 1400000000 ||
2021 Item.val.epochDate.fSecondsFraction != 0 ) {
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002022 return -4;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002023 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002024
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002025 // Epoch date with extra CBOR_TAG_B64 tag that doesn't really mean anything
2026 // but want to be sure extra tag doesn't cause a problem
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002027 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002028 return -5;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002029 if(Item.uDataType != QCBOR_TYPE_DATE_EPOCH ||
2030 Item.val.epochDate.nSeconds != 1400000001 ||
2031 Item.val.epochDate.fSecondsFraction != 0 ||
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002032 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_B64)) {
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002033 return -6;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002034 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002035
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002036 // Epoch date that is too large for our representation
2037 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_DATE_OVERFLOW) {
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002038 return -7;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002039 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002040
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002041 // Epoch date in float format with fractional seconds
2042 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002043 return -8;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002044 if(Item.uDataType != QCBOR_TYPE_DATE_EPOCH ||
2045 Item.val.epochDate.nSeconds != 1 ||
2046 CHECK_EXPECTED_DOUBLE(Item.val.epochDate.fSecondsFraction, 0.1 )) {
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002047 return -9;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002048 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002049
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002050 // Epoch date float that is too large for our representation
2051 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_DATE_OVERFLOW) {
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002052 return -10;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002053 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002054
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002055 // TODO: could use a few more tests with float, double, and half precsion and negative (but coverage is still pretty good)
2056
2057 return 0;
2058}
2059
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002060// Really simple basic input for tagging test
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002061static uint8_t spOptTestInput[] = {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002062 0xd9, 0xd9, 0xf7, // CBOR magic number
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002063 0x81, // Array of one
2064 0xd8, 0x04, // non-preferred serialization of tag 4
2065 0x82, 0x01, 0x03}; // fraction 1/3
2066
2067static uint8_t spEncodedLargeTag[] = {0xdb, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x80};
2068
2069// 0x9192939495969798, 0x88, 0x01, 0x04
2070static uint8_t spLotsOfTags[] = {0xdb, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0xd8, 0x88, 0xc5, 0xc4, 0x80};
2071
2072/*
2073 The cbor.me parse of this.
2074 55799(55799(55799({6(7(-23)): 5859837686836516696(7({7(-20): 11({17(-18): 17(17(17("Organization"))),
2075 9(-17): 773("SSG"), -15: 4(5(6(7(8(9(10(11(12(13(14(15("Confusion")))))))))))), 17(-16): 17("San Diego"),
2076 17(-14): 17("US")}), 23(-19): 19({-11: 9({-9: -7}),
2077 90599561(90599561(90599561(-10))): 12(h'0102030405060708090A')})})),
2078 16(-22): 23({11(8(7(-5))): 8(-3)})})))
2079 */
2080static uint8_t spCSRWithTags[] = {
2081 0xd9, 0xd9, 0xf7, 0xd9, 0xd9, 0xf7, 0xd9, 0xd9, 0xf7, 0xa2,
2082 0xc6, 0xc7, 0x36,
2083 0xdb, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0xc7, 0xa2,
2084 0xda, 0x00, 0x00, 0x00, 0x07, 0x33,
2085 0xcb, 0xa5,
2086 0xd1, 0x31,
2087 0xd1, 0xd1, 0xd1, 0x6c,
2088 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
2089 0xc9, 0x30,
2090 0xd9, 0x03, 0x05, 0x63,
2091 0x53, 0x53, 0x47,
2092 0x2e,
2093 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0x69,
2094 0x43, 0x6f, 0x6e, 0x66, 0x75, 0x73, 0x69, 0x6f, 0x6e,
2095 0xd1, 0x2f,
2096 0xd1, 0x69,
2097 0x53, 0x61, 0x6e, 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f,
2098 0xd1, 0x2d,
2099 0xd1, 0x62,
2100 0x55, 0x53,
2101 0xd7, 0x32,
2102 0xd3, 0xa2,
2103 0x2a,
2104 0xc9, 0xa1,
2105 0x28,
2106 0x26,
2107 0xda, 0x05, 0x66, 0x70, 0x89, 0xda, 0x05, 0x66, 0x70, 0x89, 0xda, 0x05, 0x66, 0x70, 0x89, 0x29,
2108 0xcc, 0x4a,
2109 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,0x07, 0x08, 0x09, 0x0a,
2110 0xd0, 0x35,
2111 0xd7, 0xa1,
2112 0xcb, 0xc8, 0xc7, 0x24,
2113 0xc8, 0x22};
2114
2115static int CheckCSRMaps(QCBORDecodeContext *pDC);
2116
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002117
2118int OptTagParseTest()
2119{
2120 QCBORDecodeContext DCtx;
2121 QCBORItem Item;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002122
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002123 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spOptTestInput), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002124
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002125 //-------------------------
2126 // This text matches the magic number tag and the fraction tag
2127 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2128 return -2;
2129 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002130 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002131 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_CBOR_MAGIC)) {
2132 return -3;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002133 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002134
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002135 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2136 return -4;
2137 }
2138 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
2139 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_FRACTION) ||
2140 Item.val.uCount != 2) {
2141 return -5;
2142 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002143
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002144 // --------------------------------
2145 // This test decodes the very large tag, but it is not in
2146 // any list so it is ignored.
2147 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spEncodedLargeTag), QCBOR_DECODE_MODE_NORMAL);
2148 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2149 return -6;
2150 }
2151 if(Item.uTagBits) {
2152 return -7;
2153 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002154
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002155 // ----------------------------------
2156 // This test sets up a caller-config list that includes the very large tage and then matches it.
2157 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spEncodedLargeTag), QCBOR_DECODE_MODE_NORMAL);
2158 const uint64_t puList[] = {0x9192939495969798, 257};
2159 const QCBORTagListIn TL = {2, puList};
2160 QCBORDecode_SetCallerConfiguredTagList(&DCtx, &TL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002161
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002162 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2163 return -8;
2164 }
2165 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
2166 !QCBORDecode_IsTagged(&DCtx, &Item, 0x9192939495969798) ||
2167 QCBORDecode_IsTagged(&DCtx, &Item, 257) ||
2168 QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_BIGFLOAT) ||
2169 Item.val.uCount != 0) {
2170 return -9;
2171 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002172
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002173 //------------------------
2174 // This test sets up a caller-configured list, and looks up something not in it
2175 const uint64_t puLongList[17] = {1,2,1};
2176 const QCBORTagListIn TLLong = {17, puLongList};
2177 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spEncodedLargeTag), QCBOR_DECODE_MODE_NORMAL);
2178 QCBORDecode_SetCallerConfiguredTagList(&DCtx, &TLLong);
2179 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2180 return -11;
2181 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002182
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002183 // -----------------------
2184 // This tests retrievel of the full tag list
2185 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spLotsOfTags), QCBOR_DECODE_MODE_NORMAL);
2186 uint64_t puTags[16];
2187 QCBORTagListOut Out = {0, 4, puTags};
2188 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2189 return -12;
2190 }
2191 if(puTags[0] != 0x9192939495969798 ||
2192 puTags[1] != 0x88 ||
2193 puTags[2] != 0x05 ||
2194 puTags[3] != 0x04) {
2195 return -13;
2196 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002197
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002198 // ----------------------
2199 // This text if too small of an out list
2200 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spLotsOfTags), QCBOR_DECODE_MODE_NORMAL);
2201 QCBORTagListOut OutSmall = {0, 3, puTags};
2202 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &OutSmall) != QCBOR_ERR_TOO_MANY_TAGS) {
2203 return -14;
2204 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002205
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002206 // ---------------
2207 // Parse a version of the "CSR" that has had a ton of tags randomly inserted
2208 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRWithTags), QCBOR_DECODE_MODE_NORMAL);
2209 int n = CheckCSRMaps(&DCtx);
2210 if(n) {
2211 return n-2000;
2212 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002213
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002214 Out = (QCBORTagListOut){0,16, puTags};
2215 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRWithTags), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002216
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002217 const uint64_t puTagList[] = {773, 1, 90599561};
2218 const QCBORTagListIn TagList = {3, puTagList};
2219 QCBORDecode_SetCallerConfiguredTagList(&DCtx, &TagList);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002220
2221
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002222 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2223 return -100;
2224 }
2225 if(Item.uDataType != QCBOR_TYPE_MAP ||
2226 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_CBOR_MAGIC) ||
2227 QCBORDecode_IsTagged(&DCtx, &Item, 90599561) ||
2228 QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_DATE_EPOCH) ||
2229 Item.val.uCount != 2 ||
2230 puTags[0] != CBOR_TAG_CBOR_MAGIC ||
2231 puTags[1] != CBOR_TAG_CBOR_MAGIC ||
2232 puTags[2] != CBOR_TAG_CBOR_MAGIC ||
2233 Out.uNumUsed != 3) {
2234 return -101;
2235 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002236
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002237 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2238 return -102;
2239 }
2240 if(Item.uDataType != QCBOR_TYPE_MAP ||
2241 QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_CBOR_MAGIC) ||
2242 QCBORDecode_IsTagged(&DCtx, &Item, 6) ||
2243 QCBORDecode_IsTagged(&DCtx, &Item, 7) || // item is tagged 7, but 7 is not configured to be recognized
2244 Item.val.uCount != 2 ||
2245 puTags[0] != 5859837686836516696 ||
2246 puTags[1] != 7 ||
2247 Out.uNumUsed != 2) {
2248 return -103;
2249 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002250
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002251 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2252 return -104;
2253 }
2254 if(Item.uDataType != QCBOR_TYPE_MAP ||
2255 Item.uTagBits ||
2256 Item.val.uCount != 5 ||
2257 puTags[0] != 0x0b ||
2258 Out.uNumUsed != 1) {
2259 return -105;
2260 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002261
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002262 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2263 return -106;
2264 }
2265 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
2266 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_COSE_MAC0) ||
2267 Item.val.string.len != 12 ||
2268 puTags[0] != CBOR_TAG_COSE_MAC0 ||
2269 puTags[1] != CBOR_TAG_COSE_MAC0 ||
2270 puTags[2] != CBOR_TAG_COSE_MAC0 ||
2271 Out.uNumUsed != 3) {
2272 return -105;
2273 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002274
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002275 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2276 return -107;
2277 }
2278 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
2279 !QCBORDecode_IsTagged(&DCtx, &Item, 773) ||
2280 Item.val.string.len != 3 ||
2281 puTags[0] != 773 ||
2282 Out.uNumUsed != 1) {
2283 return -108;
2284 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002285
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002286 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2287 return -109;
2288 }
2289 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
2290 !QCBORDecode_IsTagged(&DCtx, &Item, 4) ||
2291 Item.val.string.len != 9 ||
2292 puTags[0] != 4 ||
2293 puTags[11] != 0x0f ||
2294 Out.uNumUsed != 12) {
2295 return -110;
2296 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002297
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002298 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2299 return -111;
2300 }
2301 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
2302 !QCBORDecode_IsTagged(&DCtx, &Item, 17) ||
2303 Item.val.string.len != 9 ||
2304 puTags[0] != 17 ||
2305 Out.uNumUsed != 1) {
2306 return -112;
2307 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002308
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002309 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2310 return -111;
2311 }
2312 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
2313 !QCBORDecode_IsTagged(&DCtx, &Item, 17) ||
2314 Item.val.string.len != 2 ||
2315 puTags[0] != 17 ||
2316 Out.uNumUsed != 1) {
2317 return -112;
2318 }
2319
2320 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2321 return -113;
2322 }
2323 if(Item.uDataType != QCBOR_TYPE_MAP ||
2324 QCBORDecode_IsTagged(&DCtx, &Item, 19) ||
2325 Item.val.uCount != 2 ||
2326 puTags[0] != 19 ||
2327 Out.uNumUsed != 1) {
2328 return -114;
2329 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002330
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002331 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2332 return -115;
2333 }
2334 if(Item.uDataType != QCBOR_TYPE_MAP ||
2335 QCBORDecode_IsTagged(&DCtx, &Item, 9) ||
2336 Item.uTagBits ||
2337 Item.val.uCount != 1 ||
2338 puTags[0] != 9 ||
2339 Out.uNumUsed != 1) {
2340 return -116;
2341 }
2342
2343 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2344 return -116;
2345 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002346 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002347 Item.val.int64 != -7 ||
2348 Item.uTagBits ||
2349 Out.uNumUsed != 0) {
2350 return -117;
2351 }
2352
2353 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2354 return -118;
2355 }
2356 if(Item.uDataType != QCBOR_TYPE_BYTE_STRING ||
2357 Item.val.string.len != 10 ||
2358 Item.uTagBits ||
2359 puTags[0] != 12 ||
2360 Out.uNumUsed != 1) {
2361 return -119;
2362 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002363
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002364 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2365 return -120;
2366 }
2367 if(Item.uDataType != QCBOR_TYPE_MAP ||
2368 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_ENC_AS_B16) ||
2369 Item.val.uCount != 1 ||
2370 puTags[0] != 0x17 ||
2371 Out.uNumUsed != 1) {
2372 return -121;
2373 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002374
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002375 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2376 return -122;
2377 }
2378 if(Item.uDataType != QCBOR_TYPE_INT64 ||
2379 QCBORDecode_IsTagged(&DCtx, &Item, 8) ||
2380 Item.val.int64 != -3 ||
2381 puTags[0] != 8 ||
2382 Out.uNumUsed != 1) {
2383 return -123;
2384 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002385
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002386 if(QCBORDecode_Finish(&DCtx)) {
2387 return -124;
2388 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002389
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002390 return 0;
2391}
2392
2393
2394
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002395
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002396static uint8_t spBigNumInput[] = {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002397 0x83,
2398 0xC2, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2399 0xC3, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2400 0xA4,
2401 0x63, 0x42, 0x4E, 0x2B,
2402 0xC2, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2403 0x18, 0x40,
2404 0xC2, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2405 0x63, 0x42, 0x4E, 0x2D,
2406 0xC3, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2407 0x38, 0x3F,
2408 0xC3, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
2409
2410
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002411static uint8_t spBigNum[] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002412
2413
2414int BignumParseTest()
2415{
2416 QCBORDecodeContext DCtx;
2417 QCBORItem Item;
2418 int nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002419
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002420 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNumInput), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002421
2422
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002423 //
2424 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2425 return -1;
2426 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
2427 return -1;
2428 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002429
2430 //
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002431 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2432 return -1;
2433 if(Item.uDataType != QCBOR_TYPE_POSBIGNUM ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002434 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002435 return -1;
2436 }
2437
2438 //
2439 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2440 return -1;
2441 if(Item.uDataType != QCBOR_TYPE_NEGBIGNUM ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002442 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002443 return -1;
2444 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002445
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002446 //
2447 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2448 return -1;
2449 if(Item.uDataType != QCBOR_TYPE_MAP) {
2450 return -1;
2451 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002452
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002453 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2454 return -1;
2455 if(Item.uDataType != QCBOR_TYPE_POSBIGNUM ||
2456 Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002457 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002458 return -1;
2459 }
2460
2461 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2462 return -1;
2463 if(Item.uDataType != QCBOR_TYPE_POSBIGNUM ||
2464 Item.uLabelType != QCBOR_TYPE_INT64 ||
2465 Item.label.int64 != 64 ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002466 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002467 return -1;
2468 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002469
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002470 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2471 return -1;
2472 if(Item.uDataType != QCBOR_TYPE_NEGBIGNUM ||
2473 Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002474 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002475 return -1;
2476 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002477
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002478 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2479 return -1;
2480 if(Item.uDataType != QCBOR_TYPE_NEGBIGNUM ||
2481 Item.uLabelType != QCBOR_TYPE_INT64 ||
2482 Item.label.int64 != -64 ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002483 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002484 return -1;
2485 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002486
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002487 return 0;
2488}
2489
2490
2491
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302492static 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 +08002493{
2494 QCBORItem Item;
2495 int nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002496
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002497 if((nCBORError = QCBORDecode_GetNext(pCtx, &Item))) return -1;
2498 if(Item.uDataType != uDataType) return -1;
2499 if(uNestingLevel > 0) {
2500 if(Item.uLabelType != QCBOR_TYPE_INT64 && Item.uLabelType != QCBOR_TYPE_UINT64) return -1;
2501 if(Item.uLabelType == QCBOR_TYPE_INT64) {
2502 if(Item.label.int64 != nLabel) return -1;
2503 } else {
Laurence Lundblade570fab52018-10-13 18:28:27 +08002504 if(Item.label.uint64 != (uint64_t)nLabel) return -1;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002505 }
2506 }
2507 if(Item.uNestingLevel != uNestingLevel) return -1;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302508 if(Item.uNextNestLevel != uNextNest) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002509
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002510 if(pItem) {
2511 *pItem = Item;
2512 }
2513 return 0;
2514}
2515
2516
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002517// Same code checks definite and indefinite length versions of the map
2518static int CheckCSRMaps(QCBORDecodeContext *pDC)
2519{
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302520 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 0, 1, 0, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002521
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302522 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 1, 2, -23, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002523
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302524 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 2, 3, -20, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002525
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302526 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_TEXT_STRING, 3, 3, -18, NULL)) return -1;
2527 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_TEXT_STRING, 3, 3, -17, NULL)) return -1;
2528 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_TEXT_STRING, 3, 3, -15, NULL)) return -1;
2529 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_TEXT_STRING, 3, 3, -16, NULL)) return -1;
2530 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_TEXT_STRING, 3, 2, -14, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002531
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302532 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 2, 3, -19, NULL)) return -1;
2533 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 3, 4, -11, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002534
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302535 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_INT64, 4, 3, -9, NULL)) return -1;
2536 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_BYTE_STRING, 3, 1, -10, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002537
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302538 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 1, 2, -22, NULL)) return -1;
2539 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_INT64, 2, 0, -5, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002540
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002541 if(QCBORDecode_Finish(pDC)) return -2;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002542
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002543 return 0;
2544}
2545
2546
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002547/*
2548// cbor.me decoded output
2549{
2550 -23: {
2551 -20: {
2552 -18: "Organization",
2553 -17: "SSG",
2554 -15: "Confusion",
2555 -16: "San Diego",
2556 -14: "US"
2557 },
2558 -19: {
2559 -11: {
2560 -9: -7
2561 },
2562 -10: '\u0001\u0002\u0003\u0004\u0005\u0006\a\b\t\n'
2563 }
2564 },
2565 -22: {
2566 -5: -3
2567 }
2568}
2569 */
2570
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002571
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002572static uint8_t spCSRInput[] = {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002573 0xa2, 0x36, 0xa2, 0x33, 0xa5, 0x31, 0x6c, 0x4f,
2574 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74,
2575 0x69, 0x6f, 0x6e, 0x30, 0x63, 0x53, 0x53, 0x47,
2576 0x2e, 0x69, 0x43, 0x6f, 0x6e, 0x66, 0x75, 0x73,
2577 0x69, 0x6f, 0x6e, 0x2f, 0x69, 0x53, 0x61, 0x6e,
2578 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x2d, 0x62,
2579 0x55, 0x53, 0x32, 0xa2, 0x2a, 0xa1, 0x28, 0x26,
2580 0x29, 0x4a, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
2581 0x07, 0x08, 0x09, 0x0a, 0x35, 0xa1, 0x24, 0x22};
2582
2583int NestedMapTest()
2584{
2585 QCBORDecodeContext DCtx;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002586
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002587 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRInput), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002588
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002589 return CheckCSRMaps(&DCtx);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002590}
2591
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08002592
2593
2594int StringDecoderModeFailTest()
2595{
2596 QCBORDecodeContext DCtx;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002597
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08002598 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRInput), QCBOR_DECODE_MODE_MAP_STRINGS_ONLY);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002599
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08002600 QCBORItem Item;
2601 QCBORError nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002602
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08002603 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2604 return -1;
2605 }
2606 if(Item.uDataType != QCBOR_TYPE_MAP) {
2607 return -2;
2608 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002609
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08002610 nCBORError = QCBORDecode_GetNext(&DCtx, &Item);
2611 if(nCBORError != QCBOR_ERR_MAP_LABEL_TYPE) {
2612 return -3;
2613 }
2614
2615 return 0;
2616}
2617
2618
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002619// Same map as above, but using indefinite lengths
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002620static uint8_t spCSRInputIndefLen[] = {
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002621 0xbf, 0x36, 0xbf, 0x33, 0xbf, 0x31, 0x6c, 0x4f,
2622 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74,
2623 0x69, 0x6f, 0x6e, 0x30, 0x63, 0x53, 0x53, 0x47,
2624 0x2e, 0x69, 0x43, 0x6f, 0x6e, 0x66, 0x75, 0x73,
2625 0x69, 0x6f, 0x6e, 0x2f, 0x69, 0x53, 0x61, 0x6e,
2626 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x2d, 0x62,
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002627 0x55, 0x53, 0xff, 0x32, 0xbf, 0x2a, 0xbf, 0x28,
2628 0x26, 0xff, 0x29, 0x4a, 0x01, 0x02, 0x03, 0x04,
2629 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0xff, 0xff,
2630 0x35, 0xbf, 0x24, 0x22, 0xff, 0xff};
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002631
2632int NestedMapTestIndefLen()
2633{
2634 QCBORDecodeContext DCtx;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002635
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002636 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRInputIndefLen), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002637
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002638 return CheckCSRMaps(&DCtx);
2639}
2640
2641
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002642
Laurence Lundblade17ede402018-10-13 11:43:07 +08002643static UsefulBufC make_nested_indefinite_arrays(int n, UsefulBuf Storage)
2644{
2645 UsefulOutBuf UOB;
2646 UsefulOutBuf_Init(&UOB, Storage);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002647
Laurence Lundblade17ede402018-10-13 11:43:07 +08002648 int i;
2649 for(i = 0; i < n; i++) {
2650 UsefulOutBuf_AppendByte(&UOB, 0x9f);
2651 }
2652
2653 for(i = 0; i < n; i++) {
2654 UsefulOutBuf_AppendByte(&UOB, 0xff);
2655 }
2656 return UsefulOutBuf_OutUBuf(&UOB);
2657}
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002658
2659
Laurence Lundblade17ede402018-10-13 11:43:07 +08002660static int parse_indeflen_nested(UsefulBufC Nested, int nNestLevel)
2661{
2662 QCBORDecodeContext DC;
2663 QCBORDecode_Init(&DC, Nested, 0);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002664
Laurence Lundblade17ede402018-10-13 11:43:07 +08002665 int j;
2666 for(j = 0; j < nNestLevel; j++) {
2667 QCBORItem Item;
2668 int nReturn = QCBORDecode_GetNext(&DC, &Item);
2669 if(j >= QCBOR_MAX_ARRAY_NESTING) {
2670 // Should be in error
2671 if(nReturn != QCBOR_ERR_ARRAY_NESTING_TOO_DEEP) {
2672 return -4;
2673 } else {
2674 return 0; // Decoding doesn't recover after an error
2675 }
2676 } else {
2677 // Should be no error
2678 if(nReturn) {
2679 return -9; // Should not have got an error
2680 }
2681 }
2682 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
2683 return -7;
2684 }
2685 }
2686 int nReturn = QCBORDecode_Finish(&DC);
2687 if(nReturn) {
2688 return -3;
2689 }
2690 return 0;
2691}
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002692
2693
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302694int IndefiniteLengthNestTest()
Laurence Lundblade17ede402018-10-13 11:43:07 +08002695{
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05302696 UsefulBuf_MAKE_STACK_UB(Storage, 50);
Laurence Lundblade17ede402018-10-13 11:43:07 +08002697 int i;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002698 for(i=1; i < QCBOR_MAX_ARRAY_NESTING+4; i++) {
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -08002699 const UsefulBufC Nested = make_nested_indefinite_arrays(i, Storage);
Laurence Lundblade17ede402018-10-13 11:43:07 +08002700 int nReturn = parse_indeflen_nested(Nested, i);
2701 if(nReturn) {
2702 return nReturn;
2703 }
2704 }
2705 return 0;
2706}
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002707
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002708
Laurence Lundblade6de37062018-10-15 12:22:42 +05302709
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002710static const uint8_t spIndefiniteArray[] = {0x9f, 0x01, 0x82, 0x02, 0x03, 0xff}; // [1, [2, 3]]
2711static const uint8_t spIndefiniteArrayBad1[] = {0x9f}; // No closing break
2712static const uint8_t spIndefiniteArrayBad2[] = {0x9f, 0x9f, 0x02, 0xff}; // Not enough closing breaks
2713static const uint8_t spIndefiniteArrayBad3[] = {0x9f, 0x02, 0xff, 0xff}; // Too many closing breaks
2714static const uint8_t spIndefiniteArrayBad4[] = {0x81, 0x9f}; // Unclosed indeflen inside def len
2715static const uint8_t spIndefiniteArrayBad5[] = {0x9f, 0xd1, 0xff}; // confused tag
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002716
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302717int IndefiniteLengthArrayMapTest()
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002718{
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002719 int nResult;
2720 // --- first test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002721 UsefulBufC IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArray);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002722
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002723 // Decode it and see if it is OK
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05302724 UsefulBuf_MAKE_STACK_UB(MemPool, 150);
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002725 QCBORDecodeContext DC;
2726 QCBORItem Item;
2727 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002728
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002729 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002730
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002731 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302732
2733 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
2734 Item.uNestingLevel != 0 ||
2735 Item.uNextNestLevel != 1) {
2736 return -111;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002737 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002738
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002739 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302740 if(Item.uDataType != QCBOR_TYPE_INT64 ||
2741 Item.uNestingLevel != 1 ||
2742 Item.uNextNestLevel != 1) {
2743 return -2;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002744 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002745
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002746 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302747 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
2748 Item.uNestingLevel != 1 ||
2749 Item.uNextNestLevel != 2) {
2750 return -3;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002751 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002752
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002753 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade12b495d2018-12-17 11:15:54 -08002754 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade6de37062018-10-15 12:22:42 +05302755 Item.uNestingLevel != 2 ||
2756 Item.uNextNestLevel != 2) {
2757 return -4;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002758 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002759
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002760 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade12b495d2018-12-17 11:15:54 -08002761 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade6de37062018-10-15 12:22:42 +05302762 Item.uNestingLevel != 2 ||
2763 Item.uNextNestLevel != 0) {
2764 return -5;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002765 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002766
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002767 if(QCBORDecode_Finish(&DC)) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302768 return -6;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002769 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002770
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002771 // --- next test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002772 IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArrayBad1);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002773
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002774 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002775
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002776 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002777
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002778 nResult = QCBORDecode_GetNext(&DC, &Item);
2779 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302780 return -7;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002781 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002782
Laurence Lundblade570fab52018-10-13 18:28:27 +08002783 nResult = QCBORDecode_Finish(&DC);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302784 if(nResult != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
2785 return -8;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002786 }
2787
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(spIndefiniteArrayBad2);
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 -9;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002799 }
2800
2801 nResult = QCBORDecode_GetNext(&DC, &Item);
2802 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302803 return -10;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002804 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002805
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002806 nResult = QCBORDecode_GetNext(&DC, &Item);
2807 if(nResult || Item.uDataType != QCBOR_TYPE_INT64) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302808 return -11;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002809 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002810
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002811 nResult = QCBORDecode_Finish(&DC);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302812 if(nResult != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
2813 return -12;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002814 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002815
2816
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002817 // --- next test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002818 IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArrayBad3);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002819
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002820 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002821
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002822 QCBORDecode_SetMemPool(&DC, MemPool, false);
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_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302826 return -13;
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_GetNext(&DC, &Item);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302830 if(nResult != QCBOR_ERR_BAD_BREAK) {
2831 return -14;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002832 }
Laurence Lundblade6de37062018-10-15 12:22:42 +05302833
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002834
Laurence Lundblade570fab52018-10-13 18:28:27 +08002835 // --- next test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002836 IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArrayBad4);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002837
Laurence Lundblade570fab52018-10-13 18:28:27 +08002838 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002839
Laurence Lundblade570fab52018-10-13 18:28:27 +08002840 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002841
Laurence Lundblade570fab52018-10-13 18:28:27 +08002842 nResult = QCBORDecode_GetNext(&DC, &Item);
2843 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302844 return -15;
Laurence Lundblade570fab52018-10-13 18:28:27 +08002845 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002846
Laurence Lundblade570fab52018-10-13 18:28:27 +08002847 nResult = QCBORDecode_GetNext(&DC, &Item);
2848 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302849 return -16;
Laurence Lundblade570fab52018-10-13 18:28:27 +08002850 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002851
Laurence Lundblade570fab52018-10-13 18:28:27 +08002852 nResult = QCBORDecode_Finish(&DC);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302853 if(nResult != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
2854 return -17;
Laurence Lundblade570fab52018-10-13 18:28:27 +08002855 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002856
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05302857 // --- next test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002858 IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArrayBad5);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002859
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05302860 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002861
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05302862 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002863
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05302864 nResult = QCBORDecode_GetNext(&DC, &Item);
2865 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302866 return -18;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05302867 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002868
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05302869 nResult = QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302870 if(nResult != QCBOR_ERR_BAD_BREAK) {
2871 return -19;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05302872 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002873
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002874 return 0;
2875}
2876
Laurence Lundblade17ede402018-10-13 11:43:07 +08002877
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002878static const uint8_t spIndefiniteLenString[] = {
Laurence Lundblade17ede402018-10-13 11:43:07 +08002879 0x81, // Array of length one
2880 0x7f, // text string marked with indefinite length
2881 0x65, 0x73, 0x74, 0x72, 0x65, 0x61, // first segment
2882 0x64, 0x6d, 0x69, 0x6e, 0x67, // second segment
2883 0xff // ending break
2884};
2885
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002886static const uint8_t spIndefiniteLenStringBad2[] = {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302887 0x81, // Array of length one
2888 0x7f, // text string marked with indefinite length
2889 0x65, 0x73, 0x74, 0x72, 0x65, 0x61, // first segment
2890 0x44, 0x6d, 0x69, 0x6e, 0x67, // second segment of wrong type
2891 0xff // ending break
2892};
2893
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002894static const uint8_t spIndefiniteLenStringBad3[] = {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302895 0x81, // Array of length one
2896 0x7f, // text string marked with indefinite length
2897 0x01, 0x02, // Not a string
2898 0xff // ending break
2899};
2900
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002901static const uint8_t spIndefiniteLenStringBad4[] = {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302902 0x81, // Array of length one
2903 0x7f, // text string marked with indefinite length
2904 0x65, 0x73, 0x74, 0x72, 0x65, 0x61, // first segment
2905 0x64, 0x6d, 0x69, 0x6e, 0x67, // second segment
2906 // missing end of string
2907};
2908
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002909static const uint8_t spIndefiniteLenStringLabel[] = {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302910 0xa1, // Array of length one
2911 0x7f, // text string marked with indefinite length
2912 0x65, 0x73, 0x74, 0x72, 0x75, 0x75, // first segment
2913 0x64, 0x6d, 0x69, 0x6e, 0x67, // second segment
2914 0xff, // ending break
2915 0x01 // integer being labeled.
2916};
2917
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08002918static UsefulBufC MakeIndefiniteBigBstr(UsefulBuf Storage) // TODO: size this
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302919{
2920 UsefulOutBuf UOB;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002921
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302922 UsefulOutBuf_Init(&UOB, Storage);
2923 UsefulOutBuf_AppendByte(&UOB, 0x81);
2924 UsefulOutBuf_AppendByte(&UOB, 0x5f);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002925
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302926 int i = 0;
2927 for(int nChunkSize = 1; nChunkSize <= 128; nChunkSize *= 2) {
2928 UsefulOutBuf_AppendByte(&UOB, 0x58);
2929 UsefulOutBuf_AppendByte(&UOB, (uint8_t)nChunkSize);
2930 for(int j = 0; j < nChunkSize; j++ ) {
2931 UsefulOutBuf_AppendByte(&UOB, i);
2932 i++;
2933 }
2934 }
2935 UsefulOutBuf_AppendByte(&UOB, 0xff);
2936
2937 return UsefulOutBuf_OutUBuf(&UOB);
2938}
2939
2940static int CheckBigString(UsefulBufC BigString)
2941{
2942 if(BigString.len != 255) {
2943 return 1;
2944 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002945
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302946 for(uint8_t i = 0; i < 255; i++){
2947 if(((const uint8_t *)BigString.ptr)[i] != i) {
2948 return 1;
2949 }
2950 }
2951 return 0;
2952}
2953
Laurence Lundblade7e0d13b2018-10-16 19:54:13 +05302954
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302955int IndefiniteLengthStringTest()
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05302956{
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302957 QCBORDecodeContext DC;
2958 QCBORItem Item;
Laurence Lundblade7e0d13b2018-10-16 19:54:13 +05302959 // big enough for MakeIndefiniteBigBstr() + MemPool overhead
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08002960 UsefulBuf_MAKE_STACK_UB(MemPool, 350);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002961
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302962 // --- Simple normal indefinite length string ------
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002963 UsefulBufC IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteLenString);
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302964 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002965
Laurence Lundblade7e0d13b2018-10-16 19:54:13 +05302966 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302967 return -1;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05302968 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002969
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302970 if(QCBORDecode_GetNext(&DC, &Item)) {
2971 return -2;
2972 }
2973 if(Item.uDataType != QCBOR_TYPE_ARRAY || Item.uDataAlloc) {
2974 return -3;
2975 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002976
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302977 if(QCBORDecode_GetNext(&DC, &Item)) {
2978 return -4;
2979 }
2980 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING || !Item.uDataAlloc) {
2981 return -5;
2982 }
2983 if(QCBORDecode_Finish(&DC)) {
2984 return -6;
2985 }
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05302986
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302987 // ----- types mismatch ---
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002988 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteLenStringBad2), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002989
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302990 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
2991 return -7;
2992 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002993
Laurence Lundblade57dd1442018-10-15 20:26:28 +05302994 if(QCBORDecode_GetNext(&DC, &Item)) {
2995 return -8;
2996 }
2997 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
2998 return -9;
2999 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003000
Laurence Lundblade30816f22018-11-10 13:40:22 +07003001 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_ERR_INDEFINITE_STRING_CHUNK) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303002 return -10;
3003 }
3004
3005 // ----- not a string ---
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003006 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteLenStringBad3), 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 -11;
3010 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003011
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303012 if(QCBORDecode_GetNext(&DC, &Item)) {
3013 return -12;
3014 }
3015 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
3016 return -13;
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 -14;
3021 }
3022
3023 // ----- no end -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003024 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteLenStringBad4), 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 -15;
3028 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003029
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303030 if(QCBORDecode_GetNext(&DC, &Item)) {
3031 return -16;
3032 }
3033 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
3034 return -17;
3035 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003036
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303037 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_ERR_HIT_END) {
3038 return -18;
3039 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003040
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303041 // ------ Don't set a string allocator and see an error -----
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303042 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003043
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303044 QCBORDecode_GetNext(&DC, &Item);
3045 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303046 return -19;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303047 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003048
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303049 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_ERR_NO_STRING_ALLOCATOR) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303050 return -20;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303051 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003052
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303053 // ----- Mempool is way too small -----
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003054 UsefulBuf_MAKE_STACK_UB(MemPoolTooSmall, QCBOR_DECODE_MIN_MEM_POOL_SIZE-1);
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303055
3056 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
3057 if(!QCBORDecode_SetMemPool(&DC, MemPoolTooSmall, false)) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303058 return -21;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303059 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003060
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303061 // ----- Mempool is way too small -----
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05303062 UsefulBuf_MAKE_STACK_UB(BigIndefBStrStorage, 290);
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -08003063 const UsefulBufC BigIndefBStr = MakeIndefiniteBigBstr(BigIndefBStrStorage);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003064
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05303065 UsefulBuf_MAKE_STACK_UB(MemPoolSmall, 80); // 80 is big enough for MemPool overhead, but not BigIndefBStr
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003066
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303067 QCBORDecode_Init(&DC, BigIndefBStr, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303068 if(QCBORDecode_SetMemPool(&DC, MemPoolSmall, false)) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303069 return -22;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303070 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003071
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303072 QCBORDecode_GetNext(&DC, &Item);
3073 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303074 return -23;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303075 }
Laurence Lundblade30816f22018-11-10 13:40:22 +07003076 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_ERR_STRING_ALLOCATE) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303077 return -24;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303078 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003079
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303080 // ---- big bstr -----
3081 QCBORDecode_Init(&DC, BigIndefBStr, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003082
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303083 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
3084 return -25;
3085 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003086
Laurence Lundblade7e0d13b2018-10-16 19:54:13 +05303087 if(QCBORDecode_GetNext(&DC, &Item)) {
3088 return -26;
3089 }
3090 if(Item.uDataType != QCBOR_TYPE_ARRAY || Item.uDataAlloc) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303091 return -26;
3092 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003093
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303094 if(QCBORDecode_GetNext(&DC, &Item)) {
3095 return -27;
3096 }
Laurence Lundblade7e0d13b2018-10-16 19:54:13 +05303097 if(Item.uDataType != QCBOR_TYPE_BYTE_STRING || !Item.uDataAlloc || Item.uNestingLevel != 1) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303098 return -28;
3099 }
3100 if(CheckBigString(Item.val.string)) {
3101 return -3;
3102 }
3103 if(QCBORDecode_Finish(&DC)) {
3104 return -29;
3105 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003106
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303107 // --- label is an indefinite length string ------
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003108 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteLenStringLabel), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003109
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303110 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
3111 return -30;
3112 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003113
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303114 QCBORDecode_GetNext(&DC, &Item);
3115 if(Item.uDataType != QCBOR_TYPE_MAP) {
3116 return -31;
3117 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003118
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303119 if(QCBORDecode_GetNext(&DC, &Item)){
3120 return -32;
3121 }
3122 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING || Item.uDataType != QCBOR_TYPE_INT64 ||
3123 Item.uDataAlloc || !Item.uLabelAlloc ||
3124 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("struuming"))) {
3125 return -33;
3126 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003127
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303128 if(QCBORDecode_Finish(&DC)) {
3129 return -34;
3130 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003131
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003132 return 0;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08003133}
3134
3135
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303136int AllocAllStringsTest()
3137{
3138 QCBORDecodeContext DC;
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003139 QCBORError nCBORError;
3140
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003141
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303142 // First test, use the "CSRMap" as easy input and checking
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003143 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRInput), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003144
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003145 UsefulBuf_MAKE_STACK_UB(Pool, sizeof(spCSRInput) + QCBOR_DECODE_MIN_MEM_POOL_SIZE);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003146
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003147 nCBORError = QCBORDecode_SetMemPool(&DC, Pool, 1); // Turn on copying.
3148 if(nCBORError) {
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303149 return -1;
3150 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003151
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003152 if(CheckCSRMaps(&DC)) {
3153 return -2;
3154 }
3155
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303156 // Next parse, save pointers to a few strings, destroy original and see all is OK.
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003157 UsefulBuf_MAKE_STACK_UB(CopyOfStorage, sizeof(pValidMapEncoded) + QCBOR_DECODE_MIN_MEM_POOL_SIZE);
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -08003158 const UsefulBufC CopyOf = UsefulBuf_Copy(CopyOfStorage, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapEncoded));
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08003159
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303160 QCBORDecode_Init(&DC, CopyOf, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -08003161 UsefulBuf_Set(Pool, '/');
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303162 QCBORDecode_SetMemPool(&DC, Pool, 1); // Turn on copying.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003163
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303164 QCBORItem Item1, Item2, Item3, Item4;
3165 if((nCBORError = QCBORDecode_GetNext(&DC, &Item1)))
3166 return nCBORError;
3167 if(Item1.uDataType != QCBOR_TYPE_MAP ||
3168 Item1.val.uCount != 3)
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003169 return -3;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303170 if((nCBORError = QCBORDecode_GetNext(&DC, &Item1)))
3171 return nCBORError;
3172 if((nCBORError = QCBORDecode_GetNext(&DC, &Item2)))
3173 return nCBORError;
3174 if((nCBORError = QCBORDecode_GetNext(&DC, &Item3)))
3175 return nCBORError;
3176 if((nCBORError = QCBORDecode_GetNext(&DC, &Item4)))
3177 return nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003178
Laurence Lundblade05ec57b2018-10-21 01:50:03 +05303179 UsefulBuf_Set(CopyOfStorage, '_');
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003180
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303181 if(Item1.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303182 Item1.uDataType != QCBOR_TYPE_INT64 ||
3183 Item1.val.int64 != 42 ||
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003184 Item1.uDataAlloc != 0 ||
3185 Item1.uLabelAlloc == 0 ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003186 UsefulBuf_Compare(Item1.label.string, UsefulBuf_FromSZ("first integer"))) {
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003187 return -4;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003188 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003189
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303190
3191 if(Item2.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003192 UsefulBuf_Compare(Item2.label.string, UsefulBuf_FromSZ("an array of two strings")) ||
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303193 Item2.uDataType != QCBOR_TYPE_ARRAY ||
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003194 Item2.uDataAlloc != 0 ||
3195 Item2.uLabelAlloc == 0 ||
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303196 Item2.val.uCount != 2)
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003197 return -5;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003198
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303199 if(Item3.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003200 Item3.uDataAlloc == 0 ||
3201 Item3.uLabelAlloc != 0 ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003202 UsefulBuf_Compare(Item3.val.string, UsefulBuf_FromSZ("string1"))) {
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003203 return -6;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003204 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003205
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303206 if(Item4.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003207 Item4.uDataAlloc == 0 ||
3208 Item4.uLabelAlloc != 0 ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003209 UsefulBuf_Compare(Item4.val.string, UsefulBuf_FromSZ("string2"))) {
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003210 return -7;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003211 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003212
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303213 // Next parse with a pool that is too small
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003214 UsefulBuf_MAKE_STACK_UB(SmallPool, QCBOR_DECODE_MIN_MEM_POOL_SIZE + 1);
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05303215 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapEncoded), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303216 QCBORDecode_SetMemPool(&DC, SmallPool, 1); // Turn on copying.
3217 if((nCBORError = QCBORDecode_GetNext(&DC, &Item1)))
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003218 return -8;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303219 if(Item1.uDataType != QCBOR_TYPE_MAP ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003220 Item1.val.uCount != 3) {
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003221 return -9;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003222 }
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303223 if(!(nCBORError = QCBORDecode_GetNext(&DC, &Item1))){
3224 if(!(nCBORError = QCBORDecode_GetNext(&DC, &Item2))) {
3225 if(!(nCBORError = QCBORDecode_GetNext(&DC, &Item3))) {
3226 nCBORError = QCBORDecode_GetNext(&DC, &Item4);
3227 }
3228 }
3229 }
Laurence Lundblade30816f22018-11-10 13:40:22 +07003230 if(nCBORError != QCBOR_ERR_STRING_ALLOCATE) {
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003231 return -10;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303232 }
3233
3234 return 0;
3235}
3236
Laurence Lundbladef6531662018-12-04 10:42:22 +09003237
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303238
3239int MemPoolTest(void)
Laurence Lundblade0155b622018-10-12 20:04:37 +08003240{
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003241 // Set up the decoder with a tiny bit of CBOR to parse because
3242 // nothing can be done with it unless that is set up.
Laurence Lundbladef6531662018-12-04 10:42:22 +09003243 QCBORDecodeContext DC;
3244 const uint8_t pMinimalCBOR[] = {0xa0}; // One empty map
3245 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pMinimalCBOR),0);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003246
Laurence Lundbladef6531662018-12-04 10:42:22 +09003247 // Set up an memory pool of 100 bytes
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003248 // Then fish into the internals of the decode context
3249 // to get the allocator function so it can be called directly.
3250 // Also figure out how much pool is available for use
3251 // buy subtracting out the overhead.
Laurence Lundbladef6531662018-12-04 10:42:22 +09003252 UsefulBuf_MAKE_STACK_UB(Pool, 100);
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003253 QCBORError nError = QCBORDecode_SetMemPool(&DC, Pool, 0);
3254 if(nError) {
3255 return -9;
3256 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003257 QCBORStringAllocate pAlloc = DC.StringAllocator.pfAllocator;
3258 void *pAllocCtx = DC.StringAllocator.pAllocateCxt;
3259 size_t uAvailPool = Pool.len - QCBOR_DECODE_MIN_MEM_POOL_SIZE;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003260
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003261 // First test -- ask for one more byte than available and see failure
3262 UsefulBuf Allocated = (*pAlloc)(pAllocCtx, NULL, uAvailPool+1);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003263 if(!UsefulBuf_IsNULL(Allocated)) {
3264 return -1;
3265 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003266
Laurence Lundbladef6531662018-12-04 10:42:22 +09003267 // Re do the set up for the next test that will do a successful alloc,
3268 // a fail, a free and then success
Laurence Lundbladef6531662018-12-04 10:42:22 +09003269 QCBORDecode_SetMemPool(&DC, Pool, 0);
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003270 pAlloc = DC.StringAllocator.pfAllocator;
3271 pAllocCtx = DC.StringAllocator.pAllocateCxt;
3272 uAvailPool = Pool.len - QCBOR_DECODE_MIN_MEM_POOL_SIZE;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003273
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003274 // Allocate one byte less than available and see success
3275 Allocated = (pAlloc)(pAllocCtx, NULL, uAvailPool-1);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003276 if(UsefulBuf_IsNULL(Allocated)) { // expected to succeed
3277 return -2;
3278 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003279 // Ask for some more and see failure
3280 UsefulBuf Allocated2 = (*pAlloc)(pAllocCtx, NULL, uAvailPool/2);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003281 if(!UsefulBuf_IsNULL(Allocated2)) { // expected to fail
3282 return -3;
3283 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003284 // Free the first allocate, retry the second and see success
3285 (*pAlloc)(pAllocCtx, Allocated.ptr, 0); // Free
3286 Allocated = (*pAlloc)(pAllocCtx, NULL, uAvailPool/2);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003287 if(UsefulBuf_IsNULL(Allocated)) { // succeed because of the free
3288 return -4;
3289 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003290
Laurence Lundbladef6531662018-12-04 10:42:22 +09003291 // Re do set up for next test that involves a successful alloc,
3292 // and a successful realloc and a failed realloc
3293 QCBORDecode_SetMemPool(&DC, Pool, 0);
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003294 pAlloc = DC.StringAllocator.pfAllocator;
3295 pAllocCtx = DC.StringAllocator.pAllocateCxt;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003296
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003297 // Allocate half the pool and see success
3298 Allocated = (*pAlloc)(pAllocCtx, NULL, uAvailPool/2);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003299 if(UsefulBuf_IsNULL(Allocated)) { // expected to succeed
3300 return -5;
3301 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003302 // Reallocate to take up the whole pool and see success
3303 Allocated2 = (*pAlloc)(pAllocCtx, Allocated.ptr, uAvailPool);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003304 if(UsefulBuf_IsNULL(Allocated2)) {
3305 return -6;
3306 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003307 // Make sure its the same pointer and the size is right
Laurence Lundbladef6531662018-12-04 10:42:22 +09003308 if(Allocated2.ptr != Allocated.ptr || Allocated2.len != uAvailPool) {
3309 return -7;
3310 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003311 // Try to allocate more to be sure there is failure after a realloc
3312 UsefulBuf Allocated3 = (*pAlloc)(pAllocCtx, Allocated.ptr, uAvailPool+1);
3313 if(!UsefulBuf_IsNULL(Allocated3)) {
Laurence Lundbladef6531662018-12-04 10:42:22 +09003314 return -8;
3315 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003316
Laurence Lundbladef6531662018-12-04 10:42:22 +09003317 return 0;
3318}
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08003319
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003320
3321/* Just enough of an allocator to test configuration of one */
3322static UsefulBuf AllocateTestFunction(void *pCtx, void *pOldMem, size_t uNewSize)
3323{
3324 (void)pOldMem; // unused variable
3325
3326 if(uNewSize) {
3327 // Assumes the context pointer is the buffer and
3328 // nothing too big will ever be asked for.
3329 // This is only good for this basic test!
3330 return (UsefulBuf) {pCtx, uNewSize};
3331 } else {
3332 return NULLUsefulBuf;
3333 }
3334}
3335
3336
3337int SetUpAllocatorTest(void)
3338{
3339 // Set up the decoder with a tiny bit of CBOR to parse because
3340 // nothing can be done with it unless that is set up.
3341 QCBORDecodeContext DC;
3342 const uint8_t pMinimalCBOR[] = {0x62, 0x48, 0x69}; // "Hi"
3343 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pMinimalCBOR),0);
3344
3345 uint8_t pAllocatorBuffer[50];
3346
3347 // This is really just to test that this call works.
3348 // The full functionality of string allocators is tested
3349 // elsewhere with the MemPool internal allocator.
3350 QCBORDecode_SetUpAllocator(&DC, AllocateTestFunction, pAllocatorBuffer, 1);
3351
3352 QCBORItem Item;
3353 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_SUCCESS) {
3354 return -1;
3355 }
3356
3357 if(Item.uDataAlloc == 0 ||
3358 Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
3359 Item.val.string.ptr != pAllocatorBuffer) {
3360 return -2;
3361 }
3362
3363 if(QCBORDecode_Finish(&DC) != QCBOR_SUCCESS) {
3364 return -3;
3365 }
3366
3367 return 0;
3368}
3369