blob: 2c95a00d53d8935dfded9ee269e3545670ecaca5 [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;
Laurence Lundblade29497c02020-07-11 15:44:03 -070094 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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade2ded3d92018-10-09 21:36:11 +0800374 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundblade29497c02020-07-11 15:44:03 -0700375 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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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
727 // An map with 3 items
728 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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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 Lundblade29497c02020-07-11 15:44:03 -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);
1614 QCBORError nCBORError = QCBORDecode_SetMemPool(&DCtx, Pool, 0);
1615 if(nCBORError) {
1616 return -9;
1617 }
1618
1619 // Iterate until there is an error of some sort error
1620 QCBORItem Item;
1621 do {
1622 // Set to something none-zero other than QCBOR_TYPE_NONE
1623 memset(&Item, 0x33, sizeof(Item));
1624
1625 nCBORError = QCBORDecode_GetNext(&DCtx, &Item);
1626 } while(nCBORError == QCBOR_SUCCESS);
1627
1628 // Must get the expected error or the this test fails
1629 // The data and label type must also be QCBOR_TYPE_NONE
1630 if(nCBORError != pF->nError ||
1631 Item.uDataType != QCBOR_TYPE_NONE ||
1632 Item.uLabelType != QCBOR_TYPE_NONE) {
Laurence Lundblade06350ea2020-01-27 19:32:40 -08001633 // return index of CBOR + 100
1634 const size_t nIndex = (size_t)(pF - pFailInputs)/sizeof(struct FailInput);
1635 return (int32_t)(nIndex * 100 + nCBORError);
Laurence Lundblade59289e52019-12-30 13:44:37 -08001636 }
1637 }
1638
1639 return 0;
1640}
1641
1642
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001643struct FailInput Failures[] = {
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001644 // Most of this is copied from not_well_formed.h. Here the error code
1645 // returned is also checked.
1646
1647 // Indefinite length strings must be closed off
1648 // An indefinite length byte string not closed off
1649 { {(uint8_t[]){0x5f, 0x41, 0x00}, 3}, QCBOR_ERR_HIT_END },
1650 // An indefinite length text string not closed off
1651 { {(uint8_t[]){0x7f, 0x61, 0x00}, 3}, QCBOR_ERR_HIT_END },
1652
1653
1654 // All the chunks in an indefinite length string must be of the type of indefinite length string
1655 // indefinite length byte string with text string chunk
1656 { {(uint8_t[]){0x5f, 0x61, 0x00, 0xff}, 4}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1657 // indefinite length text string with a byte string chunk
1658 { {(uint8_t[]){0x7f, 0x41, 0x00, 0xff}, 4}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1659 // indefinite length byte string with an positive integer chunk
1660 { {(uint8_t[]){0x5f, 0x00, 0xff}, 3}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1661 // indefinite length byte string with an negative integer chunk
1662 { {(uint8_t[]){0x5f, 0x21, 0xff}, 3}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1663 // indefinite length byte string with an array chunk
1664 { {(uint8_t[]){0x5f, 0x80, 0xff}, 3}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1665 // indefinite length byte string with an map chunk
1666 { {(uint8_t[]){0x5f, 0xa0, 0xff}, 3}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1667 // indefinite length byte string with tagged integer chunk
1668 { {(uint8_t[]){0x5f, 0xc0, 0x00, 0xff}, 4}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1669 // indefinite length byte string with an simple type chunk
1670 { {(uint8_t[]){0x5f, 0xe0, 0xff}, 3}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1671 { {(uint8_t[]){0x5f, 0x5f, 0x41, 0x00, 0xff, 0xff}, 6}, QCBOR_ERR_INDEFINITE_STRING_CHUNK},
1672 // indefinite length text string with indefinite string inside
1673 { {(uint8_t[]){0x7f, 0x7f, 0x61, 0x00, 0xff, 0xff}, 6}, QCBOR_ERR_INDEFINITE_STRING_CHUNK},
1674
1675
1676 // Definte length maps and arrays must be closed by having the right number of items
1677 // A definte length array that is supposed to have 1 item, but has none
1678 { {(uint8_t[]){0x81}, 1}, QCBOR_ERR_HIT_END },
1679 // A definte length array that is supposed to have 2 items, but has only 1
1680 { {(uint8_t[]){0x82, 0x00}, 2}, QCBOR_ERR_HIT_END },
1681 // A definte length array that is supposed to have 511 items, but has only 1
1682 { {(uint8_t[]){0x9a, 0x01, 0xff, 0x00}, 4}, QCBOR_ERR_HIT_END },
1683 // A definte length map that is supposed to have 1 item, but has none
1684 { {(uint8_t[]){0xa1}, 1}, QCBOR_ERR_HIT_END },
1685 // A definte length map that is supposed to have s item, but has only 1
1686 { {(uint8_t[]){0xa2, 0x01, 0x02}, 3}, QCBOR_ERR_HIT_END },
1687
1688
1689 // Indefinte length maps and arrays must be ended by a break
1690 // Indefinite length array with zero items and no break
1691 { {(uint8_t[]){0x9f}, 1}, QCBOR_ERR_HIT_END },
1692 // Indefinite length array with two items and no break
1693 { {(uint8_t[]){0x9f, 0x01, 0x02}, 3}, QCBOR_ERR_HIT_END },
1694 // Indefinite length map with zero items and no break
1695 { {(uint8_t[]){0xbf}, 1}, QCBOR_ERR_HIT_END },
1696 // Indefinite length map with two items and no break
1697 { {(uint8_t[]){0xbf, 0x01, 0x02, 0x01, 0x02}, 5}, QCBOR_ERR_HIT_END },
1698
1699
1700 // Nested maps and arrays must be closed off (some extra nested test vectors)
1701 // Unclosed indefinite array containing a close definite array
1702 { {(uint8_t[]){0x9f, 0x80, 0x00}, 3}, QCBOR_ERR_HIT_END },
1703 // Definite length array containing an unclosed indefinite array
1704 { {(uint8_t[]){0x81, 0x9f}, 2}, QCBOR_ERR_HIT_END },
1705 // Deeply nested definite length arrays with deepest one unclosed
1706 { {(uint8_t[]){0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81}, 9}, QCBOR_ERR_HIT_END },
1707 // Deeply nested indefinite length arrays with deepest one unclosed
1708 { {(uint8_t[]){0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0xff, 0xff, 0xff, 0xff}, 9}, QCBOR_ERR_HIT_END },
1709 // Mixed nesting with indefinite unclosed
Laurence Lundbladeee851742020-01-08 08:37:05 -08001710 // TODO: think through this one
1711 { {(uint8_t[]){0x9f, 0x81, 0x9f, 0x81, 0x9f, 0x9f, 0xff, 0xff, 0xff}, 9}, QCBOR_ERR_BAD_BREAK },
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001712 // Mixed nesting with definite unclosed
Laurence Lundbladeee851742020-01-08 08:37:05 -08001713 // TODO: think through this one
1714 { {(uint8_t[]){0x9f, 0x82, 0x9f, 0x81, 0x9f, 0x9f, 0xff, 0xff, 0xff, 0xff}, 10}, QCBOR_ERR_BAD_BREAK },
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 Lundblade29497c02020-07-11 15:44:03 -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
Laurence Lundblade8fa7d5d2020-07-11 16:30:47 -07002056 0xc1, 0xcf, 0xd8, 0x22, // 0xee, // Epoch date with extra tags
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
Laurence Lundblade3ed0bca2020-07-14 22:50:10 -07002063 0xfa, 0x3f, 0x8c, 0xcc, 0xcd, // single 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 Lundblade29497c02020-07-11 15:44:03 -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
Laurence Lundblade8fa7d5d2020-07-11 16:30:47 -07002111 // Epoch date 1400000000; Tue, 13 May 2014 16:53:20 GMT
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002112 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
Laurence Lundblade9682a532020-06-06 18:33:04 -07002137#ifndef QCBOR_DISABLE_FLOAT_HW_USE
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002138 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002139 return -8;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002140 if(Item.uDataType != QCBOR_TYPE_DATE_EPOCH ||
2141 Item.val.epochDate.nSeconds != 1 ||
2142 CHECK_EXPECTED_DOUBLE(Item.val.epochDate.fSecondsFraction, 0.1 )) {
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002143 return -9;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002144 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002145
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002146 // Epoch date float that is too large for our representation
2147 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_DATE_OVERFLOW) {
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002148 return -10;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002149 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002150
Laurence Lundbladea1ad8782019-11-08 00:12:11 -08002151 // Epoch date double that is just slightly too large
2152 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_DATE_OVERFLOW) {
2153 return -11;
2154 }
2155
2156 // Largest double epoch date supported
Laurence Lundblade3ed0bca2020-07-14 22:50:10 -07002157 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_SUCCESS ||
2158 Item.uDataType != QCBOR_TYPE_DATE_EPOCH ||
2159 Item.val.epochDate.nSeconds != 9223372036854773760 ||
2160 Item.val.epochDate.nSeconds == 0) {
2161 return -12;
2162 }
2163#else
2164 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_FLOAT_DATE_UNSUPPORTED) {
2165 return -80;
Laurence Lundbladea1ad8782019-11-08 00:12:11 -08002166 }
Laurence Lundblade3ed0bca2020-07-14 22:50:10 -07002167 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_FLOAT_DATE_UNSUPPORTED) {
2168 return -80;
2169 }
2170 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_FLOAT_DATE_UNSUPPORTED) {
2171 return -80;
2172 }
2173 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_FLOAT_DATE_UNSUPPORTED) {
2174 return -80;
2175 }
2176#endif
2177
2178
Laurence Lundbladeee851742020-01-08 08:37:05 -08002179 // TODO: could use a few more tests with float, double, and half precsion
2180 // and negative (but coverage is still pretty good)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002181
2182 return 0;
2183}
2184
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002185// Really simple basic input for tagging test
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002186static uint8_t spOptTestInput[] = {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002187 0xd9, 0xd9, 0xf7, // CBOR magic number
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002188 0x81, // Array of one
2189 0xd8, 0x04, // non-preferred serialization of tag 4
2190 0x82, 0x01, 0x03}; // fraction 1/3
2191
Laurence Lundblade59289e52019-12-30 13:44:37 -08002192/*
2193 DB 9192939495969798 # tag(10489608748473423768)
2194 80 # array(0)
2195 */
Laurence Lundbladeee851742020-01-08 08:37:05 -08002196static uint8_t spEncodedLargeTag[] = {0xdb, 0x91, 0x92, 0x93, 0x94, 0x95,
2197 0x96, 0x97, 0x98, 0x80};
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002198
Laurence Lundblade59289e52019-12-30 13:44:37 -08002199/*
2200DB 9192939495969798 # tag(10489608748473423768)
2201 D8 88 # tag(136)
2202 C6 # tag(6)
2203 C7 # tag(7)
2204 80 # array(0)
2205*/
Laurence Lundbladeee851742020-01-08 08:37:05 -08002206static uint8_t spLotsOfTags[] = {0xdb, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
2207 0x97, 0x98, 0xd8, 0x88, 0xc6, 0xc7, 0x80};
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002208
2209/*
2210 The cbor.me parse of this.
2211 55799(55799(55799({6(7(-23)): 5859837686836516696(7({7(-20): 11({17(-18): 17(17(17("Organization"))),
Laurence Lundblade59289e52019-12-30 13:44:37 -08002212 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 +07002213 17(-14): 17("US")}), 23(-19): 19({-11: 9({-9: -7}),
2214 90599561(90599561(90599561(-10))): 12(h'0102030405060708090A')})})),
2215 16(-22): 23({11(8(7(-5))): 8(-3)})})))
2216 */
2217static uint8_t spCSRWithTags[] = {
2218 0xd9, 0xd9, 0xf7, 0xd9, 0xd9, 0xf7, 0xd9, 0xd9, 0xf7, 0xa2,
2219 0xc6, 0xc7, 0x36,
2220 0xdb, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0xc7, 0xa2,
2221 0xda, 0x00, 0x00, 0x00, 0x07, 0x33,
2222 0xcb, 0xa5,
2223 0xd1, 0x31,
2224 0xd1, 0xd1, 0xd1, 0x6c,
2225 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
2226 0xc9, 0x30,
2227 0xd9, 0x03, 0x05, 0x63,
2228 0x53, 0x53, 0x47,
2229 0x2e,
Laurence Lundblade59289e52019-12-30 13:44:37 -08002230 0xd0, 0xd1, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0x69,
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002231 0x43, 0x6f, 0x6e, 0x66, 0x75, 0x73, 0x69, 0x6f, 0x6e,
2232 0xd1, 0x2f,
2233 0xd1, 0x69,
2234 0x53, 0x61, 0x6e, 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f,
2235 0xd1, 0x2d,
2236 0xd1, 0x62,
2237 0x55, 0x53,
2238 0xd7, 0x32,
2239 0xd3, 0xa2,
2240 0x2a,
2241 0xc9, 0xa1,
2242 0x28,
2243 0x26,
2244 0xda, 0x05, 0x66, 0x70, 0x89, 0xda, 0x05, 0x66, 0x70, 0x89, 0xda, 0x05, 0x66, 0x70, 0x89, 0x29,
2245 0xcc, 0x4a,
2246 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,0x07, 0x08, 0x09, 0x0a,
2247 0xd0, 0x35,
2248 0xd7, 0xa1,
2249 0xcb, 0xc8, 0xc7, 0x24,
2250 0xc8, 0x22};
2251
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002252static int32_t CheckCSRMaps(QCBORDecodeContext *pDC);
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002253
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002254
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002255int32_t OptTagParseTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002256{
2257 QCBORDecodeContext DCtx;
2258 QCBORItem Item;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002259
Laurence Lundbladeee851742020-01-08 08:37:05 -08002260 QCBORDecode_Init(&DCtx,
2261 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spOptTestInput),
2262 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002263
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002264 //-------------------------
2265 // This text matches the magic number tag and the fraction tag
2266 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2267 return -2;
2268 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002269 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002270 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_CBOR_MAGIC)) {
2271 return -3;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002272 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002273
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002274 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2275 return -4;
2276 }
Laurence Lundblade59289e52019-12-30 13:44:37 -08002277
2278#ifdef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002279 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
Laurence Lundblade59289e52019-12-30 13:44:37 -08002280 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_DECIMAL_FRACTION) ||
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002281 Item.val.uCount != 2) {
2282 return -5;
2283 }
Laurence Lundblade59289e52019-12-30 13:44:37 -08002284#else
2285 if(Item.uDataType != QCBOR_TYPE_DECIMAL_FRACTION) {
2286 return -6;
2287 }
2288#endif
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002289
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002290 // --------------------------------
2291 // This test decodes the very large tag, but it is not in
2292 // any list so it is ignored.
Laurence Lundbladeee851742020-01-08 08:37:05 -08002293 QCBORDecode_Init(&DCtx,
2294 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spEncodedLargeTag),
2295 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002296 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2297 return -6;
2298 }
2299 if(Item.uTagBits) {
2300 return -7;
2301 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002302
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002303 // ----------------------------------
Laurence Lundbladeee851742020-01-08 08:37:05 -08002304 // This test sets up a caller-config list that includes the very large
2305 // tage and then matches it.
2306 QCBORDecode_Init(&DCtx,
2307 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spEncodedLargeTag),
2308 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002309 const uint64_t puList[] = {0x9192939495969798, 257};
2310 const QCBORTagListIn TL = {2, puList};
2311 QCBORDecode_SetCallerConfiguredTagList(&DCtx, &TL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002312
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002313 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2314 return -8;
2315 }
2316 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
2317 !QCBORDecode_IsTagged(&DCtx, &Item, 0x9192939495969798) ||
2318 QCBORDecode_IsTagged(&DCtx, &Item, 257) ||
2319 QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_BIGFLOAT) ||
2320 Item.val.uCount != 0) {
2321 return -9;
2322 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002323
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002324 //------------------------
Laurence Lundbladeee851742020-01-08 08:37:05 -08002325 // Sets up a caller-configured list and look up something not in it
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002326 const uint64_t puLongList[17] = {1,2,1};
2327 const QCBORTagListIn TLLong = {17, puLongList};
Laurence Lundbladeee851742020-01-08 08:37:05 -08002328 QCBORDecode_Init(&DCtx,
2329 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spEncodedLargeTag),
2330 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002331 QCBORDecode_SetCallerConfiguredTagList(&DCtx, &TLLong);
2332 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2333 return -11;
2334 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002335
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002336 // -----------------------
2337 // This tests retrievel of the full tag list
Laurence Lundbladeee851742020-01-08 08:37:05 -08002338 QCBORDecode_Init(&DCtx,
2339 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spLotsOfTags),
2340 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002341 uint64_t puTags[16];
2342 QCBORTagListOut Out = {0, 4, puTags};
2343 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2344 return -12;
2345 }
2346 if(puTags[0] != 0x9192939495969798 ||
2347 puTags[1] != 0x88 ||
Laurence Lundblade59289e52019-12-30 13:44:37 -08002348 puTags[2] != 0x06 ||
2349 puTags[3] != 0x07) {
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002350 return -13;
2351 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002352
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002353 // ----------------------
2354 // This text if too small of an out list
Laurence Lundbladeee851742020-01-08 08:37:05 -08002355 QCBORDecode_Init(&DCtx,
2356 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spLotsOfTags),
2357 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002358 QCBORTagListOut OutSmall = {0, 3, puTags};
2359 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &OutSmall) != QCBOR_ERR_TOO_MANY_TAGS) {
2360 return -14;
2361 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002362
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002363 // ---------------
2364 // Parse a version of the "CSR" that has had a ton of tags randomly inserted
Laurence Lundbladeee851742020-01-08 08:37:05 -08002365 QCBORDecode_Init(&DCtx,
2366 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRWithTags),
2367 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002368 int n = CheckCSRMaps(&DCtx);
2369 if(n) {
2370 return n-2000;
2371 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002372
Laurence Lundblade59289e52019-12-30 13:44:37 -08002373 Out = (QCBORTagListOut){0, 16, puTags};
Laurence Lundbladeee851742020-01-08 08:37:05 -08002374 QCBORDecode_Init(&DCtx,
2375 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRWithTags),
2376 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002377
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002378 const uint64_t puTagList[] = {773, 1, 90599561};
2379 const QCBORTagListIn TagList = {3, puTagList};
2380 QCBORDecode_SetCallerConfiguredTagList(&DCtx, &TagList);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002381
2382
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002383 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2384 return -100;
2385 }
2386 if(Item.uDataType != QCBOR_TYPE_MAP ||
2387 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_CBOR_MAGIC) ||
2388 QCBORDecode_IsTagged(&DCtx, &Item, 90599561) ||
2389 QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_DATE_EPOCH) ||
2390 Item.val.uCount != 2 ||
2391 puTags[0] != CBOR_TAG_CBOR_MAGIC ||
2392 puTags[1] != CBOR_TAG_CBOR_MAGIC ||
2393 puTags[2] != CBOR_TAG_CBOR_MAGIC ||
2394 Out.uNumUsed != 3) {
2395 return -101;
2396 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002397
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002398 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2399 return -102;
2400 }
2401 if(Item.uDataType != QCBOR_TYPE_MAP ||
2402 QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_CBOR_MAGIC) ||
2403 QCBORDecode_IsTagged(&DCtx, &Item, 6) ||
2404 QCBORDecode_IsTagged(&DCtx, &Item, 7) || // item is tagged 7, but 7 is not configured to be recognized
2405 Item.val.uCount != 2 ||
2406 puTags[0] != 5859837686836516696 ||
2407 puTags[1] != 7 ||
2408 Out.uNumUsed != 2) {
2409 return -103;
2410 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002411
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002412 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2413 return -104;
2414 }
2415 if(Item.uDataType != QCBOR_TYPE_MAP ||
2416 Item.uTagBits ||
2417 Item.val.uCount != 5 ||
2418 puTags[0] != 0x0b ||
2419 Out.uNumUsed != 1) {
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 -106;
2425 }
2426 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
2427 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_COSE_MAC0) ||
2428 Item.val.string.len != 12 ||
2429 puTags[0] != CBOR_TAG_COSE_MAC0 ||
2430 puTags[1] != CBOR_TAG_COSE_MAC0 ||
2431 puTags[2] != CBOR_TAG_COSE_MAC0 ||
2432 Out.uNumUsed != 3) {
2433 return -105;
2434 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002435
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002436 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2437 return -107;
2438 }
2439 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
2440 !QCBORDecode_IsTagged(&DCtx, &Item, 773) ||
2441 Item.val.string.len != 3 ||
2442 puTags[0] != 773 ||
2443 Out.uNumUsed != 1) {
2444 return -108;
2445 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002446
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002447 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2448 return -109;
2449 }
2450 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundblade59289e52019-12-30 13:44:37 -08002451 !QCBORDecode_IsTagged(&DCtx, &Item, 16) ||
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002452 Item.val.string.len != 9 ||
Laurence Lundblade59289e52019-12-30 13:44:37 -08002453 puTags[0] != 16 ||
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002454 puTags[11] != 0x0f ||
2455 Out.uNumUsed != 12) {
2456 return -110;
2457 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002458
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002459 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2460 return -111;
2461 }
2462 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
2463 !QCBORDecode_IsTagged(&DCtx, &Item, 17) ||
2464 Item.val.string.len != 9 ||
2465 puTags[0] != 17 ||
2466 Out.uNumUsed != 1) {
2467 return -112;
2468 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002469
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002470 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2471 return -111;
2472 }
2473 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
2474 !QCBORDecode_IsTagged(&DCtx, &Item, 17) ||
2475 Item.val.string.len != 2 ||
2476 puTags[0] != 17 ||
2477 Out.uNumUsed != 1) {
2478 return -112;
2479 }
2480
2481 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2482 return -113;
2483 }
2484 if(Item.uDataType != QCBOR_TYPE_MAP ||
2485 QCBORDecode_IsTagged(&DCtx, &Item, 19) ||
2486 Item.val.uCount != 2 ||
2487 puTags[0] != 19 ||
2488 Out.uNumUsed != 1) {
2489 return -114;
2490 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002491
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002492 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2493 return -115;
2494 }
2495 if(Item.uDataType != QCBOR_TYPE_MAP ||
2496 QCBORDecode_IsTagged(&DCtx, &Item, 9) ||
2497 Item.uTagBits ||
2498 Item.val.uCount != 1 ||
2499 puTags[0] != 9 ||
2500 Out.uNumUsed != 1) {
2501 return -116;
2502 }
2503
2504 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2505 return -116;
2506 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002507 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002508 Item.val.int64 != -7 ||
2509 Item.uTagBits ||
2510 Out.uNumUsed != 0) {
2511 return -117;
2512 }
2513
2514 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2515 return -118;
2516 }
2517 if(Item.uDataType != QCBOR_TYPE_BYTE_STRING ||
2518 Item.val.string.len != 10 ||
2519 Item.uTagBits ||
2520 puTags[0] != 12 ||
2521 Out.uNumUsed != 1) {
2522 return -119;
2523 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002524
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002525 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2526 return -120;
2527 }
2528 if(Item.uDataType != QCBOR_TYPE_MAP ||
2529 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_ENC_AS_B16) ||
2530 Item.val.uCount != 1 ||
2531 puTags[0] != 0x17 ||
2532 Out.uNumUsed != 1) {
2533 return -121;
2534 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002535
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002536 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2537 return -122;
2538 }
2539 if(Item.uDataType != QCBOR_TYPE_INT64 ||
2540 QCBORDecode_IsTagged(&DCtx, &Item, 8) ||
2541 Item.val.int64 != -3 ||
2542 puTags[0] != 8 ||
2543 Out.uNumUsed != 1) {
2544 return -123;
2545 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002546
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002547 if(QCBORDecode_Finish(&DCtx)) {
2548 return -124;
2549 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002550
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002551 return 0;
2552}
2553
2554
2555
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002556
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002557static uint8_t spBigNumInput[] = {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002558 0x83,
2559 0xC2, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2560 0xC3, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2561 0xA4,
2562 0x63, 0x42, 0x4E, 0x2B,
2563 0xC2, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2564 0x18, 0x40,
2565 0xC2, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2566 0x63, 0x42, 0x4E, 0x2D,
2567 0xC3, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2568 0x38, 0x3F,
2569 0xC3, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
2570
2571
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002572static uint8_t spBigNum[] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002573
2574
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002575int32_t BignumParseTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002576{
2577 QCBORDecodeContext DCtx;
2578 QCBORItem Item;
Laurence Lundblade29497c02020-07-11 15:44:03 -07002579 QCBORError nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002580
Laurence Lundbladeee851742020-01-08 08:37:05 -08002581 QCBORDecode_Init(&DCtx,
2582 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNumInput),
2583 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002584
2585
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002586 //
2587 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2588 return -1;
2589 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
2590 return -1;
2591 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002592
2593 //
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002594 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2595 return -1;
2596 if(Item.uDataType != QCBOR_TYPE_POSBIGNUM ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002597 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002598 return -1;
2599 }
2600
2601 //
2602 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2603 return -1;
2604 if(Item.uDataType != QCBOR_TYPE_NEGBIGNUM ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002605 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002606 return -1;
2607 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002608
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002609 //
2610 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2611 return -1;
2612 if(Item.uDataType != QCBOR_TYPE_MAP) {
2613 return -1;
2614 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002615
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002616 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2617 return -1;
2618 if(Item.uDataType != QCBOR_TYPE_POSBIGNUM ||
2619 Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002620 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002621 return -1;
2622 }
2623
2624 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2625 return -1;
2626 if(Item.uDataType != QCBOR_TYPE_POSBIGNUM ||
2627 Item.uLabelType != QCBOR_TYPE_INT64 ||
2628 Item.label.int64 != 64 ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002629 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002630 return -1;
2631 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002632
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002633 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2634 return -1;
2635 if(Item.uDataType != QCBOR_TYPE_NEGBIGNUM ||
2636 Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002637 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002638 return -1;
2639 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002640
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002641 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2642 return -1;
2643 if(Item.uDataType != QCBOR_TYPE_NEGBIGNUM ||
2644 Item.uLabelType != QCBOR_TYPE_INT64 ||
2645 Item.label.int64 != -64 ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002646 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002647 return -1;
2648 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002649
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002650 return 0;
2651}
2652
2653
2654
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002655static int32_t CheckItemWithIntLabel(QCBORDecodeContext *pCtx,
Laurence Lundbladeee851742020-01-08 08:37:05 -08002656 uint8_t uDataType,
2657 uint8_t uNestingLevel,
2658 uint8_t uNextNest,
2659 int64_t nLabel,
2660 QCBORItem *pItem)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002661{
2662 QCBORItem Item;
Laurence Lundblade29497c02020-07-11 15:44:03 -07002663 QCBORError nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002664
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002665 if((nCBORError = QCBORDecode_GetNext(pCtx, &Item))) return -1;
2666 if(Item.uDataType != uDataType) return -1;
2667 if(uNestingLevel > 0) {
Laurence Lundbladeee851742020-01-08 08:37:05 -08002668 if(Item.uLabelType != QCBOR_TYPE_INT64 &&
2669 Item.uLabelType != QCBOR_TYPE_UINT64) {
2670 return -1;
2671 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002672 if(Item.uLabelType == QCBOR_TYPE_INT64) {
2673 if(Item.label.int64 != nLabel) return -1;
2674 } else {
Laurence Lundblade570fab52018-10-13 18:28:27 +08002675 if(Item.label.uint64 != (uint64_t)nLabel) return -1;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002676 }
2677 }
2678 if(Item.uNestingLevel != uNestingLevel) return -1;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302679 if(Item.uNextNestLevel != uNextNest) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002680
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002681 if(pItem) {
2682 *pItem = Item;
2683 }
2684 return 0;
2685}
2686
2687
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002688// Same code checks definite and indefinite length versions of the map
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002689static int32_t CheckCSRMaps(QCBORDecodeContext *pDC)
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002690{
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302691 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 0, 1, 0, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002692
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302693 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 1, 2, -23, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002694
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302695 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 2, 3, -20, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002696
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302697 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_TEXT_STRING, 3, 3, -18, NULL)) return -1;
2698 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_TEXT_STRING, 3, 3, -17, NULL)) return -1;
2699 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_TEXT_STRING, 3, 3, -15, NULL)) return -1;
2700 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_TEXT_STRING, 3, 3, -16, NULL)) return -1;
2701 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_TEXT_STRING, 3, 2, -14, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002702
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302703 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 2, 3, -19, NULL)) return -1;
2704 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 3, 4, -11, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002705
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302706 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_INT64, 4, 3, -9, NULL)) return -1;
2707 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_BYTE_STRING, 3, 1, -10, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002708
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302709 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 1, 2, -22, NULL)) return -1;
2710 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_INT64, 2, 0, -5, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002711
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002712 if(QCBORDecode_Finish(pDC)) return -2;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002713
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002714 return 0;
2715}
2716
2717
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002718/*
2719// cbor.me decoded output
2720{
2721 -23: {
2722 -20: {
2723 -18: "Organization",
2724 -17: "SSG",
2725 -15: "Confusion",
2726 -16: "San Diego",
2727 -14: "US"
2728 },
2729 -19: {
2730 -11: {
2731 -9: -7
2732 },
2733 -10: '\u0001\u0002\u0003\u0004\u0005\u0006\a\b\t\n'
2734 }
2735 },
2736 -22: {
2737 -5: -3
2738 }
2739}
2740 */
2741
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002742
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002743static uint8_t spCSRInput[] = {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002744 0xa2, 0x36, 0xa2, 0x33, 0xa5, 0x31, 0x6c, 0x4f,
2745 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74,
2746 0x69, 0x6f, 0x6e, 0x30, 0x63, 0x53, 0x53, 0x47,
2747 0x2e, 0x69, 0x43, 0x6f, 0x6e, 0x66, 0x75, 0x73,
2748 0x69, 0x6f, 0x6e, 0x2f, 0x69, 0x53, 0x61, 0x6e,
2749 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x2d, 0x62,
2750 0x55, 0x53, 0x32, 0xa2, 0x2a, 0xa1, 0x28, 0x26,
2751 0x29, 0x4a, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
2752 0x07, 0x08, 0x09, 0x0a, 0x35, 0xa1, 0x24, 0x22};
2753
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002754int32_t NestedMapTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002755{
2756 QCBORDecodeContext DCtx;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002757
Laurence Lundbladeee851742020-01-08 08:37:05 -08002758 QCBORDecode_Init(&DCtx,
2759 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRInput),
2760 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002761
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002762 return CheckCSRMaps(&DCtx);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002763}
2764
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08002765
2766
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002767int32_t StringDecoderModeFailTest()
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08002768{
2769 QCBORDecodeContext DCtx;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002770
Laurence Lundbladeee851742020-01-08 08:37:05 -08002771 QCBORDecode_Init(&DCtx,
2772 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRInput),
2773 QCBOR_DECODE_MODE_MAP_STRINGS_ONLY);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002774
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08002775 QCBORItem Item;
2776 QCBORError nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002777
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08002778 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2779 return -1;
2780 }
2781 if(Item.uDataType != QCBOR_TYPE_MAP) {
2782 return -2;
2783 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002784
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08002785 nCBORError = QCBORDecode_GetNext(&DCtx, &Item);
2786 if(nCBORError != QCBOR_ERR_MAP_LABEL_TYPE) {
2787 return -3;
2788 }
2789
2790 return 0;
2791}
2792
2793
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002794// Same map as above, but using indefinite lengths
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002795static uint8_t spCSRInputIndefLen[] = {
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002796 0xbf, 0x36, 0xbf, 0x33, 0xbf, 0x31, 0x6c, 0x4f,
2797 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74,
2798 0x69, 0x6f, 0x6e, 0x30, 0x63, 0x53, 0x53, 0x47,
2799 0x2e, 0x69, 0x43, 0x6f, 0x6e, 0x66, 0x75, 0x73,
2800 0x69, 0x6f, 0x6e, 0x2f, 0x69, 0x53, 0x61, 0x6e,
2801 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x2d, 0x62,
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002802 0x55, 0x53, 0xff, 0x32, 0xbf, 0x2a, 0xbf, 0x28,
2803 0x26, 0xff, 0x29, 0x4a, 0x01, 0x02, 0x03, 0x04,
2804 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0xff, 0xff,
2805 0x35, 0xbf, 0x24, 0x22, 0xff, 0xff};
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002806
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002807int32_t NestedMapTestIndefLen()
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002808{
2809 QCBORDecodeContext DCtx;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002810
Laurence Lundbladeee851742020-01-08 08:37:05 -08002811 QCBORDecode_Init(&DCtx,
2812 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRInputIndefLen),
2813 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002814
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002815 return CheckCSRMaps(&DCtx);
2816}
2817
2818
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002819
Laurence Lundblade17ede402018-10-13 11:43:07 +08002820static UsefulBufC make_nested_indefinite_arrays(int n, UsefulBuf Storage)
2821{
2822 UsefulOutBuf UOB;
2823 UsefulOutBuf_Init(&UOB, Storage);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002824
Laurence Lundblade17ede402018-10-13 11:43:07 +08002825 int i;
2826 for(i = 0; i < n; i++) {
2827 UsefulOutBuf_AppendByte(&UOB, 0x9f);
2828 }
2829
2830 for(i = 0; i < n; i++) {
2831 UsefulOutBuf_AppendByte(&UOB, 0xff);
2832 }
2833 return UsefulOutBuf_OutUBuf(&UOB);
2834}
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002835
2836
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002837static int32_t parse_indeflen_nested(UsefulBufC Nested, int nNestLevel)
Laurence Lundblade17ede402018-10-13 11:43:07 +08002838{
2839 QCBORDecodeContext DC;
2840 QCBORDecode_Init(&DC, Nested, 0);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002841
Laurence Lundblade17ede402018-10-13 11:43:07 +08002842 int j;
2843 for(j = 0; j < nNestLevel; j++) {
2844 QCBORItem Item;
Laurence Lundblade29497c02020-07-11 15:44:03 -07002845 QCBORError nReturn = QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade17ede402018-10-13 11:43:07 +08002846 if(j >= QCBOR_MAX_ARRAY_NESTING) {
2847 // Should be in error
2848 if(nReturn != QCBOR_ERR_ARRAY_NESTING_TOO_DEEP) {
2849 return -4;
2850 } else {
2851 return 0; // Decoding doesn't recover after an error
2852 }
2853 } else {
2854 // Should be no error
2855 if(nReturn) {
2856 return -9; // Should not have got an error
2857 }
2858 }
2859 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
2860 return -7;
2861 }
2862 }
Laurence Lundblade29497c02020-07-11 15:44:03 -07002863 QCBORError nReturn = QCBORDecode_Finish(&DC);
Laurence Lundblade17ede402018-10-13 11:43:07 +08002864 if(nReturn) {
2865 return -3;
2866 }
2867 return 0;
2868}
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002869
2870
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002871int32_t IndefiniteLengthNestTest()
Laurence Lundblade17ede402018-10-13 11:43:07 +08002872{
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05302873 UsefulBuf_MAKE_STACK_UB(Storage, 50);
Laurence Lundblade17ede402018-10-13 11:43:07 +08002874 int i;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002875 for(i=1; i < QCBOR_MAX_ARRAY_NESTING+4; i++) {
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -08002876 const UsefulBufC Nested = make_nested_indefinite_arrays(i, Storage);
Laurence Lundblade17ede402018-10-13 11:43:07 +08002877 int nReturn = parse_indeflen_nested(Nested, i);
2878 if(nReturn) {
2879 return nReturn;
2880 }
2881 }
2882 return 0;
2883}
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002884
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002885
Laurence Lundbladeee851742020-01-08 08:37:05 -08002886// [1, [2, 3]]
2887static const uint8_t spIndefiniteArray[] = {0x9f, 0x01, 0x82, 0x02, 0x03, 0xff};
2888// No closing break
2889static const uint8_t spIndefiniteArrayBad1[] = {0x9f};
2890// Not enough closing breaks
2891static const uint8_t spIndefiniteArrayBad2[] = {0x9f, 0x9f, 0x02, 0xff};
2892// Too many closing breaks
2893static const uint8_t spIndefiniteArrayBad3[] = {0x9f, 0x02, 0xff, 0xff};
2894// Unclosed indeflen inside def len
2895static const uint8_t spIndefiniteArrayBad4[] = {0x81, 0x9f};
2896// confused tag
2897static const uint8_t spIndefiniteArrayBad5[] = {0x9f, 0xd1, 0xff};
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002898
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002899int32_t IndefiniteLengthArrayMapTest()
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002900{
Laurence Lundblade29497c02020-07-11 15:44:03 -07002901 QCBORError nResult;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002902 // --- first test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002903 UsefulBufC IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArray);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002904
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002905 // Decode it and see if it is OK
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05302906 UsefulBuf_MAKE_STACK_UB(MemPool, 150);
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002907 QCBORDecodeContext DC;
2908 QCBORItem Item;
2909 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002910
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002911 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002912
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002913 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302914
2915 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
2916 Item.uNestingLevel != 0 ||
2917 Item.uNextNestLevel != 1) {
2918 return -111;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002919 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002920
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002921 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302922 if(Item.uDataType != QCBOR_TYPE_INT64 ||
2923 Item.uNestingLevel != 1 ||
2924 Item.uNextNestLevel != 1) {
2925 return -2;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002926 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002927
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002928 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302929 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
2930 Item.uNestingLevel != 1 ||
2931 Item.uNextNestLevel != 2) {
2932 return -3;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002933 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002934
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002935 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade12b495d2018-12-17 11:15:54 -08002936 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade6de37062018-10-15 12:22:42 +05302937 Item.uNestingLevel != 2 ||
2938 Item.uNextNestLevel != 2) {
2939 return -4;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002940 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002941
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002942 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade12b495d2018-12-17 11:15:54 -08002943 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade6de37062018-10-15 12:22:42 +05302944 Item.uNestingLevel != 2 ||
2945 Item.uNextNestLevel != 0) {
2946 return -5;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002947 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002948
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002949 if(QCBORDecode_Finish(&DC)) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302950 return -6;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002951 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002952
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002953 // --- next test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002954 IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArrayBad1);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002955
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002956 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002957
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002958 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002959
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002960 nResult = QCBORDecode_GetNext(&DC, &Item);
2961 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302962 return -7;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002963 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002964
Laurence Lundblade570fab52018-10-13 18:28:27 +08002965 nResult = QCBORDecode_Finish(&DC);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302966 if(nResult != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
2967 return -8;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002968 }
2969
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002970
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002971 // --- next test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002972 IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArrayBad2);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002973
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002974 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002975
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002976 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002977
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002978 nResult = QCBORDecode_GetNext(&DC, &Item);
2979 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302980 return -9;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002981 }
2982
2983 nResult = QCBORDecode_GetNext(&DC, &Item);
2984 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302985 return -10;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002986 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002987
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002988 nResult = QCBORDecode_GetNext(&DC, &Item);
2989 if(nResult || Item.uDataType != QCBOR_TYPE_INT64) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05302990 return -11;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002991 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002992
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002993 nResult = QCBORDecode_Finish(&DC);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302994 if(nResult != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
2995 return -12;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002996 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002997
2998
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002999 // --- next test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003000 IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArrayBad3);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003001
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003002 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003003
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003004 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003005
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003006 nResult = QCBORDecode_GetNext(&DC, &Item);
3007 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05303008 return -13;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003009 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003010
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003011 nResult = QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade6de37062018-10-15 12:22:42 +05303012 if(nResult != QCBOR_ERR_BAD_BREAK) {
3013 return -14;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003014 }
Laurence Lundblade6de37062018-10-15 12:22:42 +05303015
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003016
Laurence Lundblade570fab52018-10-13 18:28:27 +08003017 // --- next test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003018 IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArrayBad4);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003019
Laurence Lundblade570fab52018-10-13 18:28:27 +08003020 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003021
Laurence Lundblade570fab52018-10-13 18:28:27 +08003022 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003023
Laurence Lundblade570fab52018-10-13 18:28:27 +08003024 nResult = QCBORDecode_GetNext(&DC, &Item);
3025 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05303026 return -15;
Laurence Lundblade570fab52018-10-13 18:28:27 +08003027 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003028
Laurence Lundblade570fab52018-10-13 18:28:27 +08003029 nResult = QCBORDecode_GetNext(&DC, &Item);
3030 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05303031 return -16;
Laurence Lundblade570fab52018-10-13 18:28:27 +08003032 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003033
Laurence Lundblade570fab52018-10-13 18:28:27 +08003034 nResult = QCBORDecode_Finish(&DC);
Laurence Lundblade6de37062018-10-15 12:22:42 +05303035 if(nResult != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
3036 return -17;
Laurence Lundblade570fab52018-10-13 18:28:27 +08003037 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003038
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303039 // --- next test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003040 IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArrayBad5);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003041
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303042 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003043
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303044 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003045
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303046 nResult = QCBORDecode_GetNext(&DC, &Item);
3047 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05303048 return -18;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303049 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003050
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303051 nResult = QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade6de37062018-10-15 12:22:42 +05303052 if(nResult != QCBOR_ERR_BAD_BREAK) {
3053 return -19;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303054 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003055
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08003056 return 0;
3057}
3058
Laurence Lundblade17ede402018-10-13 11:43:07 +08003059
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003060static const uint8_t spIndefiniteLenString[] = {
Laurence Lundblade17ede402018-10-13 11:43:07 +08003061 0x81, // Array of length one
3062 0x7f, // text string marked with indefinite length
3063 0x65, 0x73, 0x74, 0x72, 0x65, 0x61, // first segment
3064 0x64, 0x6d, 0x69, 0x6e, 0x67, // second segment
3065 0xff // ending break
3066};
3067
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003068static const uint8_t spIndefiniteLenStringBad2[] = {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303069 0x81, // Array of length one
3070 0x7f, // text string marked with indefinite length
3071 0x65, 0x73, 0x74, 0x72, 0x65, 0x61, // first segment
3072 0x44, 0x6d, 0x69, 0x6e, 0x67, // second segment of wrong type
3073 0xff // ending break
3074};
3075
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003076static const uint8_t spIndefiniteLenStringBad3[] = {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303077 0x81, // Array of length one
3078 0x7f, // text string marked with indefinite length
3079 0x01, 0x02, // Not a string
3080 0xff // ending break
3081};
3082
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003083static const uint8_t spIndefiniteLenStringBad4[] = {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303084 0x81, // Array of length one
3085 0x7f, // text string marked with indefinite length
3086 0x65, 0x73, 0x74, 0x72, 0x65, 0x61, // first segment
3087 0x64, 0x6d, 0x69, 0x6e, 0x67, // second segment
3088 // missing end of string
3089};
3090
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003091static const uint8_t spIndefiniteLenStringLabel[] = {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303092 0xa1, // Array of length one
3093 0x7f, // text string marked with indefinite length
3094 0x65, 0x73, 0x74, 0x72, 0x75, 0x75, // first segment
3095 0x64, 0x6d, 0x69, 0x6e, 0x67, // second segment
3096 0xff, // ending break
3097 0x01 // integer being labeled.
3098};
3099
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003100/**
3101 Make an indefinite length string
3102
3103 @param Storage Storage for string, must be 144 bytes in size
3104 @return The indefinite length string
3105
3106 This makes an array with one indefinite length string that has 7 chunks
3107 from size of 1 byte up to 64 bytes.
3108 */
3109static UsefulBufC MakeIndefiniteBigBstr(UsefulBuf Storage)
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303110{
3111 UsefulOutBuf UOB;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003112
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303113 UsefulOutBuf_Init(&UOB, Storage);
3114 UsefulOutBuf_AppendByte(&UOB, 0x81);
3115 UsefulOutBuf_AppendByte(&UOB, 0x5f);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003116
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003117 uint8_t uStringByte = 0;
3118 // Use of type int is intentional
3119 for(int uChunkSize = 1; uChunkSize <= 128; uChunkSize *= 2) {
3120 // Not using preferred encoding here, but that is OK.
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303121 UsefulOutBuf_AppendByte(&UOB, 0x58);
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003122 UsefulOutBuf_AppendByte(&UOB, (uint8_t)uChunkSize);
3123 for(int j = 0; j < uChunkSize; j++) {
3124 UsefulOutBuf_AppendByte(&UOB, uStringByte);
3125 uStringByte++;
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303126 }
3127 }
3128 UsefulOutBuf_AppendByte(&UOB, 0xff);
3129
3130 return UsefulOutBuf_OutUBuf(&UOB);
3131}
3132
3133static int CheckBigString(UsefulBufC BigString)
3134{
3135 if(BigString.len != 255) {
3136 return 1;
3137 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003138
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303139 for(uint8_t i = 0; i < 255; i++){
3140 if(((const uint8_t *)BigString.ptr)[i] != i) {
3141 return 1;
3142 }
3143 }
3144 return 0;
3145}
3146
Laurence Lundblade7e0d13b2018-10-16 19:54:13 +05303147
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003148int32_t IndefiniteLengthStringTest()
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303149{
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303150 QCBORDecodeContext DC;
3151 QCBORItem Item;
Laurence Lundblade7e0d13b2018-10-16 19:54:13 +05303152 // big enough for MakeIndefiniteBigBstr() + MemPool overhead
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003153 UsefulBuf_MAKE_STACK_UB(MemPool, 350);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003154
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303155 // --- Simple normal indefinite length string ------
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003156 UsefulBufC IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteLenString);
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303157 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003158
Laurence Lundblade7e0d13b2018-10-16 19:54:13 +05303159 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303160 return -1;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303161 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003162
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303163 if(QCBORDecode_GetNext(&DC, &Item)) {
3164 return -2;
3165 }
3166 if(Item.uDataType != QCBOR_TYPE_ARRAY || Item.uDataAlloc) {
3167 return -3;
3168 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003169
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303170 if(QCBORDecode_GetNext(&DC, &Item)) {
3171 return -4;
3172 }
3173 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING || !Item.uDataAlloc) {
3174 return -5;
3175 }
3176 if(QCBORDecode_Finish(&DC)) {
3177 return -6;
3178 }
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303179
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303180 // ----- types mismatch ---
Laurence Lundbladeee851742020-01-08 08:37:05 -08003181 QCBORDecode_Init(&DC,
3182 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteLenStringBad2),
3183 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003184
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303185 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
3186 return -7;
3187 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003188
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303189 if(QCBORDecode_GetNext(&DC, &Item)) {
3190 return -8;
3191 }
3192 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
3193 return -9;
3194 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003195
Laurence Lundblade30816f22018-11-10 13:40:22 +07003196 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_ERR_INDEFINITE_STRING_CHUNK) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303197 return -10;
3198 }
3199
3200 // ----- not a string ---
Laurence Lundbladeee851742020-01-08 08:37:05 -08003201 QCBORDecode_Init(&DC,
3202 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteLenStringBad3),
3203 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003204
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303205 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
3206 return -11;
3207 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003208
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303209 if(QCBORDecode_GetNext(&DC, &Item)) {
3210 return -12;
3211 }
3212 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
3213 return -13;
3214 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003215
Laurence Lundblade30816f22018-11-10 13:40:22 +07003216 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_ERR_INDEFINITE_STRING_CHUNK) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303217 return -14;
3218 }
3219
3220 // ----- no end -----
Laurence Lundbladeee851742020-01-08 08:37:05 -08003221 QCBORDecode_Init(&DC,
3222 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteLenStringBad4),
3223 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003224
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303225 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
3226 return -15;
3227 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003228
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303229 if(QCBORDecode_GetNext(&DC, &Item)) {
3230 return -16;
3231 }
3232 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
3233 return -17;
3234 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003235
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303236 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_ERR_HIT_END) {
3237 return -18;
3238 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003239
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303240 // ------ Don't set a string allocator and see an error -----
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303241 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003242
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303243 QCBORDecode_GetNext(&DC, &Item);
3244 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303245 return -19;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303246 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003247
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303248 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_ERR_NO_STRING_ALLOCATOR) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303249 return -20;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303250 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003251
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303252 // ----- Mempool is way too small -----
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003253 UsefulBuf_MAKE_STACK_UB(MemPoolTooSmall, QCBOR_DECODE_MIN_MEM_POOL_SIZE-1);
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303254
3255 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
3256 if(!QCBORDecode_SetMemPool(&DC, MemPoolTooSmall, false)) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303257 return -21;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303258 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003259
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303260 // ----- Mempool is way too small -----
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05303261 UsefulBuf_MAKE_STACK_UB(BigIndefBStrStorage, 290);
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -08003262 const UsefulBufC BigIndefBStr = MakeIndefiniteBigBstr(BigIndefBStrStorage);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003263
Laurence Lundbladeee851742020-01-08 08:37:05 -08003264 // 80 is big enough for MemPool overhead, but not BigIndefBStr
3265 UsefulBuf_MAKE_STACK_UB(MemPoolSmall, 80);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003266
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303267 QCBORDecode_Init(&DC, BigIndefBStr, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303268 if(QCBORDecode_SetMemPool(&DC, MemPoolSmall, false)) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303269 return -22;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303270 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003271
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303272 QCBORDecode_GetNext(&DC, &Item);
3273 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303274 return -23;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303275 }
Laurence Lundblade30816f22018-11-10 13:40:22 +07003276 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_ERR_STRING_ALLOCATE) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303277 return -24;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303278 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003279
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303280 // ---- big bstr -----
3281 QCBORDecode_Init(&DC, BigIndefBStr, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003282
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303283 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
3284 return -25;
3285 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003286
Laurence Lundblade7e0d13b2018-10-16 19:54:13 +05303287 if(QCBORDecode_GetNext(&DC, &Item)) {
3288 return -26;
3289 }
3290 if(Item.uDataType != QCBOR_TYPE_ARRAY || Item.uDataAlloc) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303291 return -26;
3292 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003293
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303294 if(QCBORDecode_GetNext(&DC, &Item)) {
3295 return -27;
3296 }
Laurence Lundblade7e0d13b2018-10-16 19:54:13 +05303297 if(Item.uDataType != QCBOR_TYPE_BYTE_STRING || !Item.uDataAlloc || Item.uNestingLevel != 1) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303298 return -28;
3299 }
3300 if(CheckBigString(Item.val.string)) {
3301 return -3;
3302 }
3303 if(QCBORDecode_Finish(&DC)) {
3304 return -29;
3305 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003306
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303307 // --- label is an indefinite length string ------
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003308 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteLenStringLabel), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003309
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303310 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
3311 return -30;
3312 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003313
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303314 QCBORDecode_GetNext(&DC, &Item);
3315 if(Item.uDataType != QCBOR_TYPE_MAP) {
3316 return -31;
3317 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003318
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303319 if(QCBORDecode_GetNext(&DC, &Item)){
3320 return -32;
3321 }
Laurence Lundbladeee851742020-01-08 08:37:05 -08003322 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
3323 Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303324 Item.uDataAlloc || !Item.uLabelAlloc ||
3325 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("struuming"))) {
3326 return -33;
3327 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003328
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303329 if(QCBORDecode_Finish(&DC)) {
3330 return -34;
3331 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003332
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003333 return 0;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08003334}
3335
3336
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003337int32_t AllocAllStringsTest()
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303338{
3339 QCBORDecodeContext DC;
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003340 QCBORError nCBORError;
3341
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003342
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303343 // First test, use the "CSRMap" as easy input and checking
Laurence Lundbladeee851742020-01-08 08:37:05 -08003344 QCBORDecode_Init(&DC,
3345 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRInput),
3346 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003347
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003348 UsefulBuf_MAKE_STACK_UB(Pool, sizeof(spCSRInput) + QCBOR_DECODE_MIN_MEM_POOL_SIZE);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003349
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003350 nCBORError = QCBORDecode_SetMemPool(&DC, Pool, 1); // Turn on copying.
3351 if(nCBORError) {
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303352 return -1;
3353 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003354
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003355 if(CheckCSRMaps(&DC)) {
3356 return -2;
3357 }
3358
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303359 // Next parse, save pointers to a few strings, destroy original and see all is OK.
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003360 UsefulBuf_MAKE_STACK_UB(CopyOfStorage, sizeof(pValidMapEncoded) + QCBOR_DECODE_MIN_MEM_POOL_SIZE);
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -08003361 const UsefulBufC CopyOf = UsefulBuf_Copy(CopyOfStorage, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapEncoded));
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08003362
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303363 QCBORDecode_Init(&DC, CopyOf, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -08003364 UsefulBuf_Set(Pool, '/');
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303365 QCBORDecode_SetMemPool(&DC, Pool, 1); // Turn on copying.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003366
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303367 QCBORItem Item1, Item2, Item3, Item4;
3368 if((nCBORError = QCBORDecode_GetNext(&DC, &Item1)))
Laurence Lundblade29497c02020-07-11 15:44:03 -07003369 return (int32_t)nCBORError;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303370 if(Item1.uDataType != QCBOR_TYPE_MAP ||
3371 Item1.val.uCount != 3)
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003372 return -3;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303373 if((nCBORError = QCBORDecode_GetNext(&DC, &Item1)))
Laurence Lundblade29497c02020-07-11 15:44:03 -07003374 return (int32_t)nCBORError;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303375 if((nCBORError = QCBORDecode_GetNext(&DC, &Item2)))
Laurence Lundblade29497c02020-07-11 15:44:03 -07003376 return (int32_t)nCBORError;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303377 if((nCBORError = QCBORDecode_GetNext(&DC, &Item3)))
Laurence Lundblade29497c02020-07-11 15:44:03 -07003378 return (int32_t)nCBORError;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303379 if((nCBORError = QCBORDecode_GetNext(&DC, &Item4)))
Laurence Lundblade29497c02020-07-11 15:44:03 -07003380 return (int32_t)nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003381
Laurence Lundblade05ec57b2018-10-21 01:50:03 +05303382 UsefulBuf_Set(CopyOfStorage, '_');
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003383
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303384 if(Item1.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303385 Item1.uDataType != QCBOR_TYPE_INT64 ||
3386 Item1.val.int64 != 42 ||
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003387 Item1.uDataAlloc != 0 ||
3388 Item1.uLabelAlloc == 0 ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003389 UsefulBuf_Compare(Item1.label.string, UsefulBuf_FromSZ("first integer"))) {
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003390 return -4;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003391 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003392
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303393
3394 if(Item2.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003395 UsefulBuf_Compare(Item2.label.string, UsefulBuf_FromSZ("an array of two strings")) ||
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303396 Item2.uDataType != QCBOR_TYPE_ARRAY ||
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003397 Item2.uDataAlloc != 0 ||
3398 Item2.uLabelAlloc == 0 ||
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303399 Item2.val.uCount != 2)
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003400 return -5;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003401
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303402 if(Item3.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003403 Item3.uDataAlloc == 0 ||
3404 Item3.uLabelAlloc != 0 ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003405 UsefulBuf_Compare(Item3.val.string, UsefulBuf_FromSZ("string1"))) {
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003406 return -6;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003407 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003408
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303409 if(Item4.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003410 Item4.uDataAlloc == 0 ||
3411 Item4.uLabelAlloc != 0 ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003412 UsefulBuf_Compare(Item4.val.string, UsefulBuf_FromSZ("string2"))) {
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003413 return -7;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003414 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003415
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303416 // Next parse with a pool that is too small
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003417 UsefulBuf_MAKE_STACK_UB(SmallPool, QCBOR_DECODE_MIN_MEM_POOL_SIZE + 1);
Laurence Lundbladeee851742020-01-08 08:37:05 -08003418 QCBORDecode_Init(&DC,
3419 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapEncoded),
3420 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303421 QCBORDecode_SetMemPool(&DC, SmallPool, 1); // Turn on copying.
3422 if((nCBORError = QCBORDecode_GetNext(&DC, &Item1)))
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003423 return -8;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303424 if(Item1.uDataType != QCBOR_TYPE_MAP ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003425 Item1.val.uCount != 3) {
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003426 return -9;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003427 }
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303428 if(!(nCBORError = QCBORDecode_GetNext(&DC, &Item1))){
3429 if(!(nCBORError = QCBORDecode_GetNext(&DC, &Item2))) {
3430 if(!(nCBORError = QCBORDecode_GetNext(&DC, &Item3))) {
3431 nCBORError = QCBORDecode_GetNext(&DC, &Item4);
3432 }
3433 }
3434 }
Laurence Lundblade30816f22018-11-10 13:40:22 +07003435 if(nCBORError != QCBOR_ERR_STRING_ALLOCATE) {
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003436 return -10;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303437 }
3438
3439 return 0;
3440}
3441
Laurence Lundbladef6531662018-12-04 10:42:22 +09003442
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303443
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003444int32_t MemPoolTest(void)
Laurence Lundblade0155b622018-10-12 20:04:37 +08003445{
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003446 // Set up the decoder with a tiny bit of CBOR to parse because
3447 // nothing can be done with it unless that is set up.
Laurence Lundbladef6531662018-12-04 10:42:22 +09003448 QCBORDecodeContext DC;
3449 const uint8_t pMinimalCBOR[] = {0xa0}; // One empty map
3450 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pMinimalCBOR),0);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003451
Laurence Lundbladef6531662018-12-04 10:42:22 +09003452 // Set up an memory pool of 100 bytes
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003453 // Then fish into the internals of the decode context
3454 // to get the allocator function so it can be called directly.
3455 // Also figure out how much pool is available for use
3456 // buy subtracting out the overhead.
Laurence Lundbladef6531662018-12-04 10:42:22 +09003457 UsefulBuf_MAKE_STACK_UB(Pool, 100);
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003458 QCBORError nError = QCBORDecode_SetMemPool(&DC, Pool, 0);
3459 if(nError) {
3460 return -9;
3461 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003462 QCBORStringAllocate pAlloc = DC.StringAllocator.pfAllocator;
3463 void *pAllocCtx = DC.StringAllocator.pAllocateCxt;
3464 size_t uAvailPool = Pool.len - QCBOR_DECODE_MIN_MEM_POOL_SIZE;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003465
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003466 // First test -- ask for one more byte than available and see failure
3467 UsefulBuf Allocated = (*pAlloc)(pAllocCtx, NULL, uAvailPool+1);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003468 if(!UsefulBuf_IsNULL(Allocated)) {
3469 return -1;
3470 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003471
Laurence Lundbladef6531662018-12-04 10:42:22 +09003472 // Re do the set up for the next test that will do a successful alloc,
3473 // a fail, a free and then success
Laurence Lundbladef6531662018-12-04 10:42:22 +09003474 QCBORDecode_SetMemPool(&DC, Pool, 0);
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003475 pAlloc = DC.StringAllocator.pfAllocator;
3476 pAllocCtx = DC.StringAllocator.pAllocateCxt;
3477 uAvailPool = Pool.len - QCBOR_DECODE_MIN_MEM_POOL_SIZE;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003478
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003479 // Allocate one byte less than available and see success
3480 Allocated = (pAlloc)(pAllocCtx, NULL, uAvailPool-1);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003481 if(UsefulBuf_IsNULL(Allocated)) { // expected to succeed
3482 return -2;
3483 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003484 // Ask for some more and see failure
3485 UsefulBuf Allocated2 = (*pAlloc)(pAllocCtx, NULL, uAvailPool/2);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003486 if(!UsefulBuf_IsNULL(Allocated2)) { // expected to fail
3487 return -3;
3488 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003489 // Free the first allocate, retry the second and see success
3490 (*pAlloc)(pAllocCtx, Allocated.ptr, 0); // Free
3491 Allocated = (*pAlloc)(pAllocCtx, NULL, uAvailPool/2);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003492 if(UsefulBuf_IsNULL(Allocated)) { // succeed because of the free
3493 return -4;
3494 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003495
Laurence Lundbladef6531662018-12-04 10:42:22 +09003496 // Re do set up for next test that involves a successful alloc,
3497 // and a successful realloc and a failed realloc
3498 QCBORDecode_SetMemPool(&DC, Pool, 0);
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003499 pAlloc = DC.StringAllocator.pfAllocator;
3500 pAllocCtx = DC.StringAllocator.pAllocateCxt;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003501
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003502 // Allocate half the pool and see success
3503 Allocated = (*pAlloc)(pAllocCtx, NULL, uAvailPool/2);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003504 if(UsefulBuf_IsNULL(Allocated)) { // expected to succeed
3505 return -5;
3506 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003507 // Reallocate to take up the whole pool and see success
3508 Allocated2 = (*pAlloc)(pAllocCtx, Allocated.ptr, uAvailPool);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003509 if(UsefulBuf_IsNULL(Allocated2)) {
3510 return -6;
3511 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003512 // Make sure its the same pointer and the size is right
Laurence Lundbladef6531662018-12-04 10:42:22 +09003513 if(Allocated2.ptr != Allocated.ptr || Allocated2.len != uAvailPool) {
3514 return -7;
3515 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003516 // Try to allocate more to be sure there is failure after a realloc
3517 UsefulBuf Allocated3 = (*pAlloc)(pAllocCtx, Allocated.ptr, uAvailPool+1);
3518 if(!UsefulBuf_IsNULL(Allocated3)) {
Laurence Lundbladef6531662018-12-04 10:42:22 +09003519 return -8;
3520 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003521
Laurence Lundbladef6531662018-12-04 10:42:22 +09003522 return 0;
3523}
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08003524
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003525
3526/* Just enough of an allocator to test configuration of one */
3527static UsefulBuf AllocateTestFunction(void *pCtx, void *pOldMem, size_t uNewSize)
3528{
3529 (void)pOldMem; // unused variable
3530
3531 if(uNewSize) {
3532 // Assumes the context pointer is the buffer and
3533 // nothing too big will ever be asked for.
3534 // This is only good for this basic test!
3535 return (UsefulBuf) {pCtx, uNewSize};
3536 } else {
3537 return NULLUsefulBuf;
3538 }
3539}
3540
3541
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003542int32_t SetUpAllocatorTest(void)
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003543{
3544 // Set up the decoder with a tiny bit of CBOR to parse because
3545 // nothing can be done with it unless that is set up.
3546 QCBORDecodeContext DC;
3547 const uint8_t pMinimalCBOR[] = {0x62, 0x48, 0x69}; // "Hi"
3548 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pMinimalCBOR),0);
3549
3550 uint8_t pAllocatorBuffer[50];
3551
3552 // This is really just to test that this call works.
3553 // The full functionality of string allocators is tested
3554 // elsewhere with the MemPool internal allocator.
3555 QCBORDecode_SetUpAllocator(&DC, AllocateTestFunction, pAllocatorBuffer, 1);
3556
3557 QCBORItem Item;
3558 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_SUCCESS) {
3559 return -1;
3560 }
3561
3562 if(Item.uDataAlloc == 0 ||
3563 Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
3564 Item.val.string.ptr != pAllocatorBuffer) {
3565 return -2;
3566 }
3567
3568 if(QCBORDecode_Finish(&DC) != QCBOR_SUCCESS) {
3569 return -3;
3570 }
3571
3572 return 0;
3573}
3574
Laurence Lundblade59289e52019-12-30 13:44:37 -08003575
3576#ifndef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA
3577/*
3578 [
3579 4([-1, 3]),
3580 4([-20, 4759477275222530853136]),
3581 4([9223372036854775807, -4759477275222530853137]),
3582 5([300, 100]),
3583 5([-20, 4759477275222530853136]),
3584 5([-9223372036854775807, -4759477275222530853137])
3585 5([9223372036854775806, -4759477275222530853137])
3586 5([9223372036854775806, 9223372036854775806])]
3587 ]
3588 */
3589
3590static const uint8_t spExpectedExponentsAndMantissas[] = {
3591 0x87,
3592 0xC4, 0x82, 0x20,
3593 0x03,
3594 0xC4, 0x82, 0x33,
3595 0xC2, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,
3596 0xC4, 0x82, 0x1B, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
3597 0xC3, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,
3598 0xC5, 0x82, 0x19, 0x01, 0x2C,
3599 0x18, 0x64,
3600 0xC5, 0x82, 0x33,
3601 0xC2, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,
3602 0xC5, 0x82, 0x3B, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
3603 0xC3, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,
3604 0xC5, 0x82, 0x1B, 0x7f, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
3605 0x1B, 0x7f, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE
3606};
3607
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003608int32_t ExponentAndMantissaDecodeTests(void)
Laurence Lundblade59289e52019-12-30 13:44:37 -08003609{
3610 QCBORDecodeContext DC;
3611 QCBORError nCBORError;
3612 QCBORItem item;
3613
Laurence Lundblade17af4902020-01-07 19:11:55 -08003614 static const uint8_t spBigNumMantissa[] = {0x01, 0x02, 0x03, 0x04, 0x05,
3615 0x06, 0x07, 0x08, 0x09, 0x010};
3616 UsefulBufC BN = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNumMantissa);
Laurence Lundblade59289e52019-12-30 13:44:37 -08003617
3618
3619 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spExpectedExponentsAndMantissas), QCBOR_DECODE_MODE_NORMAL);
3620
3621 nCBORError = QCBORDecode_GetNext(&DC, &item);
3622 if(nCBORError != QCBOR_SUCCESS) {
3623 return 1;
3624 }
3625
3626 if(item.uDataType != QCBOR_TYPE_ARRAY) {
3627 return 2;
3628 }
3629
3630 nCBORError = QCBORDecode_GetNext(&DC, &item);
3631 if(nCBORError != QCBOR_SUCCESS) {
3632 return 3;
3633 }
3634
3635 if(item.uDataType != QCBOR_TYPE_DECIMAL_FRACTION ||
3636 item.val.expAndMantissa.Mantissa.nInt != 3 ||
3637 item.val.expAndMantissa.nExponent != -1) {
3638 return 4;
3639 }
3640
3641 nCBORError = QCBORDecode_GetNext(&DC, &item);
3642 if(nCBORError != QCBOR_SUCCESS) {
3643 return 5;
3644 }
3645
3646 if(item.uDataType != QCBOR_TYPE_DECIMAL_FRACTION_POS_BIGNUM ||
3647 item.val.expAndMantissa.nExponent != -20 ||
3648 UsefulBuf_Compare(item.val.expAndMantissa.Mantissa.bigNum, BN)) {
3649 return 6;
3650 }
3651
3652 nCBORError = QCBORDecode_GetNext(&DC, &item);
3653 if(nCBORError != QCBOR_SUCCESS) {
3654 return 7;
3655 }
3656
3657 if(item.uDataType != QCBOR_TYPE_DECIMAL_FRACTION_NEG_BIGNUM ||
3658 item.val.expAndMantissa.nExponent != 9223372036854775807 ||
3659 UsefulBuf_Compare(item.val.expAndMantissa.Mantissa.bigNum, BN)) {
3660 return 8;
3661 }
3662
3663 nCBORError = QCBORDecode_GetNext(&DC, &item);
3664 if(nCBORError != QCBOR_SUCCESS) {
3665 return 9;
3666 }
3667
3668 if(item.uDataType != QCBOR_TYPE_BIGFLOAT ||
3669 item.val.expAndMantissa.Mantissa.nInt != 100 ||
3670 item.val.expAndMantissa.nExponent != 300) {
3671 return 10;
3672 }
3673
3674 nCBORError = QCBORDecode_GetNext(&DC, &item);
3675 if(nCBORError != QCBOR_SUCCESS) {
3676 return 11;
3677 }
3678
3679 if(item.uDataType != QCBOR_TYPE_BIGFLOAT_POS_BIGNUM ||
3680 item.val.expAndMantissa.nExponent != -20 ||
3681 UsefulBuf_Compare(item.val.expAndMantissa.Mantissa.bigNum, BN)) {
3682 return 12;
3683 }
3684
3685 nCBORError = QCBORDecode_GetNext(&DC, &item);
3686 if(nCBORError != QCBOR_SUCCESS) {
3687 return 13;
3688 }
3689
3690 if(item.uDataType != QCBOR_TYPE_BIGFLOAT_NEG_BIGNUM ||
3691 item.val.expAndMantissa.nExponent != -9223372036854775807 ||
3692 UsefulBuf_Compare(item.val.expAndMantissa.Mantissa.bigNum, BN)) {
3693 return 14;
3694 }
3695
3696 nCBORError = QCBORDecode_GetNext(&DC, &item);
3697 if(nCBORError != QCBOR_SUCCESS) {
3698 return 15;
3699 }
3700
3701 if(item.uDataType != QCBOR_TYPE_BIGFLOAT ||
3702 item.val.expAndMantissa.nExponent != 9223372036854775806 ||
3703 item.val.expAndMantissa.Mantissa.nInt!= 9223372036854775806 ) {
3704 return 16;
3705 }
3706
3707 /* Now encode some stuff and then decode it */
3708 uint8_t pBuf[40];
3709 QCBOREncodeContext EC;
3710 UsefulBufC Encoded;
3711
3712 QCBOREncode_Init(&EC, UsefulBuf_FROM_BYTE_ARRAY(pBuf));
3713 QCBOREncode_OpenArray(&EC);
3714 QCBOREncode_AddDecimalFraction(&EC, 999, 1000); // 999 * (10 ^ 1000)
3715 QCBOREncode_AddBigFloat(&EC, 100, INT32_MIN);
3716 QCBOREncode_AddDecimalFractionBigNum(&EC, BN, false, INT32_MAX);
3717 QCBOREncode_CloseArray(&EC);
3718 QCBOREncode_Finish(&EC, &Encoded);
3719
3720
3721 QCBORDecode_Init(&DC, Encoded, QCBOR_DECODE_MODE_NORMAL);
3722 nCBORError = QCBORDecode_GetNext(&DC, &item);
3723 if(nCBORError != QCBOR_SUCCESS) {
3724 return 13;
3725 }
3726
3727 nCBORError = QCBORDecode_GetNext(&DC, &item);
3728 if(nCBORError != QCBOR_SUCCESS) {
3729 return 13;
3730 }
3731
3732 if(item.uDataType != QCBOR_TYPE_DECIMAL_FRACTION ||
3733 item.val.expAndMantissa.nExponent != 1000 ||
3734 item.val.expAndMantissa.Mantissa.nInt != 999) {
3735 return 15;
3736 }
3737
3738 nCBORError = QCBORDecode_GetNext(&DC, &item);
3739 if(nCBORError != QCBOR_SUCCESS) {
3740 return 13;
3741 }
3742
3743 if(item.uDataType != QCBOR_TYPE_BIGFLOAT ||
3744 item.val.expAndMantissa.nExponent != INT32_MIN ||
3745 item.val.expAndMantissa.Mantissa.nInt != 100) {
3746 return 15;
3747 }
3748
3749 nCBORError = QCBORDecode_GetNext(&DC, &item);
3750 if(nCBORError != QCBOR_SUCCESS) {
3751 return 13;
3752 }
3753
3754 if(item.uDataType != QCBOR_TYPE_DECIMAL_FRACTION_POS_BIGNUM ||
3755 item.val.expAndMantissa.nExponent != INT32_MAX ||
3756 UsefulBuf_Compare(item.val.expAndMantissa.Mantissa.bigNum, BN)) {
3757 return 12;
3758 }
3759
3760 return 0;
3761}
3762
3763
3764static struct FailInput ExponentAndMantissaFailures[] = {
3765 // Exponent > INT64_MAX
3766 { {(uint8_t[]){0xC4, 0x82, 0x1B, 0x7f, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
3767 0xFF, 0xFF, 0x1B, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
3768 0xFF, 0xFF,}, 20}, QCBOR_ERR_BAD_EXP_AND_MANTISSA},
3769 // Mantissa > INT64_MAX
3770 { {(uint8_t[]){0xC4, 0x82, 0x1B, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
3771 0xFF, 0xFF, 0xC3, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05,
3772 0x06, 0x07, 0x08, 0x09, 0x10}, 23}, QCBOR_ERR_BAD_EXP_AND_MANTISSA},
3773 // End of input
3774 { {(uint8_t[]){0xC4, 0x82}, 2}, QCBOR_ERR_HIT_END},
3775 // End of input
3776 { {(uint8_t[]){0xC4, 0x82, 0x01}, 3}, QCBOR_ERR_HIT_END},
3777 // bad content for big num
3778 { {(uint8_t[]){0xC4, 0x82, 0x01, 0xc3, 0x01}, 5}, QCBOR_ERR_BAD_OPT_TAG},
3779 // bad content for big num
3780 { {(uint8_t[]){0xC4, 0x82, 0xc2, 0x01, 0x1f}, 5}, QCBOR_ERR_BAD_INT},
3781 // Bad integer for exponent
3782 { {(uint8_t[]){0xC4, 0x82, 0x01, 0x1f}, 4}, QCBOR_ERR_BAD_INT},
3783 // Bad integer for mantissa
3784 { {(uint8_t[]){0xC4, 0x82, 0x1f, 0x01}, 4}, QCBOR_ERR_BAD_INT},
3785 // 3 items in array
3786 { {(uint8_t[]){0xC4, 0x83, 0x03, 0x01, 02}, 5}, QCBOR_ERR_BAD_EXP_AND_MANTISSA},
3787 // unterminated indefinite length array
3788 { {(uint8_t[]){0xC4, 0x9f, 0x03, 0x01, 0x02}, 5}, QCBOR_ERR_BAD_EXP_AND_MANTISSA},
3789 // Empty array
3790 { {(uint8_t[]){0xC4, 0x80}, 2}, QCBOR_ERR_NO_MORE_ITEMS},
3791 // Second is not an integer
3792 { {(uint8_t[]){0xC4, 0x82, 0x03, 0x40}, 4}, QCBOR_ERR_BAD_EXP_AND_MANTISSA},
3793 // First is not an integer
3794 { {(uint8_t[]){0xC4, 0x82, 0x40}, 3}, QCBOR_ERR_BAD_EXP_AND_MANTISSA},
3795 // Not an array
3796 { {(uint8_t[]){0xC4, 0xa2}, 2}, QCBOR_ERR_BAD_EXP_AND_MANTISSA}
3797};
3798
3799
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003800int32_t ExponentAndMantissaDecodeFailTests()
Laurence Lundblade59289e52019-12-30 13:44:37 -08003801{
3802 return ProcessFailures(ExponentAndMantissaFailures,
3803 sizeof(ExponentAndMantissaFailures)/sizeof(struct FailInput));
3804}
3805
3806#endif /* QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA */
Laurence Lundbladee3553422020-05-02 11:11:17 -07003807
3808
3809int32_t CBORSequenceDecodeTests(void)
3810{
3811 QCBORDecodeContext DCtx;
3812 QCBORItem Item;
3813 QCBORError uCBORError;
3814
3815 // --- Test a sequence with extra bytes ---
3816
3817 // The input for the date test happens to be a sequence so it
3818 // is reused. It is a sequence because it doesn't start as
3819 // an array or map.
3820 QCBORDecode_Init(&DCtx,
3821 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spDateTestInput),
3822 QCBOR_DECODE_MODE_NORMAL);
3823
3824 // Get the first item
3825 uCBORError = QCBORDecode_GetNext(&DCtx, &Item);
3826 if(uCBORError != QCBOR_SUCCESS) {
3827 return 1;
3828 }
3829 if(Item.uDataType != QCBOR_TYPE_DATE_STRING) {
3830 return 2;
3831 }
3832
3833 // Get a second item
3834 uCBORError = QCBORDecode_GetNext(&DCtx, &Item);
3835 if(uCBORError != QCBOR_SUCCESS) {
3836 return 2;
3837 }
3838 if(Item.uDataType != QCBOR_TYPE_DATE_EPOCH) {
3839 return 3;
3840 }
3841
3842 // A sequence can have stuff at the end that may
3843 // or may not be valid CBOR. The protocol decoder knows
3844 // when to stop by definition of the protocol, not
3845 // when the top-level map or array is ended.
3846 // Finish still has to be called to know that
3847 // maps and arrays (if there were any) were closed
3848 // off correctly. When called like this it
3849 // must return the error QCBOR_ERR_EXTRA_BYTES.
3850 uCBORError = QCBORDecode_Finish(&DCtx);
3851 if(uCBORError != QCBOR_ERR_EXTRA_BYTES) {
3852 return 4;
3853 }
3854
3855
3856 // --- Test an empty input ----
3857 uint8_t empty[1];
3858 UsefulBufC Empty = {empty, 0};
3859 QCBORDecode_Init(&DCtx,
3860 Empty,
3861 QCBOR_DECODE_MODE_NORMAL);
3862
3863 uCBORError = QCBORDecode_Finish(&DCtx);
3864 if(uCBORError != QCBOR_SUCCESS) {
3865 return 5;
3866 }
3867
3868
3869 // --- Sequence with unclosed indefinite length array ---
3870 static const uint8_t xx[] = {0x01, 0x9f, 0x02};
3871
3872 QCBORDecode_Init(&DCtx,
3873 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(xx),
3874 QCBOR_DECODE_MODE_NORMAL);
3875
3876 // Get the first item
3877 uCBORError = QCBORDecode_GetNext(&DCtx, &Item);
3878 if(uCBORError != QCBOR_SUCCESS) {
3879 return 7;
3880 }
3881 if(Item.uDataType != QCBOR_TYPE_INT64) {
3882 return 8;
3883 }
3884
3885 // Get a second item
3886 uCBORError = QCBORDecode_GetNext(&DCtx, &Item);
3887 if(uCBORError != QCBOR_SUCCESS) {
3888 return 9;
3889 }
3890 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
3891 return 10;
3892 }
3893
3894 // Try to finish before consuming all bytes to confirm
3895 // that the still-open error is returned.
3896 uCBORError = QCBORDecode_Finish(&DCtx);
3897 if(uCBORError != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
3898 return 11;
3899 }
3900
3901
3902 // --- Sequence with a closed indefinite length array ---
3903 static const uint8_t yy[] = {0x01, 0x9f, 0xff};
3904
3905 QCBORDecode_Init(&DCtx,
3906 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(yy),
3907 QCBOR_DECODE_MODE_NORMAL);
3908
3909 // Get the first item
3910 uCBORError = QCBORDecode_GetNext(&DCtx, &Item);
3911 if(uCBORError != QCBOR_SUCCESS) {
3912 return 12;
3913 }
3914 if(Item.uDataType != QCBOR_TYPE_INT64) {
3915 return 13;
3916 }
3917
3918 // Get a second item
3919 uCBORError = QCBORDecode_GetNext(&DCtx, &Item);
3920 if(uCBORError != QCBOR_SUCCESS) {
3921 return 14;
3922 }
3923 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
3924 return 15;
3925 }
3926
3927 // Try to finish before consuming all bytes to confirm
3928 // that the still-open error is returned.
3929 uCBORError = QCBORDecode_Finish(&DCtx);
3930 if(uCBORError != QCBOR_SUCCESS) {
3931 return 16;
3932 }
3933
3934
3935 return 0;
3936}
3937
Laurence Lundbladee15326f2020-06-15 15:50:23 -07003938
3939int32_t IntToTests()
3940{
3941 int nErrCode;
3942 int32_t n32;
3943 int16_t n16;
3944 int8_t n8;
3945 uint32_t u32;
3946 uint16_t u16;
3947 uint8_t u8;
3948 uint64_t u64;
3949
3950 nErrCode = QCBOR_Int64ToInt32(1, &n32);
3951 if(nErrCode == -1 || n32 != 1) {
3952 return 1;
3953 }
3954
3955 nErrCode = QCBOR_Int64ToInt32((int64_t)INT32_MAX, &n32);
3956 if(nErrCode == -1 || n32 != INT32_MAX) {
3957 return 2;
3958 }
3959
3960 nErrCode = QCBOR_Int64ToInt32((int64_t)INT32_MIN, &n32);
3961 if(nErrCode == -1 || n32 != INT32_MIN) {
3962 return 3;
3963 }
3964
3965 nErrCode = QCBOR_Int64ToInt32(((int64_t)INT32_MAX)+1, &n32);
3966 if(nErrCode != -1) {
3967 return 4;
3968 }
3969
3970 nErrCode = QCBOR_Int64ToInt32(((int64_t)INT32_MIN)-1, &n32);
3971 if(nErrCode != -1) {
3972 return 5;
3973 }
3974
3975
3976 nErrCode = QCBOR_Int64ToInt16((int64_t)INT16_MAX, &n16);
3977 if(nErrCode == -1 || n16 != INT16_MAX) {
3978 return 6;
3979 }
3980
3981 nErrCode = QCBOR_Int64ToInt16((int64_t)INT16_MIN, &n16);
3982 if(nErrCode == -1 || n16 != INT16_MIN) {
3983 return 7;
3984 }
3985
3986 nErrCode = QCBOR_Int64ToInt16(1, &n16);
3987 if(nErrCode == -1 || n16 != 1) {
3988 return 8;
3989 }
3990
3991 nErrCode = QCBOR_Int64ToInt16(((int64_t)INT16_MAX)+1, &n16);
3992 if(nErrCode != -1) {
3993 return 9;
3994 }
3995
3996 nErrCode = QCBOR_Int64ToInt16(((int64_t)INT16_MIN)-1, &n16);
3997 if(nErrCode != -1) {
3998 return 10;
3999 }
4000
4001
4002 nErrCode = QCBOR_Int64ToInt8(1, &n8);
4003 if(nErrCode == -1 || n8 != 1) {
4004 return 11;
4005 }
4006
4007 nErrCode = QCBOR_Int64ToInt8((int64_t)INT8_MAX, &n8);
4008 if(nErrCode == -1 || n8 != INT8_MAX) {
4009 return 12;
4010 }
4011
4012 nErrCode = QCBOR_Int64ToInt8((int64_t)INT8_MIN, &n8);
4013 if(nErrCode == -1 || n8 != INT8_MIN) {
4014 return 13;
4015 }
4016
4017 nErrCode = QCBOR_Int64ToInt8(((int64_t)INT8_MAX)+1, &n8);
4018 if(nErrCode != -1) {
4019 return 14;
4020 }
4021
4022 nErrCode = QCBOR_Int64ToInt8(((int64_t)INT8_MIN)-1, &n8);
4023 if(nErrCode != -1) {
4024 return 15;
4025 }
4026
4027
4028 nErrCode = QCBOR_Int64ToUInt32(1, &u32);
4029 if(nErrCode == -1 || u32 != 1) {
4030 return 16;
4031 }
4032
4033 nErrCode = QCBOR_Int64ToUInt32((int64_t)UINT32_MAX, &u32);
4034 if(nErrCode == -1 || u32 != UINT32_MAX) {
4035 return 17;
4036 }
4037
4038 nErrCode = QCBOR_Int64ToUInt32((int64_t)0, &u32);
4039 if(nErrCode == -1 || u32 != 0) {
4040 return 18;
4041 }
4042
4043 nErrCode = QCBOR_Int64ToUInt32(((int64_t)UINT32_MAX)+1, &u32);
4044 if(nErrCode != -1) {
4045 return 19;
4046 }
4047
4048 nErrCode = QCBOR_Int64ToUInt32((int64_t)-1, &u32);
4049 if(nErrCode != -1) {
4050 return 20;
4051 }
4052
4053
4054 nErrCode = QCBOR_Int64UToInt16((int64_t)UINT16_MAX, &u16);
4055 if(nErrCode == -1 || u16 != UINT16_MAX) {
4056 return 21;
4057 }
4058
4059 nErrCode = QCBOR_Int64UToInt16((int64_t)0, &u16);
4060 if(nErrCode == -1 || u16 != 0) {
4061 return 22;
4062 }
4063
4064 nErrCode = QCBOR_Int64UToInt16(1, &u16);
4065 if(nErrCode == -1 || u16 != 1) {
4066 return 23;
4067 }
4068
4069 nErrCode = QCBOR_Int64UToInt16(((int64_t)UINT16_MAX)+1, &u16);
4070 if(nErrCode != -1) {
4071 return 24;
4072 }
4073
4074 nErrCode = QCBOR_Int64UToInt16((int64_t)-1, &u16);
4075 if(nErrCode != -1) {
4076 return 25;
4077 }
4078
4079
4080 nErrCode = QCBOR_Int64ToUInt8((int64_t)UINT8_MAX, &u8);
4081 if(nErrCode == -1 || u8 != UINT8_MAX) {
4082 return 26;
4083 }
4084
4085 nErrCode = QCBOR_Int64ToUInt8((int64_t)0, &u8);
4086 if(nErrCode == -1 || u8 != 0) {
4087 return 27;
4088 }
4089
4090 nErrCode = QCBOR_Int64ToUInt8(1, &u8);
4091 if(nErrCode == -1 || u8 != 1) {
4092 return 28;
4093 }
4094
4095 nErrCode = QCBOR_Int64ToUInt8(((int64_t)UINT16_MAX)+1, &u8);
4096 if(nErrCode != -1) {
4097 return 29;
4098 }
4099
4100 nErrCode = QCBOR_Int64ToUInt8((int64_t)-1, &u8);
4101 if(nErrCode != -1) {
4102 return 30;
4103 }
4104
4105
4106 nErrCode = QCBOR_Int64ToUInt64(1, &u64);
4107 if(nErrCode == -1 || u64 != 1) {
4108 return 31;
4109 }
4110
4111 nErrCode = QCBOR_Int64ToUInt64(INT64_MAX, &u64);
4112 if(nErrCode == -1 || u64 != INT64_MAX) {
4113 return 32;
4114 }
4115
4116 nErrCode = QCBOR_Int64ToUInt64((int64_t)0, &u64);
4117 if(nErrCode == -1 || u64 != 0) {
4118 return 33;
4119 }
4120
4121 nErrCode = QCBOR_Int64ToUInt64((int64_t)-1, &u64);
4122 if(nErrCode != -1) {
4123 return 34;
4124 }
4125
4126 return 0;
4127}
4128