blob: a38f18516fffcff901842572085c593038e226fc [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 Lundbladeee851742020-01-08 08:37:05 -08003 Copyright (c) 2018-2020, 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 Lundbladeee851742020-01-08 08:37:05 -080031 =============================================================================*/
Laurence Lundblade9e3651c2018-10-10 11:49:55 +080032
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080033#include "qcbor_decode_tests.h"
Laurence Lundblade844bb5c2020-03-01 17:27:25 -080034#include "qcbor/qcbor_encode.h"
35#include "qcbor/qcbor_decode.h"
Laurence Lundbladed4728fd2018-12-17 15:15:56 -080036#include <string.h>
Laurence Lundblade9e3651c2018-10-10 11:49:55 +080037#include <math.h> // for fabs()
Laurence Lundbladebb1062e2019-08-12 23:28:54 -070038#include "not_well_formed_cbor.h"
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -080039
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080040
Laurence Lundbladea2e29072018-12-30 09:20:06 -080041#ifdef PRINT_FUNCTIONS_FOR_DEBUGGING
Laurence Lundblade20db9c92018-12-17 11:40:37 -080042#include <stdio.h>
Laurence Lundbladea2e29072018-12-30 09:20:06 -080043
44static void PrintUsefulBufC(const char *szLabel, UsefulBufC Buf)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080045{
46 if(szLabel) {
47 printf("%s ", szLabel);
48 }
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -080049
Laurence Lundblade570fab52018-10-13 18:28:27 +080050 size_t i;
Laurence Lundbladea2e29072018-12-30 09:20:06 -080051 for(i = 0; i < Buf.len; i++) {
52 uint8_t Z = ((uint8_t *)Buf.ptr)[i];
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080053 printf("%02x ", Z);
54 }
55 printf("\n");
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -080056
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080057 fflush(stdout);
58}
Laurence Lundblade20db9c92018-12-17 11:40:37 -080059#endif
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080060
61
Laurence Lundbladeb836efb2018-10-28 20:09:58 +070062static const uint8_t spExpectedEncodedInts[] = {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080063 0x98, 0x2f, 0x3b, 0x7f, 0xff, 0xff, 0xff, 0xff,
64 0xff, 0xff, 0xff, 0x3b, 0x00, 0x00, 0x00, 0x01,
65 0x00, 0x00, 0x00, 0x00, 0x3a, 0xff, 0xff, 0xff,
66 0xff, 0x3a, 0xff, 0xff, 0xff, 0xfe, 0x3a, 0xff,
67 0xff, 0xff, 0xfd, 0x3a, 0x7f, 0xff, 0xff, 0xff,
68 0x3a, 0x7f, 0xff, 0xff, 0xfe, 0x3a, 0x00, 0x01,
69 0x00, 0x01, 0x3a, 0x00, 0x01, 0x00, 0x00, 0x39,
70 0xff, 0xff, 0x39, 0xff, 0xfe, 0x39, 0xff, 0xfd,
71 0x39, 0x01, 0x00, 0x38, 0xff, 0x38, 0xfe, 0x38,
72 0xfd, 0x38, 0x18, 0x37, 0x36, 0x20, 0x00, 0x00,
73 0x01, 0x16, 0x17, 0x18, 0x18, 0x18, 0x19, 0x18,
74 0x1a, 0x18, 0xfe, 0x18, 0xff, 0x19, 0x01, 0x00,
75 0x19, 0x01, 0x01, 0x19, 0xff, 0xfe, 0x19, 0xff,
76 0xff, 0x1a, 0x00, 0x01, 0x00, 0x00, 0x1a, 0x00,
77 0x01, 0x00, 0x01, 0x1a, 0x00, 0x01, 0x00, 0x02,
78 0x1a, 0x7f, 0xff, 0xff, 0xff, 0x1a, 0x7f, 0xff,
79 0xff, 0xff, 0x1a, 0x80, 0x00, 0x00, 0x00, 0x1a,
80 0x80, 0x00, 0x00, 0x01, 0x1a, 0xff, 0xff, 0xff,
81 0xfe, 0x1a, 0xff, 0xff, 0xff, 0xff, 0x1b, 0x00,
82 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x1b,
83 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
84 0x1b, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
85 0xff, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
86 0xff, 0xff};
87
88
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080089// return CBOR error or -1 if type of value doesn't match
90
Laurence Lundbladec5fef682020-01-25 11:38:45 -080091static int32_t IntegerValuesParseTestInternal(QCBORDecodeContext *pDCtx)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080092{
Laurence Lundbladee6bcef12020-04-01 10:56:27 -070093 QCBORItem Item;
94 QCBORError nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080095
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080096 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -070097 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080098 if(Item.uDataType != QCBOR_TYPE_ARRAY)
99 return -1;
100
101 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700102 return (int32_t)nCBORError;
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800103 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade570fab52018-10-13 18:28:27 +0800104 Item.val.int64 != -9223372036854775807LL - 1)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800105 return -1;
106
107 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700108 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800109 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade570fab52018-10-13 18:28:27 +0800110 Item.val.int64 != -4294967297)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800111 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800112
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800113 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700114 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800115 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade570fab52018-10-13 18:28:27 +0800116 Item.val.int64 != -4294967296)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800117 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800118
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800119 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700120 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800121 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade570fab52018-10-13 18:28:27 +0800122 Item.val.int64 != -4294967295)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800123 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800124
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800125 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700126 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800127 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade570fab52018-10-13 18:28:27 +0800128 Item.val.int64 != -4294967294)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800129 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800130
131
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800132 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700133 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800134 if(Item.uDataType != QCBOR_TYPE_INT64 ||
135 Item.val.int64 != -2147483648)
136 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800137
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800138 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700139 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800140 if(Item.uDataType != QCBOR_TYPE_INT64 ||
141 Item.val.int64 != -2147483647)
142 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800143
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800144 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700145 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800146 if(Item.uDataType != QCBOR_TYPE_INT64 ||
147 Item.val.int64 != -65538)
148 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800149
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800150 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700151 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800152 if(Item.uDataType != QCBOR_TYPE_INT64 ||
153 Item.val.int64 != -65537)
154 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800155
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800156 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700157 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800158 if(Item.uDataType != QCBOR_TYPE_INT64 ||
159 Item.val.int64 != -65536)
160 return -1;
161
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800162
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800163 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700164 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800165 if(Item.uDataType != QCBOR_TYPE_INT64 ||
166 Item.val.int64 != -65535)
167 return -1;
168
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800169
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800170 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700171 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800172 if(Item.uDataType != QCBOR_TYPE_INT64 ||
173 Item.val.int64 != -65534)
174 return -1;
175
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800176
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800177 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700178 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800179 if(Item.uDataType != QCBOR_TYPE_INT64 ||
180 Item.val.int64 != -257)
181 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800182
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800183 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700184 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800185 if(Item.uDataType != QCBOR_TYPE_INT64 ||
186 Item.val.int64 != -256)
187 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800188
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800189 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700190 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800191 if(Item.uDataType != QCBOR_TYPE_INT64 ||
192 Item.val.int64 != -255)
193 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800194
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800195 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700196 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800197 if(Item.uDataType != QCBOR_TYPE_INT64 ||
198 Item.val.int64 != -254)
199 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800200
201
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800202 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700203 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800204 if(Item.uDataType != QCBOR_TYPE_INT64 ||
205 Item.val.int64 != -25)
206 return -1;
207
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800208
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800209 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700210 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800211 if(Item.uDataType != QCBOR_TYPE_INT64 ||
212 Item.val.int64 != -24)
213 return -1;
214
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800215
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800216 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700217 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800218 if(Item.uDataType != QCBOR_TYPE_INT64 ||
219 Item.val.int64 != -23)
220 return -1;
221
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800222
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800223 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700224 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800225 if(Item.uDataType != QCBOR_TYPE_INT64 ||
226 Item.val.int64 != -1)
227 return -1;
228
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800229
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800230 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700231 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800232 if(Item.uDataType != QCBOR_TYPE_INT64 ||
233 Item.val.int64 != 0)
234 return -1;
235
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800236
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800237 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700238 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800239 if(Item.uDataType != QCBOR_TYPE_INT64 ||
240 Item.val.int64 != 0)
241 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800242
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800243 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700244 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800245 if(Item.uDataType != QCBOR_TYPE_INT64 ||
246 Item.val.int64 != 1)
247 return -1;
248
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800249
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800250 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700251 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800252 if(Item.uDataType != QCBOR_TYPE_INT64 ||
253 Item.val.int64 != 22)
254 return -1;
255
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800256
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800257 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700258 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800259 if(Item.uDataType != QCBOR_TYPE_INT64 ||
260 Item.val.int64 != 23)
261 return -1;
262
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800263
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800264 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700265 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800266 if(Item.uDataType != QCBOR_TYPE_INT64 ||
267 Item.val.int64 != 24)
268 return -1;
269
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800270
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800271 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700272 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800273 if(Item.uDataType != QCBOR_TYPE_INT64 ||
274 Item.val.int64 != 25)
275 return -1;
276
277 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700278 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800279 if(Item.uDataType != QCBOR_TYPE_INT64 ||
280 Item.val.int64 != 26)
281 return -1;
282
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800283
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800284 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700285 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800286 if(Item.uDataType != QCBOR_TYPE_INT64 ||
287 Item.val.int64 != 254)
288 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800289
290
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800291 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700292 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800293 if(Item.uDataType != QCBOR_TYPE_INT64 ||
294 Item.val.int64 != 255)
295 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800296
297
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800298 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700299 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800300 if(Item.uDataType != QCBOR_TYPE_INT64 ||
301 Item.val.int64 != 256)
302 return -1;
303
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800304
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800305 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700306 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800307 if(Item.uDataType != QCBOR_TYPE_INT64 ||
308 Item.val.int64 != 257)
309 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800310
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800311 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700312 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800313 if(Item.uDataType != QCBOR_TYPE_INT64 ||
314 Item.val.int64 != 65534)
315 return -1;
316
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800317
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800318 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700319 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800320 if(Item.uDataType != QCBOR_TYPE_INT64 ||
321 Item.val.int64 != 65535)
322 return -1;
323
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800324
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800325 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700326 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800327 if(Item.uDataType != QCBOR_TYPE_INT64 ||
328 Item.val.int64 != 65536)
329 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800330
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800331 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700332 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800333 if(Item.uDataType != QCBOR_TYPE_INT64 ||
334 Item.val.int64 != 65537)
335 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800336
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800337 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700338 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800339 if(Item.uDataType != QCBOR_TYPE_INT64 ||
340 Item.val.int64 != 65538)
341 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800342
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800343 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700344 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800345 if(Item.uDataType != QCBOR_TYPE_INT64 ||
346 Item.val.int64 != 2147483647)
347 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800348
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800349 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700350 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800351 if(Item.uDataType != QCBOR_TYPE_INT64 ||
352 Item.val.int64 != 2147483647)
353 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800354
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800355 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700356 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800357 if(Item.uDataType != QCBOR_TYPE_INT64 ||
358 Item.val.int64 != 2147483648)
359 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800360
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800361 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700362 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800363 if(Item.uDataType != QCBOR_TYPE_INT64 ||
364 Item.val.int64 != 2147483649)
365 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800366
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800367 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700368 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800369 if(Item.uDataType != QCBOR_TYPE_INT64 ||
370 Item.val.int64 != 4294967294)
371 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800372
373
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700374 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
375 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800376 if(Item.uDataType != QCBOR_TYPE_INT64 ||
377 Item.val.int64 != 4294967295)
378 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800379
380
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800381 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700382 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800383 if(Item.uDataType != QCBOR_TYPE_INT64 ||
384 Item.val.int64 != 4294967296)
385 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800386
387
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800388 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700389 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800390 if(Item.uDataType != QCBOR_TYPE_INT64 ||
391 Item.val.int64 != 4294967297)
392 return -1;
393
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800394
395
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800396 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700397 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800398 if(Item.uDataType != QCBOR_TYPE_INT64 ||
399 Item.val.int64 != 9223372036854775807LL)
400 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800401
402
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800403 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700404 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800405 if(Item.uDataType != QCBOR_TYPE_UINT64 ||
406 Item.val.uint64 != 18446744073709551615ULL)
407 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800408
409
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800410 if(QCBORDecode_Finish(pDCtx) != QCBOR_SUCCESS) {
411 return -1;
412 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800413
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800414 return 0;
415}
416
417
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800418// One less than the smallest negative integer allowed in C. Decoding
419// this should fail.
420static const uint8_t spTooSmallNegative[] = {
421 0x3b, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Laurence Lundblade21d1d812019-09-28 22:47:49 -1000422};
423
424
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800425/*
426 Tests the decoding of lots of different integers sizes
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +0800427 and values.
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800428 */
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800429int32_t IntegerValuesParseTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800430{
Laurence Lundblade21d1d812019-09-28 22:47:49 -1000431 int nReturn;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800432 QCBORDecodeContext DCtx;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800433
Laurence Lundblade21d1d812019-09-28 22:47:49 -1000434 QCBORDecode_Init(&DCtx,
435 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spExpectedEncodedInts),
436 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800437
Laurence Lundblade21d1d812019-09-28 22:47:49 -1000438 // The really big test of all successes
439 nReturn = IntegerValuesParseTestInternal(&DCtx);
440 if(nReturn) {
441 return nReturn;
442 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800443
Laurence Lundblade21d1d812019-09-28 22:47:49 -1000444 // The one large negative integer that can be parsed
445 QCBORDecode_Init(&DCtx,
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800446 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spTooSmallNegative),
Laurence Lundblade21d1d812019-09-28 22:47:49 -1000447 QCBOR_DECODE_MODE_NORMAL);
448
449 QCBORItem item;
450 if(QCBORDecode_GetNext(&DCtx, &item) != QCBOR_ERR_INT_OVERFLOW) {
451 nReturn = -4000;
452 }
453
454 return(nReturn);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800455}
456
457
458/*
Laurence Lundbladeee851742020-01-08 08:37:05 -0800459 Creates a simple CBOR array and returns it in *pEncoded. The array is
460 malloced and needs to be freed. This is used by several tests.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800461
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800462 Two of the inputs can be set. Two other items in the array are fixed.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800463
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800464 */
465
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800466static uint8_t spSimpleArrayBuffer[50];
467
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800468static int32_t CreateSimpleArray(int nInt1, int nInt2, uint8_t **pEncoded, size_t *pEncodedLen)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800469{
470 QCBOREncodeContext ECtx;
471 int nReturn = -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800472
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800473 *pEncoded = NULL;
474 *pEncodedLen = INT32_MAX;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800475
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800476 // loop runs CBOR encoding twice. First with no buffer to
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800477 // calculate the length so buffer can be allocated correctly,
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800478 // and last with the buffer to do the actual encoding
479 do {
Laurence Lundblade0595e932018-11-02 22:22:47 +0700480 QCBOREncode_Init(&ECtx, (UsefulBuf){*pEncoded, *pEncodedLen});
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800481 QCBOREncode_OpenArray(&ECtx);
482 QCBOREncode_AddInt64(&ECtx, nInt1);
483 QCBOREncode_AddInt64(&ECtx, nInt2);
484 QCBOREncode_AddBytes(&ECtx, ((UsefulBufC) {"galactic", 8}));
485 QCBOREncode_AddBytes(&ECtx, ((UsefulBufC) {"haven token", 11}));
486 QCBOREncode_CloseArray(&ECtx);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800487
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800488 if(QCBOREncode_FinishGetSize(&ECtx, pEncodedLen))
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800489 goto Done;
490
491 if(*pEncoded != NULL) {
492 nReturn = 0;
493 goto Done;
494 }
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800495
496 // Use static buffer to avoid dependency on malloc()
497 if(*pEncodedLen > sizeof(spSimpleArrayBuffer)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800498 goto Done;
499 }
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800500 *pEncoded = spSimpleArrayBuffer;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800501
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800502 } while(1);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800503
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800504Done:
505 return nReturn;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800506}
507
508
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800509/*
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800510 Some basic CBOR with map and array used in a lot of tests.
511 The map labels are all strings
512
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800513 {"first integer": 42,
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900514 "an array of two strings": [
515 "string1", "string2"
516 ],
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800517 "map in a map": {
518 "bytes 1": h'78787878',
519 "bytes 2": h'79797979',
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900520 "another int": 98,
521 "text 2": "lies, damn lies and statistics"
522 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800523 }
524 */
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800525static const uint8_t pValidMapEncoded[] = {
Laurence Lundbladeb836efb2018-10-28 20:09:58 +0700526 0xa3, 0x6d, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x69, 0x6e,
527 0x74, 0x65, 0x67, 0x65, 0x72, 0x18, 0x2a, 0x77, 0x61, 0x6e,
528 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20,
529 0x74, 0x77, 0x6f, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
530 0x73, 0x82, 0x67, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x31,
531 0x67, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x32, 0x6c, 0x6d,
532 0x61, 0x70, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x6d, 0x61,
533 0x70, 0xa4, 0x67, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x31,
534 0x44, 0x78, 0x78, 0x78, 0x78, 0x67, 0x62, 0x79, 0x74, 0x65,
535 0x73, 0x20, 0x32, 0x44, 0x79, 0x79, 0x79, 0x79, 0x6b, 0x61,
536 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x74,
537 0x18, 0x62, 0x66, 0x74, 0x65, 0x78, 0x74, 0x20, 0x32, 0x78,
538 0x1e, 0x6c, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x64, 0x61, 0x6d,
539 0x6e, 0x20, 0x6c, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64,
540 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63,
541 0x73 } ;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800542
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800543static int32_t ParseOrderedArray(const uint8_t *pEncoded,
Laurence Lundbladeee851742020-01-08 08:37:05 -0800544 size_t nLen,
545 int64_t *pInt1,
546 int64_t *pInt2,
547 const uint8_t **pBuf3,
548 size_t *pBuf3Len,
549 const uint8_t **pBuf4,
550 size_t *pBuf4Len)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800551{
552 QCBORDecodeContext DCtx;
553 QCBORItem Item;
554 int nReturn = -1; // assume error until success
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800555
Laurence Lundbladeee851742020-01-08 08:37:05 -0800556 QCBORDecode_Init(&DCtx,
557 (UsefulBufC){pEncoded, nLen},
558 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800559
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800560 // Make sure the first thing is a map
561 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 || Item.uDataType != QCBOR_TYPE_ARRAY)
562 goto Done;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800563
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800564 // First integer
Laurence Lundblade12b495d2018-12-17 11:15:54 -0800565 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 || Item.uDataType != QCBOR_TYPE_INT64)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800566 goto Done;
567 *pInt1 = Item.val.int64;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800568
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800569 // Second integer
570 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 || Item.uDataType != QCBOR_TYPE_INT64)
571 goto Done;
572 *pInt2 = Item.val.int64;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800573
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800574 // First string
575 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 || Item.uDataType != QCBOR_TYPE_BYTE_STRING)
576 goto Done;
577 *pBuf3 = Item.val.string.ptr;
578 *pBuf3Len = Item.val.string.len;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800579
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800580 // Second string
581 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 || Item.uDataType != QCBOR_TYPE_BYTE_STRING)
582 goto Done;
583 *pBuf4 = Item.val.string.ptr;
584 *pBuf4Len = Item.val.string.len;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800585
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800586 nReturn = 0;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800587
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800588Done:
589 return(nReturn);
590}
591
592
593
Laurence Lundblade9e3651c2018-10-10 11:49:55 +0800594
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800595int32_t SimpleArrayTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800596{
597 uint8_t *pEncoded;
598 size_t nEncodedLen;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800599
Laurence Lundblade5e390822019-01-06 12:35:01 -0800600 int64_t i1=0, i2=0;
601 size_t i3=0, i4=0;
602 const uint8_t *s3= (uint8_t *)"";
603 const uint8_t *s4= (uint8_t *)"";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800604
605
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800606 if(CreateSimpleArray(23, 6000, &pEncoded, &nEncodedLen) < 0) {
607 return(-1);
608 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800609
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800610 ParseOrderedArray(pEncoded, nEncodedLen, &i1, &i2, &s3, &i3, &s4, &i4);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800611
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800612 if(i1 != 23 ||
613 i2 != 6000 ||
614 i3 != 8 ||
615 i4 != 11 ||
Laurence Lundbladea44d5062018-10-17 18:45:12 +0530616 memcmp("galactic", s3, 8) !=0 ||
617 memcmp("haven token", s4, 11) !=0) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800618 return(-1);
619 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800620
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800621 return(0);
622}
623
624
Laurence Lundblade9916b1b2019-09-07 22:33:25 -0700625/*
626 [
627 0,
628 [],
629 [
630 [],
631 [
632 0
633 ],
634 {},
635 {
636 1: {},
637 2: {},
638 3: []
639 }
640 ]
641 ]
642 */
643static uint8_t sEmpties[] = {0x83, 0x00, 0x80, 0x84, 0x80, 0x81, 0x00, 0xa0,
644 0xa3, 0x01, 0xa0, 0x02, 0xa0, 0x03, 0x80};
645
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800646int32_t EmptyMapsAndArraysTest()
Laurence Lundblade9916b1b2019-09-07 22:33:25 -0700647{
648 QCBORDecodeContext DCtx;
649 QCBORItem Item;
650
Laurence Lundbladeee851742020-01-08 08:37:05 -0800651 QCBORDecode_Init(&DCtx,
652 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(sEmpties),
653 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade9916b1b2019-09-07 22:33:25 -0700654
655 // Array with 3 items
656 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
657 Item.uDataType != QCBOR_TYPE_ARRAY ||
658 Item.uNestingLevel != 0 ||
659 Item.uNextNestLevel != 1 ||
660 Item.val.uCount != 3) {
661 return -1;
662 }
663
664 // An integer 0
665 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
666 Item.uDataType != QCBOR_TYPE_INT64 ||
667 Item.uNestingLevel != 1 ||
668 Item.uNextNestLevel != 1 ||
669 Item.val.uint64 != 0) {
670 return -2;
671 }
672
673 // An empty array
674 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
675 Item.uDataType != QCBOR_TYPE_ARRAY ||
676 Item.uNestingLevel != 1 ||
677 Item.uNextNestLevel != 1 ||
678 Item.val.uCount != 0) {
679 return -3;
680 }
681
682 // An array with 4 items
683 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
684 Item.uDataType != QCBOR_TYPE_ARRAY ||
685 Item.uNestingLevel != 1 ||
686 Item.uNextNestLevel != 2 ||
687 Item.val.uCount != 4) {
688 return -4;
689 }
690
691 // An empty array
692 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
693 Item.uDataType != QCBOR_TYPE_ARRAY ||
694 Item.uNestingLevel != 2 ||
695 Item.uNextNestLevel != 2 ||
696 Item.val.uCount != 0) {
697 return -5;
698 }
699
700 // An array with 1 item
701 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
702 Item.uDataType != QCBOR_TYPE_ARRAY ||
703 Item.uNestingLevel != 2 ||
704 Item.uNextNestLevel != 3 ||
705 Item.val.uCount != 1) {
706 return -6;
707 }
708
709 // An integer 0
710 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
711 Item.uDataType != QCBOR_TYPE_INT64 ||
712 Item.uNestingLevel != 3 ||
713 Item.uNextNestLevel != 2 ||
714 Item.val.uint64 != 0) {
715 return -7;
716 }
717
718 // An empty map
719 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
720 Item.uDataType != QCBOR_TYPE_MAP ||
721 Item.uNestingLevel != 2 ||
722 Item.uNextNestLevel != 2 ||
723 Item.val.uCount != 0) {
724 return -8;
725 }
726
Laurence Lundblade5e87da62020-06-07 03:24:28 -0700727 // A map with 3 items
Laurence Lundblade9916b1b2019-09-07 22:33:25 -0700728 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
729 Item.uDataType != QCBOR_TYPE_MAP ||
730 Item.uNestingLevel != 2 ||
731 Item.uNextNestLevel != 3 ||
732 Item.val.uCount != 3) {
733 return -9;
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 -10;
743 }
744
745 // An empty map
746 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
747 Item.uDataType != QCBOR_TYPE_MAP ||
748 Item.uNestingLevel != 3 ||
749 Item.uNextNestLevel != 3 ||
750 Item.val.uCount != 0) {
751 return -11;
752 }
753
754 // An empty array
755 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
756 Item.uDataType != QCBOR_TYPE_ARRAY ||
757 Item.uNestingLevel != 3 ||
758 Item.uNextNestLevel != 0 ||
759 Item.val.uCount != 0) {
760 return -12;
761 }
762
763 if(QCBORDecode_Finish(&DCtx) != QCBOR_SUCCESS) {
764 return -13;
765 }
766
767 return 0;
768}
769
Laurence Lundblade9e3651c2018-10-10 11:49:55 +0800770
Laurence Lundbladeee851742020-01-08 08:37:05 -0800771static uint8_t spDeepArrays[] = {0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
772 0x81, 0x81, 0x81, 0x80};
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800773
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800774int32_t ParseDeepArrayTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800775{
776 QCBORDecodeContext DCtx;
777 int nReturn = 0;
778 int i;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800779
Laurence Lundbladeee851742020-01-08 08:37:05 -0800780 QCBORDecode_Init(&DCtx,
781 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spDeepArrays),
782 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800783
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800784 for(i = 0; i < 10; i++) {
785 QCBORItem Item;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800786
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800787 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
788 Item.uDataType != QCBOR_TYPE_ARRAY ||
789 Item.uNestingLevel != i) {
790 nReturn = -1;
791 break;
792 }
793 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800794
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800795 return(nReturn);
796}
797
Laurence Lundblade972e59c2018-11-11 15:57:23 +0700798// Big enough to test nesting to the depth of 24
Laurence Lundbladeee851742020-01-08 08:37:05 -0800799static uint8_t spTooDeepArrays[] = {0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
800 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
801 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
802 0x81, 0x81, 0x81, 0x80};
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800803
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800804int32_t ParseTooDeepArrayTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800805{
806 QCBORDecodeContext DCtx;
807 int nReturn = 0;
808 int i;
809 QCBORItem Item;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800810
811
Laurence Lundbladeee851742020-01-08 08:37:05 -0800812 QCBORDecode_Init(&DCtx,
813 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spTooDeepArrays),
814 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800815
Laurence Lundblade972e59c2018-11-11 15:57:23 +0700816 for(i = 0; i < QCBOR_MAX_ARRAY_NESTING1; i++) {
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800817
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800818 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
819 Item.uDataType != QCBOR_TYPE_ARRAY ||
820 Item.uNestingLevel != i) {
821 nReturn = -1;
822 break;
823 }
824 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800825
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800826 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_ARRAY_NESTING_TOO_DEEP)
827 nReturn = -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800828
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800829 return(nReturn);
830}
831
832
833
834
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800835int32_t ShortBufferParseTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800836{
Laurence Lundbladebb1062e2019-08-12 23:28:54 -0700837 int nResult = 0;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800838
Laurence Lundblade06350ea2020-01-27 19:32:40 -0800839 for(size_t nNum = sizeof(spExpectedEncodedInts)-1; nNum; nNum--) {
Laurence Lundbladebb1062e2019-08-12 23:28:54 -0700840 QCBORDecodeContext DCtx;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800841
Laurence Lundbladeee851742020-01-08 08:37:05 -0800842 QCBORDecode_Init(&DCtx,
843 (UsefulBufC){spExpectedEncodedInts, nNum},
844 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800845
Laurence Lundblade06350ea2020-01-27 19:32:40 -0800846 const int nErr = IntegerValuesParseTestInternal(&DCtx);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800847
Laurence Lundbladebb1062e2019-08-12 23:28:54 -0700848 if(nErr != QCBOR_ERR_HIT_END && nErr != QCBOR_ERR_NO_MORE_ITEMS) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800849 nResult = -1;
850 goto Done;
851 }
852 }
853Done:
854 return nResult;
855}
856
857
Laurence Lundblade9e3651c2018-10-10 11:49:55 +0800858
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800859int32_t ShortBufferParseTest2()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800860{
861 uint8_t *pEncoded;
862 int nReturn;
863 size_t nEncodedLen;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800864
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800865 int64_t i1, i2;
866 size_t i3, i4;
867 const uint8_t *s3, *s4;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800868
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800869 nReturn = 0;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800870
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800871 if(CreateSimpleArray(23, 6000, &pEncoded, &nEncodedLen) < 0) {
872 return(-1);
873 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800874
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800875 for(nEncodedLen--; nEncodedLen; nEncodedLen--) {
876 int nResult = ParseOrderedArray(pEncoded, (uint32_t)nEncodedLen, &i1, &i2, &s3, &i3, &s4, &i4);
877 if(nResult == 0) {
878 nReturn = -1;
879 }
880 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800881
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800882 return(nReturn);
883}
884
Laurence Lundbladefab1b522018-10-19 13:40:52 +0530885/*
886 Decode and thoroughly check a moderately complex
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800887 set of maps. Can be run in QCBOR_DECODE_MODE_NORMAL or in
888 QCBOR_DECODE_MODE_MAP_STRINGS_ONLY.
Laurence Lundbladefab1b522018-10-19 13:40:52 +0530889 */
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800890static int32_t ParseMapTest1(QCBORDecodeMode nMode)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800891{
892 QCBORDecodeContext DCtx;
893 QCBORItem Item;
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700894 QCBORError nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800895
Laurence Lundbladeee851742020-01-08 08:37:05 -0800896 QCBORDecode_Init(&DCtx,
897 (UsefulBufC){pValidMapEncoded, sizeof(pValidMapEncoded)},
898 nMode);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800899
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900900 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700901 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900902 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800903 if(Item.uDataType != QCBOR_TYPE_MAP ||
904 Item.val.uCount != 3)
905 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800906
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900907 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700908 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900909 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800910 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800911 Item.uDataType != QCBOR_TYPE_INT64 ||
912 Item.val.int64 != 42 ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +0530913 Item.uDataAlloc ||
914 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900915 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("first integer"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800916 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900917 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800918
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900919 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700920 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900921 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800922 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +0530923 Item.uDataAlloc ||
924 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900925 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("an array of two strings")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800926 Item.uDataType != QCBOR_TYPE_ARRAY ||
927 Item.val.uCount != 2)
928 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800929
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900930 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700931 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900932 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800933 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +0530934 Item.uDataAlloc ||
935 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900936 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("string1"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800937 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900938 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800939
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900940 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700941 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900942 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800943 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +0530944 Item.uDataAlloc ||
945 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900946 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("string2"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800947 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900948 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800949
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900950 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700951 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900952 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800953 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +0530954 Item.uDataAlloc ||
955 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900956 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("map in a map")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800957 Item.uDataType != QCBOR_TYPE_MAP ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900958 Item.val.uCount != 4) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800959 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900960 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800961
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900962 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700963 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900964 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800965 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900966 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("bytes 1"))||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800967 Item.uDataType != QCBOR_TYPE_BYTE_STRING ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +0530968 Item.uDataAlloc ||
969 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900970 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("xxxx"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800971 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900972 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800973
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900974 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700975 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900976 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800977 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900978 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("bytes 2")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800979 Item.uDataType != QCBOR_TYPE_BYTE_STRING ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +0530980 Item.uDataAlloc ||
981 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900982 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("yyyy"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800983 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900984 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800985
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900986 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700987 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900988 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800989 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +0530990 Item.uDataAlloc ||
991 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900992 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("another int")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800993 Item.uDataType != QCBOR_TYPE_INT64 ||
994 Item.val.int64 != 98)
995 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800996
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900997 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700998 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900999 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001000 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001001 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("text 2"))||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001002 Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +05301003 Item.uDataAlloc ||
1004 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001005 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("lies, damn lies and statistics"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001006 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001007 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001008
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001009 return 0;
1010}
1011
1012
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001013/*
1014 Decode and thoroughly check a moderately complex
1015 set of maps
1016 */
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001017int32_t ParseMapAsArrayTest()
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001018{
1019 QCBORDecodeContext DCtx;
1020 QCBORItem Item;
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001021 QCBORError nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001022
Laurence Lundbladeee851742020-01-08 08:37:05 -08001023 QCBORDecode_Init(&DCtx,
1024 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapEncoded),
1025 QCBOR_DECODE_MODE_MAP_AS_ARRAY);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001026
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001027 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001028 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001029 }
Laurence Lundbladed61cbf32018-12-09 11:42:21 -08001030 if(Item.uDataType != QCBOR_TYPE_MAP_AS_ARRAY ||
1031 Item.val.uCount != 6) {
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001032 return -1;
1033 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001034
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001035 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001036 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001037 }
1038 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
1039 Item.uDataAlloc ||
1040 Item.uLabelAlloc ||
1041 Item.uLabelType != QCBOR_TYPE_NONE ||
1042 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("first integer"))) {
1043 return -2;
1044 }
1045
1046 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001047 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001048 }
1049 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1050 Item.uDataType != QCBOR_TYPE_INT64 ||
1051 Item.val.int64 != 42 ||
1052 Item.uDataAlloc ||
1053 Item.uLabelAlloc) {
1054 return -3;
1055 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001056
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001057 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001058 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001059 }
1060 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1061 Item.uDataAlloc ||
1062 Item.uLabelAlloc ||
1063 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("an array of two strings")) ||
1064 Item.uDataType != QCBOR_TYPE_TEXT_STRING) {
1065 return -4;
1066 }
1067
1068 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001069 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001070 }
1071 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1072 Item.uDataAlloc ||
1073 Item.uLabelAlloc ||
1074 Item.uDataType != QCBOR_TYPE_ARRAY ||
1075 Item.val.uCount != 2) {
1076 return -5;
1077 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001078
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001079 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001080 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001081 }
1082 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
1083 Item.val.string.len != 7 ||
1084 Item.uDataAlloc ||
1085 Item.uLabelAlloc ||
1086 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("string1"))) {
1087 return -6;
1088 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001089
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001090 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001091 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001092 }
1093 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
1094 Item.uDataAlloc ||
1095 Item.uLabelAlloc ||
1096 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("string2"))) {
1097 return -7;
1098 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001099
1100
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001101 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001102 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001103 }
1104 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1105 Item.uDataAlloc ||
1106 Item.uLabelAlloc ||
1107 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("map in a map"))) {
1108 return -8;
1109 }
1110
1111 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001112 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001113 }
1114 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1115 Item.uDataAlloc ||
1116 Item.uLabelAlloc ||
Laurence Lundbladed61cbf32018-12-09 11:42:21 -08001117 Item.uDataType != QCBOR_TYPE_MAP_AS_ARRAY ||
1118 Item.val.uCount != 8) {
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001119 return -9;
1120 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001121
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001122 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001123 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001124 }
1125 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1126 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("bytes 1"))||
1127 Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
1128 Item.uDataAlloc ||
1129 Item.uLabelAlloc) {
1130 return -10;
1131 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001132
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001133 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001134 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001135 }
1136 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1137 Item.uDataType != QCBOR_TYPE_BYTE_STRING ||
1138 Item.uDataAlloc ||
1139 Item.uLabelAlloc ||
1140 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("xxxx"))) {
1141 return -11;
1142 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001143
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001144 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001145 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001146 }
1147 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1148 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("bytes 2")) ||
1149 Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
1150 Item.uDataAlloc ||
1151 Item.uLabelAlloc) {
1152 return -12;
1153 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001154
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001155 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001156 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001157 }
1158 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1159 Item.uDataType != QCBOR_TYPE_BYTE_STRING ||
1160 Item.uDataAlloc ||
1161 Item.uLabelAlloc ||
1162 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("yyyy"))) {
1163 return -13;
1164 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001165
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001166 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001167 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001168 }
1169 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1170 Item.uDataAlloc ||
1171 Item.uLabelAlloc ||
1172 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("another int")) ||
1173 Item.uDataType != QCBOR_TYPE_TEXT_STRING) {
1174 return -14;
1175 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001176
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001177 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001178 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001179 }
1180 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1181 Item.uDataAlloc ||
1182 Item.uLabelAlloc ||
1183 Item.uDataType != QCBOR_TYPE_INT64 ||
1184 Item.val.int64 != 98) {
1185 return -15;
1186 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001187
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001188 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001189 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001190 }
1191 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1192 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("text 2"))||
1193 Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
1194 Item.uDataAlloc ||
1195 Item.uLabelAlloc) {
1196 return -16;
1197 }
1198
1199 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001200 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001201 }
1202 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1203 Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
1204 Item.uDataAlloc ||
1205 Item.uLabelAlloc ||
1206 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("lies, damn lies and statistics"))) {
1207 return -17;
1208 }
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001209
1210
1211 /*
1212 Test with map that nearly QCBOR_MAX_ITEMS_IN_ARRAY items in a
1213 map that when interpreted as an array will be too many. Test
1214 data just has the start of the map, not all the items in the map.
1215 */
1216 static const uint8_t pTooLargeMap[] = {0xb9, 0xff, 0xfd};
1217
1218 QCBORDecode_Init(&DCtx,
1219 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pTooLargeMap),
1220 QCBOR_DECODE_MODE_MAP_AS_ARRAY);
1221
1222 if((QCBOR_ERR_ARRAY_TOO_LONG != QCBORDecode_GetNext(&DCtx, &Item))) {
1223 return -50;
1224 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001225
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001226 return 0;
1227}
1228
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001229
1230/*
Laurence Lundbladefab1b522018-10-19 13:40:52 +05301231 Fully or partially decode pValidMapEncoded. When
1232 partially decoding check for the right error code.
1233 How much partial decoding depends on nLevel.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001234
Laurence Lundbladefab1b522018-10-19 13:40:52 +05301235 The partial decodes test error conditions of
1236 incomplete encoded input.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001237
Laurence Lundbladefab1b522018-10-19 13:40:52 +05301238 This could be combined with the above test
1239 and made prettier and maybe a little more
1240 thorough.
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001241 */
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001242static int32_t ExtraBytesTest(int nLevel)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001243{
1244 QCBORDecodeContext DCtx;
1245 QCBORItem Item;
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001246 QCBORError nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001247
Laurence Lundbladeee851742020-01-08 08:37:05 -08001248 QCBORDecode_Init(&DCtx,
1249 (UsefulBufC){pValidMapEncoded, sizeof(pValidMapEncoded)},
1250 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001251
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001252 if(nLevel < 1) {
1253 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_EXTRA_BYTES) {
1254 return -1;
1255 } else {
1256 return 0;
1257 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001258 }
Laurence Lundbladefab1b522018-10-19 13:40:52 +05301259
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001260
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001261 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001262 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001263 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001264 if(Item.uDataType != QCBOR_TYPE_MAP ||
1265 Item.val.uCount != 3)
1266 return -1;
1267
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001268 if(nLevel < 2) {
1269 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1270 return -1;
1271 } else {
1272 return 0;
1273 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001274 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001275
1276
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001277 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001278 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001279 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001280 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001281 Item.uDataType != QCBOR_TYPE_INT64 ||
1282 Item.val.uCount != 42 ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001283 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("first integer"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001284 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001285 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001286
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001287 if(nLevel < 3) {
1288 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1289 return -1;
1290 } else {
1291 return 0;
1292 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001293 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001294
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001295 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001296 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001297 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001298 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001299 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("an array of two strings")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001300 Item.uDataType != QCBOR_TYPE_ARRAY ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001301 Item.val.uCount != 2) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001302 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001303 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001304
1305
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001306 if(nLevel < 4) {
1307 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1308 return -1;
1309 } else {
1310 return 0;
1311 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001312 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001313
1314
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001315 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001316 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001317 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001318 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001319 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("string1"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001320 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001321 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001322
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001323 if(nLevel < 5) {
1324 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1325 return -1;
1326 } else {
1327 return 0;
1328 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001329 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001330
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001331 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001332 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001333 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001334 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001335 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("string2"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001336 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001337 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001338
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001339 if(nLevel < 6) {
1340 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1341 return -1;
1342 } else {
1343 return 0;
1344 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001345 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001346
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001347 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001348 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001349 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001350 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001351 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("map in a map")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001352 Item.uDataType != QCBOR_TYPE_MAP ||
1353 Item.val.uCount != 4)
1354 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001355
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001356 if(nLevel < 7) {
1357 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1358 return -1;
1359 } else {
1360 return 0;
1361 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001362 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001363
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001364 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001365 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001366 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001367 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001368 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("bytes 1")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001369 Item.uDataType != QCBOR_TYPE_BYTE_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001370 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("xxxx"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001371 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001372 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001373
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001374 if(nLevel < 8) {
1375 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1376 return -1;
1377 } else {
1378 return 0;
1379 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001380 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001381
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001382 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001383 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001384 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001385 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001386 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("bytes 2")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001387 Item.uDataType != QCBOR_TYPE_BYTE_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001388 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("yyyy"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001389 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001390 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001391
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001392 if(nLevel < 9) {
1393 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1394 return -1;
1395 } else {
1396 return 0;
1397 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001398 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001399
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001400 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001401 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001402 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001403 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001404 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("another int")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001405 Item.uDataType != QCBOR_TYPE_INT64 ||
1406 Item.val.int64 != 98)
1407 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001408
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001409 if(nLevel < 10) {
1410 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1411 return -1;
1412 } else {
1413 return 0;
1414 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001415 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001416
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001417 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001418 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001419 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001420 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001421 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("text 2"))||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001422 Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001423 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("lies, damn lies and statistics"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001424 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001425 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001426
Laurence Lundbladefab1b522018-10-19 13:40:52 +05301427 if(QCBORDecode_Finish(&DCtx)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001428 return -1;
1429 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001430
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001431 return 0;
1432}
1433
1434
1435
Laurence Lundblade844bb5c2020-03-01 17:27:25 -08001436
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001437int32_t ParseMapTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001438{
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001439 // Parse a moderatly complex map structure very thoroughly
1440 int32_t nResult = ParseMapTest1(QCBOR_DECODE_MODE_NORMAL);
1441 if(nResult) {
1442 return nResult;
1443 }
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08001444
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001445 // Again, but in strings-only mode. It should succeed since the input
1446 // map has only string labels.
1447 nResult = ParseMapTest1(QCBOR_DECODE_MODE_MAP_STRINGS_ONLY);
1448 if(nResult) {
1449 return nResult;
1450 }
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08001451
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001452 // Again, but try to finish the decoding before the end of the
1453 // input at 10 different place and see that the right error code
1454 // is returned.
1455 for(int i = 0; i < 10; i++) {
1456 nResult = ExtraBytesTest(i);
1457 if(nResult) {
1458 break;
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001459 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001460 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001461
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001462 return nResult;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001463}
1464
1465
Laurence Lundbladeee851742020-01-08 08:37:05 -08001466static uint8_t spSimpleValues[] = {0x8a, 0xf4, 0xf5, 0xf6, 0xf7, 0xff,
1467 0xe0, 0xf3, 0xf8, 0x00, 0xf8, 0x13,
1468 0xf8, 0x1f, 0xf8, 0x20, 0xf8, 0xff};
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001469
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001470int32_t ParseSimpleTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001471{
1472 QCBORDecodeContext DCtx;
1473 QCBORItem Item;
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001474 QCBORError nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001475
1476
Laurence Lundbladeee851742020-01-08 08:37:05 -08001477 QCBORDecode_Init(&DCtx,
1478 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spSimpleValues),
1479 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001480
1481
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001482 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001483 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001484 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
1485 Item.val.uCount != 10)
1486 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001487
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001488 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001489 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001490 if(Item.uDataType != QCBOR_TYPE_FALSE)
1491 return -1;
1492
1493 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001494 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001495 if(Item.uDataType != QCBOR_TYPE_TRUE)
1496 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001497
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001498 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001499 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001500 if(Item.uDataType != QCBOR_TYPE_NULL)
1501 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001502
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001503 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001504 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001505 if(Item.uDataType != QCBOR_TYPE_UNDEF)
1506 return -1;
1507
1508 // A break
Laurence Lundblade9e3651c2018-10-10 11:49:55 +08001509 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_BAD_BREAK)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001510 return -1;
1511
1512 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001513 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001514 if(Item.uDataType != QCBOR_TYPE_UKNOWN_SIMPLE || Item.val.uSimple != 0)
1515 return -1;
1516
1517 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001518 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001519 if(Item.uDataType != QCBOR_TYPE_UKNOWN_SIMPLE || Item.val.uSimple != 19)
1520 return -1;
1521
Laurence Lundblade077475f2019-04-26 09:06:33 -07001522 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_BAD_TYPE_7)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001523 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001524
Laurence Lundblade077475f2019-04-26 09:06:33 -07001525 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_BAD_TYPE_7)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001526 return -1;
1527
Laurence Lundblade077475f2019-04-26 09:06:33 -07001528 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_BAD_TYPE_7)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001529 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001530
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001531 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001532 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001533 if(Item.uDataType != QCBOR_TYPE_UKNOWN_SIMPLE || Item.val.uSimple != 32)
1534 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001535
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001536 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001537 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001538 if(Item.uDataType != QCBOR_TYPE_UKNOWN_SIMPLE || Item.val.uSimple != 255)
1539 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001540
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001541 return 0;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001542
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001543}
1544
1545
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001546static int IsNotWellFormedError(QCBORError nErr)
1547{
1548 switch(nErr){
1549 case QCBOR_ERR_INDEFINITE_STRING_CHUNK:
1550 case QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN:
1551 case QCBOR_ERR_UNSUPPORTED:
1552 case QCBOR_ERR_HIT_END:
1553 case QCBOR_ERR_BAD_TYPE_7:
1554 case QCBOR_ERR_BAD_BREAK:
1555 case QCBOR_ERR_EXTRA_BYTES:
1556 case QCBOR_ERR_BAD_INT:
1557 return 1;
1558 default:
1559 return 0;
1560 }
1561}
1562
1563
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001564int32_t NotWellFormedTests()
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001565{
1566 // Loop over all the not-well-formed instance of CBOR
1567 // that are test vectors in not_well_formed_cbor.h
1568 const uint16_t nArraySize = sizeof(paNotWellFormedCBOR)/sizeof(struct someBinaryBytes);
1569 for(uint16_t nIterate = 0; nIterate < nArraySize; nIterate++) {
1570 const struct someBinaryBytes *pBytes = &paNotWellFormedCBOR[nIterate];
1571 const UsefulBufC Input = (UsefulBufC){pBytes->p, pBytes->n};
1572
Laurence Lundbladeee851742020-01-08 08:37:05 -08001573 // Set up decoder context. String allocator needed for indefinite
1574 // string test cases
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001575 QCBORDecodeContext DCtx;
1576 QCBORDecode_Init(&DCtx, Input, QCBOR_DECODE_MODE_NORMAL);
1577 UsefulBuf_MAKE_STACK_UB(Pool, 100);
1578 QCBORDecode_SetMemPool(&DCtx, Pool, 0);
1579
1580 // Loop getting items until no more to get
1581 QCBORError nCBORError;
1582 do {
1583 QCBORItem Item;
1584
1585 nCBORError = QCBORDecode_GetNext(&DCtx, &Item);
1586 } while(nCBORError == QCBOR_SUCCESS);
1587
1588 // Every test vector must fail with
1589 // a not-well-formed error. If not
1590 // this test fails.
1591 if(!IsNotWellFormedError(nCBORError)) {
1592 // Return index of failure in the error code
1593 return 2000 + nIterate;
1594 }
1595 }
1596 return 0;
1597}
1598
1599
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001600struct FailInput {
Laurence Lundblade59289e52019-12-30 13:44:37 -08001601 UsefulBufC Input;
1602 QCBORError nError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001603};
1604
Laurence Lundblade59289e52019-12-30 13:44:37 -08001605
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001606static int32_t ProcessFailures(struct FailInput *pFailInputs, size_t nNumFails)
Laurence Lundblade59289e52019-12-30 13:44:37 -08001607{
1608 for(struct FailInput *pF = pFailInputs; pF < pFailInputs + nNumFails; pF++) {
1609 // Set up the decoding context including a memory pool so that
1610 // indefinite length items can be checked
1611 QCBORDecodeContext DCtx;
1612 QCBORDecode_Init(&DCtx, pF->Input, QCBOR_DECODE_MODE_NORMAL);
1613 UsefulBuf_MAKE_STACK_UB(Pool, 100);
Laurence Lundblade830fbf92020-05-31 17:22:33 -07001614
Laurence Lundblade59289e52019-12-30 13:44:37 -08001615 QCBORError nCBORError = QCBORDecode_SetMemPool(&DCtx, Pool, 0);
1616 if(nCBORError) {
1617 return -9;
1618 }
Laurence Lundblade0a042a92020-06-12 14:09:50 -07001619
Laurence Lundblade59289e52019-12-30 13:44:37 -08001620 // Iterate until there is an error of some sort error
1621 QCBORItem Item;
1622 do {
1623 // Set to something none-zero other than QCBOR_TYPE_NONE
1624 memset(&Item, 0x33, sizeof(Item));
1625
1626 nCBORError = QCBORDecode_GetNext(&DCtx, &Item);
1627 } while(nCBORError == QCBOR_SUCCESS);
1628
1629 // Must get the expected error or the this test fails
1630 // The data and label type must also be QCBOR_TYPE_NONE
1631 if(nCBORError != pF->nError ||
1632 Item.uDataType != QCBOR_TYPE_NONE ||
1633 Item.uLabelType != QCBOR_TYPE_NONE) {
Laurence Lundblade06350ea2020-01-27 19:32:40 -08001634 // return index of CBOR + 100
Laurence Lundblade830fbf92020-05-31 17:22:33 -07001635 const size_t nIndex = (size_t)(pF - pFailInputs);
Laurence Lundblade06350ea2020-01-27 19:32:40 -08001636 return (int32_t)(nIndex * 100 + nCBORError);
Laurence Lundblade59289e52019-12-30 13:44:37 -08001637 }
1638 }
1639
1640 return 0;
1641}
1642
1643
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001644struct FailInput Failures[] = {
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001645 // Most of this is copied from not_well_formed.h. Here the error code
1646 // returned is also checked.
1647
1648 // Indefinite length strings must be closed off
1649 // An indefinite length byte string not closed off
1650 { {(uint8_t[]){0x5f, 0x41, 0x00}, 3}, QCBOR_ERR_HIT_END },
1651 // An indefinite length text string not closed off
1652 { {(uint8_t[]){0x7f, 0x61, 0x00}, 3}, QCBOR_ERR_HIT_END },
1653
1654
1655 // All the chunks in an indefinite length string must be of the type of indefinite length string
1656 // indefinite length byte string with text string chunk
1657 { {(uint8_t[]){0x5f, 0x61, 0x00, 0xff}, 4}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1658 // indefinite length text string with a byte string chunk
1659 { {(uint8_t[]){0x7f, 0x41, 0x00, 0xff}, 4}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1660 // indefinite length byte string with an positive integer chunk
1661 { {(uint8_t[]){0x5f, 0x00, 0xff}, 3}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1662 // indefinite length byte string with an negative integer chunk
1663 { {(uint8_t[]){0x5f, 0x21, 0xff}, 3}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1664 // indefinite length byte string with an array chunk
1665 { {(uint8_t[]){0x5f, 0x80, 0xff}, 3}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1666 // indefinite length byte string with an map chunk
1667 { {(uint8_t[]){0x5f, 0xa0, 0xff}, 3}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1668 // indefinite length byte string with tagged integer chunk
1669 { {(uint8_t[]){0x5f, 0xc0, 0x00, 0xff}, 4}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1670 // indefinite length byte string with an simple type chunk
1671 { {(uint8_t[]){0x5f, 0xe0, 0xff}, 3}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1672 { {(uint8_t[]){0x5f, 0x5f, 0x41, 0x00, 0xff, 0xff}, 6}, QCBOR_ERR_INDEFINITE_STRING_CHUNK},
1673 // indefinite length text string with indefinite string inside
1674 { {(uint8_t[]){0x7f, 0x7f, 0x61, 0x00, 0xff, 0xff}, 6}, QCBOR_ERR_INDEFINITE_STRING_CHUNK},
1675
1676
1677 // Definte length maps and arrays must be closed by having the right number of items
1678 // A definte length array that is supposed to have 1 item, but has none
1679 { {(uint8_t[]){0x81}, 1}, QCBOR_ERR_HIT_END },
1680 // A definte length array that is supposed to have 2 items, but has only 1
1681 { {(uint8_t[]){0x82, 0x00}, 2}, QCBOR_ERR_HIT_END },
1682 // A definte length array that is supposed to have 511 items, but has only 1
1683 { {(uint8_t[]){0x9a, 0x01, 0xff, 0x00}, 4}, QCBOR_ERR_HIT_END },
1684 // A definte length map that is supposed to have 1 item, but has none
1685 { {(uint8_t[]){0xa1}, 1}, QCBOR_ERR_HIT_END },
1686 // A definte length map that is supposed to have s item, but has only 1
1687 { {(uint8_t[]){0xa2, 0x01, 0x02}, 3}, QCBOR_ERR_HIT_END },
1688
1689
1690 // Indefinte length maps and arrays must be ended by a break
1691 // Indefinite length array with zero items and no break
1692 { {(uint8_t[]){0x9f}, 1}, QCBOR_ERR_HIT_END },
1693 // Indefinite length array with two items and no break
1694 { {(uint8_t[]){0x9f, 0x01, 0x02}, 3}, QCBOR_ERR_HIT_END },
1695 // Indefinite length map with zero items and no break
1696 { {(uint8_t[]){0xbf}, 1}, QCBOR_ERR_HIT_END },
1697 // Indefinite length map with two items and no break
1698 { {(uint8_t[]){0xbf, 0x01, 0x02, 0x01, 0x02}, 5}, QCBOR_ERR_HIT_END },
1699
1700
1701 // Nested maps and arrays must be closed off (some extra nested test vectors)
Laurence Lundblade642282a2020-06-23 12:00:33 -07001702 // Unclosed indefinite array containing a closed definite length array
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001703 { {(uint8_t[]){0x9f, 0x80, 0x00}, 3}, QCBOR_ERR_HIT_END },
Laurence Lundblade642282a2020-06-23 12:00:33 -07001704 // Definite length array containing an unclosed indefinite length array
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001705 { {(uint8_t[]){0x81, 0x9f}, 2}, QCBOR_ERR_HIT_END },
1706 // Deeply nested definite length arrays with deepest one unclosed
1707 { {(uint8_t[]){0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81}, 9}, QCBOR_ERR_HIT_END },
1708 // Deeply nested indefinite length arrays with deepest one unclosed
1709 { {(uint8_t[]){0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0xff, 0xff, 0xff, 0xff}, 9}, QCBOR_ERR_HIT_END },
1710 // Mixed nesting with indefinite unclosed
Laurence Lundblade0a042a92020-06-12 14:09:50 -07001711 { {(uint8_t[]){0x9f, 0x81, 0x9f, 0x81, 0x9f, 0x9f, 0xff, 0xff, 0xff}, 9}, QCBOR_ERR_HIT_END },
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001712 // Mixed nesting with definite unclosed
Laurence Lundbladeee851742020-01-08 08:37:05 -08001713 { {(uint8_t[]){0x9f, 0x82, 0x9f, 0x81, 0x9f, 0x9f, 0xff, 0xff, 0xff, 0xff}, 10}, QCBOR_ERR_BAD_BREAK },
Laurence Lundblade0a042a92020-06-12 14:09:50 -07001714 // TODO: a few more definite indefinite length combos and check with CBORbis.
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001715
1716
1717 // The "argument" for the data item is incomplete
1718 // Positive integer missing 1 byte argument
1719 { {(uint8_t[]){0x18}, 1}, QCBOR_ERR_HIT_END },
1720 // Positive integer missing 2 byte argument
1721 { {(uint8_t[]){0x19}, 1}, QCBOR_ERR_HIT_END },
1722 // Positive integer missing 4 byte argument
1723 { {(uint8_t[]){0x1a}, 1}, QCBOR_ERR_HIT_END },
1724 // Positive integer missing 8 byte argument
1725 { {(uint8_t[]){0x1b}, 1}, QCBOR_ERR_HIT_END },
1726 // Positive integer missing 1 byte of 2 byte argument
1727 { {(uint8_t[]){0x19, 0x01}, 2}, QCBOR_ERR_HIT_END },
1728 // Positive integer missing 2 bytes of 4 byte argument
1729 { {(uint8_t[]){0x1a, 0x01, 0x02}, 3}, QCBOR_ERR_HIT_END },
1730 // Positive integer missing 1 bytes of 7 byte argument
1731 { {(uint8_t[]){0x1b, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 8}, QCBOR_ERR_HIT_END },
1732 // Negative integer missing 1 byte argument
1733 { {(uint8_t[]){0x38}, 1}, QCBOR_ERR_HIT_END },
1734 // Binary string missing 1 byte argument
1735 { {(uint8_t[]){0x58}, 1}, QCBOR_ERR_HIT_END },
1736 // Text string missing 1 byte argument
1737 { {(uint8_t[]){0x78}, 1}, QCBOR_ERR_HIT_END },
1738 // Array missing 1 byte argument
1739 { {(uint8_t[]){0x98}, 1}, QCBOR_ERR_HIT_END },
1740 // Map missing 1 byte argument
1741 { {(uint8_t[]){0xb8}, 1}, QCBOR_ERR_HIT_END },
1742 // Tag missing 1 byte argument
1743 { {(uint8_t[]){0xd8}, 1}, QCBOR_ERR_HIT_END },
1744 // Simple missing 1 byte argument
1745 { {(uint8_t[]){0xf8}, 1}, QCBOR_ERR_HIT_END },
1746
1747
1748 // Breaks must not occur in definite length arrays and maps
1749 // Array of length 1 with sole member replaced by a break
1750 { {(uint8_t[]){0x81, 0xff}, 2}, QCBOR_ERR_BAD_BREAK },
1751 // Array of length 2 with 2nd member replaced by a break
1752 { {(uint8_t[]){0x82, 0x00, 0xff}, 3}, QCBOR_ERR_BAD_BREAK },
1753 // Map of length 1 with sole member label replaced by a break
1754 { {(uint8_t[]){0xa1, 0xff}, 2}, QCBOR_ERR_BAD_BREAK },
1755 // Map of length 1 with sole member label replaced by break
1756 // Alternate representation that some decoders handle difference
1757 { {(uint8_t[]){0xa1, 0xff, 0x00}, 3}, QCBOR_ERR_BAD_BREAK },
1758 // Array of length 1 with 2nd member value replaced by a break
1759 { {(uint8_t[]){0xa1, 0x00, 0xff}, 3}, QCBOR_ERR_BAD_BREAK },
1760 // Map of length 2 with 2nd member replaced by a break
1761 { {(uint8_t[]){0xa2, 0x00, 0x00, 0xff}, 4}, QCBOR_ERR_BAD_BREAK },
1762
1763
1764 // Breaks must not occur on their own out of an indefinite length data item
1765 // A bare break is not well formed
1766 { {(uint8_t[]){0xff}, 1}, QCBOR_ERR_BAD_BREAK },
1767 // A bare break after a zero length definite length array
1768 { {(uint8_t[]){0x80, 0xff}, 2}, QCBOR_ERR_BAD_BREAK },
1769 // A bare break after a zero length indefinite length map
1770 { {(uint8_t[]){0x9f, 0xff, 0xff}, 3}, QCBOR_ERR_BAD_BREAK },
1771
1772
1773 // Forbidden two byte encodings of simple types
1774 // Must use 0xe0 instead
1775 { {(uint8_t[]){0xf8, 0x00}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1776 // Should use 0xe1 instead
1777 { {(uint8_t[]){0xf8, 0x01}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1778 // Should use 0xe2 instead
1779 { {(uint8_t[]){0xf8, 0x02}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1780 // Should use 0xe3 instead
1781 { {(uint8_t[]){0xf8, 0x03}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1782 // Should use 0xe4 instead
1783 { {(uint8_t[]){0xf8, 0x04}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1784 // Should use 0xe5 instead
1785 { {(uint8_t[]){0xf8, 0x05}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1786 // Should use 0xe6 instead
1787 { {(uint8_t[]){0xf8, 0x06}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1788 // Should use 0xe7 instead
1789 { {(uint8_t[]){0xf8, 0x07}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1790 // Should use 0xe8 instead
1791 { {(uint8_t[]){0xf8, 0x08}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1792 // Should use 0xe9 instead
1793 { {(uint8_t[]){0xf8, 0x09}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1794 // Should use 0xea instead
1795 { {(uint8_t[]){0xf8, 0x0a}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1796 // Should use 0xeb instead
1797 { {(uint8_t[]){0xf8, 0x0b}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1798 // Should use 0xec instead
1799 { {(uint8_t[]){0xf8, 0x0c}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1800 // Should use 0xed instead
1801 { {(uint8_t[]){0xf8, 0x0d}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1802 // Should use 0xee instead
1803 { {(uint8_t[]){0xf8, 0x0e}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1804 // Should use 0xef instead
1805 { {(uint8_t[]){0xf8, 0x0f}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1806 // Should use 0xf0 instead
1807 { {(uint8_t[]){0xf8, 0x10}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1808 // Should use 0xf1 instead
1809 { {(uint8_t[]){0xf8, 0x11}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1810 // Should use 0xf2 instead
1811 { {(uint8_t[]){0xf8, 0x12}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1812 // Must use 0xf3 instead
1813 { {(uint8_t[]){0xf8, 0x13}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1814 // Must use 0xf4 instead
1815 { {(uint8_t[]){0xf8, 0x14}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1816 // Must use 0xf5 instead
1817 { {(uint8_t[]){0xf8, 0x15}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1818 // Must use 0xf6 instead
1819 { {(uint8_t[]){0xf8, 0x16}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1820 // Must use 0xf7 instead
1821 { {(uint8_t[]){0xf8, 0x17}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1822 // Must use 0xf8 instead
1823 { {(uint8_t[]){0xf8, 0x18}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1824
1825
1826 // Integers with additional info indefinite length
1827 // Positive integer with additional info indefinite length
1828 { {(uint8_t[]){0x1f}, 1}, QCBOR_ERR_BAD_INT },
1829 // Negative integer with additional info indefinite length
1830 { {(uint8_t[]){0x3f}, 1}, QCBOR_ERR_BAD_INT },
1831 // CBOR tag with "argument" an indefinite length
1832 { {(uint8_t[]){0xdf, 0x00}, 2}, QCBOR_ERR_BAD_INT },
1833 // CBOR tag with "argument" an indefinite length alternate vector
1834 { {(uint8_t[]){0xdf}, 1}, QCBOR_ERR_BAD_INT },
1835
1836
1837 // Missing bytes from a deterministic length string
1838 // A byte string is of length 1 without the 1 byte
1839 { {(uint8_t[]){0x41}, 1}, QCBOR_ERR_HIT_END },
1840 // A text string is of length 1 without the 1 byte
1841 { {(uint8_t[]){0x61}, 1}, QCBOR_ERR_HIT_END },
Laurence Lundblade42272e42020-01-31 07:50:53 -08001842 // Byte string should have 2^32-15 bytes, but has one
1843 { {(uint8_t[]){0x5a, 0xff, 0xff, 0xff, 0xf0, 0x00}, 6}, QCBOR_ERR_HIT_END },
1844 // Byte string should have 2^32-15 bytes, but has one
1845 { {(uint8_t[]){0x7a, 0xff, 0xff, 0xff, 0xf0, 0x00}, 6}, QCBOR_ERR_HIT_END },
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001846
1847
1848 // Use of unassigned additional information values
1849 // Major type positive integer with reserved value 28
1850 { {(uint8_t[]){0x1c}, 1}, QCBOR_ERR_UNSUPPORTED },
1851 // Major type positive integer with reserved value 29
1852 { {(uint8_t[]){0x1d}, 1}, QCBOR_ERR_UNSUPPORTED },
1853 // Major type positive integer with reserved value 30
1854 { {(uint8_t[]){0x1e}, 1}, QCBOR_ERR_UNSUPPORTED },
1855 // Major type negative integer with reserved value 28
1856 { {(uint8_t[]){0x3c}, 1}, QCBOR_ERR_UNSUPPORTED },
1857 // Major type negative integer with reserved value 29
1858 { {(uint8_t[]){0x3d}, 1}, QCBOR_ERR_UNSUPPORTED },
1859 // Major type negative integer with reserved value 30
1860 { {(uint8_t[]){0x3e}, 1}, QCBOR_ERR_UNSUPPORTED },
1861 // Major type byte string with reserved value 28 length
1862 { {(uint8_t[]){0x5c}, 1}, QCBOR_ERR_UNSUPPORTED },
1863 // Major type byte string with reserved value 29 length
1864 { {(uint8_t[]){0x5d}, 1}, QCBOR_ERR_UNSUPPORTED },
1865 // Major type byte string with reserved value 30 length
1866 { {(uint8_t[]){0x5e}, 1}, QCBOR_ERR_UNSUPPORTED },
1867 // Major type text string with reserved value 28 length
1868 { {(uint8_t[]){0x7c}, 1}, QCBOR_ERR_UNSUPPORTED },
1869 // Major type text string with reserved value 29 length
1870 { {(uint8_t[]){0x7d}, 1}, QCBOR_ERR_UNSUPPORTED },
1871 // Major type text string with reserved value 30 length
1872 { {(uint8_t[]){0x7e}, 1}, QCBOR_ERR_UNSUPPORTED },
1873 // Major type array with reserved value 28 length
1874 { {(uint8_t[]){0x9c}, 1}, QCBOR_ERR_UNSUPPORTED },
1875 // Major type array with reserved value 29 length
1876 { {(uint8_t[]){0x9d}, 1}, QCBOR_ERR_UNSUPPORTED },
1877 // Major type array with reserved value 30 length
1878 { {(uint8_t[]){0x9e}, 1}, QCBOR_ERR_UNSUPPORTED },
1879 // Major type map with reserved value 28 length
1880 { {(uint8_t[]){0xbc}, 1}, QCBOR_ERR_UNSUPPORTED },
1881 // Major type map with reserved value 29 length
1882 { {(uint8_t[]){0xbd}, 1}, QCBOR_ERR_UNSUPPORTED },
1883 // Major type map with reserved value 30 length
1884 { {(uint8_t[]){0xbe}, 1}, QCBOR_ERR_UNSUPPORTED },
1885 // Major type tag with reserved value 28 length
1886 { {(uint8_t[]){0xdc}, 1}, QCBOR_ERR_UNSUPPORTED },
1887 // Major type tag with reserved value 29 length
1888 { {(uint8_t[]){0xdd}, 1}, QCBOR_ERR_UNSUPPORTED },
1889 // Major type tag with reserved value 30 length
1890 { {(uint8_t[]){0xde}, 1}, QCBOR_ERR_UNSUPPORTED },
1891 // Major type simple with reserved value 28 length
1892 { {(uint8_t[]){0xfc}, 1}, QCBOR_ERR_UNSUPPORTED },
1893 // Major type simple with reserved value 29 length
1894 { {(uint8_t[]){0xfd}, 1}, QCBOR_ERR_UNSUPPORTED },
1895 // Major type simple with reserved value 30 length
1896 { {(uint8_t[]){0xfe}, 1}, QCBOR_ERR_UNSUPPORTED },
1897
1898
1899 // Maps must have an even number of data items (key & value)
1900 // Map with 1 item when it should have 2
1901 { {(uint8_t[]){0xa1, 0x00}, 2}, QCBOR_ERR_HIT_END },
1902 // Map with 3 item when it should have 4
1903 { {(uint8_t[]){0xa2, 0x00, 0x00, 0x00}, 2}, QCBOR_ERR_HIT_END },
1904 // Map with 1 item when it should have 2
1905 { {(uint8_t[]){0xbf, 0x00, 0xff}, 3}, QCBOR_ERR_BAD_BREAK },
1906 // Map with 3 item when it should have 4
1907 { {(uint8_t[]){0xbf, 0x00, 0x00, 0x00, 0xff}, 5}, QCBOR_ERR_BAD_BREAK },
1908
1909
1910 // In addition to not-well-formed, some invalid CBOR
Laurence Lundbladeee851742020-01-08 08:37:05 -08001911 // Text-based date, with an integer
1912 { {(uint8_t[]){0xc0, 0x00}, 2}, QCBOR_ERR_BAD_OPT_TAG },
1913 // Epoch date, with an byte string
1914 { {(uint8_t[]){0xc1, 0x41, 0x33}, 3}, QCBOR_ERR_BAD_OPT_TAG },
1915 // tagged as both epoch and string dates
1916 { {(uint8_t[]){0xc1, 0xc0, 0x00}, 3}, QCBOR_ERR_BAD_OPT_TAG },
1917 // big num tagged an int, not a byte string
1918 { {(uint8_t[]){0xc2, 0x00}, 2}, QCBOR_ERR_BAD_OPT_TAG },
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001919};
1920
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001921int32_t DecodeFailureTests()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001922{
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001923 int32_t nResult;
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001924
Laurence Lundblade59289e52019-12-30 13:44:37 -08001925 nResult = ProcessFailures(Failures, sizeof(Failures)/sizeof(struct FailInput));
1926 if(nResult) {
1927 return nResult;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001928 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001929
Laurence Lundblade3a6042e2019-06-28 19:58:04 -07001930 // Corrupt the UsefulInputBuf and see that
1931 // it reflected correctly for CBOR decoding
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001932 {
1933 QCBORDecodeContext DCtx;
Laurence Lundblade3a6042e2019-06-28 19:58:04 -07001934 QCBORItem Item;
1935 QCBORError nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001936
Laurence Lundblade3a6042e2019-06-28 19:58:04 -07001937 QCBORDecode_Init(&DCtx,
1938 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spSimpleValues),
1939 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001940
1941 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001942 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001943 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
Laurence Lundblade3a6042e2019-06-28 19:58:04 -07001944 Item.val.uCount != 10) {
1945 // This wasn't supposed to happen
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001946 return -1;
Laurence Lundblade3a6042e2019-06-28 19:58:04 -07001947 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001948
Laurence Lundblade3a6042e2019-06-28 19:58:04 -07001949 DCtx.InBuf.magic = 0; // Reach in and corrupt the UsefulInputBuf
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001950
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001951 nCBORError = QCBORDecode_GetNext(&DCtx, &Item);
Laurence Lundblade3a6042e2019-06-28 19:58:04 -07001952 if(nCBORError != QCBOR_ERR_HIT_END) {
1953 // Did not get back the error expected
1954 return -2;
1955 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001956 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001957
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001958/*
1959 This test is disabled until QCBOREncode_EncodeHead() is brought in so
1960 the size encoded can be tied to SIZE_MAX and work for all size CPUs.
1961
1962 This relies on the largest string allowed being SIZE_MAX -4 rather than
1963 SIZE_MAX. That way the test can be performed.
1964 {
1965 QCBORDecodeContext DCtx;
1966 QCBORItem Item;
1967
1968 static uint8_t foo[] = {0x5b, 0xff, 0xff, 0xff, 0xff,
1969 0xff, 0xff, 0xff, 0xff};
1970
1971 QCBORDecode_Init(&DCtx,
1972 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(foo),
1973 QCBOR_DECODE_MODE_NORMAL);
1974
1975 if(QCBOR_ERR_STRING_TOO_LONG != QCBORDecode_GetNext(&DCtx, &Item)) {
1976 return -4;
1977 }
1978 }
1979*/
1980
Laurence Lundblade3a6042e2019-06-28 19:58:04 -07001981 return 0;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001982}
1983
1984
Laurence Lundbladea2e29072018-12-30 09:20:06 -08001985/* Try all 256 values of the byte at nLen including recursing for
1986 each of the values to try values at nLen+1 ... up to nLenMax
1987 */
Laurence Lundblade06350ea2020-01-27 19:32:40 -08001988static void ComprehensiveInputRecurser(uint8_t *pBuf, size_t nLen, size_t nLenMax)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001989{
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001990 if(nLen >= nLenMax) {
1991 return;
1992 }
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -08001993
Laurence Lundbladea2e29072018-12-30 09:20:06 -08001994 for(int inputByte = 0; inputByte < 256; inputByte++) {
1995 // Set up the input
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001996 pBuf[nLen] = (uint8_t)inputByte;
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -08001997 const UsefulBufC Input = {pBuf, nLen+1};
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -08001998
Laurence Lundbladea2e29072018-12-30 09:20:06 -08001999 // Get ready to parse
2000 QCBORDecodeContext DCtx;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002001 QCBORDecode_Init(&DCtx, Input, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002002
Laurence Lundbladea2e29072018-12-30 09:20:06 -08002003 // Parse by getting the next item until an error occurs
2004 // Just about every possible decoder error can occur here
2005 // The goal of this test is not to check for the correct
2006 // error since that is not really possible. It is to
2007 // see that there is no crash on hostile input.
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002008 while(1) {
Laurence Lundbladea2e29072018-12-30 09:20:06 -08002009 QCBORItem Item;
2010 QCBORError nCBORError = QCBORDecode_GetNext(&DCtx, &Item);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002011 if(nCBORError != QCBOR_SUCCESS) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002012 break;
2013 }
2014 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002015
Laurence Lundbladea2e29072018-12-30 09:20:06 -08002016 ComprehensiveInputRecurser(pBuf, nLen+1, nLenMax);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002017 }
2018}
2019
2020
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002021int32_t ComprehensiveInputTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002022{
Laurence Lundbladea2e29072018-12-30 09:20:06 -08002023 // Size 2 tests 64K inputs and runs quickly
2024 uint8_t pBuf[2];
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002025
Laurence Lundbladea2e29072018-12-30 09:20:06 -08002026 ComprehensiveInputRecurser(pBuf, 0, sizeof(pBuf));
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002027
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002028 return 0;
2029}
2030
Laurence Lundbladea2e29072018-12-30 09:20:06 -08002031
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002032int32_t BigComprehensiveInputTest()
Laurence Lundbladea2e29072018-12-30 09:20:06 -08002033{
2034 // size 3 tests 16 million inputs and runs OK
2035 // in seconds on fast machines. Size 4 takes
2036 // 10+ minutes and 5 half a day on fast
2037 // machines. This test is kept separate from
2038 // the others so as to no slow down the use
2039 // of them as a very frequent regression.
2040 uint8_t pBuf[3]; //
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -08002041
Laurence Lundbladea2e29072018-12-30 09:20:06 -08002042 ComprehensiveInputRecurser(pBuf, 0, sizeof(pBuf));
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -08002043
Laurence Lundbladea2e29072018-12-30 09:20:06 -08002044 return 0;
2045}
2046
2047
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002048static uint8_t spDateTestInput[] = {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002049 0xc0, // tag for string date
2050 0x6a, '1','9','8','5','-','0','4','-','1','2', // Date string
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002051
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002052 0xc1, // tag for epoch date
2053 0x1a, 0x53, 0x72, 0x4E, 0x00, // Epoch date 1400000000; Tue, 13 May 2014 16:53:20 GMT
2054
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002055 // CBOR_TAG_B64
2056 0xc1, 0xcf, 0xd8, 0x22, // 0xee, // Epoch date with extra tags TODO: fix this test
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002057 0x1a, 0x53, 0x72, 0x4E, 0x01,
2058
2059 0xc1, // tag for epoch date
2060 0x1b, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, // Too large integer
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002061
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002062 0xc1, // tag for epoch date
2063 0xfa, 0x3f, 0x8c, 0xcc, 0xcd, // double with value 1.1
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002064
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002065 0xc1, // tag for epoch date
Laurence Lundbladea1ad8782019-11-08 00:12:11 -08002066 0xfa, 0x7f, 0x7f, 0xff, 0xff, // 3.4028234663852886e+38 too large
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002067
Laurence Lundbladea1ad8782019-11-08 00:12:11 -08002068 0xc1, // tag for epoch date
2069 0xfb, 0x43, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 9223372036854775808.000000 just barely too large
2070 //0xfa, 0x7f, 0x7f, 0xff, 0xff // 3.4028234663852886e+38 too large
2071
2072 0xc1, // tag for epoch date
2073 0xfb, 0x43, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe // 9223372036854773760 largest supported
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002074};
2075
2076
2077// have to check float expected only to within an epsilon
2078int CHECK_EXPECTED_DOUBLE(double val, double expected) {
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002079
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002080 double diff = val - expected;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002081
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002082 diff = fabs(diff);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002083
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002084 return diff > 0.0000001;
2085}
2086
2087
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002088int32_t DateParseTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002089{
2090 QCBORDecodeContext DCtx;
2091 QCBORItem Item;
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07002092 QCBORError nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002093
Laurence Lundbladeee851742020-01-08 08:37:05 -08002094 QCBORDecode_Init(&DCtx,
2095 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spDateTestInput),
2096 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002097
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002098 const uint64_t uTags[] = {15};
2099 QCBORTagListIn TagList = {1, uTags};
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002100
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002101 QCBORDecode_SetCallerConfiguredTagList(&DCtx, &TagList);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002102
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002103 // String date
2104 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2105 return -1;
2106 if(Item.uDataType != QCBOR_TYPE_DATE_STRING ||
Laurence Lundblade9e3651c2018-10-10 11:49:55 +08002107 UsefulBuf_Compare(Item.val.dateString, UsefulBuf_FromSZ("1985-04-12"))){
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002108 return -2;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002109 }
2110
2111 // Epoch date
2112 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002113 return -3;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002114 if(Item.uDataType != QCBOR_TYPE_DATE_EPOCH ||
2115 Item.val.epochDate.nSeconds != 1400000000 ||
2116 Item.val.epochDate.fSecondsFraction != 0 ) {
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002117 return -4;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002118 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002119
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002120 // Epoch date with extra CBOR_TAG_B64 tag that doesn't really mean anything
2121 // but want to be sure extra tag doesn't cause a problem
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002122 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002123 return -5;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002124 if(Item.uDataType != QCBOR_TYPE_DATE_EPOCH ||
2125 Item.val.epochDate.nSeconds != 1400000001 ||
2126 Item.val.epochDate.fSecondsFraction != 0 ||
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002127 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_B64)) {
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002128 return -6;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002129 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002130
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002131 // Epoch date that is too large for our representation
2132 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_DATE_OVERFLOW) {
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002133 return -7;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002134 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002135
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002136 // Epoch date in float format with fractional seconds
2137 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002138 return -8;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002139 if(Item.uDataType != QCBOR_TYPE_DATE_EPOCH ||
2140 Item.val.epochDate.nSeconds != 1 ||
2141 CHECK_EXPECTED_DOUBLE(Item.val.epochDate.fSecondsFraction, 0.1 )) {
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002142 return -9;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002143 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002144
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002145 // Epoch date float that is too large for our representation
2146 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_DATE_OVERFLOW) {
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002147 return -10;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002148 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002149
Laurence Lundbladea1ad8782019-11-08 00:12:11 -08002150 // Epoch date double that is just slightly too large
2151 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_DATE_OVERFLOW) {
2152 return -11;
2153 }
2154
2155 // Largest double epoch date supported
2156 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_SUCCESS ||
2157 Item.uDataType != QCBOR_TYPE_DATE_EPOCH ||
2158 Item.val.epochDate.nSeconds != 9223372036854773760 ||
2159 Item.val.epochDate.nSeconds == 0) {
2160 return -12;
2161 }
Laurence Lundbladeee851742020-01-08 08:37:05 -08002162 // TODO: could use a few more tests with float, double, and half precsion
2163 // and negative (but coverage is still pretty good)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002164
2165 return 0;
2166}
2167
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002168// Really simple basic input for tagging test
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002169static uint8_t spOptTestInput[] = {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002170 0xd9, 0xd9, 0xf7, // CBOR magic number
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002171 0x81, // Array of one
2172 0xd8, 0x04, // non-preferred serialization of tag 4
2173 0x82, 0x01, 0x03}; // fraction 1/3
2174
Laurence Lundblade59289e52019-12-30 13:44:37 -08002175/*
2176 DB 9192939495969798 # tag(10489608748473423768)
2177 80 # array(0)
2178 */
Laurence Lundbladeee851742020-01-08 08:37:05 -08002179static uint8_t spEncodedLargeTag[] = {0xdb, 0x91, 0x92, 0x93, 0x94, 0x95,
2180 0x96, 0x97, 0x98, 0x80};
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002181
Laurence Lundblade59289e52019-12-30 13:44:37 -08002182/*
2183DB 9192939495969798 # tag(10489608748473423768)
2184 D8 88 # tag(136)
2185 C6 # tag(6)
2186 C7 # tag(7)
2187 80 # array(0)
2188*/
Laurence Lundbladeee851742020-01-08 08:37:05 -08002189static uint8_t spLotsOfTags[] = {0xdb, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
2190 0x97, 0x98, 0xd8, 0x88, 0xc6, 0xc7, 0x80};
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002191
2192/*
2193 The cbor.me parse of this.
2194 55799(55799(55799({6(7(-23)): 5859837686836516696(7({7(-20): 11({17(-18): 17(17(17("Organization"))),
Laurence Lundblade59289e52019-12-30 13:44:37 -08002195 9(-17): 773("SSG"), -15: 16(17(6(7(8(9(10(11(12(13(14(15("Confusion")))))))))))), 17(-16): 17("San Diego"),
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002196 17(-14): 17("US")}), 23(-19): 19({-11: 9({-9: -7}),
2197 90599561(90599561(90599561(-10))): 12(h'0102030405060708090A')})})),
2198 16(-22): 23({11(8(7(-5))): 8(-3)})})))
2199 */
2200static uint8_t spCSRWithTags[] = {
2201 0xd9, 0xd9, 0xf7, 0xd9, 0xd9, 0xf7, 0xd9, 0xd9, 0xf7, 0xa2,
2202 0xc6, 0xc7, 0x36,
2203 0xdb, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0xc7, 0xa2,
2204 0xda, 0x00, 0x00, 0x00, 0x07, 0x33,
2205 0xcb, 0xa5,
2206 0xd1, 0x31,
2207 0xd1, 0xd1, 0xd1, 0x6c,
2208 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
2209 0xc9, 0x30,
2210 0xd9, 0x03, 0x05, 0x63,
2211 0x53, 0x53, 0x47,
2212 0x2e,
Laurence Lundblade59289e52019-12-30 13:44:37 -08002213 0xd0, 0xd1, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0x69,
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002214 0x43, 0x6f, 0x6e, 0x66, 0x75, 0x73, 0x69, 0x6f, 0x6e,
2215 0xd1, 0x2f,
2216 0xd1, 0x69,
2217 0x53, 0x61, 0x6e, 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f,
2218 0xd1, 0x2d,
2219 0xd1, 0x62,
2220 0x55, 0x53,
2221 0xd7, 0x32,
2222 0xd3, 0xa2,
2223 0x2a,
2224 0xc9, 0xa1,
2225 0x28,
2226 0x26,
2227 0xda, 0x05, 0x66, 0x70, 0x89, 0xda, 0x05, 0x66, 0x70, 0x89, 0xda, 0x05, 0x66, 0x70, 0x89, 0x29,
2228 0xcc, 0x4a,
2229 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,0x07, 0x08, 0x09, 0x0a,
2230 0xd0, 0x35,
2231 0xd7, 0xa1,
2232 0xcb, 0xc8, 0xc7, 0x24,
2233 0xc8, 0x22};
2234
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002235static int32_t CheckCSRMaps(QCBORDecodeContext *pDC);
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002236
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002237
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002238int32_t OptTagParseTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002239{
2240 QCBORDecodeContext DCtx;
2241 QCBORItem Item;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002242
Laurence Lundbladeee851742020-01-08 08:37:05 -08002243 QCBORDecode_Init(&DCtx,
2244 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spOptTestInput),
2245 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002246
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002247 //-------------------------
2248 // This text matches the magic number tag and the fraction tag
2249 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2250 return -2;
2251 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002252 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002253 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_CBOR_MAGIC)) {
2254 return -3;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002255 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002256
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002257 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2258 return -4;
2259 }
Laurence Lundblade59289e52019-12-30 13:44:37 -08002260
2261#ifdef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002262 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
Laurence Lundblade59289e52019-12-30 13:44:37 -08002263 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_DECIMAL_FRACTION) ||
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002264 Item.val.uCount != 2) {
2265 return -5;
2266 }
Laurence Lundblade59289e52019-12-30 13:44:37 -08002267#else
2268 if(Item.uDataType != QCBOR_TYPE_DECIMAL_FRACTION) {
2269 return -6;
2270 }
2271#endif
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002272
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002273 // --------------------------------
2274 // This test decodes the very large tag, but it is not in
2275 // any list so it is ignored.
Laurence Lundbladeee851742020-01-08 08:37:05 -08002276 QCBORDecode_Init(&DCtx,
2277 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spEncodedLargeTag),
2278 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002279 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2280 return -6;
2281 }
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002282 /*
2283 if(Item.uTagBits) { // TODO: make sure it is OK to remove this
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002284 return -7;
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002285 }*/
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002286
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002287 // ----------------------------------
Laurence Lundbladeee851742020-01-08 08:37:05 -08002288 // This test sets up a caller-config list that includes the very large
2289 // tage and then matches it.
2290 QCBORDecode_Init(&DCtx,
2291 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spEncodedLargeTag),
2292 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002293 const uint64_t puList[] = {0x9192939495969798, 257};
2294 const QCBORTagListIn TL = {2, puList};
2295 QCBORDecode_SetCallerConfiguredTagList(&DCtx, &TL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002296
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002297 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2298 return -8;
2299 }
2300 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
2301 !QCBORDecode_IsTagged(&DCtx, &Item, 0x9192939495969798) ||
2302 QCBORDecode_IsTagged(&DCtx, &Item, 257) ||
2303 QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_BIGFLOAT) ||
2304 Item.val.uCount != 0) {
2305 return -9;
2306 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002307
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002308 //------------------------
Laurence Lundbladeee851742020-01-08 08:37:05 -08002309 // Sets up a caller-configured list and look up something not in it
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002310 const uint64_t puLongList[17] = {1,2,1};
2311 const QCBORTagListIn TLLong = {17, puLongList};
Laurence Lundbladeee851742020-01-08 08:37:05 -08002312 QCBORDecode_Init(&DCtx,
2313 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spEncodedLargeTag),
2314 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002315 QCBORDecode_SetCallerConfiguredTagList(&DCtx, &TLLong);
2316 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2317 return -11;
2318 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002319
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002320 // -----------------------
2321 // This tests retrievel of the full tag list
Laurence Lundbladeee851742020-01-08 08:37:05 -08002322 QCBORDecode_Init(&DCtx,
2323 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spLotsOfTags),
2324 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002325 uint64_t puTags[16];
2326 QCBORTagListOut Out = {0, 4, puTags};
2327 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2328 return -12;
2329 }
2330 if(puTags[0] != 0x9192939495969798 ||
2331 puTags[1] != 0x88 ||
Laurence Lundblade59289e52019-12-30 13:44:37 -08002332 puTags[2] != 0x06 ||
2333 puTags[3] != 0x07) {
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002334 return -13;
2335 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002336
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002337 // ----------------------
2338 // This text if too small of an out list
Laurence Lundbladeee851742020-01-08 08:37:05 -08002339 QCBORDecode_Init(&DCtx,
2340 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spLotsOfTags),
2341 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002342 QCBORTagListOut OutSmall = {0, 3, puTags};
2343 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &OutSmall) != QCBOR_ERR_TOO_MANY_TAGS) {
2344 return -14;
2345 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002346
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002347#if 0
2348 // TODO: this test needs to be re evaluated
2349
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002350 // ---------------
2351 // Parse a version of the "CSR" that has had a ton of tags randomly inserted
Laurence Lundbladeee851742020-01-08 08:37:05 -08002352 QCBORDecode_Init(&DCtx,
2353 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRWithTags),
2354 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002355 int n = CheckCSRMaps(&DCtx);
2356 if(n) {
2357 return n-2000;
2358 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002359
Laurence Lundblade59289e52019-12-30 13:44:37 -08002360 Out = (QCBORTagListOut){0, 16, puTags};
Laurence Lundbladeee851742020-01-08 08:37:05 -08002361 QCBORDecode_Init(&DCtx,
2362 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRWithTags),
2363 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002364
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002365 const uint64_t puTagList[] = {773, 1, 90599561};
2366 const QCBORTagListIn TagList = {3, puTagList};
2367 QCBORDecode_SetCallerConfiguredTagList(&DCtx, &TagList);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002368
2369
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002370 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2371 return -100;
2372 }
2373 if(Item.uDataType != QCBOR_TYPE_MAP ||
2374 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_CBOR_MAGIC) ||
2375 QCBORDecode_IsTagged(&DCtx, &Item, 90599561) ||
2376 QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_DATE_EPOCH) ||
2377 Item.val.uCount != 2 ||
2378 puTags[0] != CBOR_TAG_CBOR_MAGIC ||
2379 puTags[1] != CBOR_TAG_CBOR_MAGIC ||
2380 puTags[2] != CBOR_TAG_CBOR_MAGIC ||
2381 Out.uNumUsed != 3) {
2382 return -101;
2383 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002384
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002385 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2386 return -102;
2387 }
2388 if(Item.uDataType != QCBOR_TYPE_MAP ||
2389 QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_CBOR_MAGIC) ||
2390 QCBORDecode_IsTagged(&DCtx, &Item, 6) ||
2391 QCBORDecode_IsTagged(&DCtx, &Item, 7) || // item is tagged 7, but 7 is not configured to be recognized
2392 Item.val.uCount != 2 ||
2393 puTags[0] != 5859837686836516696 ||
2394 puTags[1] != 7 ||
2395 Out.uNumUsed != 2) {
2396 return -103;
2397 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002398
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002399 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2400 return -104;
2401 }
2402 if(Item.uDataType != QCBOR_TYPE_MAP ||
2403 Item.uTagBits ||
2404 Item.val.uCount != 5 ||
2405 puTags[0] != 0x0b ||
2406 Out.uNumUsed != 1) {
2407 return -105;
2408 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002409
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002410 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2411 return -106;
2412 }
2413 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
2414 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_COSE_MAC0) ||
2415 Item.val.string.len != 12 ||
2416 puTags[0] != CBOR_TAG_COSE_MAC0 ||
2417 puTags[1] != CBOR_TAG_COSE_MAC0 ||
2418 puTags[2] != CBOR_TAG_COSE_MAC0 ||
2419 Out.uNumUsed != 3) {
2420 return -105;
2421 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002422
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002423 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2424 return -107;
2425 }
2426 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
2427 !QCBORDecode_IsTagged(&DCtx, &Item, 773) ||
2428 Item.val.string.len != 3 ||
2429 puTags[0] != 773 ||
2430 Out.uNumUsed != 1) {
2431 return -108;
2432 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002433
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002434 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2435 return -109;
2436 }
2437 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundblade59289e52019-12-30 13:44:37 -08002438 !QCBORDecode_IsTagged(&DCtx, &Item, 16) ||
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002439 Item.val.string.len != 9 ||
Laurence Lundblade59289e52019-12-30 13:44:37 -08002440 puTags[0] != 16 ||
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002441 puTags[11] != 0x0f ||
2442 Out.uNumUsed != 12) {
2443 return -110;
2444 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002445
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002446 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2447 return -111;
2448 }
2449 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
2450 !QCBORDecode_IsTagged(&DCtx, &Item, 17) ||
2451 Item.val.string.len != 9 ||
2452 puTags[0] != 17 ||
2453 Out.uNumUsed != 1) {
2454 return -112;
2455 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002456
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002457 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2458 return -111;
2459 }
2460 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
2461 !QCBORDecode_IsTagged(&DCtx, &Item, 17) ||
2462 Item.val.string.len != 2 ||
2463 puTags[0] != 17 ||
2464 Out.uNumUsed != 1) {
2465 return -112;
2466 }
2467
2468 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2469 return -113;
2470 }
2471 if(Item.uDataType != QCBOR_TYPE_MAP ||
2472 QCBORDecode_IsTagged(&DCtx, &Item, 19) ||
2473 Item.val.uCount != 2 ||
2474 puTags[0] != 19 ||
2475 Out.uNumUsed != 1) {
2476 return -114;
2477 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002478
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002479 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2480 return -115;
2481 }
2482 if(Item.uDataType != QCBOR_TYPE_MAP ||
2483 QCBORDecode_IsTagged(&DCtx, &Item, 9) ||
2484 Item.uTagBits ||
2485 Item.val.uCount != 1 ||
2486 puTags[0] != 9 ||
2487 Out.uNumUsed != 1) {
2488 return -116;
2489 }
2490
2491 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2492 return -116;
2493 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002494 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002495 Item.val.int64 != -7 ||
2496 Item.uTagBits ||
2497 Out.uNumUsed != 0) {
2498 return -117;
2499 }
2500
2501 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2502 return -118;
2503 }
2504 if(Item.uDataType != QCBOR_TYPE_BYTE_STRING ||
2505 Item.val.string.len != 10 ||
2506 Item.uTagBits ||
2507 puTags[0] != 12 ||
2508 Out.uNumUsed != 1) {
2509 return -119;
2510 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002511
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002512 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2513 return -120;
2514 }
2515 if(Item.uDataType != QCBOR_TYPE_MAP ||
2516 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_ENC_AS_B16) ||
2517 Item.val.uCount != 1 ||
2518 puTags[0] != 0x17 ||
2519 Out.uNumUsed != 1) {
2520 return -121;
2521 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002522
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002523 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2524 return -122;
2525 }
2526 if(Item.uDataType != QCBOR_TYPE_INT64 ||
2527 QCBORDecode_IsTagged(&DCtx, &Item, 8) ||
2528 Item.val.int64 != -3 ||
2529 puTags[0] != 8 ||
2530 Out.uNumUsed != 1) {
2531 return -123;
2532 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002533
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002534 if(QCBORDecode_Finish(&DCtx)) {
2535 return -124;
2536 }
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002537#else
2538 (void)spCSRWithTags;
2539#endif
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002540 return 0;
2541}
2542
2543
2544
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002545
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002546static uint8_t spBigNumInput[] = {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002547 0x83,
2548 0xC2, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2549 0xC3, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2550 0xA4,
2551 0x63, 0x42, 0x4E, 0x2B,
2552 0xC2, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2553 0x18, 0x40,
2554 0xC2, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2555 0x63, 0x42, 0x4E, 0x2D,
2556 0xC3, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2557 0x38, 0x3F,
2558 0xC3, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
2559
2560
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002561static uint8_t spBigNum[] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002562
2563
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002564int32_t BignumParseTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002565{
2566 QCBORDecodeContext DCtx;
2567 QCBORItem Item;
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07002568 QCBORError nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002569
Laurence Lundbladeee851742020-01-08 08:37:05 -08002570 QCBORDecode_Init(&DCtx,
2571 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNumInput),
2572 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002573
2574
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002575 //
2576 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2577 return -1;
2578 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002579 return -2;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002580 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002581
2582 //
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002583 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002584 return -3;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002585 if(Item.uDataType != QCBOR_TYPE_POSBIGNUM ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002586 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002587 return -4;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002588 }
2589
2590 //
2591 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002592 return -5;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002593 if(Item.uDataType != QCBOR_TYPE_NEGBIGNUM ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002594 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002595 return -6;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002596 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002597
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002598 //
2599 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002600 return -7;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002601 if(Item.uDataType != QCBOR_TYPE_MAP) {
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002602 return -8;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002603 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002604
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002605 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002606 return -9;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002607 if(Item.uDataType != QCBOR_TYPE_POSBIGNUM ||
2608 Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002609 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002610 return -10;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002611 }
2612
2613 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002614 return -11;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002615 if(Item.uDataType != QCBOR_TYPE_POSBIGNUM ||
2616 Item.uLabelType != QCBOR_TYPE_INT64 ||
2617 Item.label.int64 != 64 ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002618 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002619 return -12;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002620 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002621
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002622 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002623 return -13;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002624 if(Item.uDataType != QCBOR_TYPE_NEGBIGNUM ||
2625 Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002626 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002627 return -14;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002628 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002629
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002630 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002631 return -15;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002632 if(Item.uDataType != QCBOR_TYPE_NEGBIGNUM ||
2633 Item.uLabelType != QCBOR_TYPE_INT64 ||
2634 Item.label.int64 != -64 ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002635 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002636 return -16;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002637 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002638
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002639 return 0;
2640}
2641
2642
2643
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002644static int32_t CheckItemWithIntLabel(QCBORDecodeContext *pCtx,
Laurence Lundbladeee851742020-01-08 08:37:05 -08002645 uint8_t uDataType,
2646 uint8_t uNestingLevel,
2647 uint8_t uNextNest,
2648 int64_t nLabel,
2649 QCBORItem *pItem)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002650{
2651 QCBORItem Item;
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07002652 QCBORError nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002653
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002654 if((nCBORError = QCBORDecode_GetNext(pCtx, &Item))) return -1;
2655 if(Item.uDataType != uDataType) return -1;
2656 if(uNestingLevel > 0) {
Laurence Lundbladeee851742020-01-08 08:37:05 -08002657 if(Item.uLabelType != QCBOR_TYPE_INT64 &&
2658 Item.uLabelType != QCBOR_TYPE_UINT64) {
2659 return -1;
2660 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002661 if(Item.uLabelType == QCBOR_TYPE_INT64) {
2662 if(Item.label.int64 != nLabel) return -1;
2663 } else {
Laurence Lundblade570fab52018-10-13 18:28:27 +08002664 if(Item.label.uint64 != (uint64_t)nLabel) return -1;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002665 }
2666 }
2667 if(Item.uNestingLevel != uNestingLevel) return -1;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302668 if(Item.uNextNestLevel != uNextNest) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002669
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002670 if(pItem) {
2671 *pItem = Item;
2672 }
2673 return 0;
2674}
2675
2676
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002677// Same code checks definite and indefinite length versions of the map
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002678static int32_t CheckCSRMaps(QCBORDecodeContext *pDC)
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002679{
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302680 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 0, 1, 0, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002681
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302682 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 1, 2, -23, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002683
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302684 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 2, 3, -20, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002685
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302686 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_TEXT_STRING, 3, 3, -18, NULL)) return -1;
2687 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_TEXT_STRING, 3, 3, -17, NULL)) return -1;
2688 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_TEXT_STRING, 3, 3, -15, NULL)) return -1;
2689 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_TEXT_STRING, 3, 3, -16, NULL)) return -1;
2690 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_TEXT_STRING, 3, 2, -14, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002691
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302692 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 2, 3, -19, NULL)) return -1;
2693 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 3, 4, -11, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002694
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302695 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_INT64, 4, 3, -9, NULL)) return -1;
2696 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_BYTE_STRING, 3, 1, -10, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002697
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302698 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 1, 2, -22, NULL)) return -1;
2699 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_INT64, 2, 0, -5, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002700
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002701 if(QCBORDecode_Finish(pDC)) return -2;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002702
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002703 return 0;
2704}
2705
2706
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002707/*
2708// cbor.me decoded output
2709{
2710 -23: {
2711 -20: {
2712 -18: "Organization",
2713 -17: "SSG",
2714 -15: "Confusion",
2715 -16: "San Diego",
2716 -14: "US"
2717 },
2718 -19: {
2719 -11: {
2720 -9: -7
2721 },
2722 -10: '\u0001\u0002\u0003\u0004\u0005\u0006\a\b\t\n'
2723 }
2724 },
2725 -22: {
2726 -5: -3
2727 }
2728}
2729 */
2730
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002731
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002732static uint8_t spCSRInput[] = {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002733 0xa2, 0x36, 0xa2, 0x33, 0xa5, 0x31, 0x6c, 0x4f,
2734 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74,
2735 0x69, 0x6f, 0x6e, 0x30, 0x63, 0x53, 0x53, 0x47,
2736 0x2e, 0x69, 0x43, 0x6f, 0x6e, 0x66, 0x75, 0x73,
2737 0x69, 0x6f, 0x6e, 0x2f, 0x69, 0x53, 0x61, 0x6e,
2738 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x2d, 0x62,
2739 0x55, 0x53, 0x32, 0xa2, 0x2a, 0xa1, 0x28, 0x26,
2740 0x29, 0x4a, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
2741 0x07, 0x08, 0x09, 0x0a, 0x35, 0xa1, 0x24, 0x22};
2742
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002743int32_t NestedMapTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002744{
2745 QCBORDecodeContext DCtx;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002746
Laurence Lundbladeee851742020-01-08 08:37:05 -08002747 QCBORDecode_Init(&DCtx,
2748 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRInput),
2749 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002750
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002751 return CheckCSRMaps(&DCtx);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002752}
2753
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08002754
2755
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002756int32_t StringDecoderModeFailTest()
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08002757{
2758 QCBORDecodeContext DCtx;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002759
Laurence Lundbladeee851742020-01-08 08:37:05 -08002760 QCBORDecode_Init(&DCtx,
2761 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRInput),
2762 QCBOR_DECODE_MODE_MAP_STRINGS_ONLY);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002763
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08002764 QCBORItem Item;
2765 QCBORError nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002766
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08002767 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2768 return -1;
2769 }
2770 if(Item.uDataType != QCBOR_TYPE_MAP) {
2771 return -2;
2772 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002773
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08002774 nCBORError = QCBORDecode_GetNext(&DCtx, &Item);
2775 if(nCBORError != QCBOR_ERR_MAP_LABEL_TYPE) {
2776 return -3;
2777 }
2778
2779 return 0;
2780}
2781
2782
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002783// Same map as above, but using indefinite lengths
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002784static uint8_t spCSRInputIndefLen[] = {
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002785 0xbf, 0x36, 0xbf, 0x33, 0xbf, 0x31, 0x6c, 0x4f,
2786 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74,
2787 0x69, 0x6f, 0x6e, 0x30, 0x63, 0x53, 0x53, 0x47,
2788 0x2e, 0x69, 0x43, 0x6f, 0x6e, 0x66, 0x75, 0x73,
2789 0x69, 0x6f, 0x6e, 0x2f, 0x69, 0x53, 0x61, 0x6e,
2790 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x2d, 0x62,
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002791 0x55, 0x53, 0xff, 0x32, 0xbf, 0x2a, 0xbf, 0x28,
2792 0x26, 0xff, 0x29, 0x4a, 0x01, 0x02, 0x03, 0x04,
2793 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0xff, 0xff,
2794 0x35, 0xbf, 0x24, 0x22, 0xff, 0xff};
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002795
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002796int32_t NestedMapTestIndefLen()
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002797{
2798 QCBORDecodeContext DCtx;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002799
Laurence Lundbladeee851742020-01-08 08:37:05 -08002800 QCBORDecode_Init(&DCtx,
2801 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRInputIndefLen),
2802 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002803
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002804 return CheckCSRMaps(&DCtx);
2805}
2806
2807
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002808
Laurence Lundblade17ede402018-10-13 11:43:07 +08002809static UsefulBufC make_nested_indefinite_arrays(int n, UsefulBuf Storage)
2810{
2811 UsefulOutBuf UOB;
2812 UsefulOutBuf_Init(&UOB, Storage);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002813
Laurence Lundblade17ede402018-10-13 11:43:07 +08002814 int i;
2815 for(i = 0; i < n; i++) {
2816 UsefulOutBuf_AppendByte(&UOB, 0x9f);
2817 }
2818
2819 for(i = 0; i < n; i++) {
2820 UsefulOutBuf_AppendByte(&UOB, 0xff);
2821 }
2822 return UsefulOutBuf_OutUBuf(&UOB);
2823}
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002824
2825
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002826static int32_t parse_indeflen_nested(UsefulBufC Nested, int nNestLevel)
Laurence Lundblade17ede402018-10-13 11:43:07 +08002827{
2828 QCBORDecodeContext DC;
2829 QCBORDecode_Init(&DC, Nested, 0);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002830
Laurence Lundblade17ede402018-10-13 11:43:07 +08002831 int j;
2832 for(j = 0; j < nNestLevel; j++) {
2833 QCBORItem Item;
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07002834 QCBORError nReturn = QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade17ede402018-10-13 11:43:07 +08002835 if(j >= QCBOR_MAX_ARRAY_NESTING) {
2836 // Should be in error
2837 if(nReturn != QCBOR_ERR_ARRAY_NESTING_TOO_DEEP) {
2838 return -4;
2839 } else {
2840 return 0; // Decoding doesn't recover after an error
2841 }
2842 } else {
2843 // Should be no error
2844 if(nReturn) {
2845 return -9; // Should not have got an error
2846 }
2847 }
2848 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
2849 return -7;
2850 }
2851 }
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07002852 QCBORError nReturn = QCBORDecode_Finish(&DC);
Laurence Lundblade17ede402018-10-13 11:43:07 +08002853 if(nReturn) {
2854 return -3;
2855 }
2856 return 0;
2857}
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002858
2859
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002860int32_t IndefiniteLengthNestTest()
Laurence Lundblade17ede402018-10-13 11:43:07 +08002861{
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05302862 UsefulBuf_MAKE_STACK_UB(Storage, 50);
Laurence Lundblade17ede402018-10-13 11:43:07 +08002863 int i;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002864 for(i=1; i < QCBOR_MAX_ARRAY_NESTING+4; i++) {
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -08002865 const UsefulBufC Nested = make_nested_indefinite_arrays(i, Storage);
Laurence Lundblade17ede402018-10-13 11:43:07 +08002866 int nReturn = parse_indeflen_nested(Nested, i);
2867 if(nReturn) {
2868 return nReturn;
2869 }
2870 }
2871 return 0;
2872}
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002873
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002874
Laurence Lundbladeee851742020-01-08 08:37:05 -08002875// [1, [2, 3]]
2876static const uint8_t spIndefiniteArray[] = {0x9f, 0x01, 0x82, 0x02, 0x03, 0xff};
2877// No closing break
2878static const uint8_t spIndefiniteArrayBad1[] = {0x9f};
2879// Not enough closing breaks
2880static const uint8_t spIndefiniteArrayBad2[] = {0x9f, 0x9f, 0x02, 0xff};
2881// Too many closing breaks
2882static const uint8_t spIndefiniteArrayBad3[] = {0x9f, 0x02, 0xff, 0xff};
2883// Unclosed indeflen inside def len
2884static const uint8_t spIndefiniteArrayBad4[] = {0x81, 0x9f};
2885// confused tag
2886static const uint8_t spIndefiniteArrayBad5[] = {0x9f, 0xd1, 0xff};
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002887
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002888int32_t IndefiniteLengthArrayMapTest()
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002889{
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07002890 QCBORError nResult;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002891 // --- first test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002892 UsefulBufC IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArray);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002893
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002894 // Decode it and see if it is OK
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05302895 UsefulBuf_MAKE_STACK_UB(MemPool, 150);
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002896 QCBORDecodeContext DC;
2897 QCBORItem Item;
2898 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002899
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002900 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002901
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002902 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302903
2904 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
2905 Item.uNestingLevel != 0 ||
2906 Item.uNextNestLevel != 1) {
2907 return -111;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002908 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002909
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002910 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302911 if(Item.uDataType != QCBOR_TYPE_INT64 ||
2912 Item.uNestingLevel != 1 ||
2913 Item.uNextNestLevel != 1) {
2914 return -2;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002915 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002916
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002917 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302918 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
2919 Item.uNestingLevel != 1 ||
2920 Item.uNextNestLevel != 2) {
2921 return -3;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002922 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002923
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002924 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade12b495d2018-12-17 11:15:54 -08002925 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade6de37062018-10-15 12:22:42 +05302926 Item.uNestingLevel != 2 ||
2927 Item.uNextNestLevel != 2) {
2928 return -4;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002929 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002930
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002931 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade12b495d2018-12-17 11:15:54 -08002932 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade6de37062018-10-15 12:22:42 +05302933 Item.uNestingLevel != 2 ||
2934 Item.uNextNestLevel != 0) {
2935 return -5;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002936 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002937
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002938 if(QCBORDecode_Finish(&DC)) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302939 return -6;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002940 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002941
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002942 // --- next test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002943 IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArrayBad1);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002944
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002945 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002946
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002947 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002948
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002949 nResult = QCBORDecode_GetNext(&DC, &Item);
2950 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302951 return -7;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002952 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002953
Laurence Lundblade570fab52018-10-13 18:28:27 +08002954 nResult = QCBORDecode_Finish(&DC);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302955 if(nResult != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
2956 return -8;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002957 }
2958
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002959
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002960 // --- next test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002961 IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArrayBad2);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002962
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002963 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002964
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002965 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002966
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002967 nResult = QCBORDecode_GetNext(&DC, &Item);
2968 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302969 return -9;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002970 }
2971
2972 nResult = QCBORDecode_GetNext(&DC, &Item);
2973 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302974 return -10;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002975 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002976
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002977 nResult = QCBORDecode_GetNext(&DC, &Item);
2978 if(nResult || Item.uDataType != QCBOR_TYPE_INT64) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302979 return -11;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002980 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002981
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002982 nResult = QCBORDecode_Finish(&DC);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302983 if(nResult != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
2984 return -12;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002985 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002986
2987
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002988 // --- next test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002989 IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArrayBad3);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002990
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002991 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002992
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002993 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002994
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002995 nResult = QCBORDecode_GetNext(&DC, &Item);
2996 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302997 return -13;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002998 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002999
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003000 nResult = QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade642282a2020-06-23 12:00:33 -07003001 if(nResult != QCBOR_SUCCESS) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05303002 return -14;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003003 }
Laurence Lundblade6de37062018-10-15 12:22:42 +05303004
Laurence Lundblade642282a2020-06-23 12:00:33 -07003005 nResult = QCBORDecode_GetNext(&DC, &Item);
3006 if(nResult != QCBOR_ERR_BAD_BREAK) {
3007 return -140;
3008 }
3009
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003010
Laurence Lundblade570fab52018-10-13 18:28:27 +08003011 // --- next test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003012 IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArrayBad4);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003013
Laurence Lundblade570fab52018-10-13 18:28:27 +08003014 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003015
Laurence Lundblade570fab52018-10-13 18:28:27 +08003016 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003017
Laurence Lundblade570fab52018-10-13 18:28:27 +08003018 nResult = QCBORDecode_GetNext(&DC, &Item);
3019 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05303020 return -15;
Laurence Lundblade570fab52018-10-13 18:28:27 +08003021 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003022
Laurence Lundblade570fab52018-10-13 18:28:27 +08003023 nResult = QCBORDecode_GetNext(&DC, &Item);
3024 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05303025 return -16;
Laurence Lundblade570fab52018-10-13 18:28:27 +08003026 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003027
Laurence Lundblade570fab52018-10-13 18:28:27 +08003028 nResult = QCBORDecode_Finish(&DC);
Laurence Lundblade6de37062018-10-15 12:22:42 +05303029 if(nResult != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
3030 return -17;
Laurence Lundblade570fab52018-10-13 18:28:27 +08003031 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003032
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303033 // --- next test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003034 IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArrayBad5);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003035
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303036 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003037
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303038 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003039
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303040 nResult = QCBORDecode_GetNext(&DC, &Item);
3041 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05303042 return -18;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303043 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003044
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303045 nResult = QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade6de37062018-10-15 12:22:42 +05303046 if(nResult != QCBOR_ERR_BAD_BREAK) {
3047 return -19;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303048 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003049
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08003050 return 0;
3051}
3052
Laurence Lundblade17ede402018-10-13 11:43:07 +08003053
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003054static const uint8_t spIndefiniteLenString[] = {
Laurence Lundblade17ede402018-10-13 11:43:07 +08003055 0x81, // Array of length one
3056 0x7f, // text string marked with indefinite length
3057 0x65, 0x73, 0x74, 0x72, 0x65, 0x61, // first segment
3058 0x64, 0x6d, 0x69, 0x6e, 0x67, // second segment
3059 0xff // ending break
3060};
3061
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003062static const uint8_t spIndefiniteLenStringBad2[] = {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303063 0x81, // Array of length one
3064 0x7f, // text string marked with indefinite length
3065 0x65, 0x73, 0x74, 0x72, 0x65, 0x61, // first segment
3066 0x44, 0x6d, 0x69, 0x6e, 0x67, // second segment of wrong type
3067 0xff // ending break
3068};
3069
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003070static const uint8_t spIndefiniteLenStringBad3[] = {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303071 0x81, // Array of length one
3072 0x7f, // text string marked with indefinite length
3073 0x01, 0x02, // Not a string
3074 0xff // ending break
3075};
3076
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003077static const uint8_t spIndefiniteLenStringBad4[] = {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303078 0x81, // Array of length one
3079 0x7f, // text string marked with indefinite length
3080 0x65, 0x73, 0x74, 0x72, 0x65, 0x61, // first segment
3081 0x64, 0x6d, 0x69, 0x6e, 0x67, // second segment
3082 // missing end of string
3083};
3084
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003085static const uint8_t spIndefiniteLenStringLabel[] = {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303086 0xa1, // Array of length one
3087 0x7f, // text string marked with indefinite length
3088 0x65, 0x73, 0x74, 0x72, 0x75, 0x75, // first segment
3089 0x64, 0x6d, 0x69, 0x6e, 0x67, // second segment
3090 0xff, // ending break
3091 0x01 // integer being labeled.
3092};
3093
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003094/**
3095 Make an indefinite length string
3096
3097 @param Storage Storage for string, must be 144 bytes in size
3098 @return The indefinite length string
3099
3100 This makes an array with one indefinite length string that has 7 chunks
3101 from size of 1 byte up to 64 bytes.
3102 */
3103static UsefulBufC MakeIndefiniteBigBstr(UsefulBuf Storage)
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303104{
3105 UsefulOutBuf UOB;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003106
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303107 UsefulOutBuf_Init(&UOB, Storage);
3108 UsefulOutBuf_AppendByte(&UOB, 0x81);
3109 UsefulOutBuf_AppendByte(&UOB, 0x5f);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003110
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003111 uint8_t uStringByte = 0;
3112 // Use of type int is intentional
3113 for(int uChunkSize = 1; uChunkSize <= 128; uChunkSize *= 2) {
3114 // Not using preferred encoding here, but that is OK.
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303115 UsefulOutBuf_AppendByte(&UOB, 0x58);
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003116 UsefulOutBuf_AppendByte(&UOB, (uint8_t)uChunkSize);
3117 for(int j = 0; j < uChunkSize; j++) {
3118 UsefulOutBuf_AppendByte(&UOB, uStringByte);
3119 uStringByte++;
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303120 }
3121 }
3122 UsefulOutBuf_AppendByte(&UOB, 0xff);
3123
3124 return UsefulOutBuf_OutUBuf(&UOB);
3125}
3126
3127static int CheckBigString(UsefulBufC BigString)
3128{
3129 if(BigString.len != 255) {
3130 return 1;
3131 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003132
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303133 for(uint8_t i = 0; i < 255; i++){
3134 if(((const uint8_t *)BigString.ptr)[i] != i) {
3135 return 1;
3136 }
3137 }
3138 return 0;
3139}
3140
Laurence Lundblade7e0d13b2018-10-16 19:54:13 +05303141
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003142int32_t IndefiniteLengthStringTest()
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303143{
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303144 QCBORDecodeContext DC;
3145 QCBORItem Item;
Laurence Lundblade7e0d13b2018-10-16 19:54:13 +05303146 // big enough for MakeIndefiniteBigBstr() + MemPool overhead
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003147 UsefulBuf_MAKE_STACK_UB(MemPool, 350);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003148
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303149 // --- Simple normal indefinite length string ------
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003150 UsefulBufC IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteLenString);
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303151 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003152
Laurence Lundblade7e0d13b2018-10-16 19:54:13 +05303153 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303154 return -1;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303155 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003156
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303157 if(QCBORDecode_GetNext(&DC, &Item)) {
3158 return -2;
3159 }
3160 if(Item.uDataType != QCBOR_TYPE_ARRAY || Item.uDataAlloc) {
3161 return -3;
3162 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003163
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303164 if(QCBORDecode_GetNext(&DC, &Item)) {
3165 return -4;
3166 }
3167 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING || !Item.uDataAlloc) {
3168 return -5;
3169 }
3170 if(QCBORDecode_Finish(&DC)) {
3171 return -6;
3172 }
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303173
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303174 // ----- types mismatch ---
Laurence Lundbladeee851742020-01-08 08:37:05 -08003175 QCBORDecode_Init(&DC,
3176 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteLenStringBad2),
3177 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003178
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303179 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
3180 return -7;
3181 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003182
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303183 if(QCBORDecode_GetNext(&DC, &Item)) {
3184 return -8;
3185 }
3186 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
3187 return -9;
3188 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003189
Laurence Lundblade30816f22018-11-10 13:40:22 +07003190 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_ERR_INDEFINITE_STRING_CHUNK) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303191 return -10;
3192 }
3193
3194 // ----- not a string ---
Laurence Lundbladeee851742020-01-08 08:37:05 -08003195 QCBORDecode_Init(&DC,
3196 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteLenStringBad3),
3197 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003198
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303199 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
3200 return -11;
3201 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003202
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303203 if(QCBORDecode_GetNext(&DC, &Item)) {
3204 return -12;
3205 }
3206 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
3207 return -13;
3208 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003209
Laurence Lundblade30816f22018-11-10 13:40:22 +07003210 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_ERR_INDEFINITE_STRING_CHUNK) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303211 return -14;
3212 }
3213
3214 // ----- no end -----
Laurence Lundbladeee851742020-01-08 08:37:05 -08003215 QCBORDecode_Init(&DC,
3216 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteLenStringBad4),
3217 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003218
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303219 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
3220 return -15;
3221 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003222
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303223 if(QCBORDecode_GetNext(&DC, &Item)) {
3224 return -16;
3225 }
3226 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
3227 return -17;
3228 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003229
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303230 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_ERR_HIT_END) {
3231 return -18;
3232 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003233
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303234 // ------ Don't set a string allocator and see an error -----
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303235 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003236
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303237 QCBORDecode_GetNext(&DC, &Item);
3238 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303239 return -19;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303240 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003241
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303242 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_ERR_NO_STRING_ALLOCATOR) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303243 return -20;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303244 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003245
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303246 // ----- Mempool is way too small -----
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003247 UsefulBuf_MAKE_STACK_UB(MemPoolTooSmall, QCBOR_DECODE_MIN_MEM_POOL_SIZE-1);
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303248
3249 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
3250 if(!QCBORDecode_SetMemPool(&DC, MemPoolTooSmall, false)) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303251 return -21;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303252 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003253
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303254 // ----- Mempool is way too small -----
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05303255 UsefulBuf_MAKE_STACK_UB(BigIndefBStrStorage, 290);
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -08003256 const UsefulBufC BigIndefBStr = MakeIndefiniteBigBstr(BigIndefBStrStorage);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003257
Laurence Lundbladeee851742020-01-08 08:37:05 -08003258 // 80 is big enough for MemPool overhead, but not BigIndefBStr
3259 UsefulBuf_MAKE_STACK_UB(MemPoolSmall, 80);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003260
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303261 QCBORDecode_Init(&DC, BigIndefBStr, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303262 if(QCBORDecode_SetMemPool(&DC, MemPoolSmall, false)) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303263 return -22;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303264 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003265
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303266 QCBORDecode_GetNext(&DC, &Item);
3267 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303268 return -23;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303269 }
Laurence Lundblade30816f22018-11-10 13:40:22 +07003270 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_ERR_STRING_ALLOCATE) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303271 return -24;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303272 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003273
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303274 // ---- big bstr -----
3275 QCBORDecode_Init(&DC, BigIndefBStr, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003276
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303277 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
3278 return -25;
3279 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003280
Laurence Lundblade7e0d13b2018-10-16 19:54:13 +05303281 if(QCBORDecode_GetNext(&DC, &Item)) {
3282 return -26;
3283 }
3284 if(Item.uDataType != QCBOR_TYPE_ARRAY || Item.uDataAlloc) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303285 return -26;
3286 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003287
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303288 if(QCBORDecode_GetNext(&DC, &Item)) {
3289 return -27;
3290 }
Laurence Lundblade7e0d13b2018-10-16 19:54:13 +05303291 if(Item.uDataType != QCBOR_TYPE_BYTE_STRING || !Item.uDataAlloc || Item.uNestingLevel != 1) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303292 return -28;
3293 }
3294 if(CheckBigString(Item.val.string)) {
3295 return -3;
3296 }
3297 if(QCBORDecode_Finish(&DC)) {
3298 return -29;
3299 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003300
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303301 // --- label is an indefinite length string ------
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003302 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteLenStringLabel), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003303
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303304 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
3305 return -30;
3306 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003307
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303308 QCBORDecode_GetNext(&DC, &Item);
3309 if(Item.uDataType != QCBOR_TYPE_MAP) {
3310 return -31;
3311 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003312
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303313 if(QCBORDecode_GetNext(&DC, &Item)){
3314 return -32;
3315 }
Laurence Lundbladeee851742020-01-08 08:37:05 -08003316 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
3317 Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303318 Item.uDataAlloc || !Item.uLabelAlloc ||
3319 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("struuming"))) {
3320 return -33;
3321 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003322
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303323 if(QCBORDecode_Finish(&DC)) {
3324 return -34;
3325 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003326
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003327 return 0;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08003328}
3329
3330
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003331int32_t AllocAllStringsTest()
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303332{
3333 QCBORDecodeContext DC;
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003334 QCBORError nCBORError;
3335
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003336
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303337 // First test, use the "CSRMap" as easy input and checking
Laurence Lundbladeee851742020-01-08 08:37:05 -08003338 QCBORDecode_Init(&DC,
3339 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRInput),
3340 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003341
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003342 UsefulBuf_MAKE_STACK_UB(Pool, sizeof(spCSRInput) + QCBOR_DECODE_MIN_MEM_POOL_SIZE);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003343
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003344 nCBORError = QCBORDecode_SetMemPool(&DC, Pool, 1); // Turn on copying.
3345 if(nCBORError) {
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303346 return -1;
3347 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003348
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003349 if(CheckCSRMaps(&DC)) {
3350 return -2;
3351 }
3352
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303353 // Next parse, save pointers to a few strings, destroy original and see all is OK.
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003354 UsefulBuf_MAKE_STACK_UB(CopyOfStorage, sizeof(pValidMapEncoded) + QCBOR_DECODE_MIN_MEM_POOL_SIZE);
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -08003355 const UsefulBufC CopyOf = UsefulBuf_Copy(CopyOfStorage, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapEncoded));
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08003356
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303357 QCBORDecode_Init(&DC, CopyOf, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -08003358 UsefulBuf_Set(Pool, '/');
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303359 QCBORDecode_SetMemPool(&DC, Pool, 1); // Turn on copying.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003360
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303361 QCBORItem Item1, Item2, Item3, Item4;
3362 if((nCBORError = QCBORDecode_GetNext(&DC, &Item1)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07003363 return (int32_t)nCBORError;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303364 if(Item1.uDataType != QCBOR_TYPE_MAP ||
3365 Item1.val.uCount != 3)
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003366 return -3;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303367 if((nCBORError = QCBORDecode_GetNext(&DC, &Item1)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07003368 return (int32_t)nCBORError;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303369 if((nCBORError = QCBORDecode_GetNext(&DC, &Item2)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07003370 return (int32_t)nCBORError;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303371 if((nCBORError = QCBORDecode_GetNext(&DC, &Item3)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07003372 return (int32_t)nCBORError;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303373 if((nCBORError = QCBORDecode_GetNext(&DC, &Item4)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07003374 return (int32_t)nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003375
Laurence Lundblade05ec57b2018-10-21 01:50:03 +05303376 UsefulBuf_Set(CopyOfStorage, '_');
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003377
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303378 if(Item1.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303379 Item1.uDataType != QCBOR_TYPE_INT64 ||
3380 Item1.val.int64 != 42 ||
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003381 Item1.uDataAlloc != 0 ||
3382 Item1.uLabelAlloc == 0 ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003383 UsefulBuf_Compare(Item1.label.string, UsefulBuf_FromSZ("first integer"))) {
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003384 return -4;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003385 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003386
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303387
3388 if(Item2.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003389 UsefulBuf_Compare(Item2.label.string, UsefulBuf_FromSZ("an array of two strings")) ||
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303390 Item2.uDataType != QCBOR_TYPE_ARRAY ||
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003391 Item2.uDataAlloc != 0 ||
3392 Item2.uLabelAlloc == 0 ||
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303393 Item2.val.uCount != 2)
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003394 return -5;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003395
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303396 if(Item3.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003397 Item3.uDataAlloc == 0 ||
3398 Item3.uLabelAlloc != 0 ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003399 UsefulBuf_Compare(Item3.val.string, UsefulBuf_FromSZ("string1"))) {
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003400 return -6;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003401 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003402
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303403 if(Item4.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003404 Item4.uDataAlloc == 0 ||
3405 Item4.uLabelAlloc != 0 ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003406 UsefulBuf_Compare(Item4.val.string, UsefulBuf_FromSZ("string2"))) {
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003407 return -7;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003408 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003409
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303410 // Next parse with a pool that is too small
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003411 UsefulBuf_MAKE_STACK_UB(SmallPool, QCBOR_DECODE_MIN_MEM_POOL_SIZE + 1);
Laurence Lundbladeee851742020-01-08 08:37:05 -08003412 QCBORDecode_Init(&DC,
3413 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapEncoded),
3414 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303415 QCBORDecode_SetMemPool(&DC, SmallPool, 1); // Turn on copying.
3416 if((nCBORError = QCBORDecode_GetNext(&DC, &Item1)))
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003417 return -8;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303418 if(Item1.uDataType != QCBOR_TYPE_MAP ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003419 Item1.val.uCount != 3) {
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003420 return -9;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003421 }
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303422 if(!(nCBORError = QCBORDecode_GetNext(&DC, &Item1))){
3423 if(!(nCBORError = QCBORDecode_GetNext(&DC, &Item2))) {
3424 if(!(nCBORError = QCBORDecode_GetNext(&DC, &Item3))) {
3425 nCBORError = QCBORDecode_GetNext(&DC, &Item4);
3426 }
3427 }
3428 }
Laurence Lundblade30816f22018-11-10 13:40:22 +07003429 if(nCBORError != QCBOR_ERR_STRING_ALLOCATE) {
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003430 return -10;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303431 }
3432
3433 return 0;
3434}
3435
Laurence Lundbladef6531662018-12-04 10:42:22 +09003436
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303437
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003438int32_t MemPoolTest(void)
Laurence Lundblade0155b622018-10-12 20:04:37 +08003439{
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003440 // Set up the decoder with a tiny bit of CBOR to parse because
3441 // nothing can be done with it unless that is set up.
Laurence Lundbladef6531662018-12-04 10:42:22 +09003442 QCBORDecodeContext DC;
3443 const uint8_t pMinimalCBOR[] = {0xa0}; // One empty map
3444 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pMinimalCBOR),0);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003445
Laurence Lundbladef6531662018-12-04 10:42:22 +09003446 // Set up an memory pool of 100 bytes
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003447 // Then fish into the internals of the decode context
3448 // to get the allocator function so it can be called directly.
3449 // Also figure out how much pool is available for use
3450 // buy subtracting out the overhead.
Laurence Lundbladef6531662018-12-04 10:42:22 +09003451 UsefulBuf_MAKE_STACK_UB(Pool, 100);
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003452 QCBORError nError = QCBORDecode_SetMemPool(&DC, Pool, 0);
3453 if(nError) {
3454 return -9;
3455 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003456 QCBORStringAllocate pAlloc = DC.StringAllocator.pfAllocator;
3457 void *pAllocCtx = DC.StringAllocator.pAllocateCxt;
3458 size_t uAvailPool = Pool.len - QCBOR_DECODE_MIN_MEM_POOL_SIZE;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003459
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003460 // First test -- ask for one more byte than available and see failure
3461 UsefulBuf Allocated = (*pAlloc)(pAllocCtx, NULL, uAvailPool+1);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003462 if(!UsefulBuf_IsNULL(Allocated)) {
3463 return -1;
3464 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003465
Laurence Lundbladef6531662018-12-04 10:42:22 +09003466 // Re do the set up for the next test that will do a successful alloc,
3467 // a fail, a free and then success
Laurence Lundbladef6531662018-12-04 10:42:22 +09003468 QCBORDecode_SetMemPool(&DC, Pool, 0);
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003469 pAlloc = DC.StringAllocator.pfAllocator;
3470 pAllocCtx = DC.StringAllocator.pAllocateCxt;
3471 uAvailPool = Pool.len - QCBOR_DECODE_MIN_MEM_POOL_SIZE;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003472
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003473 // Allocate one byte less than available and see success
3474 Allocated = (pAlloc)(pAllocCtx, NULL, uAvailPool-1);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003475 if(UsefulBuf_IsNULL(Allocated)) { // expected to succeed
3476 return -2;
3477 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003478 // Ask for some more and see failure
3479 UsefulBuf Allocated2 = (*pAlloc)(pAllocCtx, NULL, uAvailPool/2);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003480 if(!UsefulBuf_IsNULL(Allocated2)) { // expected to fail
3481 return -3;
3482 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003483 // Free the first allocate, retry the second and see success
3484 (*pAlloc)(pAllocCtx, Allocated.ptr, 0); // Free
3485 Allocated = (*pAlloc)(pAllocCtx, NULL, uAvailPool/2);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003486 if(UsefulBuf_IsNULL(Allocated)) { // succeed because of the free
3487 return -4;
3488 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003489
Laurence Lundbladef6531662018-12-04 10:42:22 +09003490 // Re do set up for next test that involves a successful alloc,
3491 // and a successful realloc and a failed realloc
3492 QCBORDecode_SetMemPool(&DC, Pool, 0);
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003493 pAlloc = DC.StringAllocator.pfAllocator;
3494 pAllocCtx = DC.StringAllocator.pAllocateCxt;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003495
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003496 // Allocate half the pool and see success
3497 Allocated = (*pAlloc)(pAllocCtx, NULL, uAvailPool/2);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003498 if(UsefulBuf_IsNULL(Allocated)) { // expected to succeed
3499 return -5;
3500 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003501 // Reallocate to take up the whole pool and see success
3502 Allocated2 = (*pAlloc)(pAllocCtx, Allocated.ptr, uAvailPool);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003503 if(UsefulBuf_IsNULL(Allocated2)) {
3504 return -6;
3505 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003506 // Make sure its the same pointer and the size is right
Laurence Lundbladef6531662018-12-04 10:42:22 +09003507 if(Allocated2.ptr != Allocated.ptr || Allocated2.len != uAvailPool) {
3508 return -7;
3509 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003510 // Try to allocate more to be sure there is failure after a realloc
3511 UsefulBuf Allocated3 = (*pAlloc)(pAllocCtx, Allocated.ptr, uAvailPool+1);
3512 if(!UsefulBuf_IsNULL(Allocated3)) {
Laurence Lundbladef6531662018-12-04 10:42:22 +09003513 return -8;
3514 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003515
Laurence Lundbladef6531662018-12-04 10:42:22 +09003516 return 0;
3517}
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08003518
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003519
3520/* Just enough of an allocator to test configuration of one */
3521static UsefulBuf AllocateTestFunction(void *pCtx, void *pOldMem, size_t uNewSize)
3522{
3523 (void)pOldMem; // unused variable
3524
3525 if(uNewSize) {
3526 // Assumes the context pointer is the buffer and
3527 // nothing too big will ever be asked for.
3528 // This is only good for this basic test!
3529 return (UsefulBuf) {pCtx, uNewSize};
3530 } else {
3531 return NULLUsefulBuf;
3532 }
3533}
3534
3535
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003536int32_t SetUpAllocatorTest(void)
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003537{
3538 // Set up the decoder with a tiny bit of CBOR to parse because
3539 // nothing can be done with it unless that is set up.
3540 QCBORDecodeContext DC;
3541 const uint8_t pMinimalCBOR[] = {0x62, 0x48, 0x69}; // "Hi"
3542 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pMinimalCBOR),0);
3543
3544 uint8_t pAllocatorBuffer[50];
3545
3546 // This is really just to test that this call works.
3547 // The full functionality of string allocators is tested
3548 // elsewhere with the MemPool internal allocator.
3549 QCBORDecode_SetUpAllocator(&DC, AllocateTestFunction, pAllocatorBuffer, 1);
3550
3551 QCBORItem Item;
3552 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_SUCCESS) {
3553 return -1;
3554 }
3555
3556 if(Item.uDataAlloc == 0 ||
3557 Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
3558 Item.val.string.ptr != pAllocatorBuffer) {
3559 return -2;
3560 }
3561
3562 if(QCBORDecode_Finish(&DC) != QCBOR_SUCCESS) {
3563 return -3;
3564 }
3565
3566 return 0;
3567}
3568
Laurence Lundblade59289e52019-12-30 13:44:37 -08003569
3570#ifndef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA
Laurence Lundbladea826c502020-05-10 21:07:00 -07003571/* exponent, mantissa
Laurence Lundblade59289e52019-12-30 13:44:37 -08003572 [
3573 4([-1, 3]),
Laurence Lundbladea826c502020-05-10 21:07:00 -07003574 4([-20, 4759477275222530853136]),
3575 4([9223372036854775807, -4759477275222530853137]),
Laurence Lundblade59289e52019-12-30 13:44:37 -08003576 5([300, 100]),
Laurence Lundbladea826c502020-05-10 21:07:00 -07003577 5([-20, 4759477275222530853136]),
Laurence Lundblade59289e52019-12-30 13:44:37 -08003578 5([-9223372036854775807, -4759477275222530853137])
Laurence Lundbladea826c502020-05-10 21:07:00 -07003579 5([ 9223372036854775806, -4759477275222530853137])
3580 5([ 9223372036854775806, 9223372036854775806])]
Laurence Lundblade59289e52019-12-30 13:44:37 -08003581 ]
3582 */
3583
3584static const uint8_t spExpectedExponentsAndMantissas[] = {
3585 0x87,
3586 0xC4, 0x82, 0x20,
3587 0x03,
3588 0xC4, 0x82, 0x33,
3589 0xC2, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,
3590 0xC4, 0x82, 0x1B, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
3591 0xC3, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,
3592 0xC5, 0x82, 0x19, 0x01, 0x2C,
3593 0x18, 0x64,
3594 0xC5, 0x82, 0x33,
3595 0xC2, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,
3596 0xC5, 0x82, 0x3B, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
3597 0xC3, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,
Laurence Lundbladea826c502020-05-10 21:07:00 -07003598 0xC5, 0x82, 0x1B, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
3599 0xC3, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,
Laurence Lundblade59289e52019-12-30 13:44:37 -08003600 0xC5, 0x82, 0x1B, 0x7f, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
3601 0x1B, 0x7f, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE
3602};
3603
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003604int32_t ExponentAndMantissaDecodeTests(void)
Laurence Lundblade59289e52019-12-30 13:44:37 -08003605{
3606 QCBORDecodeContext DC;
3607 QCBORError nCBORError;
3608 QCBORItem item;
3609
Laurence Lundblade17af4902020-01-07 19:11:55 -08003610 static const uint8_t spBigNumMantissa[] = {0x01, 0x02, 0x03, 0x04, 0x05,
3611 0x06, 0x07, 0x08, 0x09, 0x010};
3612 UsefulBufC BN = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNumMantissa);
Laurence Lundblade59289e52019-12-30 13:44:37 -08003613
3614
3615 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spExpectedExponentsAndMantissas), QCBOR_DECODE_MODE_NORMAL);
3616
3617 nCBORError = QCBORDecode_GetNext(&DC, &item);
3618 if(nCBORError != QCBOR_SUCCESS) {
3619 return 1;
3620 }
3621
3622 if(item.uDataType != QCBOR_TYPE_ARRAY) {
3623 return 2;
3624 }
3625
3626 nCBORError = QCBORDecode_GetNext(&DC, &item);
3627 if(nCBORError != QCBOR_SUCCESS) {
3628 return 3;
3629 }
3630
3631 if(item.uDataType != QCBOR_TYPE_DECIMAL_FRACTION ||
3632 item.val.expAndMantissa.Mantissa.nInt != 3 ||
3633 item.val.expAndMantissa.nExponent != -1) {
3634 return 4;
3635 }
3636
3637 nCBORError = QCBORDecode_GetNext(&DC, &item);
3638 if(nCBORError != QCBOR_SUCCESS) {
3639 return 5;
3640 }
3641
3642 if(item.uDataType != QCBOR_TYPE_DECIMAL_FRACTION_POS_BIGNUM ||
3643 item.val.expAndMantissa.nExponent != -20 ||
3644 UsefulBuf_Compare(item.val.expAndMantissa.Mantissa.bigNum, BN)) {
3645 return 6;
3646 }
3647
3648 nCBORError = QCBORDecode_GetNext(&DC, &item);
3649 if(nCBORError != QCBOR_SUCCESS) {
3650 return 7;
3651 }
3652
3653 if(item.uDataType != QCBOR_TYPE_DECIMAL_FRACTION_NEG_BIGNUM ||
3654 item.val.expAndMantissa.nExponent != 9223372036854775807 ||
3655 UsefulBuf_Compare(item.val.expAndMantissa.Mantissa.bigNum, BN)) {
3656 return 8;
3657 }
3658
3659 nCBORError = QCBORDecode_GetNext(&DC, &item);
3660 if(nCBORError != QCBOR_SUCCESS) {
3661 return 9;
3662 }
3663
3664 if(item.uDataType != QCBOR_TYPE_BIGFLOAT ||
3665 item.val.expAndMantissa.Mantissa.nInt != 100 ||
3666 item.val.expAndMantissa.nExponent != 300) {
3667 return 10;
3668 }
3669
Laurence Lundbladea826c502020-05-10 21:07:00 -07003670 // 5([-20, 4759477275222530853136]),
Laurence Lundblade59289e52019-12-30 13:44:37 -08003671 nCBORError = QCBORDecode_GetNext(&DC, &item);
3672 if(nCBORError != QCBOR_SUCCESS) {
3673 return 11;
3674 }
Laurence Lundblade59289e52019-12-30 13:44:37 -08003675 if(item.uDataType != QCBOR_TYPE_BIGFLOAT_POS_BIGNUM ||
3676 item.val.expAndMantissa.nExponent != -20 ||
3677 UsefulBuf_Compare(item.val.expAndMantissa.Mantissa.bigNum, BN)) {
3678 return 12;
3679 }
3680
Laurence Lundbladea826c502020-05-10 21:07:00 -07003681 // 5([-9223372036854775807, -4759477275222530853137])
Laurence Lundblade59289e52019-12-30 13:44:37 -08003682 nCBORError = QCBORDecode_GetNext(&DC, &item);
3683 if(nCBORError != QCBOR_SUCCESS) {
3684 return 13;
3685 }
Laurence Lundblade59289e52019-12-30 13:44:37 -08003686 if(item.uDataType != QCBOR_TYPE_BIGFLOAT_NEG_BIGNUM ||
3687 item.val.expAndMantissa.nExponent != -9223372036854775807 ||
3688 UsefulBuf_Compare(item.val.expAndMantissa.Mantissa.bigNum, BN)) {
3689 return 14;
3690 }
3691
Laurence Lundbladea826c502020-05-10 21:07:00 -07003692 // 5([ 9223372036854775806, -4759477275222530853137])
3693 nCBORError = QCBORDecode_GetNext(&DC, &item);
3694 if(nCBORError != QCBOR_SUCCESS) {
3695 return 13;
3696 }
3697 if(item.uDataType != QCBOR_TYPE_BIGFLOAT_NEG_BIGNUM ||
3698 item.val.expAndMantissa.nExponent != 9223372036854775806 ||
3699 UsefulBuf_Compare(item.val.expAndMantissa.Mantissa.bigNum, BN)) {
3700 return 14;
3701 }
3702
3703
3704 // 5([ 9223372036854775806, 9223372036854775806])]
Laurence Lundblade59289e52019-12-30 13:44:37 -08003705 nCBORError = QCBORDecode_GetNext(&DC, &item);
3706 if(nCBORError != QCBOR_SUCCESS) {
3707 return 15;
3708 }
Laurence Lundblade59289e52019-12-30 13:44:37 -08003709 if(item.uDataType != QCBOR_TYPE_BIGFLOAT ||
3710 item.val.expAndMantissa.nExponent != 9223372036854775806 ||
3711 item.val.expAndMantissa.Mantissa.nInt!= 9223372036854775806 ) {
3712 return 16;
3713 }
3714
3715 /* Now encode some stuff and then decode it */
3716 uint8_t pBuf[40];
3717 QCBOREncodeContext EC;
3718 UsefulBufC Encoded;
3719
3720 QCBOREncode_Init(&EC, UsefulBuf_FROM_BYTE_ARRAY(pBuf));
3721 QCBOREncode_OpenArray(&EC);
3722 QCBOREncode_AddDecimalFraction(&EC, 999, 1000); // 999 * (10 ^ 1000)
3723 QCBOREncode_AddBigFloat(&EC, 100, INT32_MIN);
3724 QCBOREncode_AddDecimalFractionBigNum(&EC, BN, false, INT32_MAX);
3725 QCBOREncode_CloseArray(&EC);
3726 QCBOREncode_Finish(&EC, &Encoded);
3727
3728
3729 QCBORDecode_Init(&DC, Encoded, QCBOR_DECODE_MODE_NORMAL);
3730 nCBORError = QCBORDecode_GetNext(&DC, &item);
3731 if(nCBORError != QCBOR_SUCCESS) {
3732 return 13;
3733 }
3734
3735 nCBORError = QCBORDecode_GetNext(&DC, &item);
3736 if(nCBORError != QCBOR_SUCCESS) {
3737 return 13;
3738 }
3739
3740 if(item.uDataType != QCBOR_TYPE_DECIMAL_FRACTION ||
3741 item.val.expAndMantissa.nExponent != 1000 ||
3742 item.val.expAndMantissa.Mantissa.nInt != 999) {
3743 return 15;
3744 }
3745
3746 nCBORError = QCBORDecode_GetNext(&DC, &item);
3747 if(nCBORError != QCBOR_SUCCESS) {
3748 return 13;
3749 }
3750
3751 if(item.uDataType != QCBOR_TYPE_BIGFLOAT ||
3752 item.val.expAndMantissa.nExponent != INT32_MIN ||
3753 item.val.expAndMantissa.Mantissa.nInt != 100) {
3754 return 15;
3755 }
3756
3757 nCBORError = QCBORDecode_GetNext(&DC, &item);
3758 if(nCBORError != QCBOR_SUCCESS) {
3759 return 13;
3760 }
3761
3762 if(item.uDataType != QCBOR_TYPE_DECIMAL_FRACTION_POS_BIGNUM ||
3763 item.val.expAndMantissa.nExponent != INT32_MAX ||
3764 UsefulBuf_Compare(item.val.expAndMantissa.Mantissa.bigNum, BN)) {
3765 return 12;
3766 }
3767
3768 return 0;
3769}
3770
3771
3772static struct FailInput ExponentAndMantissaFailures[] = {
3773 // Exponent > INT64_MAX
3774 { {(uint8_t[]){0xC4, 0x82, 0x1B, 0x7f, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
3775 0xFF, 0xFF, 0x1B, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
3776 0xFF, 0xFF,}, 20}, QCBOR_ERR_BAD_EXP_AND_MANTISSA},
3777 // Mantissa > INT64_MAX
3778 { {(uint8_t[]){0xC4, 0x82, 0x1B, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
3779 0xFF, 0xFF, 0xC3, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05,
3780 0x06, 0x07, 0x08, 0x09, 0x10}, 23}, QCBOR_ERR_BAD_EXP_AND_MANTISSA},
3781 // End of input
3782 { {(uint8_t[]){0xC4, 0x82}, 2}, QCBOR_ERR_HIT_END},
3783 // End of input
3784 { {(uint8_t[]){0xC4, 0x82, 0x01}, 3}, QCBOR_ERR_HIT_END},
3785 // bad content for big num
3786 { {(uint8_t[]){0xC4, 0x82, 0x01, 0xc3, 0x01}, 5}, QCBOR_ERR_BAD_OPT_TAG},
3787 // bad content for big num
3788 { {(uint8_t[]){0xC4, 0x82, 0xc2, 0x01, 0x1f}, 5}, QCBOR_ERR_BAD_INT},
3789 // Bad integer for exponent
3790 { {(uint8_t[]){0xC4, 0x82, 0x01, 0x1f}, 4}, QCBOR_ERR_BAD_INT},
3791 // Bad integer for mantissa
3792 { {(uint8_t[]){0xC4, 0x82, 0x1f, 0x01}, 4}, QCBOR_ERR_BAD_INT},
3793 // 3 items in array
3794 { {(uint8_t[]){0xC4, 0x83, 0x03, 0x01, 02}, 5}, QCBOR_ERR_BAD_EXP_AND_MANTISSA},
3795 // unterminated indefinite length array
3796 { {(uint8_t[]){0xC4, 0x9f, 0x03, 0x01, 0x02}, 5}, QCBOR_ERR_BAD_EXP_AND_MANTISSA},
3797 // Empty array
3798 { {(uint8_t[]){0xC4, 0x80}, 2}, QCBOR_ERR_NO_MORE_ITEMS},
3799 // Second is not an integer
3800 { {(uint8_t[]){0xC4, 0x82, 0x03, 0x40}, 4}, QCBOR_ERR_BAD_EXP_AND_MANTISSA},
3801 // First is not an integer
3802 { {(uint8_t[]){0xC4, 0x82, 0x40}, 3}, QCBOR_ERR_BAD_EXP_AND_MANTISSA},
3803 // Not an array
3804 { {(uint8_t[]){0xC4, 0xa2}, 2}, QCBOR_ERR_BAD_EXP_AND_MANTISSA}
3805};
3806
3807
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003808int32_t ExponentAndMantissaDecodeFailTests()
Laurence Lundblade59289e52019-12-30 13:44:37 -08003809{
3810 return ProcessFailures(ExponentAndMantissaFailures,
3811 sizeof(ExponentAndMantissaFailures)/sizeof(struct FailInput));
3812}
3813
3814#endif /* QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA */
Laurence Lundbladebb87be22020-04-09 19:15:32 -07003815
3816
3817
3818/*
3819 Some basic CBOR with map and array used in a lot of tests.
3820 The map labels are all strings
3821
Laurence Lundblade8ffdb742020-05-07 02:49:18 -07003822 {
3823 "first integer": 42,
Laurence Lundbladebb87be22020-04-09 19:15:32 -07003824 "an array of two strings": [
3825 "string1", "string2"
3826 ],
3827 "map in a map": {
3828 "bytes 1": h'78787878',
3829 "bytes 2": h'79797979',
3830 "another int": 98,
3831 "text 2": "lies, damn lies and statistics"
3832 }
3833 }
3834 */
3835
Laurence Lundbladeeb0b53d2020-04-14 18:34:25 -07003836#include "qcbor/qcbor_decode_map.h"
Laurence Lundblade1341c592020-04-11 14:19:05 -07003837#include <stdio.h>
Laurence Lundbladebb87be22020-04-09 19:15:32 -07003838
Laurence Lundblade9c905e82020-04-25 11:31:38 -07003839static char strbuf[10];
3840const char *PrintType(uint8_t type) {
3841 switch(type) {
3842 case QCBOR_TYPE_INT64: return "INT64";
3843 case QCBOR_TYPE_UINT64: return "UINT64";
3844 case QCBOR_TYPE_ARRAY: return "ARRAY";
3845 case QCBOR_TYPE_MAP: return "MAP";
3846 case QCBOR_TYPE_BYTE_STRING: return "BYTE_STRING";
3847 case QCBOR_TYPE_TEXT_STRING: return "TEXT_STRING";
3848 default:
3849 sprintf(strbuf, "%d", type);
3850 return strbuf;
3851 }
3852}
3853
3854
3855void PrintItem(QCBORItem Item)
3856{
3857 printf("\nData: %s nest: %d,%d %s\n", PrintType(Item.uDataType), Item.uNestingLevel, Item.uNextNestLevel, Item.uDataAlloc ? "Allocated":"");
3858 if(Item.uLabelType) {
3859 printf("Label: %s ", PrintType(Item.uLabelType));
3860 if(Item.uLabelType == QCBOR_TYPE_INT64) {
3861 printf("%lld\n", Item.label.int64);
3862 } else if(Item.uLabelType == QCBOR_TYPE_TEXT_STRING) {
3863 printf("\"%4.4s\"\n", Item.label.string.ptr);
3864 }
3865 }
3866}
3867
Laurence Lundblade8ffdb742020-05-07 02:49:18 -07003868
Laurence Lundbladebb87be22020-04-09 19:15:32 -07003869int32_t EnterMapTest()
3870{
Laurence Lundblade8ffdb742020-05-07 02:49:18 -07003871 QCBORItem Item1, Item2, Item3;
3872 int64_t nDecodedInt1, nDecodedInt2;
3873 UsefulBufC B1, B2, S1, S2, S3;
Laurence Lundblade9c905e82020-04-25 11:31:38 -07003874
Laurence Lundbladebb87be22020-04-09 19:15:32 -07003875 QCBORDecodeContext DCtx;
3876 QCBORError nCBORError;
3877
3878 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapEncoded), 0);
Laurence Lundblade1341c592020-04-11 14:19:05 -07003879
Laurence Lundbladebb87be22020-04-09 19:15:32 -07003880 QCBORDecode_EnterMap(&DCtx);
Laurence Lundblade1341c592020-04-11 14:19:05 -07003881
Laurence Lundblade843a10c2020-05-23 13:57:00 -07003882 QCBORDecode_GetInt64InMapSZ(&DCtx, "first integer", &nDecodedInt1);
Laurence Lundblade1341c592020-04-11 14:19:05 -07003883
Laurence Lundblade8ffdb742020-05-07 02:49:18 -07003884 QCBORDecode_EnterMapFromMapSZ(&DCtx, "map in a map");
Laurence Lundblade843a10c2020-05-23 13:57:00 -07003885 QCBORDecode_GetInt64InMapSZ(&DCtx, "another int", &nDecodedInt2);
3886 QCBORDecode_GetBytesInMapSZ(&DCtx, "bytes 1", &B1);
3887 QCBORDecode_GetBytesInMapSZ(&DCtx, "bytes 2", &B2);
Laurence Lundblade8ffdb742020-05-07 02:49:18 -07003888 QCBORDecode_GetTextInMapSZ(&DCtx, "text 2", &S1);
3889 QCBORDecode_ExitMap(&DCtx);
Laurence Lundblade1341c592020-04-11 14:19:05 -07003890
Laurence Lundblade8ffdb742020-05-07 02:49:18 -07003891 QCBORDecode_EnterArrayFromMapSZ(&DCtx, "an array of two strings");
3892 QCBORDecode_GetNext(&DCtx, &Item1);
3893 QCBORDecode_GetNext(&DCtx, &Item2);
3894 if(QCBORDecode_GetNext(&DCtx, &Item3) != QCBOR_ERR_NO_MORE_ITEMS) {
3895 return -400;
3896 }
3897 QCBORDecode_ExitArray(&DCtx);
Laurence Lundblade3f9ef042020-04-14 13:15:51 -07003898
Laurence Lundblade8ffdb742020-05-07 02:49:18 -07003899 // Parse the same array again using GetText() instead of GetItem()
3900 QCBORDecode_EnterArrayFromMapSZ(&DCtx, "an array of two strings");
3901 QCBORDecode_GetText(&DCtx, &S2);
3902 QCBORDecode_GetText(&DCtx, &S3);
3903 // TODO, check for end of array?
3904 QCBORDecode_ExitArray(&DCtx);
Laurence Lundblade1341c592020-04-11 14:19:05 -07003905
Laurence Lundbladebb87be22020-04-09 19:15:32 -07003906 QCBORDecode_ExitMap(&DCtx);
3907
3908 nCBORError = QCBORDecode_Finish(&DCtx);
3909
3910 if(nCBORError) {
3911 return (int32_t)nCBORError;
3912 }
3913
3914 if(nDecodedInt1 != 42) {
Laurence Lundblade8ffdb742020-05-07 02:49:18 -07003915 return 1001;
Laurence Lundbladebb87be22020-04-09 19:15:32 -07003916 }
3917
Laurence Lundblade1341c592020-04-11 14:19:05 -07003918 if(nDecodedInt2 != 98) {
Laurence Lundblade8ffdb742020-05-07 02:49:18 -07003919 return 1002;
3920 }
3921
3922 if(Item1.uDataType != QCBOR_TYPE_TEXT_STRING ||
3923 UsefulBuf_Compare(Item1.val.string, UsefulBuf_FromSZ("string1"))){
3924 return 1003;
3925 }
3926
3927 if(Item1.uDataType != QCBOR_TYPE_TEXT_STRING ||
3928 UsefulBuf_Compare(Item2.val.string, UsefulBuf_FromSZ("string2"))){
3929 return 1004;
3930 }
3931
3932 if(UsefulBuf_Compare(S1, UsefulBuf_FromSZ("lies, damn lies and statistics"))){
3933 return 1005;
Laurence Lundbladebb87be22020-04-09 19:15:32 -07003934 }
3935
Laurence Lundblade8ffdb742020-05-07 02:49:18 -07003936 if(UsefulBuf_Compare(B1, UsefulBuf_FromSZ("xxxx"))){
3937 return 1006;
3938 }
3939
3940 if(UsefulBuf_Compare(B2, UsefulBuf_FromSZ("yyyy"))){
3941 return 1007;
3942 }
3943
3944 if(UsefulBuf_Compare(S2, UsefulBuf_FromSZ("string1"))){
3945 return 1008;
3946 }
3947
3948 if(UsefulBuf_Compare(S3, UsefulBuf_FromSZ("string2"))){
3949 return 1009;
3950 }
Laurence Lundblade937ea812020-05-08 11:38:23 -07003951
3952 // These tests confirm the cursor is at the right place after entering a map or array
3953
3954 // Confirm cursor is at right place
3955 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapEncoded), 0);
3956 QCBORDecode_EnterMap(&DCtx);
3957 QCBORDecode_GetNext(&DCtx, &Item1);
3958 if(Item1.uDataType != QCBOR_TYPE_INT64) {
3959 return 2001;
3960 }
3961
3962
3963 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapEncoded), 0);
3964 QCBORDecode_GetNext(&DCtx, &Item1);
3965 QCBORDecode_GetNext(&DCtx, &Item1);
3966 QCBORDecode_EnterArray(&DCtx);
3967 QCBORDecode_GetNext(&DCtx, &Item1);
3968 if(Item1.uDataType != QCBOR_TYPE_TEXT_STRING) {
3969 return 2002;
3970 }
3971
3972 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapEncoded), 0);
3973 QCBORDecode_EnterMap(&DCtx);
Laurence Lundblade64b607e2020-05-13 13:05:57 -07003974 QCBORDecode_GetNext(&DCtx, &Item1);
3975 QCBORDecode_GetNext(&DCtx, &Item1);
3976 QCBORDecode_GetNext(&DCtx, &Item1);
Laurence Lundblade937ea812020-05-08 11:38:23 -07003977 QCBORDecode_EnterMapFromMapSZ(&DCtx, "map in a map");
3978 QCBORDecode_GetNext(&DCtx, &Item1);
3979 if(Item1.uDataType != QCBOR_TYPE_BYTE_STRING) {
3980 return 2003;
3981 }
3982
3983 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapEncoded), 0);
3984 QCBORDecode_EnterMap(&DCtx);
3985 QCBORDecode_GetNext(&DCtx, &Item1);
3986 QCBORDecode_GetNext(&DCtx, &Item1);
3987 QCBORDecode_GetNext(&DCtx, &Item1);
3988 QCBORDecode_GetNext(&DCtx, &Item1);
3989 QCBORDecode_GetNext(&DCtx, &Item1);
3990 QCBORDecode_GetNext(&DCtx, &Item1);
3991 QCBORDecode_GetNext(&DCtx, &Item1);
3992 QCBORDecode_EnterArrayFromMapSZ(&DCtx, "an array of two strings");
3993 QCBORDecode_GetNext(&DCtx, &Item1);
3994 if(Item1.uDataType != QCBOR_TYPE_TEXT_STRING) {
Laurence Lundblade64b607e2020-05-13 13:05:57 -07003995 return 2004;
Laurence Lundblade937ea812020-05-08 11:38:23 -07003996 }
3997
Laurence Lundblade2b843b52020-06-16 20:51:03 -07003998 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapEncoded), 0);
3999 QCBORDecode_EnterMap(&DCtx);
4000 QCBORDecode_EnterArrayFromMapSZ(&DCtx, "an array of two strings");
4001 QCBORDecode_ExitArray(&DCtx);
4002 QCBORDecode_GetNext(&DCtx, &Item1);
4003 if(Item1.uDataType != QCBOR_TYPE_MAP && Item1.uLabelAlloc != QCBOR_TYPE_TEXT_STRING) {
4004 return 2006;
4005 }
4006 QCBORDecode_ExitMap(&DCtx);
4007 if(QCBORDecode_GetNext(&DCtx, &Item1) != QCBOR_ERR_NO_MORE_ITEMS) {
4008 return 2007;
4009 }
4010
Laurence Lundblade937ea812020-05-08 11:38:23 -07004011
Laurence Lundblade9c905e82020-04-25 11:31:38 -07004012 return 0;
4013}
4014
4015
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004016struct NumberConversion {
4017 char *szDescription;
4018 UsefulBufC CBOR;
4019 int64_t nConvertedToInt64;
4020 QCBORError uErrorInt64;
4021 uint64_t uConvertToUInt64;
4022 QCBORError uErrorUint64;
4023 double dConvertToDouble;
4024 QCBORError uErrorDouble;
4025};
4026
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004027static const struct NumberConversion NumberConversions[] = {
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004028 {
Laurence Lundbladeda095972020-06-06 18:35:33 -07004029 "negative bignum -1",
4030 {(uint8_t[]){0xc3, 0x41, 0x00}, 3},
4031 -1,
4032 QCBOR_SUCCESS,
4033 0,
4034 QCBOR_ERR_NUMBER_SIGN_CONVERSION,
4035 -1.0,
4036 QCBOR_SUCCESS
4037 },
4038 {
Laurence Lundblade9ab5abb2020-05-20 12:10:45 -07004039 "Decimal Fraction with positive bignum 257 * 10e3",
Laurence Lundblade887add82020-05-17 05:50:34 -07004040 {(uint8_t[]){0xC4, 0x82, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
4041 0xC2, 0x42, 0x01, 0x01}, 15},
4042 257000,
4043 QCBOR_SUCCESS,
4044 257000,
4045 QCBOR_SUCCESS,
4046 257000.0,
4047 QCBOR_SUCCESS
4048 },
4049 {
Laurence Lundbladeda095972020-06-06 18:35:33 -07004050 "bigfloat with negative bignum -258 * 2e3",
Laurence Lundblade887add82020-05-17 05:50:34 -07004051 {(uint8_t[]){0xC5, 0x82, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
4052 0xC3, 0x42, 0x01, 0x01}, 15},
Laurence Lundbladeda095972020-06-06 18:35:33 -07004053 -2064,
Laurence Lundblade887add82020-05-17 05:50:34 -07004054 QCBOR_SUCCESS,
4055 0,
4056 QCBOR_ERR_NUMBER_SIGN_CONVERSION,
Laurence Lundbladeda095972020-06-06 18:35:33 -07004057 -2064.0,
Laurence Lundblade887add82020-05-17 05:50:34 -07004058 QCBOR_SUCCESS
4059 },
4060 {
Laurence Lundblade9ab5abb2020-05-20 12:10:45 -07004061 "bigfloat with positive bignum 257 * 2e3",
Laurence Lundblade887add82020-05-17 05:50:34 -07004062 {(uint8_t[]){0xC5, 0x82, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
4063 0xC2, 0x42, 0x01, 0x01}, 15},
4064 2056,
4065 QCBOR_SUCCESS,
4066 2056,
4067 QCBOR_SUCCESS,
4068 2056.0,
4069 QCBOR_SUCCESS
4070 },
4071 {
Laurence Lundbladeda095972020-06-06 18:35:33 -07004072 "negative bignum 0xc349010000000000000000 -18446744073709551617",
Laurence Lundblade887add82020-05-17 05:50:34 -07004073 {(uint8_t[]){0xc3, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 11},
4074 0,
4075 QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
4076 0,
4077 QCBOR_ERR_NUMBER_SIGN_CONVERSION,
4078 -18446744073709551617.0,
4079 QCBOR_SUCCESS
4080 },
4081 {
Laurence Lundblade313b2862020-05-16 01:23:06 -07004082 "Positive bignum 0x01020304 indefinite length string",
4083 {(uint8_t[]){0xC2, 0x5f, 0x42, 0x01, 0x02, 0x41, 0x03, 0x41, 0x04, 0xff}, 10},
4084 0x01020304,
4085 QCBOR_SUCCESS,
4086 0x01020304,
4087 QCBOR_SUCCESS,
4088 16909060.0,
4089 QCBOR_SUCCESS
4090 },
4091 {
Laurence Lundblade887add82020-05-17 05:50:34 -07004092 "Decimal Fraction with neg bignum [9223372036854775807, -4759477275222530853137]",
Laurence Lundblade313b2862020-05-16 01:23:06 -07004093 {(uint8_t[]){0xC4, 0x82, 0x1B, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
4094 0xC3, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,}, 23},
4095 0,
4096 QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
4097 0,
4098 QCBOR_ERR_NUMBER_SIGN_CONVERSION,
4099 -INFINITY,
4100 QCBOR_SUCCESS
4101 },
4102 {
4103 "big float [9223372036854775806, 9223372036854775806]",
4104 {(uint8_t[]){0xC5, 0x82, 0x1B, 0x7f, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
4105 0x1B, 0x7f, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE}, 20},
4106 0,
4107 QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
4108 0,
4109 QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
4110 INFINITY,
4111 QCBOR_SUCCESS
4112 },
4113 {
Laurence Lundblade983500d2020-05-14 11:49:34 -07004114 "Big float 3 * 2^^2",
4115 {(uint8_t[]){0xC5, 0x82, 0x02, 0x03}, 4},
4116 12,
4117 QCBOR_SUCCESS,
4118 12,
4119 QCBOR_SUCCESS,
4120 12.0,
4121 QCBOR_SUCCESS
4122 },
Laurence Lundblade983500d2020-05-14 11:49:34 -07004123 {
Laurence Lundblade313b2862020-05-16 01:23:06 -07004124 "Positive integer 18446744073709551615",
Laurence Lundblade983500d2020-05-14 11:49:34 -07004125 {(uint8_t[]){0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, 9},
4126 0,
4127 QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
4128 18446744073709551615ULL,
4129 QCBOR_SUCCESS,
4130 18446744073709551615.0,
4131 QCBOR_SUCCESS
4132 },
Laurence Lundblade983500d2020-05-14 11:49:34 -07004133 {
Laurence Lundblade313b2862020-05-16 01:23:06 -07004134 "Positive bignum 0xffff",
Laurence Lundblade983500d2020-05-14 11:49:34 -07004135 {(uint8_t[]){0xC2, 0x42, 0xff, 0xff}, 4},
4136 65536-1,
4137 QCBOR_SUCCESS,
4138 0xffff,
4139 QCBOR_SUCCESS,
4140 65535.0,
4141 QCBOR_SUCCESS
4142 },
4143 {
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004144 "Postive integer 0",
4145 {(uint8_t[]){0x0}, 1},
4146 0LL,
4147 QCBOR_SUCCESS,
4148 0ULL,
4149 QCBOR_SUCCESS,
4150 0.0,
4151 QCBOR_SUCCESS
4152 },
4153 {
Laurence Lundblade313b2862020-05-16 01:23:06 -07004154 "Negative integer -18446744073709551616",
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004155 {(uint8_t[]){0x3b, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, 9},
4156 -9223372036854775807-1, // INT64_MIN
4157 QCBOR_SUCCESS,
4158 0ULL,
4159 QCBOR_ERR_NUMBER_SIGN_CONVERSION,
4160 -9223372036854775808.0,
4161 QCBOR_SUCCESS
4162 },
4163 {
Laurence Lundblade313b2862020-05-16 01:23:06 -07004164 "Double Floating point value 100.3",
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004165 {(uint8_t[]){0xfb, 0x40, 0x59, 0x13, 0x33, 0x33, 0x33, 0x33, 0x33}, 9},
4166 100L,
4167 QCBOR_SUCCESS,
4168 100ULL,
4169 QCBOR_SUCCESS,
4170 100.3,
4171 QCBOR_SUCCESS
4172 },
4173 {
4174 "Floating point value NaN 0xfa7fc00000",
4175 {(uint8_t[]){0xfa, 0x7f, 0xc0, 0x00, 0x00}, 5},
4176 0,
4177 QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
4178 0,
4179 QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
4180 NAN,
4181 QCBOR_SUCCESS
4182 },
4183 {
Laurence Lundblade313b2862020-05-16 01:23:06 -07004184 "half-precision Floating point value -4",
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004185 {(uint8_t[]){0xf9, 0xc4, 0x00}, 3},
4186 -4,
4187 QCBOR_SUCCESS,
4188 0,
4189 QCBOR_ERR_NUMBER_SIGN_CONVERSION,
4190 -4.0,
4191 QCBOR_SUCCESS
4192 },
4193 {
4194 "Decimal fraction 3/10",
4195 {(uint8_t[]){0xC4, 0x82, 0x20, 0x03}, 4},
4196 0,
4197 QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
4198 0,
4199 QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
4200 0.30000000000000004,
4201 QCBOR_SUCCESS
4202 }
4203};
Laurence Lundblade9c905e82020-04-25 11:31:38 -07004204
4205
4206
Laurence Lundblade313b2862020-05-16 01:23:06 -07004207int32_t IntegerConvertTest()
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004208{
Laurence Lundblade9ab5abb2020-05-20 12:10:45 -07004209 const int nNumTests = sizeof(NumberConversions)/sizeof(struct NumberConversion);
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004210
Laurence Lundblade9ab5abb2020-05-20 12:10:45 -07004211 for(int nIndex = 0; nIndex < nNumTests; nIndex++) {
4212 const struct NumberConversion *pF = &NumberConversions[nIndex];
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004213
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004214 // Set up the decoding context including a memory pool so that
4215 // indefinite length items can be checked
4216 QCBORDecodeContext DCtx;
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004217 UsefulBuf_MAKE_STACK_UB(Pool, 100);
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004218
4219 /* ----- test conversion to int64_t ------ */
4220 QCBORDecode_Init(&DCtx, pF->CBOR, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004221 QCBORError nCBORError = QCBORDecode_SetMemPool(&DCtx, Pool, 0);
4222 if(nCBORError) {
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004223 return (int32_t)(1000+nIndex);
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004224 }
4225
4226 int64_t nInt;
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004227 QCBORDecode_GetInt64ConvertAll(&DCtx, 0xffff, &nInt);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004228 if(QCBORDecode_GetError(&DCtx) != pF->uErrorInt64) {
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004229 return (int32_t)(2000+nIndex);
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004230 }
4231 if(pF->uErrorInt64 == QCBOR_SUCCESS && pF->nConvertedToInt64 != nInt) {
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004232 return (int32_t)(3000+nIndex);
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004233 }
4234
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004235 /* ----- test conversion to uint64_t ------ */
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004236 QCBORDecode_Init(&DCtx, pF->CBOR, QCBOR_DECODE_MODE_NORMAL);
4237 nCBORError = QCBORDecode_SetMemPool(&DCtx, Pool, 0);
4238 if(nCBORError) {
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004239 return (int32_t)(1000+nIndex);
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004240 }
4241 uint64_t uInt;
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004242 QCBORDecode_GetUInt64ConvertAll(&DCtx, 0xffff, &uInt);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004243 if(QCBORDecode_GetError(&DCtx) != pF->uErrorUint64) {
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004244 return (int32_t)(4000+nIndex);
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004245 }
4246 if(pF->uErrorUint64 == QCBOR_SUCCESS && pF->uConvertToUInt64 != uInt) {
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004247 return (int32_t)(5000+nIndex);
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004248 }
4249
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004250 /* ----- test conversion to double ------ */
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004251 QCBORDecode_Init(&DCtx, pF->CBOR, QCBOR_DECODE_MODE_NORMAL);
4252 nCBORError = QCBORDecode_SetMemPool(&DCtx, Pool, 0);
4253 if(nCBORError) {
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004254 return (int32_t)(1000+nIndex);
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004255 }
4256 double d;
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004257 QCBORDecode_GetDoubleConvertAll(&DCtx, 0xffff, &d);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004258 if(QCBORDecode_GetError(&DCtx) != pF->uErrorDouble) {
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004259 return (int32_t)(6000+nIndex);
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004260 }
4261 if(pF->uErrorDouble == QCBOR_SUCCESS) {
4262 if(isnan(pF->dConvertToDouble)) {
Laurence Lundblade983500d2020-05-14 11:49:34 -07004263 // NaN's can't be compared for equality. A NaN is
4264 // never equal to anything including another NaN
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004265 if(!isnan(d)) {
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004266 return (int32_t)(7000+nIndex);
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004267 }
4268 } else {
4269 // TODO: this comparison may need a margin of error
4270 if(pF->dConvertToDouble != d) {
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004271 return (int32_t)(8000+nIndex);
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004272 }
4273 }
4274 }
4275 }
4276
4277 return 0;
4278}
4279
Laurence Lundblade313b2862020-05-16 01:23:06 -07004280int32_t IntegerConvertTestOld()
Laurence Lundblade9c905e82020-04-25 11:31:38 -07004281{
Laurence Lundblade9c905e82020-04-25 11:31:38 -07004282 QCBORDecodeContext DCtx;
4283 QCBORError nCBORError;
4284
Laurence Lundbladea826c502020-05-10 21:07:00 -07004285 /* exponent, mantissa
Laurence Lundblade9c905e82020-04-25 11:31:38 -07004286 [
4287 4([-1, 3]),
4288 4([-20, 4759477275222530853136]),
4289 4([9223372036854775807, -4759477275222530853137]),
4290 5([300, 100]),
4291 5([-20, 4759477275222530853136]),
4292 5([-9223372036854775807, -4759477275222530853137])
Laurence Lundbladea826c502020-05-10 21:07:00 -07004293 5([ 9223372036854775806, -4759477275222530853137])
4294 5([ 9223372036854775806, 9223372036854775806])]
Laurence Lundblade9c905e82020-04-25 11:31:38 -07004295 ]
4296 */
4297
4298 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spExpectedExponentsAndMantissas), 0);
4299
4300 QCBORItem Item;
4301 nCBORError = QCBORDecode_GetNext(&DCtx, &Item);
4302 if(nCBORError) {
4303 return -1;
4304 }
4305
4306 int64_t integer;
Laurence Lundbladea826c502020-05-10 21:07:00 -07004307 // 4([-1, 3]),
Laurence Lundblade9c905e82020-04-25 11:31:38 -07004308 QCBORDecode_GetInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION, &integer);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004309 if(QCBORDecode_GetError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
Laurence Lundblade9c905e82020-04-25 11:31:38 -07004310 return -2;
4311 }
4312 DCtx.uLastError = 0; // TODO: a method for this
4313
Laurence Lundbladea826c502020-05-10 21:07:00 -07004314 // 4([-20, 4759477275222530853136]),
Laurence Lundblade9c905e82020-04-25 11:31:38 -07004315 QCBORDecode_GetInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION, &integer);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004316 if(QCBORDecode_GetError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
Laurence Lundblade9c905e82020-04-25 11:31:38 -07004317 return -2;
4318 }
4319 DCtx.uLastError = 0; // TODO: a method for this
4320
Laurence Lundbladea826c502020-05-10 21:07:00 -07004321 // 4([9223372036854775807, -4759477275222530853137]),
4322 QCBORDecode_GetInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION, &integer);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004323 if(QCBORDecode_GetError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
Laurence Lundbladea826c502020-05-10 21:07:00 -07004324 return -2;
4325 }
4326 DCtx.uLastError = 0; // TODO: a method for this
4327
4328 // 5([300, 100]),
Laurence Lundblade9c905e82020-04-25 11:31:38 -07004329 QCBORDecode_GetInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION|QCBOR_CONVERT_TYPE_BIGFLOAT, &integer);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004330 if(QCBORDecode_GetError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
Laurence Lundblade9c905e82020-04-25 11:31:38 -07004331 return -2;
4332 }
4333 DCtx.uLastError = 0; // TODO: a method for this
4334
Laurence Lundbladea826c502020-05-10 21:07:00 -07004335 // 5([-20, 4759477275222530853136]),
Laurence Lundblade9c905e82020-04-25 11:31:38 -07004336 QCBORDecode_GetInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION|QCBOR_CONVERT_TYPE_BIGFLOAT, &integer);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004337 if(QCBORDecode_GetError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
Laurence Lundblade9c905e82020-04-25 11:31:38 -07004338 return -2;
4339 }
4340 DCtx.uLastError = 0; // TODO: a method for this
4341
Laurence Lundbladea826c502020-05-10 21:07:00 -07004342 // 5([-9223372036854775807, -4759477275222530853137])
4343 QCBORDecode_GetInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION|QCBOR_CONVERT_TYPE_BIGFLOAT, &integer);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004344 if(QCBORDecode_GetError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
Laurence Lundbladea826c502020-05-10 21:07:00 -07004345 return -2;
4346 }
4347 DCtx.uLastError = 0; // TODO: a method for this
4348
4349 // 5([ 9223372036854775806, -4759477275222530853137])
4350 QCBORDecode_GetInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION|QCBOR_CONVERT_TYPE_BIGFLOAT, &integer);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004351 if(QCBORDecode_GetError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
Laurence Lundbladea826c502020-05-10 21:07:00 -07004352 return -2;
4353 }
4354 DCtx.uLastError = 0; // TODO: a method for this
4355
4356 // 5([ 9223372036854775806, 9223372036854775806])]
4357 QCBORDecode_GetInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION|QCBOR_CONVERT_TYPE_BIGFLOAT, &integer);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004358 if(QCBORDecode_GetError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
Laurence Lundbladea826c502020-05-10 21:07:00 -07004359 return -2;
4360 }
4361 DCtx.uLastError = 0; // TODO: a method for this
4362
4363
4364
4365 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spExpectedExponentsAndMantissas), 0);
4366
4367 nCBORError = QCBORDecode_GetNext(&DCtx, &Item);
4368 if(nCBORError) {
4369 return -1;
4370 }
4371
4372 uint64_t uinteger;
4373 // 4([-1, 3]),
4374 QCBORDecode_GetUInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION, &uinteger);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004375 if(QCBORDecode_GetError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
Laurence Lundbladea826c502020-05-10 21:07:00 -07004376 return -2;
4377 }
4378 DCtx.uLastError = 0; // TODO: a method for this
4379
4380 // 4([-20, 4759477275222530853136]),
4381 QCBORDecode_GetUInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION, &uinteger);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004382 if(QCBORDecode_GetError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
Laurence Lundbladea826c502020-05-10 21:07:00 -07004383 return -2;
4384 }
4385 DCtx.uLastError = 0; // TODO: a method for this
4386
4387 // 4([9223372036854775807, -4759477275222530853137]),
4388 QCBORDecode_GetUInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION, &uinteger);
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004389 if(QCBORDecode_GetError(&DCtx) != QCBOR_ERR_NUMBER_SIGN_CONVERSION) {
Laurence Lundbladea826c502020-05-10 21:07:00 -07004390 return -2;
4391 }
4392 DCtx.uLastError = 0; // TODO: a method for this
4393
4394 // 5([300, 100]),
4395 QCBORDecode_GetUInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION|QCBOR_CONVERT_TYPE_BIGFLOAT, &uinteger);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004396 if(QCBORDecode_GetError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
Laurence Lundbladea826c502020-05-10 21:07:00 -07004397 return -2;
4398 }
4399 DCtx.uLastError = 0; // TODO: a method for this
4400
4401 // 5([-20, 4759477275222530853136]),
4402 QCBORDecode_GetUInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION|QCBOR_CONVERT_TYPE_BIGFLOAT, &uinteger);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004403 if(QCBORDecode_GetError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
Laurence Lundbladea826c502020-05-10 21:07:00 -07004404 return -2;
4405 }
4406 DCtx.uLastError = 0; // TODO: a method for this
4407
4408 // 5([-9223372036854775807, -4759477275222530853137])
4409 QCBORDecode_GetUInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION|QCBOR_CONVERT_TYPE_BIGFLOAT, &uinteger);
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004410 if(QCBORDecode_GetError(&DCtx) != QCBOR_ERR_NUMBER_SIGN_CONVERSION) {
Laurence Lundbladea826c502020-05-10 21:07:00 -07004411 return -2;
4412 }
4413 DCtx.uLastError = 0; // TODO: a method for this
4414
4415 // 5([ 9223372036854775806, -4759477275222530853137])
4416 QCBORDecode_GetUInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION|QCBOR_CONVERT_TYPE_BIGFLOAT, &uinteger);
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004417 if(QCBORDecode_GetError(&DCtx) != QCBOR_ERR_NUMBER_SIGN_CONVERSION) {
Laurence Lundbladea826c502020-05-10 21:07:00 -07004418 return -2;
4419 }
4420 DCtx.uLastError = 0; // TODO: a method for this
4421
4422 // 5([ 9223372036854775806, 9223372036854775806])]
4423 QCBORDecode_GetUInt64ConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION|QCBOR_CONVERT_TYPE_BIGFLOAT, &uinteger);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004424 if(QCBORDecode_GetError(&DCtx) != QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW) {
Laurence Lundbladea826c502020-05-10 21:07:00 -07004425 return -2;
4426 }
4427 DCtx.uLastError = 0; // TODO: a method for this
4428
4429
4430
4431 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spExpectedExponentsAndMantissas), 0);
4432 nCBORError = QCBORDecode_GetNext(&DCtx, &Item);
4433 if(nCBORError) {
4434 return -1;
4435 }
4436
4437 double dResult;
4438 // 4([-1, 3]),
4439 QCBORDecode_GetDoubleConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION, &dResult);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004440 if(QCBORDecode_GetError(&DCtx) != QCBOR_SUCCESS &&
Laurence Lundbladea826c502020-05-10 21:07:00 -07004441 dResult != 0.3) {
4442 return -2;
4443 }
4444
4445 // 4([-20, 4759477275222530853136]),
4446 QCBORDecode_GetDoubleConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION, &dResult);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004447 if(QCBORDecode_GetError(&DCtx) != QCBOR_SUCCESS &&
Laurence Lundbladea826c502020-05-10 21:07:00 -07004448 dResult != 47.408855671161923) {
4449 return -2;
4450 }
4451
4452 // 4([9223372036854775807, -4759477275222530853137]),
4453 QCBORDecode_GetDoubleConvertAll(&DCtx, QCBOR_CONVERT_TYPE_DECIMAL_FRACTION, &dResult);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004454 if(QCBORDecode_GetError(&DCtx) != QCBOR_SUCCESS &&
Laurence Lundbladea826c502020-05-10 21:07:00 -07004455 dResult != -INFINITY) {
4456 return -2;
4457 }
4458
4459 // 5([300, 100]),
4460 QCBORDecode_GetDoubleConvertAll(&DCtx, QCBOR_CONVERT_TYPE_BIGFLOAT, &dResult);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004461 if(QCBORDecode_GetError(&DCtx) != QCBOR_SUCCESS &&
Laurence Lundbladea826c502020-05-10 21:07:00 -07004462 dResult != -INFINITY) {
4463 return -2;
4464 }
4465
4466 // 5([-20, 4759477275222530853136]),
4467 QCBORDecode_GetDoubleConvertAll(&DCtx, QCBOR_CONVERT_TYPE_BIGFLOAT, &dResult);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004468 if(QCBORDecode_GetError(&DCtx) != QCBOR_SUCCESS &&
Laurence Lundbladea826c502020-05-10 21:07:00 -07004469 dResult != 4521260802379792.0) {
4470 return -2;
4471 }
4472
4473 // 5([-9223372036854775807, -4759477275222530853137])
4474 QCBORDecode_GetDoubleConvertAll(&DCtx, QCBOR_CONVERT_TYPE_BIGFLOAT, &dResult);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004475 if(QCBORDecode_GetError(&DCtx) != QCBOR_SUCCESS &&
Laurence Lundbladea826c502020-05-10 21:07:00 -07004476 dResult != -0.0) {
4477 return -2;
4478 }
4479
4480 // 5([9223372036854775806, 9223372036854775806])]
4481 QCBORDecode_GetDoubleConvertAll(&DCtx, QCBOR_CONVERT_TYPE_BIGFLOAT, &dResult);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004482 if(QCBORDecode_GetError(&DCtx) != QCBOR_SUCCESS &&
Laurence Lundbladea826c502020-05-10 21:07:00 -07004483 dResult != INFINITY) {
4484 return -2;
4485 }
4486
Laurence Lundbladebb87be22020-04-09 19:15:32 -07004487 return 0;
Laurence Lundbladebb87be22020-04-09 19:15:32 -07004488}
Laurence Lundblade97c61bf2020-05-02 11:24:06 -07004489
4490
Laurence Lundbladee3553422020-05-02 11:11:17 -07004491int32_t CBORSequenceDecodeTests(void)
4492{
4493 QCBORDecodeContext DCtx;
4494 QCBORItem Item;
4495 QCBORError uCBORError;
4496
4497 // --- Test a sequence with extra bytes ---
4498
4499 // The input for the date test happens to be a sequence so it
4500 // is reused. It is a sequence because it doesn't start as
4501 // an array or map.
4502 QCBORDecode_Init(&DCtx,
4503 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spDateTestInput),
4504 QCBOR_DECODE_MODE_NORMAL);
4505
4506 // Get the first item
4507 uCBORError = QCBORDecode_GetNext(&DCtx, &Item);
4508 if(uCBORError != QCBOR_SUCCESS) {
4509 return 1;
4510 }
4511 if(Item.uDataType != QCBOR_TYPE_DATE_STRING) {
4512 return 2;
4513 }
4514
4515 // Get a second item
4516 uCBORError = QCBORDecode_GetNext(&DCtx, &Item);
4517 if(uCBORError != QCBOR_SUCCESS) {
4518 return 2;
4519 }
4520 if(Item.uDataType != QCBOR_TYPE_DATE_EPOCH) {
4521 return 3;
4522 }
4523
4524 // A sequence can have stuff at the end that may
4525 // or may not be valid CBOR. The protocol decoder knows
4526 // when to stop by definition of the protocol, not
4527 // when the top-level map or array is ended.
4528 // Finish still has to be called to know that
4529 // maps and arrays (if there were any) were closed
4530 // off correctly. When called like this it
4531 // must return the error QCBOR_ERR_EXTRA_BYTES.
4532 uCBORError = QCBORDecode_Finish(&DCtx);
4533 if(uCBORError != QCBOR_ERR_EXTRA_BYTES) {
4534 return 4;
4535 }
4536
4537
4538 // --- Test an empty input ----
4539 uint8_t empty[1];
4540 UsefulBufC Empty = {empty, 0};
4541 QCBORDecode_Init(&DCtx,
4542 Empty,
4543 QCBOR_DECODE_MODE_NORMAL);
4544
4545 uCBORError = QCBORDecode_Finish(&DCtx);
4546 if(uCBORError != QCBOR_SUCCESS) {
4547 return 5;
4548 }
4549
4550
4551 // --- Sequence with unclosed indefinite length array ---
4552 static const uint8_t xx[] = {0x01, 0x9f, 0x02};
4553
4554 QCBORDecode_Init(&DCtx,
4555 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(xx),
4556 QCBOR_DECODE_MODE_NORMAL);
4557
4558 // Get the first item
4559 uCBORError = QCBORDecode_GetNext(&DCtx, &Item);
4560 if(uCBORError != QCBOR_SUCCESS) {
4561 return 7;
4562 }
4563 if(Item.uDataType != QCBOR_TYPE_INT64) {
4564 return 8;
4565 }
4566
4567 // Get a second item
4568 uCBORError = QCBORDecode_GetNext(&DCtx, &Item);
4569 if(uCBORError != QCBOR_SUCCESS) {
4570 return 9;
4571 }
4572 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
4573 return 10;
4574 }
4575
4576 // Try to finish before consuming all bytes to confirm
4577 // that the still-open error is returned.
4578 uCBORError = QCBORDecode_Finish(&DCtx);
4579 if(uCBORError != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
4580 return 11;
4581 }
4582
4583
4584 // --- Sequence with a closed indefinite length array ---
4585 static const uint8_t yy[] = {0x01, 0x9f, 0xff};
4586
4587 QCBORDecode_Init(&DCtx,
4588 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(yy),
4589 QCBOR_DECODE_MODE_NORMAL);
4590
4591 // Get the first item
4592 uCBORError = QCBORDecode_GetNext(&DCtx, &Item);
4593 if(uCBORError != QCBOR_SUCCESS) {
4594 return 12;
4595 }
4596 if(Item.uDataType != QCBOR_TYPE_INT64) {
4597 return 13;
4598 }
4599
4600 // Get a second item
4601 uCBORError = QCBORDecode_GetNext(&DCtx, &Item);
4602 if(uCBORError != QCBOR_SUCCESS) {
4603 return 14;
4604 }
4605 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
4606 return 15;
4607 }
4608
4609 // Try to finish before consuming all bytes to confirm
4610 // that the still-open error is returned.
4611 uCBORError = QCBORDecode_Finish(&DCtx);
4612 if(uCBORError != QCBOR_SUCCESS) {
4613 return 16;
4614 }
4615
4616
4617 return 0;
4618}
4619
Laurence Lundbladee15326f2020-06-15 15:50:23 -07004620
Laurence Lundblade70ecead2020-06-15 19:40:06 -07004621
Laurence Lundbladee15326f2020-06-15 15:50:23 -07004622int32_t IntToTests()
4623{
4624 int nErrCode;
4625 int32_t n32;
4626 int16_t n16;
4627 int8_t n8;
4628 uint32_t u32;
4629 uint16_t u16;
4630 uint8_t u8;
4631 uint64_t u64;
4632
4633 nErrCode = QCBOR_Int64ToInt32(1, &n32);
4634 if(nErrCode == -1 || n32 != 1) {
4635 return 1;
4636 }
4637
4638 nErrCode = QCBOR_Int64ToInt32((int64_t)INT32_MAX, &n32);
4639 if(nErrCode == -1 || n32 != INT32_MAX) {
4640 return 2;
4641 }
4642
4643 nErrCode = QCBOR_Int64ToInt32((int64_t)INT32_MIN, &n32);
4644 if(nErrCode == -1 || n32 != INT32_MIN) {
4645 return 3;
4646 }
4647
4648 nErrCode = QCBOR_Int64ToInt32(((int64_t)INT32_MAX)+1, &n32);
4649 if(nErrCode != -1) {
4650 return 4;
4651 }
4652
4653 nErrCode = QCBOR_Int64ToInt32(((int64_t)INT32_MIN)-1, &n32);
4654 if(nErrCode != -1) {
4655 return 5;
4656 }
4657
4658
4659 nErrCode = QCBOR_Int64ToInt16((int64_t)INT16_MAX, &n16);
4660 if(nErrCode == -1 || n16 != INT16_MAX) {
4661 return 6;
4662 }
4663
4664 nErrCode = QCBOR_Int64ToInt16((int64_t)INT16_MIN, &n16);
4665 if(nErrCode == -1 || n16 != INT16_MIN) {
4666 return 7;
4667 }
4668
4669 nErrCode = QCBOR_Int64ToInt16(1, &n16);
4670 if(nErrCode == -1 || n16 != 1) {
4671 return 8;
4672 }
4673
4674 nErrCode = QCBOR_Int64ToInt16(((int64_t)INT16_MAX)+1, &n16);
4675 if(nErrCode != -1) {
4676 return 9;
4677 }
4678
4679 nErrCode = QCBOR_Int64ToInt16(((int64_t)INT16_MIN)-1, &n16);
4680 if(nErrCode != -1) {
4681 return 10;
4682 }
4683
4684
4685 nErrCode = QCBOR_Int64ToInt8(1, &n8);
4686 if(nErrCode == -1 || n8 != 1) {
4687 return 11;
4688 }
4689
4690 nErrCode = QCBOR_Int64ToInt8((int64_t)INT8_MAX, &n8);
4691 if(nErrCode == -1 || n8 != INT8_MAX) {
4692 return 12;
4693 }
4694
4695 nErrCode = QCBOR_Int64ToInt8((int64_t)INT8_MIN, &n8);
4696 if(nErrCode == -1 || n8 != INT8_MIN) {
4697 return 13;
4698 }
4699
4700 nErrCode = QCBOR_Int64ToInt8(((int64_t)INT8_MAX)+1, &n8);
4701 if(nErrCode != -1) {
4702 return 14;
4703 }
4704
4705 nErrCode = QCBOR_Int64ToInt8(((int64_t)INT8_MIN)-1, &n8);
4706 if(nErrCode != -1) {
4707 return 15;
4708 }
4709
4710
4711 nErrCode = QCBOR_Int64ToUInt32(1, &u32);
4712 if(nErrCode == -1 || u32 != 1) {
4713 return 16;
4714 }
4715
4716 nErrCode = QCBOR_Int64ToUInt32((int64_t)UINT32_MAX, &u32);
4717 if(nErrCode == -1 || u32 != UINT32_MAX) {
4718 return 17;
4719 }
4720
4721 nErrCode = QCBOR_Int64ToUInt32((int64_t)0, &u32);
4722 if(nErrCode == -1 || u32 != 0) {
4723 return 18;
4724 }
4725
4726 nErrCode = QCBOR_Int64ToUInt32(((int64_t)UINT32_MAX)+1, &u32);
4727 if(nErrCode != -1) {
4728 return 19;
4729 }
4730
4731 nErrCode = QCBOR_Int64ToUInt32((int64_t)-1, &u32);
4732 if(nErrCode != -1) {
4733 return 20;
4734 }
4735
4736
4737 nErrCode = QCBOR_Int64UToInt16((int64_t)UINT16_MAX, &u16);
4738 if(nErrCode == -1 || u16 != UINT16_MAX) {
4739 return 21;
4740 }
4741
4742 nErrCode = QCBOR_Int64UToInt16((int64_t)0, &u16);
4743 if(nErrCode == -1 || u16 != 0) {
4744 return 22;
4745 }
4746
4747 nErrCode = QCBOR_Int64UToInt16(1, &u16);
4748 if(nErrCode == -1 || u16 != 1) {
4749 return 23;
4750 }
4751
4752 nErrCode = QCBOR_Int64UToInt16(((int64_t)UINT16_MAX)+1, &u16);
4753 if(nErrCode != -1) {
4754 return 24;
4755 }
4756
4757 nErrCode = QCBOR_Int64UToInt16((int64_t)-1, &u16);
4758 if(nErrCode != -1) {
4759 return 25;
4760 }
4761
4762
4763 nErrCode = QCBOR_Int64ToUInt8((int64_t)UINT8_MAX, &u8);
4764 if(nErrCode == -1 || u8 != UINT8_MAX) {
4765 return 26;
4766 }
4767
4768 nErrCode = QCBOR_Int64ToUInt8((int64_t)0, &u8);
4769 if(nErrCode == -1 || u8 != 0) {
4770 return 27;
4771 }
4772
4773 nErrCode = QCBOR_Int64ToUInt8(1, &u8);
4774 if(nErrCode == -1 || u8 != 1) {
4775 return 28;
4776 }
4777
4778 nErrCode = QCBOR_Int64ToUInt8(((int64_t)UINT16_MAX)+1, &u8);
4779 if(nErrCode != -1) {
4780 return 29;
4781 }
4782
4783 nErrCode = QCBOR_Int64ToUInt8((int64_t)-1, &u8);
4784 if(nErrCode != -1) {
4785 return 30;
4786 }
4787
4788
4789 nErrCode = QCBOR_Int64ToUInt64(1, &u64);
4790 if(nErrCode == -1 || u64 != 1) {
4791 return 31;
4792 }
4793
4794 nErrCode = QCBOR_Int64ToUInt64(INT64_MAX, &u64);
4795 if(nErrCode == -1 || u64 != INT64_MAX) {
4796 return 32;
4797 }
4798
4799 nErrCode = QCBOR_Int64ToUInt64((int64_t)0, &u64);
4800 if(nErrCode == -1 || u64 != 0) {
4801 return 33;
4802 }
4803
4804 nErrCode = QCBOR_Int64ToUInt64((int64_t)-1, &u64);
4805 if(nErrCode != -1) {
4806 return 34;
4807 }
4808
4809 return 0;
4810}
4811
Laurence Lundblade0750fc42020-06-20 21:02:34 -07004812
4813/*
4814A sequence with
4815 A wrapping bstr
4816 containing a map
4817 1
4818 2
4819 A wrapping bstr
4820 containing an array
4821 3
4822 wrapping bstr
4823 4
4824 5
4825 6
4826 array
4827 7
4828 8
4829
4830 */
4831
4832static UsefulBufC foo(UsefulBuf ffo)
4833{
4834 UsefulBufC Encoded;
4835 QCBOREncodeContext EC;
4836 QCBORError uErr;
4837
4838 QCBOREncode_Init(&EC, ffo);
4839
4840 QCBOREncode_BstrWrap(&EC);
4841 QCBOREncode_OpenMap(&EC);
4842 QCBOREncode_AddInt64ToMapN(&EC, 100, 1);
4843 QCBOREncode_AddInt64ToMapN(&EC, 200, 2);
4844 QCBOREncode_CloseMap(&EC);
4845 QCBOREncode_BstrWrap(&EC);
4846 QCBOREncode_OpenArray(&EC);
4847 QCBOREncode_AddInt64(&EC, 3);
4848 QCBOREncode_BstrWrap(&EC);
4849 QCBOREncode_AddInt64(&EC, 4);
4850 QCBOREncode_CloseBstrWrap(&EC, NULL);
4851 QCBOREncode_AddInt64(&EC, 5);
4852 QCBOREncode_CloseArray(&EC);
4853 QCBOREncode_CloseBstrWrap(&EC, NULL);
4854 QCBOREncode_AddInt64(&EC, 6);
4855 QCBOREncode_CloseBstrWrap(&EC, NULL);
4856 QCBOREncode_OpenArray(&EC);
4857 QCBOREncode_AddInt64(&EC, 7);
4858 QCBOREncode_AddInt64(&EC, 8);
4859 QCBOREncode_CloseArray(&EC);
4860
4861 uErr = QCBOREncode_Finish(&EC, &Encoded);
4862
4863 return Encoded;
4864}
4865
4866
4867int32_t EnterBstrTest()
4868{
4869 MakeUsefulBufOnStack(ffo, 100);
4870
4871 QCBORDecodeContext DC;
4872
4873 QCBORDecode_Init(&DC, foo(ffo), 0);
4874
4875 int64_t i1, i2, i3, i4, i5, i6, i7, i8;
4876
4877
4878 QCBORDecode_EnterBstrWrapped(&DC, QCBOR_TAGSPEC_MATCH_TAG_CONTENT_TYPE, NULL);
4879 QCBORDecode_EnterMap(&DC);
4880 QCBORDecode_GetInt64InMapN(&DC, 100, &i1);
4881 QCBORDecode_GetInt64InMapN(&DC, 200, &i2);
4882 QCBORDecode_ExitMap(&DC);
4883 QCBORDecode_EnterBstrWrapped(&DC, QCBOR_TAGSPEC_MATCH_TAG_CONTENT_TYPE, NULL);
4884 QCBORDecode_EnterArray(&DC);
4885 QCBORDecode_GetInt64(&DC, &i3);
4886 QCBORDecode_EnterBstrWrapped(&DC, QCBOR_TAGSPEC_MATCH_TAG_CONTENT_TYPE, NULL);
4887 QCBORDecode_GetInt64(&DC, &i4);
4888 QCBORDecode_ExitBstrWrapped(&DC);
4889 QCBORDecode_GetInt64(&DC, &i5);
4890 QCBORDecode_ExitArray(&DC);
4891 QCBORDecode_ExitBstrWrapped(&DC);
4892 QCBORDecode_GetInt64(&DC, &i6);
4893 QCBORDecode_ExitBstrWrapped(&DC);
4894 QCBORDecode_EnterArray(&DC);
4895 QCBORDecode_GetInt64(&DC, &i7);
4896 QCBORDecode_GetInt64(&DC, &i8);
4897 QCBORDecode_ExitArray(&DC);
4898
4899 QCBORError uErr = QCBORDecode_Finish(&DC);
4900
4901 return (int32_t)uErr;
4902}