blob: 5f839ee2cb3fbedce60bf4f56b7e7af5881751be [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 Lundblade67257dc2020-07-27 03:33:37 -070036#include "qcbor/qcbor_spiffy_decode.h"
Laurence Lundbladed4728fd2018-12-17 15:15:56 -080037#include <string.h>
Laurence Lundblade9e3651c2018-10-10 11:49:55 +080038#include <math.h> // for fabs()
Laurence Lundbladebb1062e2019-08-12 23:28:54 -070039#include "not_well_formed_cbor.h"
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -080040
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080041
Laurence Lundbladea2e29072018-12-30 09:20:06 -080042#ifdef PRINT_FUNCTIONS_FOR_DEBUGGING
Laurence Lundblade20db9c92018-12-17 11:40:37 -080043#include <stdio.h>
Laurence Lundbladea2e29072018-12-30 09:20:06 -080044
45static void PrintUsefulBufC(const char *szLabel, UsefulBufC Buf)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080046{
47 if(szLabel) {
48 printf("%s ", szLabel);
49 }
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -080050
Laurence Lundblade570fab52018-10-13 18:28:27 +080051 size_t i;
Laurence Lundbladea2e29072018-12-30 09:20:06 -080052 for(i = 0; i < Buf.len; i++) {
53 uint8_t Z = ((uint8_t *)Buf.ptr)[i];
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080054 printf("%02x ", Z);
55 }
56 printf("\n");
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -080057
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080058 fflush(stdout);
59}
Laurence Lundblade20db9c92018-12-17 11:40:37 -080060#endif
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080061
62
Laurence Lundbladeb836efb2018-10-28 20:09:58 +070063static const uint8_t spExpectedEncodedInts[] = {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080064 0x98, 0x2f, 0x3b, 0x7f, 0xff, 0xff, 0xff, 0xff,
65 0xff, 0xff, 0xff, 0x3b, 0x00, 0x00, 0x00, 0x01,
66 0x00, 0x00, 0x00, 0x00, 0x3a, 0xff, 0xff, 0xff,
67 0xff, 0x3a, 0xff, 0xff, 0xff, 0xfe, 0x3a, 0xff,
68 0xff, 0xff, 0xfd, 0x3a, 0x7f, 0xff, 0xff, 0xff,
69 0x3a, 0x7f, 0xff, 0xff, 0xfe, 0x3a, 0x00, 0x01,
70 0x00, 0x01, 0x3a, 0x00, 0x01, 0x00, 0x00, 0x39,
71 0xff, 0xff, 0x39, 0xff, 0xfe, 0x39, 0xff, 0xfd,
72 0x39, 0x01, 0x00, 0x38, 0xff, 0x38, 0xfe, 0x38,
73 0xfd, 0x38, 0x18, 0x37, 0x36, 0x20, 0x00, 0x00,
74 0x01, 0x16, 0x17, 0x18, 0x18, 0x18, 0x19, 0x18,
75 0x1a, 0x18, 0xfe, 0x18, 0xff, 0x19, 0x01, 0x00,
76 0x19, 0x01, 0x01, 0x19, 0xff, 0xfe, 0x19, 0xff,
77 0xff, 0x1a, 0x00, 0x01, 0x00, 0x00, 0x1a, 0x00,
78 0x01, 0x00, 0x01, 0x1a, 0x00, 0x01, 0x00, 0x02,
79 0x1a, 0x7f, 0xff, 0xff, 0xff, 0x1a, 0x7f, 0xff,
80 0xff, 0xff, 0x1a, 0x80, 0x00, 0x00, 0x00, 0x1a,
81 0x80, 0x00, 0x00, 0x01, 0x1a, 0xff, 0xff, 0xff,
82 0xfe, 0x1a, 0xff, 0xff, 0xff, 0xff, 0x1b, 0x00,
83 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x1b,
84 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
85 0x1b, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
86 0xff, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
87 0xff, 0xff};
88
89
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080090// return CBOR error or -1 if type of value doesn't match
91
Laurence Lundbladec5fef682020-01-25 11:38:45 -080092static int32_t IntegerValuesParseTestInternal(QCBORDecodeContext *pDCtx)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080093{
Laurence Lundbladee6bcef12020-04-01 10:56:27 -070094 QCBORItem Item;
95 QCBORError nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080096
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080097 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -070098 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080099 if(Item.uDataType != QCBOR_TYPE_ARRAY)
100 return -1;
101
102 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700103 return (int32_t)nCBORError;
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800104 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade570fab52018-10-13 18:28:27 +0800105 Item.val.int64 != -9223372036854775807LL - 1)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800106 return -1;
107
108 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700109 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800110 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade570fab52018-10-13 18:28:27 +0800111 Item.val.int64 != -4294967297)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800112 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800113
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800114 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700115 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800116 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade570fab52018-10-13 18:28:27 +0800117 Item.val.int64 != -4294967296)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800118 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800119
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800120 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700121 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800122 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade570fab52018-10-13 18:28:27 +0800123 Item.val.int64 != -4294967295)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800124 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800125
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800126 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700127 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800128 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade570fab52018-10-13 18:28:27 +0800129 Item.val.int64 != -4294967294)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800130 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800131
132
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800133 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700134 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800135 if(Item.uDataType != QCBOR_TYPE_INT64 ||
136 Item.val.int64 != -2147483648)
137 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800138
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800139 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700140 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800141 if(Item.uDataType != QCBOR_TYPE_INT64 ||
142 Item.val.int64 != -2147483647)
143 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800144
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800145 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700146 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800147 if(Item.uDataType != QCBOR_TYPE_INT64 ||
148 Item.val.int64 != -65538)
149 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800150
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800151 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700152 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800153 if(Item.uDataType != QCBOR_TYPE_INT64 ||
154 Item.val.int64 != -65537)
155 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800156
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800157 if((nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700158 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800159 if(Item.uDataType != QCBOR_TYPE_INT64 ||
160 Item.val.int64 != -65536)
161 return -1;
162
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800163
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800164 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700165 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800166 if(Item.uDataType != QCBOR_TYPE_INT64 ||
167 Item.val.int64 != -65535)
168 return -1;
169
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800170
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800171 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700172 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800173 if(Item.uDataType != QCBOR_TYPE_INT64 ||
174 Item.val.int64 != -65534)
175 return -1;
176
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800177
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800178 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700179 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800180 if(Item.uDataType != QCBOR_TYPE_INT64 ||
181 Item.val.int64 != -257)
182 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800183
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800184 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700185 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800186 if(Item.uDataType != QCBOR_TYPE_INT64 ||
187 Item.val.int64 != -256)
188 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800189
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800190 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700191 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800192 if(Item.uDataType != QCBOR_TYPE_INT64 ||
193 Item.val.int64 != -255)
194 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800195
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800196 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700197 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800198 if(Item.uDataType != QCBOR_TYPE_INT64 ||
199 Item.val.int64 != -254)
200 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800201
202
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800203 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700204 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800205 if(Item.uDataType != QCBOR_TYPE_INT64 ||
206 Item.val.int64 != -25)
207 return -1;
208
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800209
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800210 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700211 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800212 if(Item.uDataType != QCBOR_TYPE_INT64 ||
213 Item.val.int64 != -24)
214 return -1;
215
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800216
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800217 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700218 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800219 if(Item.uDataType != QCBOR_TYPE_INT64 ||
220 Item.val.int64 != -23)
221 return -1;
222
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800223
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800224 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700225 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800226 if(Item.uDataType != QCBOR_TYPE_INT64 ||
227 Item.val.int64 != -1)
228 return -1;
229
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800230
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800231 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700232 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800233 if(Item.uDataType != QCBOR_TYPE_INT64 ||
234 Item.val.int64 != 0)
235 return -1;
236
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800237
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800238 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700239 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800240 if(Item.uDataType != QCBOR_TYPE_INT64 ||
241 Item.val.int64 != 0)
242 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800243
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800244 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700245 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800246 if(Item.uDataType != QCBOR_TYPE_INT64 ||
247 Item.val.int64 != 1)
248 return -1;
249
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800250
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800251 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700252 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800253 if(Item.uDataType != QCBOR_TYPE_INT64 ||
254 Item.val.int64 != 22)
255 return -1;
256
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800257
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800258 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700259 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800260 if(Item.uDataType != QCBOR_TYPE_INT64 ||
261 Item.val.int64 != 23)
262 return -1;
263
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800264
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800265 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700266 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800267 if(Item.uDataType != QCBOR_TYPE_INT64 ||
268 Item.val.int64 != 24)
269 return -1;
270
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800271
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800272 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700273 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800274 if(Item.uDataType != QCBOR_TYPE_INT64 ||
275 Item.val.int64 != 25)
276 return -1;
277
278 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700279 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800280 if(Item.uDataType != QCBOR_TYPE_INT64 ||
281 Item.val.int64 != 26)
282 return -1;
283
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800284
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800285 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700286 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800287 if(Item.uDataType != QCBOR_TYPE_INT64 ||
288 Item.val.int64 != 254)
289 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800290
291
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800292 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700293 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800294 if(Item.uDataType != QCBOR_TYPE_INT64 ||
295 Item.val.int64 != 255)
296 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800297
298
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800299 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700300 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800301 if(Item.uDataType != QCBOR_TYPE_INT64 ||
302 Item.val.int64 != 256)
303 return -1;
304
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800305
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800306 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700307 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800308 if(Item.uDataType != QCBOR_TYPE_INT64 ||
309 Item.val.int64 != 257)
310 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800311
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800312 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700313 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800314 if(Item.uDataType != QCBOR_TYPE_INT64 ||
315 Item.val.int64 != 65534)
316 return -1;
317
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800318
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800319 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700320 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800321 if(Item.uDataType != QCBOR_TYPE_INT64 ||
322 Item.val.int64 != 65535)
323 return -1;
324
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800325
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800326 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700327 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800328 if(Item.uDataType != QCBOR_TYPE_INT64 ||
329 Item.val.int64 != 65536)
330 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800331
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800332 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700333 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800334 if(Item.uDataType != QCBOR_TYPE_INT64 ||
335 Item.val.int64 != 65537)
336 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800337
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800338 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700339 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800340 if(Item.uDataType != QCBOR_TYPE_INT64 ||
341 Item.val.int64 != 65538)
342 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800343
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800344 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700345 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800346 if(Item.uDataType != QCBOR_TYPE_INT64 ||
347 Item.val.int64 != 2147483647)
348 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800349
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800350 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700351 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800352 if(Item.uDataType != QCBOR_TYPE_INT64 ||
353 Item.val.int64 != 2147483647)
354 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800355
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800356 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700357 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800358 if(Item.uDataType != QCBOR_TYPE_INT64 ||
359 Item.val.int64 != 2147483648)
360 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800361
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800362 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700363 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800364 if(Item.uDataType != QCBOR_TYPE_INT64 ||
365 Item.val.int64 != 2147483649)
366 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800367
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800368 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700369 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800370 if(Item.uDataType != QCBOR_TYPE_INT64 ||
371 Item.val.int64 != 4294967294)
372 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800373
374
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800375 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700376 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800377 if(Item.uDataType != QCBOR_TYPE_INT64 ||
378 Item.val.int64 != 4294967295)
379 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800380
381
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800382 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700383 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800384 if(Item.uDataType != QCBOR_TYPE_INT64 ||
385 Item.val.int64 != 4294967296)
386 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800387
388
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800389 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700390 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800391 if(Item.uDataType != QCBOR_TYPE_INT64 ||
392 Item.val.int64 != 4294967297)
393 return -1;
394
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800395
396
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800397 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700398 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800399 if(Item.uDataType != QCBOR_TYPE_INT64 ||
400 Item.val.int64 != 9223372036854775807LL)
401 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800402
403
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800404 if(( nCBORError = QCBORDecode_GetNext(pDCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700405 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800406 if(Item.uDataType != QCBOR_TYPE_UINT64 ||
407 Item.val.uint64 != 18446744073709551615ULL)
408 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800409
410
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800411 if(QCBORDecode_Finish(pDCtx) != QCBOR_SUCCESS) {
412 return -1;
413 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800414
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800415 return 0;
416}
417
418
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800419// One less than the smallest negative integer allowed in C. Decoding
420// this should fail.
421static const uint8_t spTooSmallNegative[] = {
422 0x3b, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
Laurence Lundblade21d1d812019-09-28 22:47:49 -1000423};
424
425
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800426/*
427 Tests the decoding of lots of different integers sizes
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +0800428 and values.
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800429 */
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800430int32_t IntegerValuesParseTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800431{
Laurence Lundblade21d1d812019-09-28 22:47:49 -1000432 int nReturn;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800433 QCBORDecodeContext DCtx;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800434
Laurence Lundblade21d1d812019-09-28 22:47:49 -1000435 QCBORDecode_Init(&DCtx,
436 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spExpectedEncodedInts),
437 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800438
Laurence Lundblade21d1d812019-09-28 22:47:49 -1000439 // The really big test of all successes
440 nReturn = IntegerValuesParseTestInternal(&DCtx);
441 if(nReturn) {
442 return nReturn;
443 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800444
Laurence Lundblade21d1d812019-09-28 22:47:49 -1000445 // The one large negative integer that can be parsed
446 QCBORDecode_Init(&DCtx,
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800447 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spTooSmallNegative),
Laurence Lundblade21d1d812019-09-28 22:47:49 -1000448 QCBOR_DECODE_MODE_NORMAL);
449
450 QCBORItem item;
451 if(QCBORDecode_GetNext(&DCtx, &item) != QCBOR_ERR_INT_OVERFLOW) {
452 nReturn = -4000;
453 }
454
455 return(nReturn);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800456}
457
458
459/*
Laurence Lundbladeee851742020-01-08 08:37:05 -0800460 Creates a simple CBOR array and returns it in *pEncoded. The array is
461 malloced and needs to be freed. This is used by several tests.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800462
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800463 Two of the inputs can be set. Two other items in the array are fixed.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800464
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800465 */
466
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800467static uint8_t spSimpleArrayBuffer[50];
468
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800469static int32_t CreateSimpleArray(int nInt1, int nInt2, uint8_t **pEncoded, size_t *pEncodedLen)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800470{
471 QCBOREncodeContext ECtx;
472 int nReturn = -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800473
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800474 *pEncoded = NULL;
475 *pEncodedLen = INT32_MAX;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800476
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800477 // loop runs CBOR encoding twice. First with no buffer to
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800478 // calculate the length so buffer can be allocated correctly,
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800479 // and last with the buffer to do the actual encoding
480 do {
Laurence Lundblade0595e932018-11-02 22:22:47 +0700481 QCBOREncode_Init(&ECtx, (UsefulBuf){*pEncoded, *pEncodedLen});
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800482 QCBOREncode_OpenArray(&ECtx);
483 QCBOREncode_AddInt64(&ECtx, nInt1);
484 QCBOREncode_AddInt64(&ECtx, nInt2);
485 QCBOREncode_AddBytes(&ECtx, ((UsefulBufC) {"galactic", 8}));
486 QCBOREncode_AddBytes(&ECtx, ((UsefulBufC) {"haven token", 11}));
487 QCBOREncode_CloseArray(&ECtx);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800488
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800489 if(QCBOREncode_FinishGetSize(&ECtx, pEncodedLen))
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800490 goto Done;
491
492 if(*pEncoded != NULL) {
493 nReturn = 0;
494 goto Done;
495 }
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800496
497 // Use static buffer to avoid dependency on malloc()
498 if(*pEncodedLen > sizeof(spSimpleArrayBuffer)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800499 goto Done;
500 }
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800501 *pEncoded = spSimpleArrayBuffer;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800502
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800503 } while(1);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800504
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -0800505Done:
506 return nReturn;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800507}
508
509
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800510/*
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800511 Some basic CBOR with map and array used in a lot of tests.
512 The map labels are all strings
513
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800514 {"first integer": 42,
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900515 "an array of two strings": [
516 "string1", "string2"
517 ],
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800518 "map in a map": {
519 "bytes 1": h'78787878',
520 "bytes 2": h'79797979',
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900521 "another int": 98,
522 "text 2": "lies, damn lies and statistics"
523 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800524 }
525 */
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800526static const uint8_t pValidMapEncoded[] = {
Laurence Lundbladeb836efb2018-10-28 20:09:58 +0700527 0xa3, 0x6d, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x69, 0x6e,
528 0x74, 0x65, 0x67, 0x65, 0x72, 0x18, 0x2a, 0x77, 0x61, 0x6e,
529 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20,
530 0x74, 0x77, 0x6f, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
531 0x73, 0x82, 0x67, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x31,
532 0x67, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x32, 0x6c, 0x6d,
533 0x61, 0x70, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x6d, 0x61,
534 0x70, 0xa4, 0x67, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x31,
535 0x44, 0x78, 0x78, 0x78, 0x78, 0x67, 0x62, 0x79, 0x74, 0x65,
536 0x73, 0x20, 0x32, 0x44, 0x79, 0x79, 0x79, 0x79, 0x6b, 0x61,
537 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x74,
538 0x18, 0x62, 0x66, 0x74, 0x65, 0x78, 0x74, 0x20, 0x32, 0x78,
539 0x1e, 0x6c, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x64, 0x61, 0x6d,
540 0x6e, 0x20, 0x6c, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64,
541 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63,
Laurence Lundblade02625d42020-06-25 14:41:41 -0700542 0x73 };
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800543
Laurence Lundblade2c1faf92020-06-26 22:43:56 -0700544// Same as above, but with indefinite lengths.
545static const uint8_t pValidMapIndefEncoded[] = {
5460xbf, 0x6d, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x69, 0x6e,
5470x74, 0x65, 0x67, 0x65, 0x72, 0x18, 0x2a, 0x77, 0x61, 0x6e,
5480x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20,
5490x74, 0x77, 0x6f, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
5500x73, 0x9f, 0x67, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x31,
5510x67, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x32, 0xff, 0x6c, 0x6d,
5520x61, 0x70, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x6d, 0x61,
5530x70, 0xbf, 0x67, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x31,
5540x44, 0x78, 0x78, 0x78, 0x78, 0x67, 0x62, 0x79, 0x74, 0x65,
5550x73, 0x20, 0x32, 0x44, 0x79, 0x79, 0x79, 0x79, 0x6b, 0x61,
5560x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x74,
5570x18, 0x62, 0x66, 0x74, 0x65, 0x78, 0x74, 0x20, 0x32, 0x78,
5580x1e, 0x6c, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x64, 0x61, 0x6d,
5590x6e, 0x20, 0x6c, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64,
5600x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63,
5610x73, 0xff, 0xff};
562
563
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800564static int32_t ParseOrderedArray(const uint8_t *pEncoded,
Laurence Lundblade02625d42020-06-25 14:41:41 -0700565 size_t nLen,
566 int64_t *pInt1,
567 int64_t *pInt2,
568 const uint8_t **pBuf3,
569 size_t *pBuf3Len,
570 const uint8_t **pBuf4,
571 size_t *pBuf4Len)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800572{
573 QCBORDecodeContext DCtx;
574 QCBORItem Item;
575 int nReturn = -1; // assume error until success
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800576
Laurence Lundbladeee851742020-01-08 08:37:05 -0800577 QCBORDecode_Init(&DCtx,
578 (UsefulBufC){pEncoded, nLen},
579 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800580
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800581 // Make sure the first thing is a map
582 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 || Item.uDataType != QCBOR_TYPE_ARRAY)
583 goto Done;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800584
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800585 // First integer
Laurence Lundblade12b495d2018-12-17 11:15:54 -0800586 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 || Item.uDataType != QCBOR_TYPE_INT64)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800587 goto Done;
588 *pInt1 = Item.val.int64;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800589
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800590 // Second integer
591 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 || Item.uDataType != QCBOR_TYPE_INT64)
592 goto Done;
593 *pInt2 = Item.val.int64;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800594
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800595 // First string
596 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 || Item.uDataType != QCBOR_TYPE_BYTE_STRING)
597 goto Done;
598 *pBuf3 = Item.val.string.ptr;
599 *pBuf3Len = Item.val.string.len;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800600
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800601 // Second string
602 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 || Item.uDataType != QCBOR_TYPE_BYTE_STRING)
603 goto Done;
604 *pBuf4 = Item.val.string.ptr;
605 *pBuf4Len = Item.val.string.len;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800606
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800607 nReturn = 0;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800608
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800609Done:
610 return(nReturn);
611}
612
613
614
Laurence Lundblade9e3651c2018-10-10 11:49:55 +0800615
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800616int32_t SimpleArrayTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800617{
618 uint8_t *pEncoded;
619 size_t nEncodedLen;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800620
Laurence Lundblade5e390822019-01-06 12:35:01 -0800621 int64_t i1=0, i2=0;
622 size_t i3=0, i4=0;
623 const uint8_t *s3= (uint8_t *)"";
624 const uint8_t *s4= (uint8_t *)"";
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800625
626
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800627 if(CreateSimpleArray(23, 6000, &pEncoded, &nEncodedLen) < 0) {
628 return(-1);
629 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800630
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800631 ParseOrderedArray(pEncoded, nEncodedLen, &i1, &i2, &s3, &i3, &s4, &i4);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800632
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800633 if(i1 != 23 ||
634 i2 != 6000 ||
635 i3 != 8 ||
636 i4 != 11 ||
Laurence Lundbladea44d5062018-10-17 18:45:12 +0530637 memcmp("galactic", s3, 8) !=0 ||
638 memcmp("haven token", s4, 11) !=0) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800639 return(-1);
640 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800641
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800642 return(0);
643}
644
645
Laurence Lundblade9916b1b2019-09-07 22:33:25 -0700646/*
647 [
648 0,
649 [],
650 [
651 [],
652 [
653 0
654 ],
655 {},
656 {
657 1: {},
658 2: {},
659 3: []
660 }
661 ]
662 ]
663 */
664static uint8_t sEmpties[] = {0x83, 0x00, 0x80, 0x84, 0x80, 0x81, 0x00, 0xa0,
665 0xa3, 0x01, 0xa0, 0x02, 0xa0, 0x03, 0x80};
666
Laurence Lundblade02625d42020-06-25 14:41:41 -0700667/* Same as above, but with indefinte lengths */
668static uint8_t sEmptiesIndef[] = {
6690x9F,
Laurence Lundblade2c1faf92020-06-26 22:43:56 -0700670 0x00,
671 0x9F,
672 0xFF,
673 0x9F,
674 0x9F,
675 0xFF,
676 0x9F,
677 0x00,
678 0xFF,
679 0xBF,
680 0xFF,
681 0xBF,
682 0x01,
683 0xBF,
684 0xFF,
685 0x02,
686 0xBF,
687 0xFF,
688 0x03,
689 0x9F,
690 0xFF,
691 0xFF,
692 0xFF,
Laurence Lundblade02625d42020-06-25 14:41:41 -0700693 0xFF};
694
695
696
697static int32_t CheckEmpties(UsefulBufC input, bool bCheckCounts)
Laurence Lundblade9916b1b2019-09-07 22:33:25 -0700698{
699 QCBORDecodeContext DCtx;
700 QCBORItem Item;
701
Laurence Lundbladeee851742020-01-08 08:37:05 -0800702 QCBORDecode_Init(&DCtx,
Laurence Lundblade02625d42020-06-25 14:41:41 -0700703 input,
Laurence Lundbladeee851742020-01-08 08:37:05 -0800704 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade9916b1b2019-09-07 22:33:25 -0700705
706 // Array with 3 items
707 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
708 Item.uDataType != QCBOR_TYPE_ARRAY ||
709 Item.uNestingLevel != 0 ||
710 Item.uNextNestLevel != 1 ||
Laurence Lundblade02625d42020-06-25 14:41:41 -0700711 (bCheckCounts && Item.val.uCount != 3)) {
Laurence Lundblade9916b1b2019-09-07 22:33:25 -0700712 return -1;
713 }
714
715 // An integer 0
716 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
717 Item.uDataType != QCBOR_TYPE_INT64 ||
718 Item.uNestingLevel != 1 ||
719 Item.uNextNestLevel != 1 ||
720 Item.val.uint64 != 0) {
721 return -2;
722 }
723
724 // An empty array
725 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
726 Item.uDataType != QCBOR_TYPE_ARRAY ||
727 Item.uNestingLevel != 1 ||
728 Item.uNextNestLevel != 1 ||
Laurence Lundblade02625d42020-06-25 14:41:41 -0700729 (bCheckCounts && Item.val.uCount != 0)) {
Laurence Lundblade9916b1b2019-09-07 22:33:25 -0700730 return -3;
731 }
732
733 // An array with 4 items
734 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
735 Item.uDataType != QCBOR_TYPE_ARRAY ||
736 Item.uNestingLevel != 1 ||
737 Item.uNextNestLevel != 2 ||
Laurence Lundblade02625d42020-06-25 14:41:41 -0700738 (bCheckCounts && Item.val.uCount != 4)) {
Laurence Lundblade9916b1b2019-09-07 22:33:25 -0700739 return -4;
740 }
741
742 // An empty array
743 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
744 Item.uDataType != QCBOR_TYPE_ARRAY ||
745 Item.uNestingLevel != 2 ||
746 Item.uNextNestLevel != 2 ||
Laurence Lundblade02625d42020-06-25 14:41:41 -0700747 (bCheckCounts && Item.val.uCount != 0)) {
Laurence Lundblade9916b1b2019-09-07 22:33:25 -0700748 return -5;
749 }
750
751 // An array with 1 item
752 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
753 Item.uDataType != QCBOR_TYPE_ARRAY ||
754 Item.uNestingLevel != 2 ||
755 Item.uNextNestLevel != 3 ||
Laurence Lundblade02625d42020-06-25 14:41:41 -0700756 (bCheckCounts && Item.val.uCount != 1)) {
Laurence Lundblade9916b1b2019-09-07 22:33:25 -0700757 return -6;
758 }
759
760 // An integer 0
761 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
762 Item.uDataType != QCBOR_TYPE_INT64 ||
763 Item.uNestingLevel != 3 ||
764 Item.uNextNestLevel != 2 ||
765 Item.val.uint64 != 0) {
766 return -7;
767 }
768
769 // An empty map
770 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
771 Item.uDataType != QCBOR_TYPE_MAP ||
772 Item.uNestingLevel != 2 ||
773 Item.uNextNestLevel != 2 ||
Laurence Lundblade02625d42020-06-25 14:41:41 -0700774 (bCheckCounts && Item.val.uCount != 0)) {
Laurence Lundblade9916b1b2019-09-07 22:33:25 -0700775 return -8;
776 }
777
Laurence Lundblade5e87da62020-06-07 03:24:28 -0700778 // A map with 3 items
Laurence Lundblade9916b1b2019-09-07 22:33:25 -0700779 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
780 Item.uDataType != QCBOR_TYPE_MAP ||
781 Item.uNestingLevel != 2 ||
782 Item.uNextNestLevel != 3 ||
Laurence Lundblade02625d42020-06-25 14:41:41 -0700783 (bCheckCounts && Item.val.uCount != 3)) {
Laurence Lundblade9916b1b2019-09-07 22:33:25 -0700784 return -9;
785 }
786
787 // An empty map
788 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
789 Item.uDataType != QCBOR_TYPE_MAP ||
790 Item.uNestingLevel != 3 ||
791 Item.uNextNestLevel != 3 ||
Laurence Lundblade02625d42020-06-25 14:41:41 -0700792 (bCheckCounts && Item.val.uCount != 0)) {
Laurence Lundblade9916b1b2019-09-07 22:33:25 -0700793 return -10;
794 }
795
796 // An empty map
797 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
798 Item.uDataType != QCBOR_TYPE_MAP ||
799 Item.uNestingLevel != 3 ||
800 Item.uNextNestLevel != 3 ||
Laurence Lundblade02625d42020-06-25 14:41:41 -0700801 (bCheckCounts && Item.val.uCount != 0)) {
Laurence Lundblade9916b1b2019-09-07 22:33:25 -0700802 return -11;
803 }
804
805 // An empty array
806 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
807 Item.uDataType != QCBOR_TYPE_ARRAY ||
808 Item.uNestingLevel != 3 ||
809 Item.uNextNestLevel != 0 ||
Laurence Lundblade02625d42020-06-25 14:41:41 -0700810 (bCheckCounts && Item.val.uCount != 0)) {
Laurence Lundblade9916b1b2019-09-07 22:33:25 -0700811 return -12;
812 }
813
814 if(QCBORDecode_Finish(&DCtx) != QCBOR_SUCCESS) {
815 return -13;
816 }
Laurence Lundblade02625d42020-06-25 14:41:41 -0700817 return 0;
818}
819
820
821int32_t EmptyMapsAndArraysTest()
822{
823 int nResult;
824 nResult = CheckEmpties(UsefulBuf_FROM_BYTE_ARRAY_LITERAL(sEmpties),
825 true);
826 if(nResult) {
827 return nResult;
828 }
829
830 nResult = CheckEmpties(UsefulBuf_FROM_BYTE_ARRAY_LITERAL(sEmptiesIndef),
831 false);
832
833 if(nResult) {
834 return nResult -100;
835 }
Laurence Lundblade9916b1b2019-09-07 22:33:25 -0700836
837 return 0;
838}
839
Laurence Lundblade9e3651c2018-10-10 11:49:55 +0800840
Laurence Lundbladeee851742020-01-08 08:37:05 -0800841static uint8_t spDeepArrays[] = {0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
842 0x81, 0x81, 0x81, 0x80};
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800843
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800844int32_t ParseDeepArrayTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800845{
846 QCBORDecodeContext DCtx;
847 int nReturn = 0;
848 int i;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800849
Laurence Lundbladeee851742020-01-08 08:37:05 -0800850 QCBORDecode_Init(&DCtx,
851 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spDeepArrays),
852 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800853
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800854 for(i = 0; i < 10; i++) {
855 QCBORItem Item;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800856
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800857 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
858 Item.uDataType != QCBOR_TYPE_ARRAY ||
859 Item.uNestingLevel != i) {
860 nReturn = -1;
861 break;
862 }
863 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800864
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800865 return(nReturn);
866}
867
Laurence Lundblade972e59c2018-11-11 15:57:23 +0700868// Big enough to test nesting to the depth of 24
Laurence Lundbladeee851742020-01-08 08:37:05 -0800869static uint8_t spTooDeepArrays[] = {0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
870 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
871 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,
872 0x81, 0x81, 0x81, 0x80};
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800873
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800874int32_t ParseTooDeepArrayTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800875{
876 QCBORDecodeContext DCtx;
877 int nReturn = 0;
878 int i;
879 QCBORItem Item;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800880
881
Laurence Lundbladeee851742020-01-08 08:37:05 -0800882 QCBORDecode_Init(&DCtx,
883 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spTooDeepArrays),
884 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800885
Laurence Lundblade972e59c2018-11-11 15:57:23 +0700886 for(i = 0; i < QCBOR_MAX_ARRAY_NESTING1; i++) {
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800887
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800888 if(QCBORDecode_GetNext(&DCtx, &Item) != 0 ||
889 Item.uDataType != QCBOR_TYPE_ARRAY ||
890 Item.uNestingLevel != i) {
891 nReturn = -1;
892 break;
893 }
894 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800895
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800896 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_ARRAY_NESTING_TOO_DEEP)
897 nReturn = -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800898
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800899 return(nReturn);
900}
901
902
903
904
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800905int32_t ShortBufferParseTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800906{
Laurence Lundbladebb1062e2019-08-12 23:28:54 -0700907 int nResult = 0;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800908
Laurence Lundblade06350ea2020-01-27 19:32:40 -0800909 for(size_t nNum = sizeof(spExpectedEncodedInts)-1; nNum; nNum--) {
Laurence Lundbladebb1062e2019-08-12 23:28:54 -0700910 QCBORDecodeContext DCtx;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800911
Laurence Lundbladeee851742020-01-08 08:37:05 -0800912 QCBORDecode_Init(&DCtx,
913 (UsefulBufC){spExpectedEncodedInts, nNum},
914 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800915
Laurence Lundblade06350ea2020-01-27 19:32:40 -0800916 const int nErr = IntegerValuesParseTestInternal(&DCtx);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800917
Laurence Lundbladebb1062e2019-08-12 23:28:54 -0700918 if(nErr != QCBOR_ERR_HIT_END && nErr != QCBOR_ERR_NO_MORE_ITEMS) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800919 nResult = -1;
920 goto Done;
921 }
922 }
923Done:
924 return nResult;
925}
926
927
Laurence Lundblade9e3651c2018-10-10 11:49:55 +0800928
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800929int32_t ShortBufferParseTest2()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800930{
931 uint8_t *pEncoded;
932 int nReturn;
933 size_t nEncodedLen;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800934
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800935 int64_t i1, i2;
936 size_t i3, i4;
937 const uint8_t *s3, *s4;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800938
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800939 nReturn = 0;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800940
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800941 if(CreateSimpleArray(23, 6000, &pEncoded, &nEncodedLen) < 0) {
942 return(-1);
943 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800944
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800945 for(nEncodedLen--; nEncodedLen; nEncodedLen--) {
946 int nResult = ParseOrderedArray(pEncoded, (uint32_t)nEncodedLen, &i1, &i2, &s3, &i3, &s4, &i4);
947 if(nResult == 0) {
948 nReturn = -1;
949 }
950 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800951
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800952 return(nReturn);
953}
954
Laurence Lundbladefab1b522018-10-19 13:40:52 +0530955/*
956 Decode and thoroughly check a moderately complex
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800957 set of maps. Can be run in QCBOR_DECODE_MODE_NORMAL or in
958 QCBOR_DECODE_MODE_MAP_STRINGS_ONLY.
Laurence Lundbladefab1b522018-10-19 13:40:52 +0530959 */
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800960static int32_t ParseMapTest1(QCBORDecodeMode nMode)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800961{
962 QCBORDecodeContext DCtx;
963 QCBORItem Item;
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700964 QCBORError nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800965
Laurence Lundbladeee851742020-01-08 08:37:05 -0800966 QCBORDecode_Init(&DCtx,
967 (UsefulBufC){pValidMapEncoded, sizeof(pValidMapEncoded)},
968 nMode);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800969
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900970 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700971 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900972 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800973 if(Item.uDataType != QCBOR_TYPE_MAP ||
974 Item.val.uCount != 3)
975 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800976
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900977 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700978 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900979 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800980 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800981 Item.uDataType != QCBOR_TYPE_INT64 ||
982 Item.val.int64 != 42 ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +0530983 Item.uDataAlloc ||
984 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900985 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("first integer"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800986 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900987 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800988
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900989 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -0700990 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900991 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800992 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +0530993 Item.uDataAlloc ||
994 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +0900995 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("an array of two strings")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800996 Item.uDataType != QCBOR_TYPE_ARRAY ||
997 Item.val.uCount != 2)
998 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800999
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001000 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001001 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001002 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001003 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +05301004 Item.uDataAlloc ||
1005 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001006 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("string1"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001007 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001008 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001009
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001010 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001011 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001012 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001013 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +05301014 Item.uDataAlloc ||
1015 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001016 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("string2"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001017 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001018 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001019
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001020 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001021 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001022 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001023 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +05301024 Item.uDataAlloc ||
1025 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001026 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("map in a map")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001027 Item.uDataType != QCBOR_TYPE_MAP ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001028 Item.val.uCount != 4) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001029 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001030 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001031
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001032 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001033 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001034 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001035 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001036 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("bytes 1"))||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001037 Item.uDataType != QCBOR_TYPE_BYTE_STRING ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +05301038 Item.uDataAlloc ||
1039 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001040 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("xxxx"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001041 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001042 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001043
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001044 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001045 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001046 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001047 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001048 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("bytes 2")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001049 Item.uDataType != QCBOR_TYPE_BYTE_STRING ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +05301050 Item.uDataAlloc ||
1051 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001052 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("yyyy"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001053 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001054 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001055
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001056 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001057 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001058 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001059 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +05301060 Item.uDataAlloc ||
1061 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001062 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("another int")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001063 Item.uDataType != QCBOR_TYPE_INT64 ||
1064 Item.val.int64 != 98)
1065 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001066
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001067 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001068 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001069 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001070 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001071 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("text 2"))||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001072 Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladefab1b522018-10-19 13:40:52 +05301073 Item.uDataAlloc ||
1074 Item.uLabelAlloc ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001075 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("lies, damn lies and statistics"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001076 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001077 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001078
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001079 return 0;
1080}
1081
1082
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001083/*
1084 Decode and thoroughly check a moderately complex
1085 set of maps
1086 */
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001087int32_t ParseMapAsArrayTest()
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001088{
1089 QCBORDecodeContext DCtx;
1090 QCBORItem Item;
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001091 QCBORError nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001092
Laurence Lundbladeee851742020-01-08 08:37:05 -08001093 QCBORDecode_Init(&DCtx,
1094 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapEncoded),
1095 QCBOR_DECODE_MODE_MAP_AS_ARRAY);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001096
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001097 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001098 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001099 }
Laurence Lundbladed61cbf32018-12-09 11:42:21 -08001100 if(Item.uDataType != QCBOR_TYPE_MAP_AS_ARRAY ||
1101 Item.val.uCount != 6) {
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001102 return -1;
1103 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001104
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001105 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001106 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001107 }
1108 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
1109 Item.uDataAlloc ||
1110 Item.uLabelAlloc ||
1111 Item.uLabelType != QCBOR_TYPE_NONE ||
1112 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("first integer"))) {
1113 return -2;
1114 }
1115
1116 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001117 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001118 }
1119 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1120 Item.uDataType != QCBOR_TYPE_INT64 ||
1121 Item.val.int64 != 42 ||
1122 Item.uDataAlloc ||
1123 Item.uLabelAlloc) {
1124 return -3;
1125 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001126
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001127 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001128 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001129 }
1130 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1131 Item.uDataAlloc ||
1132 Item.uLabelAlloc ||
1133 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("an array of two strings")) ||
1134 Item.uDataType != QCBOR_TYPE_TEXT_STRING) {
1135 return -4;
1136 }
1137
1138 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001139 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001140 }
1141 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1142 Item.uDataAlloc ||
1143 Item.uLabelAlloc ||
1144 Item.uDataType != QCBOR_TYPE_ARRAY ||
1145 Item.val.uCount != 2) {
1146 return -5;
1147 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001148
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001149 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001150 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001151 }
1152 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
1153 Item.val.string.len != 7 ||
1154 Item.uDataAlloc ||
1155 Item.uLabelAlloc ||
1156 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("string1"))) {
1157 return -6;
1158 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001159
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001160 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001161 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001162 }
1163 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
1164 Item.uDataAlloc ||
1165 Item.uLabelAlloc ||
1166 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("string2"))) {
1167 return -7;
1168 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001169
1170
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001171 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001172 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001173 }
1174 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1175 Item.uDataAlloc ||
1176 Item.uLabelAlloc ||
1177 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("map in a map"))) {
1178 return -8;
1179 }
1180
1181 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001182 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001183 }
1184 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1185 Item.uDataAlloc ||
1186 Item.uLabelAlloc ||
Laurence Lundbladed61cbf32018-12-09 11:42:21 -08001187 Item.uDataType != QCBOR_TYPE_MAP_AS_ARRAY ||
1188 Item.val.uCount != 8) {
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001189 return -9;
1190 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001191
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001192 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001193 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001194 }
1195 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1196 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("bytes 1"))||
1197 Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
1198 Item.uDataAlloc ||
1199 Item.uLabelAlloc) {
1200 return -10;
1201 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001202
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001203 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001204 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001205 }
1206 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1207 Item.uDataType != QCBOR_TYPE_BYTE_STRING ||
1208 Item.uDataAlloc ||
1209 Item.uLabelAlloc ||
1210 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("xxxx"))) {
1211 return -11;
1212 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001213
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001214 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001215 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001216 }
1217 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1218 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("bytes 2")) ||
1219 Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
1220 Item.uDataAlloc ||
1221 Item.uLabelAlloc) {
1222 return -12;
1223 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001224
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001225 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001226 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001227 }
1228 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1229 Item.uDataType != QCBOR_TYPE_BYTE_STRING ||
1230 Item.uDataAlloc ||
1231 Item.uLabelAlloc ||
1232 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("yyyy"))) {
1233 return -13;
1234 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001235
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001236 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001237 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001238 }
1239 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1240 Item.uDataAlloc ||
1241 Item.uLabelAlloc ||
1242 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("another int")) ||
1243 Item.uDataType != QCBOR_TYPE_TEXT_STRING) {
1244 return -14;
1245 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001246
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001247 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001248 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001249 }
1250 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1251 Item.uDataAlloc ||
1252 Item.uLabelAlloc ||
1253 Item.uDataType != QCBOR_TYPE_INT64 ||
1254 Item.val.int64 != 98) {
1255 return -15;
1256 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001257
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001258 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001259 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001260 }
1261 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1262 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("text 2"))||
1263 Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
1264 Item.uDataAlloc ||
1265 Item.uLabelAlloc) {
1266 return -16;
1267 }
1268
1269 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001270 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001271 }
1272 if(Item.uLabelType != QCBOR_TYPE_NONE ||
1273 Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
1274 Item.uDataAlloc ||
1275 Item.uLabelAlloc ||
1276 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("lies, damn lies and statistics"))) {
1277 return -17;
1278 }
Laurence Lundblade2feb1e12020-07-15 03:50:45 -07001279
1280
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001281 /*
1282 Test with map that nearly QCBOR_MAX_ITEMS_IN_ARRAY items in a
1283 map that when interpreted as an array will be too many. Test
1284 data just has the start of the map, not all the items in the map.
1285 */
1286 static const uint8_t pTooLargeMap[] = {0xb9, 0xff, 0xfd};
Laurence Lundblade2feb1e12020-07-15 03:50:45 -07001287
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001288 QCBORDecode_Init(&DCtx,
1289 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pTooLargeMap),
1290 QCBOR_DECODE_MODE_MAP_AS_ARRAY);
Laurence Lundblade2feb1e12020-07-15 03:50:45 -07001291
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001292 if((QCBOR_ERR_ARRAY_TOO_LONG != QCBORDecode_GetNext(&DCtx, &Item))) {
1293 return -50;
1294 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001295
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001296 return 0;
1297}
1298
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001299
1300/*
Laurence Lundbladefab1b522018-10-19 13:40:52 +05301301 Fully or partially decode pValidMapEncoded. When
1302 partially decoding check for the right error code.
1303 How much partial decoding depends on nLevel.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001304
Laurence Lundbladefab1b522018-10-19 13:40:52 +05301305 The partial decodes test error conditions of
1306 incomplete encoded input.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001307
Laurence Lundbladefab1b522018-10-19 13:40:52 +05301308 This could be combined with the above test
1309 and made prettier and maybe a little more
1310 thorough.
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001311 */
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001312static int32_t ExtraBytesTest(int nLevel)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001313{
1314 QCBORDecodeContext DCtx;
1315 QCBORItem Item;
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001316 QCBORError nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001317
Laurence Lundbladeee851742020-01-08 08:37:05 -08001318 QCBORDecode_Init(&DCtx,
1319 (UsefulBufC){pValidMapEncoded, sizeof(pValidMapEncoded)},
1320 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001321
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001322 if(nLevel < 1) {
1323 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_EXTRA_BYTES) {
1324 return -1;
1325 } else {
1326 return 0;
1327 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001328 }
Laurence Lundbladefab1b522018-10-19 13:40:52 +05301329
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001330
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001331 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001332 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001333 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001334 if(Item.uDataType != QCBOR_TYPE_MAP ||
1335 Item.val.uCount != 3)
1336 return -1;
1337
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001338 if(nLevel < 2) {
1339 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1340 return -1;
1341 } else {
1342 return 0;
1343 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001344 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001345
1346
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001347 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001348 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001349 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001350 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001351 Item.uDataType != QCBOR_TYPE_INT64 ||
1352 Item.val.uCount != 42 ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001353 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("first integer"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001354 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001355 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001356
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001357 if(nLevel < 3) {
1358 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1359 return -1;
1360 } else {
1361 return 0;
1362 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001363 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001364
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001365 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001366 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001367 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001368 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001369 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("an array of two strings")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001370 Item.uDataType != QCBOR_TYPE_ARRAY ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001371 Item.val.uCount != 2) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001372 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001373 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001374
1375
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001376 if(nLevel < 4) {
1377 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1378 return -1;
1379 } else {
1380 return 0;
1381 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001382 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001383
1384
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001385 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001386 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001387 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001388 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001389 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("string1"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001390 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001391 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001392
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001393 if(nLevel < 5) {
1394 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1395 return -1;
1396 } else {
1397 return 0;
1398 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001399 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001400
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001401 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001402 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001403 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001404 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001405 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("string2"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001406 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001407 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001408
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001409 if(nLevel < 6) {
1410 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1411 return -1;
1412 } else {
1413 return 0;
1414 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001415 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001416
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001417 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001418 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001419 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001420 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001421 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("map in a map")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001422 Item.uDataType != QCBOR_TYPE_MAP ||
1423 Item.val.uCount != 4)
1424 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001425
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001426 if(nLevel < 7) {
1427 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1428 return -1;
1429 } else {
1430 return 0;
1431 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001432 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001433
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001434 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001435 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001436 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001437 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001438 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("bytes 1")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001439 Item.uDataType != QCBOR_TYPE_BYTE_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001440 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("xxxx"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001441 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001442 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001443
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001444 if(nLevel < 8) {
1445 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1446 return -1;
1447 } else {
1448 return 0;
1449 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001450 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001451
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001452 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001453 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001454 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001455 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001456 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("bytes 2")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001457 Item.uDataType != QCBOR_TYPE_BYTE_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001458 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("yyyy"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001459 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001460 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001461
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001462 if(nLevel < 9) {
1463 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1464 return -1;
1465 } else {
1466 return 0;
1467 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001468 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001469
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001470 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001471 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001472 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001473 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001474 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("another int")) ||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001475 Item.uDataType != QCBOR_TYPE_INT64 ||
1476 Item.val.int64 != 98)
1477 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001478
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001479 if(nLevel < 10) {
1480 if(QCBORDecode_Finish(&DCtx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
1481 return -1;
1482 } else {
1483 return 0;
1484 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001485 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001486
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001487 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001488 return (int32_t)nCBORError;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001489 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001490 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001491 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("text 2"))||
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001492 Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001493 UsefulBuf_Compare(Item.val.string, UsefulBuf_FromSZ("lies, damn lies and statistics"))) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001494 return -1;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09001495 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001496
Laurence Lundbladefab1b522018-10-19 13:40:52 +05301497 if(QCBORDecode_Finish(&DCtx)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001498 return -1;
1499 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001500
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001501 return 0;
1502}
1503
1504
1505
Laurence Lundblade844bb5c2020-03-01 17:27:25 -08001506
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001507int32_t ParseMapTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001508{
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001509 // Parse a moderatly complex map structure very thoroughly
1510 int32_t nResult = ParseMapTest1(QCBOR_DECODE_MODE_NORMAL);
1511 if(nResult) {
1512 return nResult;
1513 }
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08001514
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001515 // Again, but in strings-only mode. It should succeed since the input
1516 // map has only string labels.
1517 nResult = ParseMapTest1(QCBOR_DECODE_MODE_MAP_STRINGS_ONLY);
1518 if(nResult) {
1519 return nResult;
1520 }
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08001521
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001522 // Again, but try to finish the decoding before the end of the
1523 // input at 10 different place and see that the right error code
1524 // is returned.
1525 for(int i = 0; i < 10; i++) {
1526 nResult = ExtraBytesTest(i);
1527 if(nResult) {
1528 break;
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001529 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001530 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001531
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001532 return nResult;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001533}
1534
1535
Laurence Lundbladeee851742020-01-08 08:37:05 -08001536static uint8_t spSimpleValues[] = {0x8a, 0xf4, 0xf5, 0xf6, 0xf7, 0xff,
1537 0xe0, 0xf3, 0xf8, 0x00, 0xf8, 0x13,
1538 0xf8, 0x1f, 0xf8, 0x20, 0xf8, 0xff};
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001539
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001540int32_t ParseSimpleTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001541{
1542 QCBORDecodeContext DCtx;
1543 QCBORItem Item;
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001544 QCBORError nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001545
1546
Laurence Lundbladeee851742020-01-08 08:37:05 -08001547 QCBORDecode_Init(&DCtx,
1548 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spSimpleValues),
1549 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001550
1551
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001552 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001553 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001554 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
1555 Item.val.uCount != 10)
1556 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001557
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001558 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001559 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001560 if(Item.uDataType != QCBOR_TYPE_FALSE)
1561 return -1;
1562
1563 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001564 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001565 if(Item.uDataType != QCBOR_TYPE_TRUE)
1566 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001567
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001568 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001569 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001570 if(Item.uDataType != QCBOR_TYPE_NULL)
1571 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001572
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001573 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001574 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001575 if(Item.uDataType != QCBOR_TYPE_UNDEF)
1576 return -1;
1577
1578 // A break
Laurence Lundblade9e3651c2018-10-10 11:49:55 +08001579 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_BAD_BREAK)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001580 return -1;
1581
1582 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001583 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001584 if(Item.uDataType != QCBOR_TYPE_UKNOWN_SIMPLE || Item.val.uSimple != 0)
1585 return -1;
1586
1587 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001588 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001589 if(Item.uDataType != QCBOR_TYPE_UKNOWN_SIMPLE || Item.val.uSimple != 19)
1590 return -1;
1591
Laurence Lundblade077475f2019-04-26 09:06:33 -07001592 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_BAD_TYPE_7)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001593 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001594
Laurence Lundblade077475f2019-04-26 09:06:33 -07001595 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_BAD_TYPE_7)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001596 return -1;
1597
Laurence Lundblade077475f2019-04-26 09:06:33 -07001598 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_BAD_TYPE_7)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001599 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001600
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001601 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001602 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001603 if(Item.uDataType != QCBOR_TYPE_UKNOWN_SIMPLE || Item.val.uSimple != 32)
1604 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001605
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001606 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07001607 return (int32_t)nCBORError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001608 if(Item.uDataType != QCBOR_TYPE_UKNOWN_SIMPLE || Item.val.uSimple != 255)
1609 return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001610
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001611 return 0;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001612
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001613}
1614
1615
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001616int32_t NotWellFormedTests()
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001617{
1618 // Loop over all the not-well-formed instance of CBOR
1619 // that are test vectors in not_well_formed_cbor.h
1620 const uint16_t nArraySize = sizeof(paNotWellFormedCBOR)/sizeof(struct someBinaryBytes);
1621 for(uint16_t nIterate = 0; nIterate < nArraySize; nIterate++) {
1622 const struct someBinaryBytes *pBytes = &paNotWellFormedCBOR[nIterate];
1623 const UsefulBufC Input = (UsefulBufC){pBytes->p, pBytes->n};
1624
Laurence Lundbladeee851742020-01-08 08:37:05 -08001625 // Set up decoder context. String allocator needed for indefinite
1626 // string test cases
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001627 QCBORDecodeContext DCtx;
1628 QCBORDecode_Init(&DCtx, Input, QCBOR_DECODE_MODE_NORMAL);
1629 UsefulBuf_MAKE_STACK_UB(Pool, 100);
1630 QCBORDecode_SetMemPool(&DCtx, Pool, 0);
1631
1632 // Loop getting items until no more to get
Laurence Lundbladef71e1622020-08-06 18:52:13 -07001633 QCBORError uCBORError;
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001634 do {
1635 QCBORItem Item;
1636
Laurence Lundbladef71e1622020-08-06 18:52:13 -07001637 uCBORError = QCBORDecode_GetNext(&DCtx, &Item);
1638 } while(uCBORError == QCBOR_SUCCESS);
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001639
1640 // Every test vector must fail with
1641 // a not-well-formed error. If not
1642 // this test fails.
Laurence Lundbladef71e1622020-08-06 18:52:13 -07001643 if(!QCBORDecode_IsNotWellFormed(uCBORError) &&
1644 uCBORError != QCBOR_ERR_NO_MORE_ITEMS) {
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001645 // Return index of failure in the error code
1646 return 2000 + nIterate;
1647 }
1648 }
1649 return 0;
1650}
1651
1652
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001653struct FailInput {
Laurence Lundblade59289e52019-12-30 13:44:37 -08001654 UsefulBufC Input;
1655 QCBORError nError;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001656};
1657
Laurence Lundblade59289e52019-12-30 13:44:37 -08001658
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001659static int32_t ProcessFailures(struct FailInput *pFailInputs, size_t nNumFails)
Laurence Lundblade59289e52019-12-30 13:44:37 -08001660{
1661 for(struct FailInput *pF = pFailInputs; pF < pFailInputs + nNumFails; pF++) {
1662 // Set up the decoding context including a memory pool so that
1663 // indefinite length items can be checked
1664 QCBORDecodeContext DCtx;
1665 QCBORDecode_Init(&DCtx, pF->Input, QCBOR_DECODE_MODE_NORMAL);
1666 UsefulBuf_MAKE_STACK_UB(Pool, 100);
Laurence Lundblade830fbf92020-05-31 17:22:33 -07001667
Laurence Lundblade59289e52019-12-30 13:44:37 -08001668 QCBORError nCBORError = QCBORDecode_SetMemPool(&DCtx, Pool, 0);
1669 if(nCBORError) {
1670 return -9;
1671 }
Laurence Lundblade0a042a92020-06-12 14:09:50 -07001672
Laurence Lundblade59289e52019-12-30 13:44:37 -08001673 // Iterate until there is an error of some sort error
1674 QCBORItem Item;
1675 do {
Laurence Lundblade02625d42020-06-25 14:41:41 -07001676 // Set to something none-zero, something other than QCBOR_TYPE_NONE
Laurence Lundblade59289e52019-12-30 13:44:37 -08001677 memset(&Item, 0x33, sizeof(Item));
1678
1679 nCBORError = QCBORDecode_GetNext(&DCtx, &Item);
1680 } while(nCBORError == QCBOR_SUCCESS);
1681
1682 // Must get the expected error or the this test fails
1683 // The data and label type must also be QCBOR_TYPE_NONE
1684 if(nCBORError != pF->nError ||
1685 Item.uDataType != QCBOR_TYPE_NONE ||
1686 Item.uLabelType != QCBOR_TYPE_NONE) {
Laurence Lundblade06350ea2020-01-27 19:32:40 -08001687 // return index of CBOR + 100
Laurence Lundblade830fbf92020-05-31 17:22:33 -07001688 const size_t nIndex = (size_t)(pF - pFailInputs);
Laurence Lundblade06350ea2020-01-27 19:32:40 -08001689 return (int32_t)(nIndex * 100 + nCBORError);
Laurence Lundblade59289e52019-12-30 13:44:37 -08001690 }
1691 }
1692
1693 return 0;
1694}
1695
1696
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001697struct FailInput Failures[] = {
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001698 // Most of this is copied from not_well_formed.h. Here the error code
1699 // returned is also checked.
1700
1701 // Indefinite length strings must be closed off
1702 // An indefinite length byte string not closed off
1703 { {(uint8_t[]){0x5f, 0x41, 0x00}, 3}, QCBOR_ERR_HIT_END },
1704 // An indefinite length text string not closed off
1705 { {(uint8_t[]){0x7f, 0x61, 0x00}, 3}, QCBOR_ERR_HIT_END },
1706
1707
1708 // All the chunks in an indefinite length string must be of the type of indefinite length string
1709 // indefinite length byte string with text string chunk
1710 { {(uint8_t[]){0x5f, 0x61, 0x00, 0xff}, 4}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1711 // indefinite length text string with a byte string chunk
1712 { {(uint8_t[]){0x7f, 0x41, 0x00, 0xff}, 4}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1713 // indefinite length byte string with an positive integer chunk
1714 { {(uint8_t[]){0x5f, 0x00, 0xff}, 3}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1715 // indefinite length byte string with an negative integer chunk
1716 { {(uint8_t[]){0x5f, 0x21, 0xff}, 3}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1717 // indefinite length byte string with an array chunk
1718 { {(uint8_t[]){0x5f, 0x80, 0xff}, 3}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1719 // indefinite length byte string with an map chunk
1720 { {(uint8_t[]){0x5f, 0xa0, 0xff}, 3}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1721 // indefinite length byte string with tagged integer chunk
1722 { {(uint8_t[]){0x5f, 0xc0, 0x00, 0xff}, 4}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1723 // indefinite length byte string with an simple type chunk
1724 { {(uint8_t[]){0x5f, 0xe0, 0xff}, 3}, QCBOR_ERR_INDEFINITE_STRING_CHUNK },
1725 { {(uint8_t[]){0x5f, 0x5f, 0x41, 0x00, 0xff, 0xff}, 6}, QCBOR_ERR_INDEFINITE_STRING_CHUNK},
1726 // indefinite length text string with indefinite string inside
1727 { {(uint8_t[]){0x7f, 0x7f, 0x61, 0x00, 0xff, 0xff}, 6}, QCBOR_ERR_INDEFINITE_STRING_CHUNK},
1728
1729
1730 // Definte length maps and arrays must be closed by having the right number of items
1731 // A definte length array that is supposed to have 1 item, but has none
Laurence Lundbladee6f15112020-07-23 18:44:16 -07001732 { {(uint8_t[]){0x81}, 1}, QCBOR_ERR_NO_MORE_ITEMS },
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001733 // A definte length array that is supposed to have 2 items, but has only 1
Laurence Lundbladee6f15112020-07-23 18:44:16 -07001734 { {(uint8_t[]){0x82, 0x00}, 2}, QCBOR_ERR_NO_MORE_ITEMS },
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001735 // A definte length array that is supposed to have 511 items, but has only 1
1736 { {(uint8_t[]){0x9a, 0x01, 0xff, 0x00}, 4}, QCBOR_ERR_HIT_END },
1737 // A definte length map that is supposed to have 1 item, but has none
Laurence Lundbladee6f15112020-07-23 18:44:16 -07001738 { {(uint8_t[]){0xa1}, 1}, QCBOR_ERR_NO_MORE_ITEMS },
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001739 // A definte length map that is supposed to have s item, but has only 1
Laurence Lundbladee6f15112020-07-23 18:44:16 -07001740 { {(uint8_t[]){0xa2, 0x01, 0x02}, 3}, QCBOR_ERR_NO_MORE_ITEMS },
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001741
1742
1743 // Indefinte length maps and arrays must be ended by a break
1744 // Indefinite length array with zero items and no break
Laurence Lundbladee6f15112020-07-23 18:44:16 -07001745 { {(uint8_t[]){0x9f}, 1}, QCBOR_ERR_NO_MORE_ITEMS },
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001746 // Indefinite length array with two items and no break
Laurence Lundbladee6f15112020-07-23 18:44:16 -07001747 { {(uint8_t[]){0x9f, 0x01, 0x02}, 3}, QCBOR_ERR_NO_MORE_ITEMS },
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001748 // Indefinite length map with zero items and no break
Laurence Lundbladee6f15112020-07-23 18:44:16 -07001749 { {(uint8_t[]){0xbf}, 1}, QCBOR_ERR_NO_MORE_ITEMS },
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001750 // Indefinite length map with two items and no break
Laurence Lundbladee6f15112020-07-23 18:44:16 -07001751 { {(uint8_t[]){0xbf, 0x01, 0x02, 0x01, 0x02}, 5}, QCBOR_ERR_NO_MORE_ITEMS },
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001752
1753
1754 // Nested maps and arrays must be closed off (some extra nested test vectors)
Laurence Lundblade642282a2020-06-23 12:00:33 -07001755 // Unclosed indefinite array containing a closed definite length array
Laurence Lundbladee6f15112020-07-23 18:44:16 -07001756 { {(uint8_t[]){0x9f, 0x80, 0x00}, 3}, QCBOR_ERR_NO_MORE_ITEMS },
Laurence Lundblade642282a2020-06-23 12:00:33 -07001757 // Definite length array containing an unclosed indefinite length array
Laurence Lundbladee6f15112020-07-23 18:44:16 -07001758 { {(uint8_t[]){0x81, 0x9f}, 2}, QCBOR_ERR_NO_MORE_ITEMS },
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001759 // Deeply nested definite length arrays with deepest one unclosed
Laurence Lundbladee6f15112020-07-23 18:44:16 -07001760 { {(uint8_t[]){0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81}, 9}, QCBOR_ERR_NO_MORE_ITEMS }, // TODO: 23
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001761 // Deeply nested indefinite length arrays with deepest one unclosed
Laurence Lundbladee6f15112020-07-23 18:44:16 -07001762 { {(uint8_t[]){0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0xff, 0xff, 0xff, 0xff}, 9}, QCBOR_ERR_NO_MORE_ITEMS },
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001763 // Mixed nesting with indefinite unclosed
Laurence Lundbladee6f15112020-07-23 18:44:16 -07001764 { {(uint8_t[]){0x9f, 0x81, 0x9f, 0x81, 0x9f, 0x9f, 0xff, 0xff, 0xff}, 9}, QCBOR_ERR_NO_MORE_ITEMS },
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001765 // Mixed nesting with definite unclosed
Laurence Lundbladeee851742020-01-08 08:37:05 -08001766 { {(uint8_t[]){0x9f, 0x82, 0x9f, 0x81, 0x9f, 0x9f, 0xff, 0xff, 0xff, 0xff}, 10}, QCBOR_ERR_BAD_BREAK },
Laurence Lundblade0a042a92020-06-12 14:09:50 -07001767 // TODO: a few more definite indefinite length combos and check with CBORbis.
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001768
1769
1770 // The "argument" for the data item is incomplete
1771 // Positive integer missing 1 byte argument
1772 { {(uint8_t[]){0x18}, 1}, QCBOR_ERR_HIT_END },
1773 // Positive integer missing 2 byte argument
1774 { {(uint8_t[]){0x19}, 1}, QCBOR_ERR_HIT_END },
1775 // Positive integer missing 4 byte argument
1776 { {(uint8_t[]){0x1a}, 1}, QCBOR_ERR_HIT_END },
1777 // Positive integer missing 8 byte argument
1778 { {(uint8_t[]){0x1b}, 1}, QCBOR_ERR_HIT_END },
1779 // Positive integer missing 1 byte of 2 byte argument
1780 { {(uint8_t[]){0x19, 0x01}, 2}, QCBOR_ERR_HIT_END },
1781 // Positive integer missing 2 bytes of 4 byte argument
1782 { {(uint8_t[]){0x1a, 0x01, 0x02}, 3}, QCBOR_ERR_HIT_END },
1783 // Positive integer missing 1 bytes of 7 byte argument
1784 { {(uint8_t[]){0x1b, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, 8}, QCBOR_ERR_HIT_END },
1785 // Negative integer missing 1 byte argument
1786 { {(uint8_t[]){0x38}, 1}, QCBOR_ERR_HIT_END },
1787 // Binary string missing 1 byte argument
1788 { {(uint8_t[]){0x58}, 1}, QCBOR_ERR_HIT_END },
1789 // Text string missing 1 byte argument
1790 { {(uint8_t[]){0x78}, 1}, QCBOR_ERR_HIT_END },
1791 // Array missing 1 byte argument
1792 { {(uint8_t[]){0x98}, 1}, QCBOR_ERR_HIT_END },
1793 // Map missing 1 byte argument
1794 { {(uint8_t[]){0xb8}, 1}, QCBOR_ERR_HIT_END },
1795 // Tag missing 1 byte argument
1796 { {(uint8_t[]){0xd8}, 1}, QCBOR_ERR_HIT_END },
1797 // Simple missing 1 byte argument
1798 { {(uint8_t[]){0xf8}, 1}, QCBOR_ERR_HIT_END },
1799
1800
1801 // Breaks must not occur in definite length arrays and maps
1802 // Array of length 1 with sole member replaced by a break
1803 { {(uint8_t[]){0x81, 0xff}, 2}, QCBOR_ERR_BAD_BREAK },
1804 // Array of length 2 with 2nd member replaced by a break
1805 { {(uint8_t[]){0x82, 0x00, 0xff}, 3}, QCBOR_ERR_BAD_BREAK },
1806 // Map of length 1 with sole member label replaced by a break
1807 { {(uint8_t[]){0xa1, 0xff}, 2}, QCBOR_ERR_BAD_BREAK },
1808 // Map of length 1 with sole member label replaced by break
1809 // Alternate representation that some decoders handle difference
1810 { {(uint8_t[]){0xa1, 0xff, 0x00}, 3}, QCBOR_ERR_BAD_BREAK },
1811 // Array of length 1 with 2nd member value replaced by a break
1812 { {(uint8_t[]){0xa1, 0x00, 0xff}, 3}, QCBOR_ERR_BAD_BREAK },
1813 // Map of length 2 with 2nd member replaced by a break
1814 { {(uint8_t[]){0xa2, 0x00, 0x00, 0xff}, 4}, QCBOR_ERR_BAD_BREAK },
1815
1816
1817 // Breaks must not occur on their own out of an indefinite length data item
1818 // A bare break is not well formed
1819 { {(uint8_t[]){0xff}, 1}, QCBOR_ERR_BAD_BREAK },
1820 // A bare break after a zero length definite length array
1821 { {(uint8_t[]){0x80, 0xff}, 2}, QCBOR_ERR_BAD_BREAK },
1822 // A bare break after a zero length indefinite length map
1823 { {(uint8_t[]){0x9f, 0xff, 0xff}, 3}, QCBOR_ERR_BAD_BREAK },
1824
1825
1826 // Forbidden two byte encodings of simple types
1827 // Must use 0xe0 instead
1828 { {(uint8_t[]){0xf8, 0x00}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1829 // Should use 0xe1 instead
1830 { {(uint8_t[]){0xf8, 0x01}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1831 // Should use 0xe2 instead
1832 { {(uint8_t[]){0xf8, 0x02}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1833 // Should use 0xe3 instead
1834 { {(uint8_t[]){0xf8, 0x03}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1835 // Should use 0xe4 instead
1836 { {(uint8_t[]){0xf8, 0x04}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1837 // Should use 0xe5 instead
1838 { {(uint8_t[]){0xf8, 0x05}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1839 // Should use 0xe6 instead
1840 { {(uint8_t[]){0xf8, 0x06}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1841 // Should use 0xe7 instead
1842 { {(uint8_t[]){0xf8, 0x07}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1843 // Should use 0xe8 instead
1844 { {(uint8_t[]){0xf8, 0x08}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1845 // Should use 0xe9 instead
1846 { {(uint8_t[]){0xf8, 0x09}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1847 // Should use 0xea instead
1848 { {(uint8_t[]){0xf8, 0x0a}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1849 // Should use 0xeb instead
1850 { {(uint8_t[]){0xf8, 0x0b}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1851 // Should use 0xec instead
1852 { {(uint8_t[]){0xf8, 0x0c}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1853 // Should use 0xed instead
1854 { {(uint8_t[]){0xf8, 0x0d}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1855 // Should use 0xee instead
1856 { {(uint8_t[]){0xf8, 0x0e}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1857 // Should use 0xef instead
1858 { {(uint8_t[]){0xf8, 0x0f}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1859 // Should use 0xf0 instead
1860 { {(uint8_t[]){0xf8, 0x10}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1861 // Should use 0xf1 instead
1862 { {(uint8_t[]){0xf8, 0x11}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1863 // Should use 0xf2 instead
1864 { {(uint8_t[]){0xf8, 0x12}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1865 // Must use 0xf3 instead
1866 { {(uint8_t[]){0xf8, 0x13}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1867 // Must use 0xf4 instead
1868 { {(uint8_t[]){0xf8, 0x14}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1869 // Must use 0xf5 instead
1870 { {(uint8_t[]){0xf8, 0x15}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1871 // Must use 0xf6 instead
1872 { {(uint8_t[]){0xf8, 0x16}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1873 // Must use 0xf7 instead
1874 { {(uint8_t[]){0xf8, 0x17}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1875 // Must use 0xf8 instead
1876 { {(uint8_t[]){0xf8, 0x18}, 2}, QCBOR_ERR_BAD_TYPE_7 },
1877
1878
1879 // Integers with additional info indefinite length
1880 // Positive integer with additional info indefinite length
1881 { {(uint8_t[]){0x1f}, 1}, QCBOR_ERR_BAD_INT },
1882 // Negative integer with additional info indefinite length
1883 { {(uint8_t[]){0x3f}, 1}, QCBOR_ERR_BAD_INT },
1884 // CBOR tag with "argument" an indefinite length
1885 { {(uint8_t[]){0xdf, 0x00}, 2}, QCBOR_ERR_BAD_INT },
1886 // CBOR tag with "argument" an indefinite length alternate vector
1887 { {(uint8_t[]){0xdf}, 1}, QCBOR_ERR_BAD_INT },
1888
1889
1890 // Missing bytes from a deterministic length string
1891 // A byte string is of length 1 without the 1 byte
1892 { {(uint8_t[]){0x41}, 1}, QCBOR_ERR_HIT_END },
1893 // A text string is of length 1 without the 1 byte
1894 { {(uint8_t[]){0x61}, 1}, QCBOR_ERR_HIT_END },
Laurence Lundblade42272e42020-01-31 07:50:53 -08001895 // Byte string should have 2^32-15 bytes, but has one
1896 { {(uint8_t[]){0x5a, 0xff, 0xff, 0xff, 0xf0, 0x00}, 6}, QCBOR_ERR_HIT_END },
1897 // Byte string should have 2^32-15 bytes, but has one
1898 { {(uint8_t[]){0x7a, 0xff, 0xff, 0xff, 0xf0, 0x00}, 6}, QCBOR_ERR_HIT_END },
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001899
1900
1901 // Use of unassigned additional information values
1902 // Major type positive integer with reserved value 28
1903 { {(uint8_t[]){0x1c}, 1}, QCBOR_ERR_UNSUPPORTED },
1904 // Major type positive integer with reserved value 29
1905 { {(uint8_t[]){0x1d}, 1}, QCBOR_ERR_UNSUPPORTED },
1906 // Major type positive integer with reserved value 30
1907 { {(uint8_t[]){0x1e}, 1}, QCBOR_ERR_UNSUPPORTED },
1908 // Major type negative integer with reserved value 28
1909 { {(uint8_t[]){0x3c}, 1}, QCBOR_ERR_UNSUPPORTED },
1910 // Major type negative integer with reserved value 29
1911 { {(uint8_t[]){0x3d}, 1}, QCBOR_ERR_UNSUPPORTED },
1912 // Major type negative integer with reserved value 30
1913 { {(uint8_t[]){0x3e}, 1}, QCBOR_ERR_UNSUPPORTED },
1914 // Major type byte string with reserved value 28 length
1915 { {(uint8_t[]){0x5c}, 1}, QCBOR_ERR_UNSUPPORTED },
1916 // Major type byte string with reserved value 29 length
1917 { {(uint8_t[]){0x5d}, 1}, QCBOR_ERR_UNSUPPORTED },
1918 // Major type byte string with reserved value 30 length
1919 { {(uint8_t[]){0x5e}, 1}, QCBOR_ERR_UNSUPPORTED },
1920 // Major type text string with reserved value 28 length
1921 { {(uint8_t[]){0x7c}, 1}, QCBOR_ERR_UNSUPPORTED },
1922 // Major type text string with reserved value 29 length
1923 { {(uint8_t[]){0x7d}, 1}, QCBOR_ERR_UNSUPPORTED },
1924 // Major type text string with reserved value 30 length
1925 { {(uint8_t[]){0x7e}, 1}, QCBOR_ERR_UNSUPPORTED },
1926 // Major type array with reserved value 28 length
1927 { {(uint8_t[]){0x9c}, 1}, QCBOR_ERR_UNSUPPORTED },
1928 // Major type array with reserved value 29 length
1929 { {(uint8_t[]){0x9d}, 1}, QCBOR_ERR_UNSUPPORTED },
1930 // Major type array with reserved value 30 length
1931 { {(uint8_t[]){0x9e}, 1}, QCBOR_ERR_UNSUPPORTED },
1932 // Major type map with reserved value 28 length
1933 { {(uint8_t[]){0xbc}, 1}, QCBOR_ERR_UNSUPPORTED },
1934 // Major type map with reserved value 29 length
1935 { {(uint8_t[]){0xbd}, 1}, QCBOR_ERR_UNSUPPORTED },
1936 // Major type map with reserved value 30 length
1937 { {(uint8_t[]){0xbe}, 1}, QCBOR_ERR_UNSUPPORTED },
1938 // Major type tag with reserved value 28 length
1939 { {(uint8_t[]){0xdc}, 1}, QCBOR_ERR_UNSUPPORTED },
1940 // Major type tag with reserved value 29 length
1941 { {(uint8_t[]){0xdd}, 1}, QCBOR_ERR_UNSUPPORTED },
1942 // Major type tag with reserved value 30 length
1943 { {(uint8_t[]){0xde}, 1}, QCBOR_ERR_UNSUPPORTED },
1944 // Major type simple with reserved value 28 length
1945 { {(uint8_t[]){0xfc}, 1}, QCBOR_ERR_UNSUPPORTED },
1946 // Major type simple with reserved value 29 length
1947 { {(uint8_t[]){0xfd}, 1}, QCBOR_ERR_UNSUPPORTED },
1948 // Major type simple with reserved value 30 length
1949 { {(uint8_t[]){0xfe}, 1}, QCBOR_ERR_UNSUPPORTED },
1950
1951
1952 // Maps must have an even number of data items (key & value)
1953 // Map with 1 item when it should have 2
1954 { {(uint8_t[]){0xa1, 0x00}, 2}, QCBOR_ERR_HIT_END },
1955 // Map with 3 item when it should have 4
1956 { {(uint8_t[]){0xa2, 0x00, 0x00, 0x00}, 2}, QCBOR_ERR_HIT_END },
1957 // Map with 1 item when it should have 2
1958 { {(uint8_t[]){0xbf, 0x00, 0xff}, 3}, QCBOR_ERR_BAD_BREAK },
1959 // Map with 3 item when it should have 4
1960 { {(uint8_t[]){0xbf, 0x00, 0x00, 0x00, 0xff}, 5}, QCBOR_ERR_BAD_BREAK },
1961
1962
1963 // In addition to not-well-formed, some invalid CBOR
Laurence Lundbladeee851742020-01-08 08:37:05 -08001964 // Text-based date, with an integer
1965 { {(uint8_t[]){0xc0, 0x00}, 2}, QCBOR_ERR_BAD_OPT_TAG },
1966 // Epoch date, with an byte string
1967 { {(uint8_t[]){0xc1, 0x41, 0x33}, 3}, QCBOR_ERR_BAD_OPT_TAG },
1968 // tagged as both epoch and string dates
1969 { {(uint8_t[]){0xc1, 0xc0, 0x00}, 3}, QCBOR_ERR_BAD_OPT_TAG },
1970 // big num tagged an int, not a byte string
1971 { {(uint8_t[]){0xc2, 0x00}, 2}, QCBOR_ERR_BAD_OPT_TAG },
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001972};
1973
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001974int32_t DecodeFailureTests()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001975{
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001976 int32_t nResult;
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07001977
Laurence Lundblade59289e52019-12-30 13:44:37 -08001978 nResult = ProcessFailures(Failures, sizeof(Failures)/sizeof(struct FailInput));
1979 if(nResult) {
1980 return nResult;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001981 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001982
Laurence Lundblade3a6042e2019-06-28 19:58:04 -07001983 // Corrupt the UsefulInputBuf and see that
1984 // it reflected correctly for CBOR decoding
Laurence Lundbladee6f15112020-07-23 18:44:16 -07001985 QCBORDecodeContext DCtx;
1986 QCBORItem Item;
1987 QCBORError uQCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001988
Laurence Lundbladee6f15112020-07-23 18:44:16 -07001989 QCBORDecode_Init(&DCtx,
1990 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spSimpleValues),
1991 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001992
Laurence Lundbladee6f15112020-07-23 18:44:16 -07001993 if((uQCBORError = QCBORDecode_GetNext(&DCtx, &Item))) {
1994 return (int32_t)uQCBORError;
1995 }
1996 if(Item.uDataType != QCBOR_TYPE_ARRAY || Item.val.uCount != 10) {
1997 // This wasn't supposed to happen
1998 return -1;
1999 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002000
Laurence Lundbladee6f15112020-07-23 18:44:16 -07002001 DCtx.InBuf.magic = 0; // Reach in and corrupt the UsefulInputBuf
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002002
Laurence Lundbladee6f15112020-07-23 18:44:16 -07002003 uQCBORError = QCBORDecode_GetNext(&DCtx, &Item);
2004 if(uQCBORError != QCBOR_ERR_NO_MORE_ITEMS) {
2005 // Did not get back the error expected
2006 return -2;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002007 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002008
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002009/*
Laurence Lundbladee6f15112020-07-23 18:44:16 -07002010 TODO: fix this
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002011 This test is disabled until QCBOREncode_EncodeHead() is brought in so
2012 the size encoded can be tied to SIZE_MAX and work for all size CPUs.
2013
2014 This relies on the largest string allowed being SIZE_MAX -4 rather than
2015 SIZE_MAX. That way the test can be performed.
2016 {
2017 QCBORDecodeContext DCtx;
2018 QCBORItem Item;
2019
2020 static uint8_t foo[] = {0x5b, 0xff, 0xff, 0xff, 0xff,
2021 0xff, 0xff, 0xff, 0xff};
2022
2023 QCBORDecode_Init(&DCtx,
2024 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(foo),
2025 QCBOR_DECODE_MODE_NORMAL);
2026
2027 if(QCBOR_ERR_STRING_TOO_LONG != QCBORDecode_GetNext(&DCtx, &Item)) {
2028 return -4;
2029 }
2030 }
2031*/
2032
Laurence Lundblade3a6042e2019-06-28 19:58:04 -07002033 return 0;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002034}
2035
2036
Laurence Lundbladea2e29072018-12-30 09:20:06 -08002037/* Try all 256 values of the byte at nLen including recursing for
2038 each of the values to try values at nLen+1 ... up to nLenMax
2039 */
Laurence Lundblade06350ea2020-01-27 19:32:40 -08002040static void ComprehensiveInputRecurser(uint8_t *pBuf, size_t nLen, size_t nLenMax)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002041{
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002042 if(nLen >= nLenMax) {
2043 return;
2044 }
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -08002045
Laurence Lundbladea2e29072018-12-30 09:20:06 -08002046 for(int inputByte = 0; inputByte < 256; inputByte++) {
2047 // Set up the input
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002048 pBuf[nLen] = (uint8_t)inputByte;
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -08002049 const UsefulBufC Input = {pBuf, nLen+1};
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -08002050
Laurence Lundbladea2e29072018-12-30 09:20:06 -08002051 // Get ready to parse
2052 QCBORDecodeContext DCtx;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002053 QCBORDecode_Init(&DCtx, Input, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002054
Laurence Lundbladea2e29072018-12-30 09:20:06 -08002055 // Parse by getting the next item until an error occurs
2056 // Just about every possible decoder error can occur here
2057 // The goal of this test is not to check for the correct
2058 // error since that is not really possible. It is to
2059 // see that there is no crash on hostile input.
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002060 while(1) {
Laurence Lundbladea2e29072018-12-30 09:20:06 -08002061 QCBORItem Item;
2062 QCBORError nCBORError = QCBORDecode_GetNext(&DCtx, &Item);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002063 if(nCBORError != QCBOR_SUCCESS) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002064 break;
2065 }
2066 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002067
Laurence Lundbladea2e29072018-12-30 09:20:06 -08002068 ComprehensiveInputRecurser(pBuf, nLen+1, nLenMax);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002069 }
2070}
2071
2072
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002073int32_t ComprehensiveInputTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002074{
Laurence Lundbladea2e29072018-12-30 09:20:06 -08002075 // Size 2 tests 64K inputs and runs quickly
2076 uint8_t pBuf[2];
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002077
Laurence Lundbladea2e29072018-12-30 09:20:06 -08002078 ComprehensiveInputRecurser(pBuf, 0, sizeof(pBuf));
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002079
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002080 return 0;
2081}
2082
Laurence Lundbladea2e29072018-12-30 09:20:06 -08002083
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002084int32_t BigComprehensiveInputTest()
Laurence Lundbladea2e29072018-12-30 09:20:06 -08002085{
2086 // size 3 tests 16 million inputs and runs OK
2087 // in seconds on fast machines. Size 4 takes
2088 // 10+ minutes and 5 half a day on fast
2089 // machines. This test is kept separate from
2090 // the others so as to no slow down the use
2091 // of them as a very frequent regression.
2092 uint8_t pBuf[3]; //
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -08002093
Laurence Lundbladea2e29072018-12-30 09:20:06 -08002094 ComprehensiveInputRecurser(pBuf, 0, sizeof(pBuf));
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -08002095
Laurence Lundbladea2e29072018-12-30 09:20:06 -08002096 return 0;
2097}
2098
2099
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002100static uint8_t spDateTestInput[] = {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002101 0xc0, // tag for string date
2102 0x6a, '1','9','8','5','-','0','4','-','1','2', // Date string
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002103
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002104 0xc1, // tag for epoch date
2105 0x1a, 0x53, 0x72, 0x4E, 0x00, // Epoch date 1400000000; Tue, 13 May 2014 16:53:20 GMT
2106
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002107 // CBOR_TAG_B64
Laurence Lundblade8fa7d5d2020-07-11 16:30:47 -07002108 0xc1, 0xcf, 0xd8, 0x22, // 0xee, // Epoch date with extra tags
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002109 0x1a, 0x53, 0x72, 0x4E, 0x01,
2110
2111 0xc1, // tag for epoch date
2112 0x1b, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, // Too large integer
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002113
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002114 0xc1, // tag for epoch date
Laurence Lundblade3ed0bca2020-07-14 22:50:10 -07002115 0xfa, 0x3f, 0x8c, 0xcc, 0xcd, // single with value 1.1
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002116
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002117 0xc1, // tag for epoch date
Laurence Lundbladea1ad8782019-11-08 00:12:11 -08002118 0xfa, 0x7f, 0x7f, 0xff, 0xff, // 3.4028234663852886e+38 too large
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002119
Laurence Lundbladea1ad8782019-11-08 00:12:11 -08002120 0xc1, // tag for epoch date
2121 0xfb, 0x43, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 9223372036854775808.000000 just barely too large
2122 //0xfa, 0x7f, 0x7f, 0xff, 0xff // 3.4028234663852886e+38 too large
2123
2124 0xc1, // tag for epoch date
2125 0xfb, 0x43, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe // 9223372036854773760 largest supported
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002126};
2127
2128
2129// have to check float expected only to within an epsilon
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07002130#ifndef QCBOR_DISABLE_FLOAT_HW_USE
Laurence Lundblade02fcf312020-07-17 02:49:46 -07002131static int CHECK_EXPECTED_DOUBLE(double val, double expected) {
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002132
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002133 double diff = val - expected;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002134
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002135 diff = fabs(diff);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002136
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002137 return diff > 0.0000001;
2138}
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07002139#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002140
2141
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002142int32_t DateParseTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002143{
2144 QCBORDecodeContext DCtx;
2145 QCBORItem Item;
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07002146 QCBORError nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002147
Laurence Lundbladeee851742020-01-08 08:37:05 -08002148 QCBORDecode_Init(&DCtx,
2149 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spDateTestInput),
2150 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002151
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002152 const uint64_t uTags[] = {15};
2153 QCBORTagListIn TagList = {1, uTags};
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002154
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002155 QCBORDecode_SetCallerConfiguredTagList(&DCtx, &TagList);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002156
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002157 // String date
2158 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2159 return -1;
2160 if(Item.uDataType != QCBOR_TYPE_DATE_STRING ||
Laurence Lundblade9e3651c2018-10-10 11:49:55 +08002161 UsefulBuf_Compare(Item.val.dateString, UsefulBuf_FromSZ("1985-04-12"))){
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002162 return -2;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002163 }
2164
Laurence Lundblade8fa7d5d2020-07-11 16:30:47 -07002165 // Epoch date 1400000000; Tue, 13 May 2014 16:53:20 GMT
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002166 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002167 return -3;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002168 if(Item.uDataType != QCBOR_TYPE_DATE_EPOCH ||
2169 Item.val.epochDate.nSeconds != 1400000000 ||
2170 Item.val.epochDate.fSecondsFraction != 0 ) {
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002171 return -4;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002172 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002173
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002174 // Epoch date with extra CBOR_TAG_B64 tag that doesn't really mean anything
2175 // but want to be sure extra tag doesn't cause a problem
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002176 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002177 return -5;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002178 if(Item.uDataType != QCBOR_TYPE_DATE_EPOCH ||
2179 Item.val.epochDate.nSeconds != 1400000001 ||
2180 Item.val.epochDate.fSecondsFraction != 0 ||
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002181 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_B64)) {
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002182 return -6;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002183 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002184
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002185 // Epoch date that is too large for our representation
2186 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_DATE_OVERFLOW) {
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002187 return -7;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002188 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002189
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002190 // Epoch date in float format with fractional seconds
Laurence Lundblade9682a532020-06-06 18:33:04 -07002191#ifndef QCBOR_DISABLE_FLOAT_HW_USE
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002192 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002193 return -8;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002194 if(Item.uDataType != QCBOR_TYPE_DATE_EPOCH ||
2195 Item.val.epochDate.nSeconds != 1 ||
2196 CHECK_EXPECTED_DOUBLE(Item.val.epochDate.fSecondsFraction, 0.1 )) {
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002197 return -9;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002198 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002199
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002200 // Epoch date float that is too large for our representation
2201 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_DATE_OVERFLOW) {
Laurence Lundblade67bd5512018-11-02 21:44:06 +07002202 return -10;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002203 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002204
Laurence Lundbladea1ad8782019-11-08 00:12:11 -08002205 // Epoch date double that is just slightly too large
2206 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_DATE_OVERFLOW) {
2207 return -11;
2208 }
2209
2210 // Largest double epoch date supported
Laurence Lundblade3ed0bca2020-07-14 22:50:10 -07002211 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_SUCCESS ||
2212 Item.uDataType != QCBOR_TYPE_DATE_EPOCH ||
2213 Item.val.epochDate.nSeconds != 9223372036854773760 ||
2214 Item.val.epochDate.nSeconds == 0) {
2215 return -12;
2216 }
2217#else
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07002218 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_FLOAT_DATE_DISABLED) {
Laurence Lundblade3ed0bca2020-07-14 22:50:10 -07002219 return -80;
Laurence Lundbladea1ad8782019-11-08 00:12:11 -08002220 }
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07002221 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_FLOAT_DATE_DISABLED) {
Laurence Lundblade3ed0bca2020-07-14 22:50:10 -07002222 return -80;
2223 }
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07002224 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_FLOAT_DATE_DISABLED) {
Laurence Lundblade3ed0bca2020-07-14 22:50:10 -07002225 return -80;
2226 }
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07002227 if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_FLOAT_DATE_DISABLED) {
Laurence Lundblade3ed0bca2020-07-14 22:50:10 -07002228 return -80;
2229 }
2230#endif
2231
2232
Laurence Lundbladeee851742020-01-08 08:37:05 -08002233 // TODO: could use a few more tests with float, double, and half precsion
2234 // and negative (but coverage is still pretty good)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002235
2236 return 0;
2237}
2238
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002239// Really simple basic input for tagging test
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002240static uint8_t spOptTestInput[] = {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002241 0xd9, 0xd9, 0xf7, // CBOR magic number
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002242 0x81, // Array of one
2243 0xd8, 0x04, // non-preferred serialization of tag 4
2244 0x82, 0x01, 0x03}; // fraction 1/3
2245
Laurence Lundblade59289e52019-12-30 13:44:37 -08002246/*
2247 DB 9192939495969798 # tag(10489608748473423768)
2248 80 # array(0)
2249 */
Laurence Lundbladeee851742020-01-08 08:37:05 -08002250static uint8_t spEncodedLargeTag[] = {0xdb, 0x91, 0x92, 0x93, 0x94, 0x95,
2251 0x96, 0x97, 0x98, 0x80};
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002252
Laurence Lundblade59289e52019-12-30 13:44:37 -08002253/*
2254DB 9192939495969798 # tag(10489608748473423768)
2255 D8 88 # tag(136)
2256 C6 # tag(6)
2257 C7 # tag(7)
2258 80 # array(0)
2259*/
Laurence Lundbladeee851742020-01-08 08:37:05 -08002260static uint8_t spLotsOfTags[] = {0xdb, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
2261 0x97, 0x98, 0xd8, 0x88, 0xc6, 0xc7, 0x80};
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002262
2263/*
2264 The cbor.me parse of this.
2265 55799(55799(55799({6(7(-23)): 5859837686836516696(7({7(-20): 11({17(-18): 17(17(17("Organization"))),
Laurence Lundblade59289e52019-12-30 13:44:37 -08002266 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 +07002267 17(-14): 17("US")}), 23(-19): 19({-11: 9({-9: -7}),
2268 90599561(90599561(90599561(-10))): 12(h'0102030405060708090A')})})),
2269 16(-22): 23({11(8(7(-5))): 8(-3)})})))
2270 */
2271static uint8_t spCSRWithTags[] = {
2272 0xd9, 0xd9, 0xf7, 0xd9, 0xd9, 0xf7, 0xd9, 0xd9, 0xf7, 0xa2,
2273 0xc6, 0xc7, 0x36,
2274 0xdb, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0xc7, 0xa2,
2275 0xda, 0x00, 0x00, 0x00, 0x07, 0x33,
2276 0xcb, 0xa5,
2277 0xd1, 0x31,
2278 0xd1, 0xd1, 0xd1, 0x6c,
2279 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
2280 0xc9, 0x30,
2281 0xd9, 0x03, 0x05, 0x63,
2282 0x53, 0x53, 0x47,
2283 0x2e,
Laurence Lundblade59289e52019-12-30 13:44:37 -08002284 0xd0, 0xd1, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0x69,
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002285 0x43, 0x6f, 0x6e, 0x66, 0x75, 0x73, 0x69, 0x6f, 0x6e,
2286 0xd1, 0x2f,
2287 0xd1, 0x69,
2288 0x53, 0x61, 0x6e, 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f,
2289 0xd1, 0x2d,
2290 0xd1, 0x62,
2291 0x55, 0x53,
2292 0xd7, 0x32,
2293 0xd3, 0xa2,
2294 0x2a,
2295 0xc9, 0xa1,
2296 0x28,
2297 0x26,
2298 0xda, 0x05, 0x66, 0x70, 0x89, 0xda, 0x05, 0x66, 0x70, 0x89, 0xda, 0x05, 0x66, 0x70, 0x89, 0x29,
2299 0xcc, 0x4a,
2300 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,0x07, 0x08, 0x09, 0x0a,
2301 0xd0, 0x35,
2302 0xd7, 0xa1,
2303 0xcb, 0xc8, 0xc7, 0x24,
2304 0xc8, 0x22};
2305
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002306static int32_t CheckCSRMaps(QCBORDecodeContext *pDC);
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002307
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002308
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002309int32_t OptTagParseTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002310{
2311 QCBORDecodeContext DCtx;
2312 QCBORItem Item;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002313
Laurence Lundbladeee851742020-01-08 08:37:05 -08002314 QCBORDecode_Init(&DCtx,
2315 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spOptTestInput),
2316 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002317
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002318 //-------------------------
2319 // This text matches the magic number tag and the fraction tag
2320 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2321 return -2;
2322 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002323 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002324 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_CBOR_MAGIC)) {
2325 return -3;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002326 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002327
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002328 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2329 return -4;
2330 }
Laurence Lundblade59289e52019-12-30 13:44:37 -08002331
2332#ifdef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002333 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
Laurence Lundblade59289e52019-12-30 13:44:37 -08002334 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_DECIMAL_FRACTION) ||
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002335 Item.val.uCount != 2) {
2336 return -5;
2337 }
Laurence Lundblade59289e52019-12-30 13:44:37 -08002338#else
2339 if(Item.uDataType != QCBOR_TYPE_DECIMAL_FRACTION) {
2340 return -6;
2341 }
2342#endif
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002343
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002344 // --------------------------------
2345 // This test decodes the very large tag, but it is not in
2346 // any list so it is ignored.
Laurence Lundbladeee851742020-01-08 08:37:05 -08002347 QCBORDecode_Init(&DCtx,
2348 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spEncodedLargeTag),
2349 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002350 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2351 return -6;
2352 }
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002353 /*
2354 if(Item.uTagBits) { // TODO: make sure it is OK to remove this
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002355 return -7;
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002356 }*/
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002357
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002358 // ----------------------------------
Laurence Lundbladeee851742020-01-08 08:37:05 -08002359 // This test sets up a caller-config list that includes the very large
2360 // tage and then matches it.
2361 QCBORDecode_Init(&DCtx,
2362 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spEncodedLargeTag),
2363 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002364 const uint64_t puList[] = {0x9192939495969798, 257};
2365 const QCBORTagListIn TL = {2, puList};
2366 QCBORDecode_SetCallerConfiguredTagList(&DCtx, &TL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002367
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002368 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2369 return -8;
2370 }
2371 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
2372 !QCBORDecode_IsTagged(&DCtx, &Item, 0x9192939495969798) ||
2373 QCBORDecode_IsTagged(&DCtx, &Item, 257) ||
2374 QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_BIGFLOAT) ||
2375 Item.val.uCount != 0) {
2376 return -9;
2377 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002378
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002379 //------------------------
Laurence Lundbladeee851742020-01-08 08:37:05 -08002380 // Sets up a caller-configured list and look up something not in it
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002381 const uint64_t puLongList[17] = {1,2,1};
2382 const QCBORTagListIn TLLong = {17, puLongList};
Laurence Lundbladeee851742020-01-08 08:37:05 -08002383 QCBORDecode_Init(&DCtx,
2384 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spEncodedLargeTag),
2385 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002386 QCBORDecode_SetCallerConfiguredTagList(&DCtx, &TLLong);
2387 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2388 return -11;
2389 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002390
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002391 // -----------------------
2392 // This tests retrievel of the full tag list
Laurence Lundbladeee851742020-01-08 08:37:05 -08002393 QCBORDecode_Init(&DCtx,
2394 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spLotsOfTags),
2395 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002396 uint64_t puTags[16];
2397 QCBORTagListOut Out = {0, 4, puTags};
2398 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2399 return -12;
2400 }
2401 if(puTags[0] != 0x9192939495969798 ||
2402 puTags[1] != 0x88 ||
Laurence Lundblade59289e52019-12-30 13:44:37 -08002403 puTags[2] != 0x06 ||
2404 puTags[3] != 0x07) {
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002405 return -13;
2406 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002407
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002408 // ----------------------
2409 // This text if too small of an out list
Laurence Lundbladeee851742020-01-08 08:37:05 -08002410 QCBORDecode_Init(&DCtx,
2411 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spLotsOfTags),
2412 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002413 QCBORTagListOut OutSmall = {0, 3, puTags};
2414 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &OutSmall) != QCBOR_ERR_TOO_MANY_TAGS) {
2415 return -14;
2416 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002417
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002418#if 0
2419 // TODO: this test needs to be re evaluated
2420
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002421 // ---------------
2422 // Parse a version of the "CSR" that has had a ton of tags randomly inserted
Laurence Lundbladeee851742020-01-08 08:37:05 -08002423 QCBORDecode_Init(&DCtx,
2424 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRWithTags),
2425 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002426 int n = CheckCSRMaps(&DCtx);
2427 if(n) {
2428 return n-2000;
2429 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002430
Laurence Lundblade59289e52019-12-30 13:44:37 -08002431 Out = (QCBORTagListOut){0, 16, puTags};
Laurence Lundbladeee851742020-01-08 08:37:05 -08002432 QCBORDecode_Init(&DCtx,
2433 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRWithTags),
2434 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002435
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002436 const uint64_t puTagList[] = {773, 1, 90599561};
2437 const QCBORTagListIn TagList = {3, puTagList};
2438 QCBORDecode_SetCallerConfiguredTagList(&DCtx, &TagList);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002439
2440
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002441 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2442 return -100;
2443 }
2444 if(Item.uDataType != QCBOR_TYPE_MAP ||
2445 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_CBOR_MAGIC) ||
2446 QCBORDecode_IsTagged(&DCtx, &Item, 90599561) ||
2447 QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_DATE_EPOCH) ||
2448 Item.val.uCount != 2 ||
2449 puTags[0] != CBOR_TAG_CBOR_MAGIC ||
2450 puTags[1] != CBOR_TAG_CBOR_MAGIC ||
2451 puTags[2] != CBOR_TAG_CBOR_MAGIC ||
2452 Out.uNumUsed != 3) {
2453 return -101;
2454 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002455
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002456 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2457 return -102;
2458 }
2459 if(Item.uDataType != QCBOR_TYPE_MAP ||
2460 QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_CBOR_MAGIC) ||
2461 QCBORDecode_IsTagged(&DCtx, &Item, 6) ||
2462 QCBORDecode_IsTagged(&DCtx, &Item, 7) || // item is tagged 7, but 7 is not configured to be recognized
2463 Item.val.uCount != 2 ||
2464 puTags[0] != 5859837686836516696 ||
2465 puTags[1] != 7 ||
2466 Out.uNumUsed != 2) {
2467 return -103;
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 -104;
2472 }
2473 if(Item.uDataType != QCBOR_TYPE_MAP ||
2474 Item.uTagBits ||
2475 Item.val.uCount != 5 ||
2476 puTags[0] != 0x0b ||
2477 Out.uNumUsed != 1) {
2478 return -105;
2479 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002480
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002481 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2482 return -106;
2483 }
2484 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
2485 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_COSE_MAC0) ||
2486 Item.val.string.len != 12 ||
2487 puTags[0] != CBOR_TAG_COSE_MAC0 ||
2488 puTags[1] != CBOR_TAG_COSE_MAC0 ||
2489 puTags[2] != CBOR_TAG_COSE_MAC0 ||
2490 Out.uNumUsed != 3) {
2491 return -105;
2492 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002493
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002494 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2495 return -107;
2496 }
2497 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
2498 !QCBORDecode_IsTagged(&DCtx, &Item, 773) ||
2499 Item.val.string.len != 3 ||
2500 puTags[0] != 773 ||
2501 Out.uNumUsed != 1) {
2502 return -108;
2503 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002504
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002505 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2506 return -109;
2507 }
2508 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundblade59289e52019-12-30 13:44:37 -08002509 !QCBORDecode_IsTagged(&DCtx, &Item, 16) ||
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002510 Item.val.string.len != 9 ||
Laurence Lundblade59289e52019-12-30 13:44:37 -08002511 puTags[0] != 16 ||
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002512 puTags[11] != 0x0f ||
2513 Out.uNumUsed != 12) {
2514 return -110;
2515 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002516
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002517 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2518 return -111;
2519 }
2520 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
2521 !QCBORDecode_IsTagged(&DCtx, &Item, 17) ||
2522 Item.val.string.len != 9 ||
2523 puTags[0] != 17 ||
2524 Out.uNumUsed != 1) {
2525 return -112;
2526 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002527
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002528 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2529 return -111;
2530 }
2531 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
2532 !QCBORDecode_IsTagged(&DCtx, &Item, 17) ||
2533 Item.val.string.len != 2 ||
2534 puTags[0] != 17 ||
2535 Out.uNumUsed != 1) {
2536 return -112;
2537 }
2538
2539 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2540 return -113;
2541 }
2542 if(Item.uDataType != QCBOR_TYPE_MAP ||
2543 QCBORDecode_IsTagged(&DCtx, &Item, 19) ||
2544 Item.val.uCount != 2 ||
2545 puTags[0] != 19 ||
2546 Out.uNumUsed != 1) {
2547 return -114;
2548 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002549
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002550 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2551 return -115;
2552 }
2553 if(Item.uDataType != QCBOR_TYPE_MAP ||
2554 QCBORDecode_IsTagged(&DCtx, &Item, 9) ||
2555 Item.uTagBits ||
2556 Item.val.uCount != 1 ||
2557 puTags[0] != 9 ||
2558 Out.uNumUsed != 1) {
2559 return -116;
2560 }
2561
2562 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2563 return -116;
2564 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002565 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002566 Item.val.int64 != -7 ||
2567 Item.uTagBits ||
2568 Out.uNumUsed != 0) {
2569 return -117;
2570 }
2571
2572 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2573 return -118;
2574 }
2575 if(Item.uDataType != QCBOR_TYPE_BYTE_STRING ||
2576 Item.val.string.len != 10 ||
2577 Item.uTagBits ||
2578 puTags[0] != 12 ||
2579 Out.uNumUsed != 1) {
2580 return -119;
2581 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002582
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002583 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2584 return -120;
2585 }
2586 if(Item.uDataType != QCBOR_TYPE_MAP ||
2587 !QCBORDecode_IsTagged(&DCtx, &Item, CBOR_TAG_ENC_AS_B16) ||
2588 Item.val.uCount != 1 ||
2589 puTags[0] != 0x17 ||
2590 Out.uNumUsed != 1) {
2591 return -121;
2592 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002593
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002594 if(QCBORDecode_GetNextWithTags(&DCtx, &Item, &Out)) {
2595 return -122;
2596 }
2597 if(Item.uDataType != QCBOR_TYPE_INT64 ||
2598 QCBORDecode_IsTagged(&DCtx, &Item, 8) ||
2599 Item.val.int64 != -3 ||
2600 puTags[0] != 8 ||
2601 Out.uNumUsed != 1) {
2602 return -123;
2603 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002604
Laurence Lundbladedbe6f212018-10-28 11:37:53 +07002605 if(QCBORDecode_Finish(&DCtx)) {
2606 return -124;
2607 }
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002608#else
2609 (void)spCSRWithTags;
2610#endif
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002611 return 0;
2612}
2613
2614
2615
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002616
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002617static uint8_t spBigNumInput[] = {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002618 0x83,
2619 0xC2, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2620 0xC3, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2621 0xA4,
2622 0x63, 0x42, 0x4E, 0x2B,
2623 0xC2, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2624 0x18, 0x40,
2625 0xC2, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2626 0x63, 0x42, 0x4E, 0x2D,
2627 0xC3, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2628 0x38, 0x3F,
2629 0xC3, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
2630
2631
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002632static uint8_t spBigNum[] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002633
2634
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002635int32_t BignumParseTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002636{
2637 QCBORDecodeContext DCtx;
2638 QCBORItem Item;
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07002639 QCBORError nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002640
Laurence Lundbladeee851742020-01-08 08:37:05 -08002641 QCBORDecode_Init(&DCtx,
2642 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNumInput),
2643 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002644
2645
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002646 //
2647 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
2648 return -1;
2649 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002650 return -2;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002651 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002652
2653 //
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002654 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002655 return -3;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002656 if(Item.uDataType != QCBOR_TYPE_POSBIGNUM ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002657 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002658 return -4;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002659 }
2660
2661 //
2662 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002663 return -5;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002664 if(Item.uDataType != QCBOR_TYPE_NEGBIGNUM ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002665 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002666 return -6;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002667 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002668
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002669 //
2670 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002671 return -7;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002672 if(Item.uDataType != QCBOR_TYPE_MAP) {
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002673 return -8;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002674 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002675
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002676 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002677 return -9;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002678 if(Item.uDataType != QCBOR_TYPE_POSBIGNUM ||
2679 Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002680 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002681 return -10;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002682 }
2683
2684 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002685 return -11;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002686 if(Item.uDataType != QCBOR_TYPE_POSBIGNUM ||
2687 Item.uLabelType != QCBOR_TYPE_INT64 ||
2688 Item.label.int64 != 64 ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002689 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002690 return -12;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002691 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002692
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002693 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002694 return -13;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002695 if(Item.uDataType != QCBOR_TYPE_NEGBIGNUM ||
2696 Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002697 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002698 return -14;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002699 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002700
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002701 if((nCBORError = QCBORDecode_GetNext(&DCtx, &Item)))
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002702 return -15;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002703 if(Item.uDataType != QCBOR_TYPE_NEGBIGNUM ||
2704 Item.uLabelType != QCBOR_TYPE_INT64 ||
2705 Item.label.int64 != -64 ||
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002706 UsefulBuf_Compare(Item.val.bigNum, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum))){
Laurence Lundblade830fbf92020-05-31 17:22:33 -07002707 return -16;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002708 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002709
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002710 return 0;
2711}
2712
2713
2714
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002715static int32_t CheckItemWithIntLabel(QCBORDecodeContext *pCtx,
Laurence Lundbladeee851742020-01-08 08:37:05 -08002716 uint8_t uDataType,
2717 uint8_t uNestingLevel,
2718 uint8_t uNextNest,
2719 int64_t nLabel,
2720 QCBORItem *pItem)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002721{
2722 QCBORItem Item;
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07002723 QCBORError nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002724
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002725 if((nCBORError = QCBORDecode_GetNext(pCtx, &Item))) return -1;
2726 if(Item.uDataType != uDataType) return -1;
2727 if(uNestingLevel > 0) {
Laurence Lundbladeee851742020-01-08 08:37:05 -08002728 if(Item.uLabelType != QCBOR_TYPE_INT64 &&
2729 Item.uLabelType != QCBOR_TYPE_UINT64) {
2730 return -1;
2731 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002732 if(Item.uLabelType == QCBOR_TYPE_INT64) {
2733 if(Item.label.int64 != nLabel) return -1;
2734 } else {
Laurence Lundblade570fab52018-10-13 18:28:27 +08002735 if(Item.label.uint64 != (uint64_t)nLabel) return -1;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002736 }
2737 }
2738 if(Item.uNestingLevel != uNestingLevel) return -1;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302739 if(Item.uNextNestLevel != uNextNest) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002740
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002741 if(pItem) {
2742 *pItem = Item;
2743 }
2744 return 0;
2745}
2746
2747
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002748// Same code checks definite and indefinite length versions of the map
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002749static int32_t CheckCSRMaps(QCBORDecodeContext *pDC)
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002750{
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302751 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 0, 1, 0, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002752
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302753 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 1, 2, -23, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002754
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302755 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 2, 3, -20, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002756
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302757 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_TEXT_STRING, 3, 3, -18, NULL)) return -1;
2758 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_TEXT_STRING, 3, 3, -17, NULL)) return -1;
2759 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_TEXT_STRING, 3, 3, -15, NULL)) return -1;
2760 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_TEXT_STRING, 3, 3, -16, NULL)) return -1;
2761 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_TEXT_STRING, 3, 2, -14, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002762
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302763 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 2, 3, -19, NULL)) return -1;
2764 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 3, 4, -11, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002765
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302766 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_INT64, 4, 3, -9, NULL)) return -1;
2767 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_BYTE_STRING, 3, 1, -10, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002768
Laurence Lundbladea44d5062018-10-17 18:45:12 +05302769 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_MAP, 1, 2, -22, NULL)) return -1;
2770 if(CheckItemWithIntLabel(pDC, QCBOR_TYPE_INT64, 2, 0, -5, NULL)) return -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002771
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002772 if(QCBORDecode_Finish(pDC)) return -2;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002773
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002774 return 0;
2775}
2776
2777
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002778/*
2779// cbor.me decoded output
2780{
2781 -23: {
2782 -20: {
2783 -18: "Organization",
2784 -17: "SSG",
2785 -15: "Confusion",
2786 -16: "San Diego",
2787 -14: "US"
2788 },
2789 -19: {
2790 -11: {
2791 -9: -7
2792 },
2793 -10: '\u0001\u0002\u0003\u0004\u0005\u0006\a\b\t\n'
2794 }
2795 },
2796 -22: {
2797 -5: -3
2798 }
2799}
2800 */
2801
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002802
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002803static uint8_t spCSRInput[] = {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002804 0xa2, 0x36, 0xa2, 0x33, 0xa5, 0x31, 0x6c, 0x4f,
2805 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74,
2806 0x69, 0x6f, 0x6e, 0x30, 0x63, 0x53, 0x53, 0x47,
2807 0x2e, 0x69, 0x43, 0x6f, 0x6e, 0x66, 0x75, 0x73,
2808 0x69, 0x6f, 0x6e, 0x2f, 0x69, 0x53, 0x61, 0x6e,
2809 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x2d, 0x62,
2810 0x55, 0x53, 0x32, 0xa2, 0x2a, 0xa1, 0x28, 0x26,
2811 0x29, 0x4a, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
2812 0x07, 0x08, 0x09, 0x0a, 0x35, 0xa1, 0x24, 0x22};
2813
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002814int32_t NestedMapTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002815{
2816 QCBORDecodeContext DCtx;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002817
Laurence Lundbladeee851742020-01-08 08:37:05 -08002818 QCBORDecode_Init(&DCtx,
2819 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRInput),
2820 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002821
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002822 return CheckCSRMaps(&DCtx);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002823}
2824
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08002825
2826
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002827int32_t StringDecoderModeFailTest()
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08002828{
2829 QCBORDecodeContext DCtx;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002830
Laurence Lundbladeee851742020-01-08 08:37:05 -08002831 QCBORDecode_Init(&DCtx,
2832 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRInput),
2833 QCBOR_DECODE_MODE_MAP_STRINGS_ONLY);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002834
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08002835 QCBORItem Item;
2836 QCBORError nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002837
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08002838 if(QCBORDecode_GetNext(&DCtx, &Item)) {
2839 return -1;
2840 }
2841 if(Item.uDataType != QCBOR_TYPE_MAP) {
2842 return -2;
2843 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002844
Laurence Lundbladeea567ac2018-12-09 14:03:21 -08002845 nCBORError = QCBORDecode_GetNext(&DCtx, &Item);
2846 if(nCBORError != QCBOR_ERR_MAP_LABEL_TYPE) {
2847 return -3;
2848 }
2849
2850 return 0;
2851}
2852
2853
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002854// Same map as above, but using indefinite lengths
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002855static uint8_t spCSRInputIndefLen[] = {
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002856 0xbf, 0x36, 0xbf, 0x33, 0xbf, 0x31, 0x6c, 0x4f,
2857 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74,
2858 0x69, 0x6f, 0x6e, 0x30, 0x63, 0x53, 0x53, 0x47,
2859 0x2e, 0x69, 0x43, 0x6f, 0x6e, 0x66, 0x75, 0x73,
2860 0x69, 0x6f, 0x6e, 0x2f, 0x69, 0x53, 0x61, 0x6e,
2861 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x2d, 0x62,
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002862 0x55, 0x53, 0xff, 0x32, 0xbf, 0x2a, 0xbf, 0x28,
2863 0x26, 0xff, 0x29, 0x4a, 0x01, 0x02, 0x03, 0x04,
2864 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0xff, 0xff,
2865 0x35, 0xbf, 0x24, 0x22, 0xff, 0xff};
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002866
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002867int32_t NestedMapTestIndefLen()
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002868{
2869 QCBORDecodeContext DCtx;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002870
Laurence Lundbladeee851742020-01-08 08:37:05 -08002871 QCBORDecode_Init(&DCtx,
2872 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRInputIndefLen),
2873 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002874
Laurence Lundblade742df4a2018-10-13 20:07:17 +08002875 return CheckCSRMaps(&DCtx);
2876}
2877
2878
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08002879
Laurence Lundblade17ede402018-10-13 11:43:07 +08002880static UsefulBufC make_nested_indefinite_arrays(int n, UsefulBuf Storage)
2881{
2882 UsefulOutBuf UOB;
2883 UsefulOutBuf_Init(&UOB, Storage);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002884
Laurence Lundblade17ede402018-10-13 11:43:07 +08002885 int i;
2886 for(i = 0; i < n; i++) {
2887 UsefulOutBuf_AppendByte(&UOB, 0x9f);
2888 }
2889
2890 for(i = 0; i < n; i++) {
2891 UsefulOutBuf_AppendByte(&UOB, 0xff);
2892 }
2893 return UsefulOutBuf_OutUBuf(&UOB);
2894}
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002895
2896
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002897static int32_t parse_indeflen_nested(UsefulBufC Nested, int nNestLevel)
Laurence Lundblade17ede402018-10-13 11:43:07 +08002898{
2899 QCBORDecodeContext DC;
2900 QCBORDecode_Init(&DC, Nested, 0);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002901
Laurence Lundblade17ede402018-10-13 11:43:07 +08002902 int j;
2903 for(j = 0; j < nNestLevel; j++) {
2904 QCBORItem Item;
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07002905 QCBORError nReturn = QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade17ede402018-10-13 11:43:07 +08002906 if(j >= QCBOR_MAX_ARRAY_NESTING) {
2907 // Should be in error
2908 if(nReturn != QCBOR_ERR_ARRAY_NESTING_TOO_DEEP) {
2909 return -4;
2910 } else {
2911 return 0; // Decoding doesn't recover after an error
2912 }
2913 } else {
2914 // Should be no error
2915 if(nReturn) {
2916 return -9; // Should not have got an error
2917 }
2918 }
2919 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
2920 return -7;
2921 }
2922 }
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07002923 QCBORError nReturn = QCBORDecode_Finish(&DC);
Laurence Lundblade17ede402018-10-13 11:43:07 +08002924 if(nReturn) {
2925 return -3;
2926 }
2927 return 0;
2928}
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002929
2930
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002931int32_t IndefiniteLengthNestTest()
Laurence Lundblade17ede402018-10-13 11:43:07 +08002932{
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05302933 UsefulBuf_MAKE_STACK_UB(Storage, 50);
Laurence Lundblade17ede402018-10-13 11:43:07 +08002934 int i;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002935 for(i=1; i < QCBOR_MAX_ARRAY_NESTING+4; i++) {
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -08002936 const UsefulBufC Nested = make_nested_indefinite_arrays(i, Storage);
Laurence Lundblade17ede402018-10-13 11:43:07 +08002937 int nReturn = parse_indeflen_nested(Nested, i);
2938 if(nReturn) {
2939 return nReturn;
2940 }
2941 }
2942 return 0;
2943}
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002944
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002945
Laurence Lundbladeee851742020-01-08 08:37:05 -08002946// [1, [2, 3]]
2947static const uint8_t spIndefiniteArray[] = {0x9f, 0x01, 0x82, 0x02, 0x03, 0xff};
2948// No closing break
2949static const uint8_t spIndefiniteArrayBad1[] = {0x9f};
2950// Not enough closing breaks
2951static const uint8_t spIndefiniteArrayBad2[] = {0x9f, 0x9f, 0x02, 0xff};
2952// Too many closing breaks
2953static const uint8_t spIndefiniteArrayBad3[] = {0x9f, 0x02, 0xff, 0xff};
2954// Unclosed indeflen inside def len
2955static const uint8_t spIndefiniteArrayBad4[] = {0x81, 0x9f};
2956// confused tag
2957static const uint8_t spIndefiniteArrayBad5[] = {0x9f, 0xd1, 0xff};
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002958
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002959int32_t IndefiniteLengthArrayMapTest()
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002960{
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07002961 QCBORError nResult;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08002962 // --- first test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07002963 UsefulBufC IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArray);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002964
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002965 // Decode it and see if it is OK
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05302966 UsefulBuf_MAKE_STACK_UB(MemPool, 150);
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002967 QCBORDecodeContext DC;
2968 QCBORItem Item;
2969 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002970
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002971 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002972
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002973 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302974
2975 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
2976 Item.uNestingLevel != 0 ||
2977 Item.uNextNestLevel != 1) {
2978 return -111;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002979 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002980
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002981 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302982 if(Item.uDataType != QCBOR_TYPE_INT64 ||
2983 Item.uNestingLevel != 1 ||
2984 Item.uNextNestLevel != 1) {
2985 return -2;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002986 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002987
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002988 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade6de37062018-10-15 12:22:42 +05302989 if(Item.uDataType != QCBOR_TYPE_ARRAY ||
2990 Item.uNestingLevel != 1 ||
2991 Item.uNextNestLevel != 2) {
2992 return -3;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002993 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002994
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08002995 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade12b495d2018-12-17 11:15:54 -08002996 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade6de37062018-10-15 12:22:42 +05302997 Item.uNestingLevel != 2 ||
2998 Item.uNextNestLevel != 2) {
2999 return -4;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08003000 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003001
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08003002 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade12b495d2018-12-17 11:15:54 -08003003 if(Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade6de37062018-10-15 12:22:42 +05303004 Item.uNestingLevel != 2 ||
3005 Item.uNextNestLevel != 0) {
3006 return -5;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08003007 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003008
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08003009 if(QCBORDecode_Finish(&DC)) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05303010 return -6;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08003011 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003012
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003013 // --- next test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003014 IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArrayBad1);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003015
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003016 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003017
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003018 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003019
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003020 nResult = QCBORDecode_GetNext(&DC, &Item);
3021 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05303022 return -7;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003023 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003024
Laurence Lundblade570fab52018-10-13 18:28:27 +08003025 nResult = QCBORDecode_Finish(&DC);
Laurence Lundblade6de37062018-10-15 12:22:42 +05303026 if(nResult != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
3027 return -8;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003028 }
3029
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003030
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003031 // --- next test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003032 IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArrayBad2);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003033
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003034 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003035
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003036 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003037
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003038 nResult = QCBORDecode_GetNext(&DC, &Item);
3039 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05303040 return -9;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003041 }
3042
3043 nResult = QCBORDecode_GetNext(&DC, &Item);
3044 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05303045 return -10;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003046 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003047
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003048 nResult = QCBORDecode_GetNext(&DC, &Item);
3049 if(nResult || Item.uDataType != QCBOR_TYPE_INT64) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05303050 return -11;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003051 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003052
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003053 nResult = QCBORDecode_Finish(&DC);
Laurence Lundblade6de37062018-10-15 12:22:42 +05303054 if(nResult != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
3055 return -12;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003056 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003057
3058
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003059 // --- next test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003060 IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArrayBad3);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003061
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003062 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003063
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003064 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003065
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003066 nResult = QCBORDecode_GetNext(&DC, &Item);
3067 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05303068 return -13;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003069 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003070
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003071 nResult = QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade642282a2020-06-23 12:00:33 -07003072 if(nResult != QCBOR_SUCCESS) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05303073 return -14;
Laurence Lundblade19e0c802018-10-13 12:19:55 +08003074 }
Laurence Lundblade6de37062018-10-15 12:22:42 +05303075
Laurence Lundblade642282a2020-06-23 12:00:33 -07003076 nResult = QCBORDecode_GetNext(&DC, &Item);
3077 if(nResult != QCBOR_ERR_BAD_BREAK) {
3078 return -140;
3079 }
3080
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003081
Laurence Lundblade570fab52018-10-13 18:28:27 +08003082 // --- next test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003083 IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArrayBad4);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003084
Laurence Lundblade570fab52018-10-13 18:28:27 +08003085 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003086
Laurence Lundblade570fab52018-10-13 18:28:27 +08003087 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003088
Laurence Lundblade570fab52018-10-13 18:28:27 +08003089 nResult = QCBORDecode_GetNext(&DC, &Item);
3090 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05303091 return -15;
Laurence Lundblade570fab52018-10-13 18:28:27 +08003092 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003093
Laurence Lundblade570fab52018-10-13 18:28:27 +08003094 nResult = QCBORDecode_GetNext(&DC, &Item);
3095 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05303096 return -16;
Laurence Lundblade570fab52018-10-13 18:28:27 +08003097 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003098
Laurence Lundblade570fab52018-10-13 18:28:27 +08003099 nResult = QCBORDecode_Finish(&DC);
Laurence Lundblade6de37062018-10-15 12:22:42 +05303100 if(nResult != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
3101 return -17;
Laurence Lundblade570fab52018-10-13 18:28:27 +08003102 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003103
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303104 // --- next test -----
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003105 IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteArrayBad5);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003106
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303107 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003108
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303109 QCBORDecode_SetMemPool(&DC, MemPool, false);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003110
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303111 nResult = QCBORDecode_GetNext(&DC, &Item);
3112 if(nResult || Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade6de37062018-10-15 12:22:42 +05303113 return -18;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303114 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003115
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303116 nResult = QCBORDecode_GetNext(&DC, &Item);
Laurence Lundblade6de37062018-10-15 12:22:42 +05303117 if(nResult != QCBOR_ERR_BAD_BREAK) {
3118 return -19;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303119 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003120
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08003121 return 0;
3122}
3123
Laurence Lundblade17ede402018-10-13 11:43:07 +08003124
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003125static const uint8_t spIndefiniteLenString[] = {
Laurence Lundblade17ede402018-10-13 11:43:07 +08003126 0x81, // Array of length one
3127 0x7f, // text string marked with indefinite length
3128 0x65, 0x73, 0x74, 0x72, 0x65, 0x61, // first segment
3129 0x64, 0x6d, 0x69, 0x6e, 0x67, // second segment
3130 0xff // ending break
3131};
3132
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003133static const uint8_t spIndefiniteLenStringBad2[] = {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303134 0x81, // Array of length one
3135 0x7f, // text string marked with indefinite length
3136 0x65, 0x73, 0x74, 0x72, 0x65, 0x61, // first segment
3137 0x44, 0x6d, 0x69, 0x6e, 0x67, // second segment of wrong type
3138 0xff // ending break
3139};
3140
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003141static const uint8_t spIndefiniteLenStringBad3[] = {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303142 0x81, // Array of length one
3143 0x7f, // text string marked with indefinite length
3144 0x01, 0x02, // Not a string
3145 0xff // ending break
3146};
3147
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003148static const uint8_t spIndefiniteLenStringBad4[] = {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303149 0x81, // Array of length one
3150 0x7f, // text string marked with indefinite length
3151 0x65, 0x73, 0x74, 0x72, 0x65, 0x61, // first segment
3152 0x64, 0x6d, 0x69, 0x6e, 0x67, // second segment
3153 // missing end of string
3154};
3155
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003156static const uint8_t spIndefiniteLenStringLabel[] = {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303157 0xa1, // Array of length one
3158 0x7f, // text string marked with indefinite length
3159 0x65, 0x73, 0x74, 0x72, 0x75, 0x75, // first segment
3160 0x64, 0x6d, 0x69, 0x6e, 0x67, // second segment
3161 0xff, // ending break
3162 0x01 // integer being labeled.
3163};
3164
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003165/**
3166 Make an indefinite length string
3167
3168 @param Storage Storage for string, must be 144 bytes in size
3169 @return The indefinite length string
3170
3171 This makes an array with one indefinite length string that has 7 chunks
3172 from size of 1 byte up to 64 bytes.
3173 */
3174static UsefulBufC MakeIndefiniteBigBstr(UsefulBuf Storage)
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303175{
3176 UsefulOutBuf UOB;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003177
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303178 UsefulOutBuf_Init(&UOB, Storage);
3179 UsefulOutBuf_AppendByte(&UOB, 0x81);
3180 UsefulOutBuf_AppendByte(&UOB, 0x5f);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003181
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003182 uint8_t uStringByte = 0;
3183 // Use of type int is intentional
3184 for(int uChunkSize = 1; uChunkSize <= 128; uChunkSize *= 2) {
3185 // Not using preferred encoding here, but that is OK.
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303186 UsefulOutBuf_AppendByte(&UOB, 0x58);
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003187 UsefulOutBuf_AppendByte(&UOB, (uint8_t)uChunkSize);
3188 for(int j = 0; j < uChunkSize; j++) {
3189 UsefulOutBuf_AppendByte(&UOB, uStringByte);
3190 uStringByte++;
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303191 }
3192 }
3193 UsefulOutBuf_AppendByte(&UOB, 0xff);
3194
3195 return UsefulOutBuf_OutUBuf(&UOB);
3196}
3197
3198static int CheckBigString(UsefulBufC BigString)
3199{
3200 if(BigString.len != 255) {
3201 return 1;
3202 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003203
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303204 for(uint8_t i = 0; i < 255; i++){
3205 if(((const uint8_t *)BigString.ptr)[i] != i) {
3206 return 1;
3207 }
3208 }
3209 return 0;
3210}
3211
Laurence Lundblade7e0d13b2018-10-16 19:54:13 +05303212
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003213int32_t IndefiniteLengthStringTest()
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303214{
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303215 QCBORDecodeContext DC;
3216 QCBORItem Item;
Laurence Lundblade7e0d13b2018-10-16 19:54:13 +05303217 // big enough for MakeIndefiniteBigBstr() + MemPool overhead
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003218 UsefulBuf_MAKE_STACK_UB(MemPool, 350);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003219
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303220 // --- Simple normal indefinite length string ------
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003221 UsefulBufC IndefLen = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteLenString);
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303222 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003223
Laurence Lundblade7e0d13b2018-10-16 19:54:13 +05303224 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303225 return -1;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303226 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003227
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303228 if(QCBORDecode_GetNext(&DC, &Item)) {
3229 return -2;
3230 }
3231 if(Item.uDataType != QCBOR_TYPE_ARRAY || Item.uDataAlloc) {
3232 return -3;
3233 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003234
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303235 if(QCBORDecode_GetNext(&DC, &Item)) {
3236 return -4;
3237 }
3238 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING || !Item.uDataAlloc) {
3239 return -5;
3240 }
3241 if(QCBORDecode_Finish(&DC)) {
3242 return -6;
3243 }
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303244
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303245 // ----- types mismatch ---
Laurence Lundbladeee851742020-01-08 08:37:05 -08003246 QCBORDecode_Init(&DC,
3247 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteLenStringBad2),
3248 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003249
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303250 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
3251 return -7;
3252 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003253
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303254 if(QCBORDecode_GetNext(&DC, &Item)) {
3255 return -8;
3256 }
3257 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
3258 return -9;
3259 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003260
Laurence Lundblade30816f22018-11-10 13:40:22 +07003261 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_ERR_INDEFINITE_STRING_CHUNK) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303262 return -10;
3263 }
3264
3265 // ----- not a string ---
Laurence Lundbladeee851742020-01-08 08:37:05 -08003266 QCBORDecode_Init(&DC,
3267 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteLenStringBad3),
3268 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003269
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303270 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
3271 return -11;
3272 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003273
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303274 if(QCBORDecode_GetNext(&DC, &Item)) {
3275 return -12;
3276 }
3277 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
3278 return -13;
3279 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003280
Laurence Lundblade30816f22018-11-10 13:40:22 +07003281 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_ERR_INDEFINITE_STRING_CHUNK) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303282 return -14;
3283 }
3284
3285 // ----- no end -----
Laurence Lundbladeee851742020-01-08 08:37:05 -08003286 QCBORDecode_Init(&DC,
3287 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteLenStringBad4),
3288 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003289
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303290 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
3291 return -15;
3292 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003293
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303294 if(QCBORDecode_GetNext(&DC, &Item)) {
3295 return -16;
3296 }
3297 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
3298 return -17;
3299 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003300
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303301 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_ERR_HIT_END) {
3302 return -18;
3303 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003304
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303305 // ------ Don't set a string allocator and see an error -----
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303306 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003307
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303308 QCBORDecode_GetNext(&DC, &Item);
3309 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303310 return -19;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303311 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003312
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303313 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_ERR_NO_STRING_ALLOCATOR) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303314 return -20;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303315 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003316
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303317 // ----- Mempool is way too small -----
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003318 UsefulBuf_MAKE_STACK_UB(MemPoolTooSmall, QCBOR_DECODE_MIN_MEM_POOL_SIZE-1);
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303319
3320 QCBORDecode_Init(&DC, IndefLen, QCBOR_DECODE_MODE_NORMAL);
3321 if(!QCBORDecode_SetMemPool(&DC, MemPoolTooSmall, false)) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303322 return -21;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303323 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003324
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303325 // ----- Mempool is way too small -----
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05303326 UsefulBuf_MAKE_STACK_UB(BigIndefBStrStorage, 290);
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -08003327 const UsefulBufC BigIndefBStr = MakeIndefiniteBigBstr(BigIndefBStrStorage);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003328
Laurence Lundbladeee851742020-01-08 08:37:05 -08003329 // 80 is big enough for MemPool overhead, but not BigIndefBStr
3330 UsefulBuf_MAKE_STACK_UB(MemPoolSmall, 80);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003331
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303332 QCBORDecode_Init(&DC, BigIndefBStr, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303333 if(QCBORDecode_SetMemPool(&DC, MemPoolSmall, false)) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303334 return -22;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303335 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003336
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303337 QCBORDecode_GetNext(&DC, &Item);
3338 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303339 return -23;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303340 }
Laurence Lundblade30816f22018-11-10 13:40:22 +07003341 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_ERR_STRING_ALLOCATE) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303342 return -24;
Laurence Lundblade5b8c5852018-10-14 21:11:42 +05303343 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003344
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303345 // ---- big bstr -----
3346 QCBORDecode_Init(&DC, BigIndefBStr, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003347
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303348 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
3349 return -25;
3350 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003351
Laurence Lundblade7e0d13b2018-10-16 19:54:13 +05303352 if(QCBORDecode_GetNext(&DC, &Item)) {
3353 return -26;
3354 }
3355 if(Item.uDataType != QCBOR_TYPE_ARRAY || Item.uDataAlloc) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303356 return -26;
3357 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003358
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303359 if(QCBORDecode_GetNext(&DC, &Item)) {
3360 return -27;
3361 }
Laurence Lundblade7e0d13b2018-10-16 19:54:13 +05303362 if(Item.uDataType != QCBOR_TYPE_BYTE_STRING || !Item.uDataAlloc || Item.uNestingLevel != 1) {
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303363 return -28;
3364 }
3365 if(CheckBigString(Item.val.string)) {
3366 return -3;
3367 }
3368 if(QCBORDecode_Finish(&DC)) {
3369 return -29;
3370 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003371
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303372 // --- label is an indefinite length string ------
Laurence Lundbladeb836efb2018-10-28 20:09:58 +07003373 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spIndefiniteLenStringLabel), QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003374
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303375 if(QCBORDecode_SetMemPool(&DC, MemPool, false)) {
3376 return -30;
3377 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003378
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303379 QCBORDecode_GetNext(&DC, &Item);
3380 if(Item.uDataType != QCBOR_TYPE_MAP) {
3381 return -31;
3382 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003383
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303384 if(QCBORDecode_GetNext(&DC, &Item)){
3385 return -32;
3386 }
Laurence Lundbladeee851742020-01-08 08:37:05 -08003387 if(Item.uLabelType != QCBOR_TYPE_TEXT_STRING ||
3388 Item.uDataType != QCBOR_TYPE_INT64 ||
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303389 Item.uDataAlloc || !Item.uLabelAlloc ||
3390 UsefulBuf_Compare(Item.label.string, UsefulBuf_FromSZ("struuming"))) {
3391 return -33;
3392 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003393
Laurence Lundblade57dd1442018-10-15 20:26:28 +05303394 if(QCBORDecode_Finish(&DC)) {
3395 return -34;
3396 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003397
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003398 return 0;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08003399}
3400
3401
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003402int32_t AllocAllStringsTest()
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303403{
3404 QCBORDecodeContext DC;
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003405 QCBORError nCBORError;
3406
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003407
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303408 // First test, use the "CSRMap" as easy input and checking
Laurence Lundbladeee851742020-01-08 08:37:05 -08003409 QCBORDecode_Init(&DC,
3410 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCSRInput),
3411 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003412
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003413 UsefulBuf_MAKE_STACK_UB(Pool, sizeof(spCSRInput) + QCBOR_DECODE_MIN_MEM_POOL_SIZE);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003414
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003415 nCBORError = QCBORDecode_SetMemPool(&DC, Pool, 1); // Turn on copying.
3416 if(nCBORError) {
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303417 return -1;
3418 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003419
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003420 if(CheckCSRMaps(&DC)) {
3421 return -2;
3422 }
3423
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303424 // Next parse, save pointers to a few strings, destroy original and see all is OK.
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003425 UsefulBuf_MAKE_STACK_UB(CopyOfStorage, sizeof(pValidMapEncoded) + QCBOR_DECODE_MIN_MEM_POOL_SIZE);
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -08003426 const UsefulBufC CopyOf = UsefulBuf_Copy(CopyOfStorage, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapEncoded));
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +08003427
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303428 QCBORDecode_Init(&DC, CopyOf, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade1f8b5b02019-01-01 22:27:38 -08003429 UsefulBuf_Set(Pool, '/');
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303430 QCBORDecode_SetMemPool(&DC, Pool, 1); // Turn on copying.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003431
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303432 QCBORItem Item1, Item2, Item3, Item4;
3433 if((nCBORError = QCBORDecode_GetNext(&DC, &Item1)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07003434 return (int32_t)nCBORError;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303435 if(Item1.uDataType != QCBOR_TYPE_MAP ||
3436 Item1.val.uCount != 3)
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003437 return -3;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303438 if((nCBORError = QCBORDecode_GetNext(&DC, &Item1)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07003439 return (int32_t)nCBORError;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303440 if((nCBORError = QCBORDecode_GetNext(&DC, &Item2)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07003441 return (int32_t)nCBORError;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303442 if((nCBORError = QCBORDecode_GetNext(&DC, &Item3)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07003443 return (int32_t)nCBORError;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303444 if((nCBORError = QCBORDecode_GetNext(&DC, &Item4)))
Laurence Lundbladee6bcef12020-04-01 10:56:27 -07003445 return (int32_t)nCBORError;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003446
Laurence Lundblade05ec57b2018-10-21 01:50:03 +05303447 UsefulBuf_Set(CopyOfStorage, '_');
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003448
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303449 if(Item1.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303450 Item1.uDataType != QCBOR_TYPE_INT64 ||
3451 Item1.val.int64 != 42 ||
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003452 Item1.uDataAlloc != 0 ||
3453 Item1.uLabelAlloc == 0 ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003454 UsefulBuf_Compare(Item1.label.string, UsefulBuf_FromSZ("first integer"))) {
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003455 return -4;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003456 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003457
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303458
3459 if(Item2.uLabelType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003460 UsefulBuf_Compare(Item2.label.string, UsefulBuf_FromSZ("an array of two strings")) ||
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303461 Item2.uDataType != QCBOR_TYPE_ARRAY ||
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003462 Item2.uDataAlloc != 0 ||
3463 Item2.uLabelAlloc == 0 ||
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303464 Item2.val.uCount != 2)
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003465 return -5;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003466
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303467 if(Item3.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003468 Item3.uDataAlloc == 0 ||
3469 Item3.uLabelAlloc != 0 ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003470 UsefulBuf_Compare(Item3.val.string, UsefulBuf_FromSZ("string1"))) {
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003471 return -6;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003472 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003473
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303474 if(Item4.uDataType != QCBOR_TYPE_TEXT_STRING ||
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003475 Item4.uDataAlloc == 0 ||
3476 Item4.uLabelAlloc != 0 ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003477 UsefulBuf_Compare(Item4.val.string, UsefulBuf_FromSZ("string2"))) {
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003478 return -7;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003479 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003480
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303481 // Next parse with a pool that is too small
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003482 UsefulBuf_MAKE_STACK_UB(SmallPool, QCBOR_DECODE_MIN_MEM_POOL_SIZE + 1);
Laurence Lundbladeee851742020-01-08 08:37:05 -08003483 QCBORDecode_Init(&DC,
3484 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapEncoded),
3485 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303486 QCBORDecode_SetMemPool(&DC, SmallPool, 1); // Turn on copying.
3487 if((nCBORError = QCBORDecode_GetNext(&DC, &Item1)))
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003488 return -8;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303489 if(Item1.uDataType != QCBOR_TYPE_MAP ||
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003490 Item1.val.uCount != 3) {
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003491 return -9;
Laurence Lundbladeccfb8cd2018-12-07 21:11:30 +09003492 }
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303493 if(!(nCBORError = QCBORDecode_GetNext(&DC, &Item1))){
3494 if(!(nCBORError = QCBORDecode_GetNext(&DC, &Item2))) {
3495 if(!(nCBORError = QCBORDecode_GetNext(&DC, &Item3))) {
3496 nCBORError = QCBORDecode_GetNext(&DC, &Item4);
3497 }
3498 }
3499 }
Laurence Lundblade30816f22018-11-10 13:40:22 +07003500 if(nCBORError != QCBOR_ERR_STRING_ALLOCATE) {
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003501 return -10;
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303502 }
3503
3504 return 0;
3505}
3506
Laurence Lundbladef6531662018-12-04 10:42:22 +09003507
Laurence Lundbladea44d5062018-10-17 18:45:12 +05303508
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003509int32_t MemPoolTest(void)
Laurence Lundblade0155b622018-10-12 20:04:37 +08003510{
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003511 // Set up the decoder with a tiny bit of CBOR to parse because
3512 // nothing can be done with it unless that is set up.
Laurence Lundbladef6531662018-12-04 10:42:22 +09003513 QCBORDecodeContext DC;
3514 const uint8_t pMinimalCBOR[] = {0xa0}; // One empty map
3515 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pMinimalCBOR),0);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003516
Laurence Lundbladef6531662018-12-04 10:42:22 +09003517 // Set up an memory pool of 100 bytes
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003518 // Then fish into the internals of the decode context
3519 // to get the allocator function so it can be called directly.
3520 // Also figure out how much pool is available for use
3521 // buy subtracting out the overhead.
Laurence Lundbladef6531662018-12-04 10:42:22 +09003522 UsefulBuf_MAKE_STACK_UB(Pool, 100);
Laurence Lundbladedf2836b2018-12-19 18:13:29 -08003523 QCBORError nError = QCBORDecode_SetMemPool(&DC, Pool, 0);
3524 if(nError) {
3525 return -9;
3526 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003527 QCBORStringAllocate pAlloc = DC.StringAllocator.pfAllocator;
3528 void *pAllocCtx = DC.StringAllocator.pAllocateCxt;
3529 size_t uAvailPool = Pool.len - QCBOR_DECODE_MIN_MEM_POOL_SIZE;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003530
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003531 // First test -- ask for one more byte than available and see failure
3532 UsefulBuf Allocated = (*pAlloc)(pAllocCtx, NULL, uAvailPool+1);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003533 if(!UsefulBuf_IsNULL(Allocated)) {
3534 return -1;
3535 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003536
Laurence Lundbladef6531662018-12-04 10:42:22 +09003537 // Re do the set up for the next test that will do a successful alloc,
3538 // a fail, a free and then success
Laurence Lundbladef6531662018-12-04 10:42:22 +09003539 QCBORDecode_SetMemPool(&DC, Pool, 0);
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003540 pAlloc = DC.StringAllocator.pfAllocator;
3541 pAllocCtx = DC.StringAllocator.pAllocateCxt;
3542 uAvailPool = Pool.len - QCBOR_DECODE_MIN_MEM_POOL_SIZE;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003543
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003544 // Allocate one byte less than available and see success
3545 Allocated = (pAlloc)(pAllocCtx, NULL, uAvailPool-1);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003546 if(UsefulBuf_IsNULL(Allocated)) { // expected to succeed
3547 return -2;
3548 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003549 // Ask for some more and see failure
3550 UsefulBuf Allocated2 = (*pAlloc)(pAllocCtx, NULL, uAvailPool/2);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003551 if(!UsefulBuf_IsNULL(Allocated2)) { // expected to fail
3552 return -3;
3553 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003554 // Free the first allocate, retry the second and see success
3555 (*pAlloc)(pAllocCtx, Allocated.ptr, 0); // Free
3556 Allocated = (*pAlloc)(pAllocCtx, NULL, uAvailPool/2);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003557 if(UsefulBuf_IsNULL(Allocated)) { // succeed because of the free
3558 return -4;
3559 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003560
Laurence Lundbladef6531662018-12-04 10:42:22 +09003561 // Re do set up for next test that involves a successful alloc,
3562 // and a successful realloc and a failed realloc
3563 QCBORDecode_SetMemPool(&DC, Pool, 0);
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003564 pAlloc = DC.StringAllocator.pfAllocator;
3565 pAllocCtx = DC.StringAllocator.pAllocateCxt;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003566
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003567 // Allocate half the pool and see success
3568 Allocated = (*pAlloc)(pAllocCtx, NULL, uAvailPool/2);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003569 if(UsefulBuf_IsNULL(Allocated)) { // expected to succeed
3570 return -5;
3571 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003572 // Reallocate to take up the whole pool and see success
3573 Allocated2 = (*pAlloc)(pAllocCtx, Allocated.ptr, uAvailPool);
Laurence Lundbladef6531662018-12-04 10:42:22 +09003574 if(UsefulBuf_IsNULL(Allocated2)) {
3575 return -6;
3576 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003577 // Make sure its the same pointer and the size is right
Laurence Lundbladef6531662018-12-04 10:42:22 +09003578 if(Allocated2.ptr != Allocated.ptr || Allocated2.len != uAvailPool) {
3579 return -7;
3580 }
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003581 // Try to allocate more to be sure there is failure after a realloc
3582 UsefulBuf Allocated3 = (*pAlloc)(pAllocCtx, Allocated.ptr, uAvailPool+1);
3583 if(!UsefulBuf_IsNULL(Allocated3)) {
Laurence Lundbladef6531662018-12-04 10:42:22 +09003584 return -8;
3585 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08003586
Laurence Lundbladef6531662018-12-04 10:42:22 +09003587 return 0;
3588}
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08003589
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003590
3591/* Just enough of an allocator to test configuration of one */
3592static UsefulBuf AllocateTestFunction(void *pCtx, void *pOldMem, size_t uNewSize)
3593{
3594 (void)pOldMem; // unused variable
3595
3596 if(uNewSize) {
3597 // Assumes the context pointer is the buffer and
3598 // nothing too big will ever be asked for.
3599 // This is only good for this basic test!
3600 return (UsefulBuf) {pCtx, uNewSize};
3601 } else {
3602 return NULLUsefulBuf;
3603 }
3604}
3605
3606
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003607int32_t SetUpAllocatorTest(void)
Laurence Lundblade1d7eb632019-02-17 17:23:38 -08003608{
3609 // Set up the decoder with a tiny bit of CBOR to parse because
3610 // nothing can be done with it unless that is set up.
3611 QCBORDecodeContext DC;
3612 const uint8_t pMinimalCBOR[] = {0x62, 0x48, 0x69}; // "Hi"
3613 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pMinimalCBOR),0);
3614
3615 uint8_t pAllocatorBuffer[50];
3616
3617 // This is really just to test that this call works.
3618 // The full functionality of string allocators is tested
3619 // elsewhere with the MemPool internal allocator.
3620 QCBORDecode_SetUpAllocator(&DC, AllocateTestFunction, pAllocatorBuffer, 1);
3621
3622 QCBORItem Item;
3623 if(QCBORDecode_GetNext(&DC, &Item) != QCBOR_SUCCESS) {
3624 return -1;
3625 }
3626
3627 if(Item.uDataAlloc == 0 ||
3628 Item.uDataType != QCBOR_TYPE_TEXT_STRING ||
3629 Item.val.string.ptr != pAllocatorBuffer) {
3630 return -2;
3631 }
3632
3633 if(QCBORDecode_Finish(&DC) != QCBOR_SUCCESS) {
3634 return -3;
3635 }
3636
3637 return 0;
3638}
3639
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07003640#ifndef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA
Laurence Lundblade59289e52019-12-30 13:44:37 -08003641
Laurence Lundbladea826c502020-05-10 21:07:00 -07003642/* exponent, mantissa
Laurence Lundblade59289e52019-12-30 13:44:37 -08003643 [
3644 4([-1, 3]),
Laurence Lundbladea826c502020-05-10 21:07:00 -07003645 4([-20, 4759477275222530853136]),
3646 4([9223372036854775807, -4759477275222530853137]),
Laurence Lundblade59289e52019-12-30 13:44:37 -08003647 5([300, 100]),
Laurence Lundbladea826c502020-05-10 21:07:00 -07003648 5([-20, 4759477275222530853136]),
Laurence Lundblade59289e52019-12-30 13:44:37 -08003649 5([-9223372036854775807, -4759477275222530853137])
Laurence Lundbladea826c502020-05-10 21:07:00 -07003650 5([ 9223372036854775806, -4759477275222530853137])
3651 5([ 9223372036854775806, 9223372036854775806])]
Laurence Lundblade59289e52019-12-30 13:44:37 -08003652 ]
3653 */
3654
3655static const uint8_t spExpectedExponentsAndMantissas[] = {
Laurence Lundbladeb3683da2020-08-02 17:44:54 -07003656 0x88,
Laurence Lundblade59289e52019-12-30 13:44:37 -08003657 0xC4, 0x82, 0x20,
3658 0x03,
3659 0xC4, 0x82, 0x33,
3660 0xC2, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,
3661 0xC4, 0x82, 0x1B, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
3662 0xC3, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,
3663 0xC5, 0x82, 0x19, 0x01, 0x2C,
3664 0x18, 0x64,
3665 0xC5, 0x82, 0x33,
3666 0xC2, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,
3667 0xC5, 0x82, 0x3B, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
3668 0xC3, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,
Laurence Lundbladea826c502020-05-10 21:07:00 -07003669 0xC5, 0x82, 0x1B, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
3670 0xC3, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,
Laurence Lundblade59289e52019-12-30 13:44:37 -08003671 0xC5, 0x82, 0x1B, 0x7f, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
3672 0x1B, 0x7f, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE
3673};
3674
Laurence Lundbladefaec39f2020-08-02 21:53:53 -07003675
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003676int32_t ExponentAndMantissaDecodeTests(void)
Laurence Lundblade59289e52019-12-30 13:44:37 -08003677{
3678 QCBORDecodeContext DC;
Laurence Lundbladeb3683da2020-08-02 17:44:54 -07003679 QCBORError uErr;
Laurence Lundblade59289e52019-12-30 13:44:37 -08003680 QCBORItem item;
3681
Laurence Lundblade17af4902020-01-07 19:11:55 -08003682 static const uint8_t spBigNumMantissa[] = {0x01, 0x02, 0x03, 0x04, 0x05,
3683 0x06, 0x07, 0x08, 0x09, 0x010};
3684 UsefulBufC BN = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNumMantissa);
Laurence Lundblade59289e52019-12-30 13:44:37 -08003685
3686
Laurence Lundbladeb3683da2020-08-02 17:44:54 -07003687 QCBORDecode_Init(&DC,
3688 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spExpectedExponentsAndMantissas),
3689 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade59289e52019-12-30 13:44:37 -08003690
Laurence Lundbladeb3683da2020-08-02 17:44:54 -07003691 uErr = QCBORDecode_GetNext(&DC, &item);
3692 if(uErr != QCBOR_SUCCESS) {
Laurence Lundblade59289e52019-12-30 13:44:37 -08003693 return 1;
3694 }
3695
3696 if(item.uDataType != QCBOR_TYPE_ARRAY) {
3697 return 2;
3698 }
3699
Laurence Lundbladeb3683da2020-08-02 17:44:54 -07003700 uErr = QCBORDecode_GetNext(&DC, &item);
3701 if(uErr != QCBOR_SUCCESS) {
Laurence Lundblade59289e52019-12-30 13:44:37 -08003702 return 3;
3703 }
3704
3705 if(item.uDataType != QCBOR_TYPE_DECIMAL_FRACTION ||
3706 item.val.expAndMantissa.Mantissa.nInt != 3 ||
3707 item.val.expAndMantissa.nExponent != -1) {
3708 return 4;
3709 }
3710
Laurence Lundbladeb3683da2020-08-02 17:44:54 -07003711 uErr = QCBORDecode_GetNext(&DC, &item);
3712 if(uErr != QCBOR_SUCCESS) {
Laurence Lundblade59289e52019-12-30 13:44:37 -08003713 return 5;
3714 }
3715
3716 if(item.uDataType != QCBOR_TYPE_DECIMAL_FRACTION_POS_BIGNUM ||
3717 item.val.expAndMantissa.nExponent != -20 ||
3718 UsefulBuf_Compare(item.val.expAndMantissa.Mantissa.bigNum, BN)) {
3719 return 6;
3720 }
3721
Laurence Lundbladeb3683da2020-08-02 17:44:54 -07003722 uErr = QCBORDecode_GetNext(&DC, &item);
3723 if(uErr != QCBOR_SUCCESS) {
Laurence Lundblade59289e52019-12-30 13:44:37 -08003724 return 7;
3725 }
3726
3727 if(item.uDataType != QCBOR_TYPE_DECIMAL_FRACTION_NEG_BIGNUM ||
3728 item.val.expAndMantissa.nExponent != 9223372036854775807 ||
3729 UsefulBuf_Compare(item.val.expAndMantissa.Mantissa.bigNum, BN)) {
3730 return 8;
3731 }
3732
Laurence Lundbladeb3683da2020-08-02 17:44:54 -07003733 uErr = QCBORDecode_GetNext(&DC, &item);
3734 if(uErr != QCBOR_SUCCESS) {
Laurence Lundblade59289e52019-12-30 13:44:37 -08003735 return 9;
3736 }
3737
3738 if(item.uDataType != QCBOR_TYPE_BIGFLOAT ||
3739 item.val.expAndMantissa.Mantissa.nInt != 100 ||
3740 item.val.expAndMantissa.nExponent != 300) {
3741 return 10;
3742 }
3743
Laurence Lundbladea826c502020-05-10 21:07:00 -07003744 // 5([-20, 4759477275222530853136]),
Laurence Lundbladeb3683da2020-08-02 17:44:54 -07003745 uErr = QCBORDecode_GetNext(&DC, &item);
3746 if(uErr != QCBOR_SUCCESS) {
Laurence Lundblade59289e52019-12-30 13:44:37 -08003747 return 11;
3748 }
Laurence Lundblade59289e52019-12-30 13:44:37 -08003749 if(item.uDataType != QCBOR_TYPE_BIGFLOAT_POS_BIGNUM ||
3750 item.val.expAndMantissa.nExponent != -20 ||
3751 UsefulBuf_Compare(item.val.expAndMantissa.Mantissa.bigNum, BN)) {
3752 return 12;
3753 }
3754
Laurence Lundbladea826c502020-05-10 21:07:00 -07003755 // 5([-9223372036854775807, -4759477275222530853137])
Laurence Lundbladeb3683da2020-08-02 17:44:54 -07003756 uErr = QCBORDecode_GetNext(&DC, &item);
3757 if(uErr != QCBOR_SUCCESS) {
Laurence Lundblade59289e52019-12-30 13:44:37 -08003758 return 13;
3759 }
Laurence Lundblade59289e52019-12-30 13:44:37 -08003760 if(item.uDataType != QCBOR_TYPE_BIGFLOAT_NEG_BIGNUM ||
3761 item.val.expAndMantissa.nExponent != -9223372036854775807 ||
3762 UsefulBuf_Compare(item.val.expAndMantissa.Mantissa.bigNum, BN)) {
3763 return 14;
3764 }
3765
Laurence Lundbladea826c502020-05-10 21:07:00 -07003766 // 5([ 9223372036854775806, -4759477275222530853137])
Laurence Lundbladeb3683da2020-08-02 17:44:54 -07003767 uErr = QCBORDecode_GetNext(&DC, &item);
3768 if(uErr != QCBOR_SUCCESS) {
3769 return 15;
Laurence Lundbladea826c502020-05-10 21:07:00 -07003770 }
3771 if(item.uDataType != QCBOR_TYPE_BIGFLOAT_NEG_BIGNUM ||
3772 item.val.expAndMantissa.nExponent != 9223372036854775806 ||
3773 UsefulBuf_Compare(item.val.expAndMantissa.Mantissa.bigNum, BN)) {
Laurence Lundbladeb3683da2020-08-02 17:44:54 -07003774 return 16;
Laurence Lundbladea826c502020-05-10 21:07:00 -07003775 }
3776
Laurence Lundbladea826c502020-05-10 21:07:00 -07003777 // 5([ 9223372036854775806, 9223372036854775806])]
Laurence Lundbladeb3683da2020-08-02 17:44:54 -07003778 uErr = QCBORDecode_GetNext(&DC, &item);
3779 if(uErr != QCBOR_SUCCESS) {
3780 return 17;
Laurence Lundblade59289e52019-12-30 13:44:37 -08003781 }
Laurence Lundblade59289e52019-12-30 13:44:37 -08003782 if(item.uDataType != QCBOR_TYPE_BIGFLOAT ||
3783 item.val.expAndMantissa.nExponent != 9223372036854775806 ||
3784 item.val.expAndMantissa.Mantissa.nInt!= 9223372036854775806 ) {
Laurence Lundbladeb3683da2020-08-02 17:44:54 -07003785 return 18;
3786 }
3787
3788 uErr = QCBORDecode_Finish(&DC);
3789 if(uErr != QCBOR_SUCCESS) {
3790 return 18;
Laurence Lundblade59289e52019-12-30 13:44:37 -08003791 }
3792
3793 /* Now encode some stuff and then decode it */
3794 uint8_t pBuf[40];
3795 QCBOREncodeContext EC;
3796 UsefulBufC Encoded;
3797
3798 QCBOREncode_Init(&EC, UsefulBuf_FROM_BYTE_ARRAY(pBuf));
3799 QCBOREncode_OpenArray(&EC);
3800 QCBOREncode_AddDecimalFraction(&EC, 999, 1000); // 999 * (10 ^ 1000)
3801 QCBOREncode_AddBigFloat(&EC, 100, INT32_MIN);
3802 QCBOREncode_AddDecimalFractionBigNum(&EC, BN, false, INT32_MAX);
3803 QCBOREncode_CloseArray(&EC);
3804 QCBOREncode_Finish(&EC, &Encoded);
3805
3806
3807 QCBORDecode_Init(&DC, Encoded, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladeb3683da2020-08-02 17:44:54 -07003808 uErr = QCBORDecode_GetNext(&DC, &item);
3809 if(uErr != QCBOR_SUCCESS) {
3810 return 100;
Laurence Lundblade59289e52019-12-30 13:44:37 -08003811 }
3812
Laurence Lundbladeb3683da2020-08-02 17:44:54 -07003813 uErr = QCBORDecode_GetNext(&DC, &item);
3814 if(uErr != QCBOR_SUCCESS) {
3815 return 101;
Laurence Lundblade59289e52019-12-30 13:44:37 -08003816 }
3817
3818 if(item.uDataType != QCBOR_TYPE_DECIMAL_FRACTION ||
3819 item.val.expAndMantissa.nExponent != 1000 ||
3820 item.val.expAndMantissa.Mantissa.nInt != 999) {
Laurence Lundbladeb3683da2020-08-02 17:44:54 -07003821 return 102;
Laurence Lundblade59289e52019-12-30 13:44:37 -08003822 }
3823
Laurence Lundbladeb3683da2020-08-02 17:44:54 -07003824 uErr = QCBORDecode_GetNext(&DC, &item);
3825 if(uErr != QCBOR_SUCCESS) {
3826 return 103;
Laurence Lundblade59289e52019-12-30 13:44:37 -08003827 }
3828
3829 if(item.uDataType != QCBOR_TYPE_BIGFLOAT ||
3830 item.val.expAndMantissa.nExponent != INT32_MIN ||
3831 item.val.expAndMantissa.Mantissa.nInt != 100) {
Laurence Lundbladeb3683da2020-08-02 17:44:54 -07003832 return 104;
Laurence Lundblade59289e52019-12-30 13:44:37 -08003833 }
3834
Laurence Lundbladeb3683da2020-08-02 17:44:54 -07003835 uErr = QCBORDecode_GetNext(&DC, &item);
3836 if(uErr != QCBOR_SUCCESS) {
3837 return 105;
Laurence Lundblade59289e52019-12-30 13:44:37 -08003838 }
3839
3840 if(item.uDataType != QCBOR_TYPE_DECIMAL_FRACTION_POS_BIGNUM ||
3841 item.val.expAndMantissa.nExponent != INT32_MAX ||
3842 UsefulBuf_Compare(item.val.expAndMantissa.Mantissa.bigNum, BN)) {
Laurence Lundbladeb3683da2020-08-02 17:44:54 -07003843 return 106;
3844 }
3845
3846
3847 int64_t nExp, nMant;
3848 UsefulBuf_MAKE_STACK_UB( MantBuf, 20);
3849 UsefulBufC Mant;
3850 bool bIsNeg;
3851
3852 QCBORDecode_Init(&DC,
3853 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spExpectedExponentsAndMantissas),
3854 QCBOR_DECODE_MODE_NORMAL);
3855 QCBORDecode_EnterArray(&DC);
3856
3857 // 4([-1, 3]),
3858 QCBORDecode_GetDecimalFraction(&DC, QCBOR_TAG_REQUIREMENT_MATCH_TAG, &nExp, &nMant);
3859
3860 // 4([-20, 4759477275222530853136]),
3861 QCBORDecode_GetDecimalFractionBig(&DC, QCBOR_TAG_REQUIREMENT_MATCH_TAG, MantBuf, &Mant, &bIsNeg, &nExp);
3862
3863 // 4([9223372036854775807, -4759477275222530853137]),
3864 QCBORDecode_GetDecimalFractionBig(&DC, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG, MantBuf, &Mant, &bIsNeg, &nExp);
3865
3866 // 5([300, 100]),
3867 QCBORDecode_GetBigFloat(&DC, QCBOR_TAG_REQUIREMENT_MATCH_TAG, &nExp, &nMant);
3868
3869 // 5([-20, 4759477275222530853136]),
3870 QCBORDecode_GetBigFloatBig(&DC, QCBOR_TAG_REQUIREMENT_MATCH_TAG, MantBuf, &Mant, &bIsNeg, &nExp);
3871
3872 // 5([-9223372036854775807, -4759477275222530853137])
3873 QCBORDecode_GetBigFloatBig(&DC, QCBOR_TAG_REQUIREMENT_MATCH_TAG, MantBuf, &Mant, &bIsNeg, &nExp);
3874
3875 // 5([ 9223372036854775806, -4759477275222530853137])
3876 QCBORDecode_GetBigFloatBig(&DC, QCBOR_TAG_REQUIREMENT_MATCH_TAG, MantBuf, &Mant, &bIsNeg, &nExp);
3877
3878 // 5([ 9223372036854775806, 9223372036854775806])]
3879 QCBORDecode_GetBigFloatBig(&DC, QCBOR_TAG_REQUIREMENT_MATCH_TAG, MantBuf, &Mant, &bIsNeg, &nExp);
3880
3881 QCBORDecode_ExitArray(&DC);
3882
3883 uErr = QCBORDecode_Finish(&DC);
3884 if(uErr != QCBOR_SUCCESS) {
3885 return 200;
Laurence Lundblade59289e52019-12-30 13:44:37 -08003886 }
3887
3888 return 0;
3889}
3890
3891
3892static struct FailInput ExponentAndMantissaFailures[] = {
3893 // Exponent > INT64_MAX
3894 { {(uint8_t[]){0xC4, 0x82, 0x1B, 0x7f, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
3895 0xFF, 0xFF, 0x1B, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
3896 0xFF, 0xFF,}, 20}, QCBOR_ERR_BAD_EXP_AND_MANTISSA},
3897 // Mantissa > INT64_MAX
3898 { {(uint8_t[]){0xC4, 0x82, 0x1B, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
3899 0xFF, 0xFF, 0xC3, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05,
3900 0x06, 0x07, 0x08, 0x09, 0x10}, 23}, QCBOR_ERR_BAD_EXP_AND_MANTISSA},
3901 // End of input
Laurence Lundbladee6f15112020-07-23 18:44:16 -07003902 { {(uint8_t[]){0xC4, 0x82}, 2}, QCBOR_ERR_NO_MORE_ITEMS},
Laurence Lundblade59289e52019-12-30 13:44:37 -08003903 // End of input
Laurence Lundbladee6f15112020-07-23 18:44:16 -07003904 { {(uint8_t[]){0xC4, 0x82, 0x01}, 3}, QCBOR_ERR_NO_MORE_ITEMS},
Laurence Lundblade59289e52019-12-30 13:44:37 -08003905 // bad content for big num
3906 { {(uint8_t[]){0xC4, 0x82, 0x01, 0xc3, 0x01}, 5}, QCBOR_ERR_BAD_OPT_TAG},
3907 // bad content for big num
3908 { {(uint8_t[]){0xC4, 0x82, 0xc2, 0x01, 0x1f}, 5}, QCBOR_ERR_BAD_INT},
3909 // Bad integer for exponent
3910 { {(uint8_t[]){0xC4, 0x82, 0x01, 0x1f}, 4}, QCBOR_ERR_BAD_INT},
3911 // Bad integer for mantissa
3912 { {(uint8_t[]){0xC4, 0x82, 0x1f, 0x01}, 4}, QCBOR_ERR_BAD_INT},
3913 // 3 items in array
3914 { {(uint8_t[]){0xC4, 0x83, 0x03, 0x01, 02}, 5}, QCBOR_ERR_BAD_EXP_AND_MANTISSA},
3915 // unterminated indefinite length array
3916 { {(uint8_t[]){0xC4, 0x9f, 0x03, 0x01, 0x02}, 5}, QCBOR_ERR_BAD_EXP_AND_MANTISSA},
3917 // Empty array
3918 { {(uint8_t[]){0xC4, 0x80}, 2}, QCBOR_ERR_NO_MORE_ITEMS},
3919 // Second is not an integer
3920 { {(uint8_t[]){0xC4, 0x82, 0x03, 0x40}, 4}, QCBOR_ERR_BAD_EXP_AND_MANTISSA},
3921 // First is not an integer
3922 { {(uint8_t[]){0xC4, 0x82, 0x40}, 3}, QCBOR_ERR_BAD_EXP_AND_MANTISSA},
3923 // Not an array
3924 { {(uint8_t[]){0xC4, 0xa2}, 2}, QCBOR_ERR_BAD_EXP_AND_MANTISSA}
3925};
3926
3927
Laurence Lundbladec5fef682020-01-25 11:38:45 -08003928int32_t ExponentAndMantissaDecodeFailTests()
Laurence Lundblade59289e52019-12-30 13:44:37 -08003929{
3930 return ProcessFailures(ExponentAndMantissaFailures,
3931 sizeof(ExponentAndMantissaFailures)/sizeof(struct FailInput));
3932}
3933
3934#endif /* QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA */
Laurence Lundbladebb87be22020-04-09 19:15:32 -07003935
3936
3937
3938/*
3939 Some basic CBOR with map and array used in a lot of tests.
3940 The map labels are all strings
3941
Laurence Lundblade8ffdb742020-05-07 02:49:18 -07003942 {
3943 "first integer": 42,
Laurence Lundbladebb87be22020-04-09 19:15:32 -07003944 "an array of two strings": [
3945 "string1", "string2"
3946 ],
3947 "map in a map": {
3948 "bytes 1": h'78787878',
3949 "bytes 2": h'79797979',
3950 "another int": 98,
3951 "text 2": "lies, damn lies and statistics"
3952 }
3953 }
3954 */
3955
Laurence Lundblade1341c592020-04-11 14:19:05 -07003956#include <stdio.h>
Laurence Lundbladebb87be22020-04-09 19:15:32 -07003957
Laurence Lundblade9c905e82020-04-25 11:31:38 -07003958static char strbuf[10];
3959const char *PrintType(uint8_t type) {
3960 switch(type) {
3961 case QCBOR_TYPE_INT64: return "INT64";
3962 case QCBOR_TYPE_UINT64: return "UINT64";
3963 case QCBOR_TYPE_ARRAY: return "ARRAY";
3964 case QCBOR_TYPE_MAP: return "MAP";
3965 case QCBOR_TYPE_BYTE_STRING: return "BYTE_STRING";
3966 case QCBOR_TYPE_TEXT_STRING: return "TEXT_STRING";
3967 default:
3968 sprintf(strbuf, "%d", type);
3969 return strbuf;
3970 }
3971}
3972
3973
3974void PrintItem(QCBORItem Item)
3975{
3976 printf("\nData: %s nest: %d,%d %s\n", PrintType(Item.uDataType), Item.uNestingLevel, Item.uNextNestLevel, Item.uDataAlloc ? "Allocated":"");
3977 if(Item.uLabelType) {
3978 printf("Label: %s ", PrintType(Item.uLabelType));
3979 if(Item.uLabelType == QCBOR_TYPE_INT64) {
3980 printf("%lld\n", Item.label.int64);
3981 } else if(Item.uLabelType == QCBOR_TYPE_TEXT_STRING) {
Laurence Lundblade40a04322020-06-27 22:52:52 -07003982 // TODO: proper conversion to null-terminated string
3983 printf("\"%4.4s\"\n", (const char *)Item.label.string.ptr);
Laurence Lundblade9c905e82020-04-25 11:31:38 -07003984 }
3985 }
3986}
3987
Laurence Lundblade8ffdb742020-05-07 02:49:18 -07003988
Laurence Lundblade2c1faf92020-06-26 22:43:56 -07003989int32_t EMap(UsefulBufC input)
3990{
3991 QCBORItem Item1, Item2, Item3;
3992 int64_t nDecodedInt1, nDecodedInt2;
3993 UsefulBufC B1, B2, S1, S2, S3;
3994
3995 QCBORDecodeContext DCtx;
3996 QCBORError nCBORError;
3997
3998 QCBORDecode_Init(&DCtx, input, 0);
3999
4000 QCBORDecode_EnterMap(&DCtx);
4001
4002 QCBORDecode_GetInt64InMapSZ(&DCtx, "first integer", &nDecodedInt1);
4003
4004 QCBORDecode_EnterMapFromMapSZ(&DCtx, "map in a map");
4005 QCBORDecode_GetInt64InMapSZ(&DCtx, "another int", &nDecodedInt2);
4006 QCBORDecode_GetBytesInMapSZ(&DCtx, "bytes 1", &B1);
4007 QCBORDecode_GetBytesInMapSZ(&DCtx, "bytes 2", &B2);
4008 QCBORDecode_GetTextInMapSZ(&DCtx, "text 2", &S1);
4009 QCBORDecode_ExitMap(&DCtx);
4010
4011 QCBORDecode_EnterArrayFromMapSZ(&DCtx, "an array of two strings");
4012 QCBORDecode_GetNext(&DCtx, &Item1);
4013 QCBORDecode_GetNext(&DCtx, &Item2);
4014 if(QCBORDecode_GetNext(&DCtx, &Item3) != QCBOR_ERR_NO_MORE_ITEMS) {
4015 return -400;
4016 }
4017 QCBORDecode_ExitArray(&DCtx);
4018
4019 // Parse the same array again using GetText() instead of GetItem()
4020 QCBORDecode_EnterArrayFromMapSZ(&DCtx, "an array of two strings");
4021 QCBORDecode_GetText(&DCtx, &S2);
4022 QCBORDecode_GetText(&DCtx, &S3);
4023 if(QCBORDecode_GetError(&DCtx) != QCBOR_SUCCESS) {
4024 return 5000;
4025 }
4026 /* QCBORDecode_GetText(&DCtx, &S3);
4027 if(QCBORDecode_GetAndResetError(&DCtx) != QCBOR_ERR_NO_MORE_ITEMS) {
4028 return 5001;
4029 } */
4030
4031 QCBORDecode_ExitArray(&DCtx);
4032
4033 QCBORDecode_ExitMap(&DCtx);
4034
4035 nCBORError = QCBORDecode_Finish(&DCtx);
4036
4037 if(nCBORError) {
4038 return (int32_t)nCBORError;
4039 }
4040
4041 if(nDecodedInt1 != 42) {
4042 return 1001;
4043 }
4044
4045 if(nDecodedInt2 != 98) {
4046 return 1002;
4047 }
4048
4049 if(Item1.uDataType != QCBOR_TYPE_TEXT_STRING ||
4050 UsefulBuf_Compare(Item1.val.string, UsefulBuf_FromSZ("string1"))){
4051 return 1003;
4052 }
4053
4054 if(Item1.uDataType != QCBOR_TYPE_TEXT_STRING ||
4055 UsefulBuf_Compare(Item2.val.string, UsefulBuf_FromSZ("string2"))){
4056 return 1004;
4057 }
4058
4059 if(UsefulBuf_Compare(S1, UsefulBuf_FromSZ("lies, damn lies and statistics"))){
4060 return 1005;
4061 }
4062
4063 if(UsefulBuf_Compare(B1, UsefulBuf_FromSZ("xxxx"))){
4064 return 1006;
4065 }
4066
4067 if(UsefulBuf_Compare(B2, UsefulBuf_FromSZ("yyyy"))){
4068 return 1007;
4069 }
4070
4071 if(UsefulBuf_Compare(S2, UsefulBuf_FromSZ("string1"))){
4072 return 1008;
4073 }
4074
4075 if(UsefulBuf_Compare(S3, UsefulBuf_FromSZ("string2"))){
4076 return 1009;
4077 }
4078
4079 return 0;
4080}
4081
Laurence Lundbladeabf5c572020-06-29 21:21:29 -07004082
4083/*
4084 [23,
4085 6000,
4086 h'67616C6163746963',
4087 h'686176656E20746F6B656E'
4088 ]
4089 */
4090static const uint8_t spSimpleArray[] = {
40910x84, 0x17, 0x19, 0x17, 0x70, 0x48, 0x67, 0x61, 0x6C, 0x61, 0x63, 0x74, 0x69, 0x63, 0x4B, 0x68, 0x61, 0x76, 0x65, 0x6E, 0x20, 0x74, 0x6F, 0x6B, 0x65, 0x6E};
4092
4093
Laurence Lundbladee6f15112020-07-23 18:44:16 -07004094static const uint8_t spEmptyMap[] = {0xa0};
4095
4096static const uint8_t spEmptyInDefinteLengthMap[] = {0xbf, 0xff};
Laurence Lundbladeabf5c572020-06-29 21:21:29 -07004097
Laurence Lundblade5f4e8712020-07-25 11:44:43 -07004098static const uint8_t spArrayOfEmpty[] = {0x84, 0x40, 0xa0, 0x80, 0x00};
4099
Laurence Lundbladef0499502020-08-01 11:55:57 -07004100/*
4101 {
4102 0: [],
4103 9: [
4104 [],
4105 []
4106 ],
4107 8: {
4108 1: [],
4109 2: {},
4110 3: []
4111 },
4112 4: {},
4113 5: [],
4114 6: [
4115 [],
4116 []
4117 ]
Laurence Lundblade44080632020-08-06 21:43:50 -07004118 }
Laurence Lundbladef0499502020-08-01 11:55:57 -07004119 */
Laurence Lundblade44080632020-08-06 21:43:50 -07004120
4121
Laurence Lundbladef0499502020-08-01 11:55:57 -07004122static const uint8_t spMapOfEmpty[] = {
4123 0xa6, 0x00, 0x80, 0x09, 0x82, 0x80, 0x80, 0x08, 0xa3, 0x01,
4124 0x80, 0x02, 0xa0, 0x03, 0x80, 0x04, 0xa0, 0x05, 0x9f, 0xff,
4125 0x06, 0x9f, 0x80, 0x9f, 0xff, 0xff};
Laurence Lundblade2cd4b0d2020-07-31 08:29:07 -07004126
Laurence Lundbladebb87be22020-04-09 19:15:32 -07004127int32_t EnterMapTest()
4128{
Laurence Lundbladef0499502020-08-01 11:55:57 -07004129 QCBORItem Item1;
Laurence Lundbladebb87be22020-04-09 19:15:32 -07004130 QCBORDecodeContext DCtx;
Laurence Lundbladef0499502020-08-01 11:55:57 -07004131 int32_t nReturn;
4132 QCBORError uErr;
Laurence Lundblade2cd4b0d2020-07-31 08:29:07 -07004133
4134
4135 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spMapOfEmpty), 0);
4136 QCBORDecode_EnterMap(&DCtx);
4137
Laurence Lundbladef0499502020-08-01 11:55:57 -07004138
4139 QCBORDecode_EnterArray(&DCtx); // Label 0
Laurence Lundblade2cd4b0d2020-07-31 08:29:07 -07004140 QCBORDecode_ExitArray(&DCtx);
4141
Laurence Lundbladef0499502020-08-01 11:55:57 -07004142 QCBORDecode_EnterArray(&DCtx); // Label 9
Laurence Lundblade2cd4b0d2020-07-31 08:29:07 -07004143 QCBORDecode_EnterArray(&DCtx);
4144 QCBORDecode_ExitArray(&DCtx);
4145 QCBORDecode_EnterArray(&DCtx);
4146 QCBORDecode_ExitArray(&DCtx);
4147 QCBORDecode_ExitArray(&DCtx);
4148
Laurence Lundbladef0499502020-08-01 11:55:57 -07004149 QCBORDecode_EnterMap(&DCtx); // Label 8
Laurence Lundblade2cd4b0d2020-07-31 08:29:07 -07004150 QCBORDecode_EnterArray(&DCtx);
4151 QCBORDecode_ExitArray(&DCtx);
4152 QCBORDecode_EnterMap(&DCtx);
4153 QCBORDecode_ExitMap(&DCtx);
4154 QCBORDecode_EnterArray(&DCtx);
4155 QCBORDecode_ExitArray(&DCtx);
4156 QCBORDecode_ExitMap(&DCtx);
4157
Laurence Lundbladef0499502020-08-01 11:55:57 -07004158 QCBORDecode_EnterMap(&DCtx); // Label4
Laurence Lundblade2cd4b0d2020-07-31 08:29:07 -07004159 QCBORDecode_ExitMap(&DCtx);
4160
Laurence Lundbladef0499502020-08-01 11:55:57 -07004161 QCBORDecode_EnterArray(&DCtx); // Label 5
Laurence Lundblade2cd4b0d2020-07-31 08:29:07 -07004162 QCBORDecode_ExitArray(&DCtx);
4163
Laurence Lundbladef0499502020-08-01 11:55:57 -07004164 QCBORDecode_EnterArray(&DCtx); // Label 6
Laurence Lundblade2cd4b0d2020-07-31 08:29:07 -07004165 QCBORDecode_EnterArray(&DCtx);
4166 QCBORDecode_ExitArray(&DCtx);
4167 QCBORDecode_EnterArray(&DCtx);
4168 QCBORDecode_ExitArray(&DCtx);
4169 QCBORDecode_ExitArray(&DCtx);
4170
4171 QCBORDecode_ExitMap(&DCtx);
4172
4173 uErr = QCBORDecode_Finish(&DCtx);
4174 if(uErr != QCBOR_SUCCESS){
4175 return 3011;
4176 }
4177
4178
Laurence Lundblade2c1faf92020-06-26 22:43:56 -07004179 (void)pValidMapIndefEncoded;
Laurence Lundbladee6f15112020-07-23 18:44:16 -07004180 nReturn = EMap(UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapIndefEncoded));
Laurence Lundblade2c1faf92020-06-26 22:43:56 -07004181 if(nReturn) {
4182 return nReturn + 20000;
Laurence Lundbladebb87be22020-04-09 19:15:32 -07004183 }
4184
Laurence Lundbladee6f15112020-07-23 18:44:16 -07004185 nReturn = EMap(UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapEncoded));
Laurence Lundblade2c1faf92020-06-26 22:43:56 -07004186 if(nReturn) {
4187 return nReturn;
4188 }
Laurence Lundbladebb87be22020-04-09 19:15:32 -07004189
Laurence Lundblade8ffdb742020-05-07 02:49:18 -07004190
Laurence Lundblade937ea812020-05-08 11:38:23 -07004191
4192 // These tests confirm the cursor is at the right place after entering a map or array
4193
4194 // Confirm cursor is at right place
4195 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapEncoded), 0);
4196 QCBORDecode_EnterMap(&DCtx);
4197 QCBORDecode_GetNext(&DCtx, &Item1);
4198 if(Item1.uDataType != QCBOR_TYPE_INT64) {
4199 return 2001;
4200 }
4201
4202
4203 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapEncoded), 0);
4204 QCBORDecode_GetNext(&DCtx, &Item1);
4205 QCBORDecode_GetNext(&DCtx, &Item1);
4206 QCBORDecode_EnterArray(&DCtx);
4207 QCBORDecode_GetNext(&DCtx, &Item1);
4208 if(Item1.uDataType != QCBOR_TYPE_TEXT_STRING) {
4209 return 2002;
4210 }
4211
4212 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapEncoded), 0);
4213 QCBORDecode_EnterMap(&DCtx);
Laurence Lundblade64b607e2020-05-13 13:05:57 -07004214 QCBORDecode_GetNext(&DCtx, &Item1);
4215 QCBORDecode_GetNext(&DCtx, &Item1);
4216 QCBORDecode_GetNext(&DCtx, &Item1);
Laurence Lundblade937ea812020-05-08 11:38:23 -07004217 QCBORDecode_EnterMapFromMapSZ(&DCtx, "map in a map");
4218 QCBORDecode_GetNext(&DCtx, &Item1);
4219 if(Item1.uDataType != QCBOR_TYPE_BYTE_STRING) {
4220 return 2003;
4221 }
4222
4223 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapEncoded), 0);
4224 QCBORDecode_EnterMap(&DCtx);
4225 QCBORDecode_GetNext(&DCtx, &Item1);
4226 QCBORDecode_GetNext(&DCtx, &Item1);
4227 QCBORDecode_GetNext(&DCtx, &Item1);
4228 QCBORDecode_GetNext(&DCtx, &Item1);
4229 QCBORDecode_GetNext(&DCtx, &Item1);
4230 QCBORDecode_GetNext(&DCtx, &Item1);
4231 QCBORDecode_GetNext(&DCtx, &Item1);
4232 QCBORDecode_EnterArrayFromMapSZ(&DCtx, "an array of two strings");
4233 QCBORDecode_GetNext(&DCtx, &Item1);
4234 if(Item1.uDataType != QCBOR_TYPE_TEXT_STRING) {
Laurence Lundblade64b607e2020-05-13 13:05:57 -07004235 return 2004;
Laurence Lundblade937ea812020-05-08 11:38:23 -07004236 }
4237
Laurence Lundblade2b843b52020-06-16 20:51:03 -07004238 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pValidMapEncoded), 0);
4239 QCBORDecode_EnterMap(&DCtx);
4240 QCBORDecode_EnterArrayFromMapSZ(&DCtx, "an array of two strings");
4241 QCBORDecode_ExitArray(&DCtx);
4242 QCBORDecode_GetNext(&DCtx, &Item1);
4243 if(Item1.uDataType != QCBOR_TYPE_MAP && Item1.uLabelAlloc != QCBOR_TYPE_TEXT_STRING) {
4244 return 2006;
4245 }
4246 QCBORDecode_ExitMap(&DCtx);
4247 if(QCBORDecode_GetNext(&DCtx, &Item1) != QCBOR_ERR_NO_MORE_ITEMS) {
4248 return 2007;
4249 }
4250
Laurence Lundbladeabf5c572020-06-29 21:21:29 -07004251 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spSimpleArray), 0);
4252 QCBORDecode_EnterArray(&DCtx);
4253 int64_t nDecodedInt2;
Laurence Lundblade2cd4b0d2020-07-31 08:29:07 -07004254 QCBORDecode_GetInt64InMapSZ(&DCtx, "another int", &nDecodedInt2);
4255 uErr = QCBORDecode_GetAndResetError(&DCtx);
4256 if(uErr != QCBOR_ERR_MAP_NOT_ENTERED){
Laurence Lundbladeabf5c572020-06-29 21:21:29 -07004257 return 2008;
4258 }
4259 UsefulBufC String;
4260 QCBORDecode_GetTextInMapN(&DCtx, 88, &String);
Laurence Lundblade2cd4b0d2020-07-31 08:29:07 -07004261 if(uErr != QCBOR_ERR_MAP_NOT_ENTERED){
Laurence Lundbladeabf5c572020-06-29 21:21:29 -07004262 return 2009;
4263 }
Laurence Lundblade937ea812020-05-08 11:38:23 -07004264
Laurence Lundbladee6f15112020-07-23 18:44:16 -07004265
4266 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spEmptyMap), 0);
4267 QCBORDecode_EnterMap(&DCtx);
4268 // This will fail because the map is empty.
4269 QCBORDecode_GetInt64InMapSZ(&DCtx, "another int", &nDecodedInt2);
4270 uErr = QCBORDecode_GetAndResetError(&DCtx);
4271 if(uErr != QCBOR_ERR_NOT_FOUND){
4272 return 2010;
4273 }
4274 QCBORDecode_ExitMap(&DCtx);
4275 uErr = QCBORDecode_Finish(&DCtx);
4276 if(uErr != QCBOR_SUCCESS){
4277 return 2011;
4278 }
4279
4280
Laurence Lundbladee6f15112020-07-23 18:44:16 -07004281 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spEmptyInDefinteLengthMap), 0);
4282 QCBORDecode_EnterMap(&DCtx);
4283 // This will fail because the map is empty.
4284 QCBORDecode_GetInt64InMapSZ(&DCtx, "another int", &nDecodedInt2);
4285 uErr = QCBORDecode_GetAndResetError(&DCtx);
4286 if(uErr != QCBOR_ERR_NOT_FOUND){
Laurence Lundblade085d7952020-07-24 10:26:30 -07004287 return 2012;
Laurence Lundbladee6f15112020-07-23 18:44:16 -07004288 }
4289 QCBORDecode_ExitMap(&DCtx);
4290 uErr = QCBORDecode_Finish(&DCtx);
4291 if(uErr != QCBOR_SUCCESS){
Laurence Lundblade085d7952020-07-24 10:26:30 -07004292 return 2013;
Laurence Lundbladee6f15112020-07-23 18:44:16 -07004293 }
4294
Laurence Lundblade5f4e8712020-07-25 11:44:43 -07004295
4296 QCBORDecode_Init(&DCtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spArrayOfEmpty), 0);
4297 QCBORDecode_EnterArray(&DCtx);
4298 QCBORDecode_GetBytes(&DCtx, &String);
4299 QCBORDecode_EnterMap(&DCtx);
4300 QCBORDecode_ExitMap(&DCtx);
4301 QCBORDecode_EnterArray(&DCtx);
4302 QCBORDecode_ExitArray(&DCtx);
4303 QCBORDecode_GetInt64(&DCtx, &nDecodedInt2);
4304 QCBORDecode_ExitArray(&DCtx);
4305 uErr = QCBORDecode_Finish(&DCtx);
4306 if(uErr != QCBOR_SUCCESS){
4307 return 2014;
4308 }
4309
Laurence Lundblade9bb039a2020-08-05 12:25:15 -07004310 // TODO: more testing of entered mapps and arrays with problems
4311 // TODO: document error handling better (maybe improve error handling)
4312
Laurence Lundbladee6f15112020-07-23 18:44:16 -07004313 return 0;
Laurence Lundblade9c905e82020-04-25 11:31:38 -07004314}
4315
4316
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004317struct NumberConversion {
4318 char *szDescription;
4319 UsefulBufC CBOR;
4320 int64_t nConvertedToInt64;
4321 QCBORError uErrorInt64;
4322 uint64_t uConvertToUInt64;
4323 QCBORError uErrorUint64;
4324 double dConvertToDouble;
4325 QCBORError uErrorDouble;
4326};
4327
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004328static const struct NumberConversion NumberConversions[] = {
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004329 {
Laurence Lundbladeda095972020-06-06 18:35:33 -07004330 "negative bignum -1",
4331 {(uint8_t[]){0xc3, 0x41, 0x00}, 3},
4332 -1,
4333 QCBOR_SUCCESS,
4334 0,
4335 QCBOR_ERR_NUMBER_SIGN_CONVERSION,
4336 -1.0,
4337 QCBOR_SUCCESS
4338 },
4339 {
Laurence Lundblade9ab5abb2020-05-20 12:10:45 -07004340 "Decimal Fraction with positive bignum 257 * 10e3",
Laurence Lundblade887add82020-05-17 05:50:34 -07004341 {(uint8_t[]){0xC4, 0x82, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
4342 0xC2, 0x42, 0x01, 0x01}, 15},
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07004343#ifndef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA
Laurence Lundblade887add82020-05-17 05:50:34 -07004344 257000,
4345 QCBOR_SUCCESS,
4346 257000,
4347 QCBOR_SUCCESS,
4348 257000.0,
4349 QCBOR_SUCCESS
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07004350#else /* QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA */
4351 0,
4352 QCBOR_ERR_UNEXPECTED_TYPE,
4353 0,
4354 QCBOR_ERR_UNEXPECTED_TYPE,
4355 0.0,
4356 QCBOR_ERR_UNEXPECTED_TYPE
4357#endif /* QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA*/
Laurence Lundblade887add82020-05-17 05:50:34 -07004358 },
4359 {
Laurence Lundbladeda095972020-06-06 18:35:33 -07004360 "bigfloat with negative bignum -258 * 2e3",
Laurence Lundblade887add82020-05-17 05:50:34 -07004361 {(uint8_t[]){0xC5, 0x82, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
4362 0xC3, 0x42, 0x01, 0x01}, 15},
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07004363#ifndef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA
Laurence Lundbladeda095972020-06-06 18:35:33 -07004364 -2064,
Laurence Lundblade887add82020-05-17 05:50:34 -07004365 QCBOR_SUCCESS,
4366 0,
4367 QCBOR_ERR_NUMBER_SIGN_CONVERSION,
Laurence Lundbladeda095972020-06-06 18:35:33 -07004368 -2064.0,
Laurence Lundblade887add82020-05-17 05:50:34 -07004369 QCBOR_SUCCESS
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07004370#else /* QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA */
4371 0,
4372 QCBOR_ERR_UNEXPECTED_TYPE,
4373 0,
4374 QCBOR_ERR_UNEXPECTED_TYPE,
4375 0.0,
4376 QCBOR_ERR_UNEXPECTED_TYPE
4377#endif /* QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA*/
Laurence Lundblade887add82020-05-17 05:50:34 -07004378 },
4379 {
Laurence Lundblade9ab5abb2020-05-20 12:10:45 -07004380 "bigfloat with positive bignum 257 * 2e3",
Laurence Lundblade887add82020-05-17 05:50:34 -07004381 {(uint8_t[]){0xC5, 0x82, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
4382 0xC2, 0x42, 0x01, 0x01}, 15},
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07004383#ifndef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA
Laurence Lundblade887add82020-05-17 05:50:34 -07004384 2056,
4385 QCBOR_SUCCESS,
4386 2056,
4387 QCBOR_SUCCESS,
4388 2056.0,
4389 QCBOR_SUCCESS
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07004390#else /* QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA */
4391 0,
4392 QCBOR_ERR_UNEXPECTED_TYPE,
4393 0,
4394 QCBOR_ERR_UNEXPECTED_TYPE,
4395 0.0,
4396 QCBOR_ERR_UNEXPECTED_TYPE
4397#endif /* QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA*/
Laurence Lundblade887add82020-05-17 05:50:34 -07004398 },
4399 {
Laurence Lundbladeda095972020-06-06 18:35:33 -07004400 "negative bignum 0xc349010000000000000000 -18446744073709551617",
Laurence Lundblade887add82020-05-17 05:50:34 -07004401 {(uint8_t[]){0xc3, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 11},
4402 0,
4403 QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
4404 0,
4405 QCBOR_ERR_NUMBER_SIGN_CONVERSION,
4406 -18446744073709551617.0,
4407 QCBOR_SUCCESS
4408 },
4409 {
Laurence Lundblade313b2862020-05-16 01:23:06 -07004410 "Positive bignum 0x01020304 indefinite length string",
4411 {(uint8_t[]){0xC2, 0x5f, 0x42, 0x01, 0x02, 0x41, 0x03, 0x41, 0x04, 0xff}, 10},
4412 0x01020304,
4413 QCBOR_SUCCESS,
4414 0x01020304,
4415 QCBOR_SUCCESS,
4416 16909060.0,
4417 QCBOR_SUCCESS
4418 },
4419 {
Laurence Lundblade887add82020-05-17 05:50:34 -07004420 "Decimal Fraction with neg bignum [9223372036854775807, -4759477275222530853137]",
Laurence Lundblade313b2862020-05-16 01:23:06 -07004421 {(uint8_t[]){0xC4, 0x82, 0x1B, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
4422 0xC3, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,}, 23},
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07004423#ifndef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA
Laurence Lundblade313b2862020-05-16 01:23:06 -07004424 0,
4425 QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
4426 0,
4427 QCBOR_ERR_NUMBER_SIGN_CONVERSION,
4428 -INFINITY,
4429 QCBOR_SUCCESS
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07004430#else /* QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA */
4431 0,
4432 QCBOR_ERR_UNEXPECTED_TYPE,
4433 0,
4434 QCBOR_ERR_UNEXPECTED_TYPE,
4435 0.0,
4436 QCBOR_ERR_UNEXPECTED_TYPE
4437#endif /* QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA */
Laurence Lundblade313b2862020-05-16 01:23:06 -07004438 },
4439 {
4440 "big float [9223372036854775806, 9223372036854775806]",
4441 {(uint8_t[]){0xC5, 0x82, 0x1B, 0x7f, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
4442 0x1B, 0x7f, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE}, 20},
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07004443#ifndef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA
Laurence Lundblade313b2862020-05-16 01:23:06 -07004444 0,
4445 QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
4446 0,
4447 QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
4448 INFINITY,
4449 QCBOR_SUCCESS
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07004450#else /* QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA */
4451 0,
4452 QCBOR_ERR_UNEXPECTED_TYPE,
4453 0,
4454 QCBOR_ERR_UNEXPECTED_TYPE,
4455 0.0,
4456 QCBOR_ERR_UNEXPECTED_TYPE
4457#endif /* QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA */
Laurence Lundblade313b2862020-05-16 01:23:06 -07004458 },
4459 {
Laurence Lundblade983500d2020-05-14 11:49:34 -07004460 "Big float 3 * 2^^2",
4461 {(uint8_t[]){0xC5, 0x82, 0x02, 0x03}, 4},
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07004462#ifndef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA
Laurence Lundblade983500d2020-05-14 11:49:34 -07004463 12,
4464 QCBOR_SUCCESS,
4465 12,
4466 QCBOR_SUCCESS,
4467 12.0,
4468 QCBOR_SUCCESS
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07004469#else /* QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA */
4470 0,
4471 QCBOR_ERR_UNEXPECTED_TYPE,
4472 0,
4473 QCBOR_ERR_UNEXPECTED_TYPE,
4474 0.0,
4475 QCBOR_ERR_UNEXPECTED_TYPE
4476#endif /* QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA */
Laurence Lundblade983500d2020-05-14 11:49:34 -07004477 },
Laurence Lundblade983500d2020-05-14 11:49:34 -07004478 {
Laurence Lundblade313b2862020-05-16 01:23:06 -07004479 "Positive integer 18446744073709551615",
Laurence Lundblade983500d2020-05-14 11:49:34 -07004480 {(uint8_t[]){0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, 9},
4481 0,
4482 QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
4483 18446744073709551615ULL,
4484 QCBOR_SUCCESS,
4485 18446744073709551615.0,
4486 QCBOR_SUCCESS
4487 },
Laurence Lundblade983500d2020-05-14 11:49:34 -07004488 {
Laurence Lundblade313b2862020-05-16 01:23:06 -07004489 "Positive bignum 0xffff",
Laurence Lundblade983500d2020-05-14 11:49:34 -07004490 {(uint8_t[]){0xC2, 0x42, 0xff, 0xff}, 4},
4491 65536-1,
4492 QCBOR_SUCCESS,
4493 0xffff,
4494 QCBOR_SUCCESS,
4495 65535.0,
4496 QCBOR_SUCCESS
4497 },
4498 {
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004499 "Postive integer 0",
4500 {(uint8_t[]){0x0}, 1},
4501 0LL,
4502 QCBOR_SUCCESS,
4503 0ULL,
4504 QCBOR_SUCCESS,
4505 0.0,
4506 QCBOR_SUCCESS
4507 },
4508 {
Laurence Lundblade313b2862020-05-16 01:23:06 -07004509 "Negative integer -18446744073709551616",
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004510 {(uint8_t[]){0x3b, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, 9},
4511 -9223372036854775807-1, // INT64_MIN
4512 QCBOR_SUCCESS,
4513 0ULL,
4514 QCBOR_ERR_NUMBER_SIGN_CONVERSION,
4515 -9223372036854775808.0,
4516 QCBOR_SUCCESS
4517 },
4518 {
Laurence Lundblade313b2862020-05-16 01:23:06 -07004519 "Double Floating point value 100.3",
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004520 {(uint8_t[]){0xfb, 0x40, 0x59, 0x13, 0x33, 0x33, 0x33, 0x33, 0x33}, 9},
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07004521#ifndef QCBOR_DISABLE_FLOAT_HW_USE
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004522 100L,
4523 QCBOR_SUCCESS,
4524 100ULL,
4525 QCBOR_SUCCESS,
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07004526#else /* QCBOR_DISABLE_FLOAT_HW_USE */
4527 0,
4528 QCBOR_ERR_HW_FLOAT_DISABLED,
4529 0,
4530 QCBOR_ERR_HW_FLOAT_DISABLED,
4531#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004532 100.3,
4533 QCBOR_SUCCESS
4534 },
4535 {
4536 "Floating point value NaN 0xfa7fc00000",
4537 {(uint8_t[]){0xfa, 0x7f, 0xc0, 0x00, 0x00}, 5},
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07004538#ifndef QCBOR_DISABLE_FLOAT_HW_USE
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004539 0,
4540 QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
4541 0,
4542 QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07004543#else /* QCBOR_DISABLE_FLOAT_HW_USE */
4544 0,
4545 QCBOR_ERR_HW_FLOAT_DISABLED,
4546 0,
4547 QCBOR_ERR_HW_FLOAT_DISABLED,
4548#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004549 NAN,
4550 QCBOR_SUCCESS
4551 },
4552 {
Laurence Lundblade313b2862020-05-16 01:23:06 -07004553 "half-precision Floating point value -4",
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004554 {(uint8_t[]){0xf9, 0xc4, 0x00}, 3},
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07004555#ifndef QCBOR_DISABLE_PREFERRED_FLOAT
4556#ifndef QCBOR_DISABLE_FLOAT_HW_USE
4557 // Normal case with all enabled.
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004558 -4,
4559 QCBOR_SUCCESS,
4560 0,
4561 QCBOR_ERR_NUMBER_SIGN_CONVERSION,
4562 -4.0,
4563 QCBOR_SUCCESS
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07004564#else /* QCBOR_DISABLE_FLOAT_HW_USE */
4565 // Float HW disabled
4566 -4,
4567 QCBOR_ERR_HW_FLOAT_DISABLED, // Can't convert to integer
4568 0,
4569 QCBOR_ERR_HW_FLOAT_DISABLED, // Can't convert to integer
4570 -4.0,
4571 QCBOR_SUCCESS // Uses ieee754.h to conver, not HW
4572#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
4573#else
4574 // Half-precision disabled
4575 -4,
4576 QCBOR_ERR_HALF_PRECISION_DISABLED,
4577 0,
4578 QCBOR_ERR_HALF_PRECISION_DISABLED,
4579 -4.0,
4580 QCBOR_ERR_HALF_PRECISION_DISABLED
4581#endif
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004582 },
4583 {
4584 "Decimal fraction 3/10",
4585 {(uint8_t[]){0xC4, 0x82, 0x20, 0x03}, 4},
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07004586#ifndef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004587 0,
4588 QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
4589 0,
4590 QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
4591 0.30000000000000004,
4592 QCBOR_SUCCESS
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07004593#else /* QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA */
4594 0,
4595 QCBOR_ERR_UNEXPECTED_TYPE,
4596 0,
4597 QCBOR_ERR_UNEXPECTED_TYPE,
4598 0.0,
4599 QCBOR_ERR_UNEXPECTED_TYPE
4600#endif /* QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA */
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004601 }
4602};
Laurence Lundblade9c905e82020-04-25 11:31:38 -07004603
4604
4605
Laurence Lundblade313b2862020-05-16 01:23:06 -07004606int32_t IntegerConvertTest()
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004607{
Laurence Lundblade9ab5abb2020-05-20 12:10:45 -07004608 const int nNumTests = sizeof(NumberConversions)/sizeof(struct NumberConversion);
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004609
Laurence Lundblade9ab5abb2020-05-20 12:10:45 -07004610 for(int nIndex = 0; nIndex < nNumTests; nIndex++) {
4611 const struct NumberConversion *pF = &NumberConversions[nIndex];
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004612
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004613 // Set up the decoding context including a memory pool so that
4614 // indefinite length items can be checked
4615 QCBORDecodeContext DCtx;
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004616 UsefulBuf_MAKE_STACK_UB(Pool, 100);
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004617
4618 /* ----- test conversion to int64_t ------ */
4619 QCBORDecode_Init(&DCtx, pF->CBOR, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004620 QCBORError nCBORError = QCBORDecode_SetMemPool(&DCtx, Pool, 0);
4621 if(nCBORError) {
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004622 return (int32_t)(1000+nIndex);
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004623 }
4624
4625 int64_t nInt;
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004626 QCBORDecode_GetInt64ConvertAll(&DCtx, 0xffff, &nInt);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004627 if(QCBORDecode_GetError(&DCtx) != pF->uErrorInt64) {
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004628 return (int32_t)(2000+nIndex);
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004629 }
4630 if(pF->uErrorInt64 == QCBOR_SUCCESS && pF->nConvertedToInt64 != nInt) {
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004631 return (int32_t)(3000+nIndex);
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004632 }
4633
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004634 /* ----- test conversion to uint64_t ------ */
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004635 QCBORDecode_Init(&DCtx, pF->CBOR, QCBOR_DECODE_MODE_NORMAL);
4636 nCBORError = QCBORDecode_SetMemPool(&DCtx, Pool, 0);
4637 if(nCBORError) {
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004638 return (int32_t)(1000+nIndex);
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004639 }
4640 uint64_t uInt;
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004641 QCBORDecode_GetUInt64ConvertAll(&DCtx, 0xffff, &uInt);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004642 if(QCBORDecode_GetError(&DCtx) != pF->uErrorUint64) {
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004643 return (int32_t)(4000+nIndex);
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004644 }
4645 if(pF->uErrorUint64 == QCBOR_SUCCESS && pF->uConvertToUInt64 != uInt) {
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004646 return (int32_t)(5000+nIndex);
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004647 }
4648
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004649 /* ----- test conversion to double ------ */
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004650 QCBORDecode_Init(&DCtx, pF->CBOR, QCBOR_DECODE_MODE_NORMAL);
4651 nCBORError = QCBORDecode_SetMemPool(&DCtx, Pool, 0);
4652 if(nCBORError) {
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004653 return (int32_t)(1000+nIndex);
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004654 }
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07004655#ifndef QCBOR_DISABLE_FLOAT_HW_USE
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004656 double d;
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004657 QCBORDecode_GetDoubleConvertAll(&DCtx, 0xffff, &d);
Laurence Lundbladeb340ba72020-05-14 11:41:10 -07004658 if(QCBORDecode_GetError(&DCtx) != pF->uErrorDouble) {
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004659 return (int32_t)(6000+nIndex);
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004660 }
4661 if(pF->uErrorDouble == QCBOR_SUCCESS) {
4662 if(isnan(pF->dConvertToDouble)) {
Laurence Lundblade983500d2020-05-14 11:49:34 -07004663 // NaN's can't be compared for equality. A NaN is
4664 // never equal to anything including another NaN
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004665 if(!isnan(d)) {
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004666 return (int32_t)(7000+nIndex);
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004667 }
4668 } else {
4669 // TODO: this comparison may need a margin of error
4670 if(pF->dConvertToDouble != d) {
Laurence Lundblade54cd99c2020-05-15 02:25:32 -07004671 return (int32_t)(8000+nIndex);
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004672 }
4673 }
4674 }
Laurence Lundbladef7c0adb2020-08-08 20:20:58 -07004675#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
Laurence Lundbladef6c86662020-05-12 02:08:00 -07004676 }
4677
4678 return 0;
4679}
4680
Laurence Lundblade9c905e82020-04-25 11:31:38 -07004681
Laurence Lundblade97c61bf2020-05-02 11:24:06 -07004682
4683
Laurence Lundbladee3553422020-05-02 11:11:17 -07004684int32_t CBORSequenceDecodeTests(void)
4685{
4686 QCBORDecodeContext DCtx;
4687 QCBORItem Item;
4688 QCBORError uCBORError;
4689
4690 // --- Test a sequence with extra bytes ---
4691
4692 // The input for the date test happens to be a sequence so it
4693 // is reused. It is a sequence because it doesn't start as
4694 // an array or map.
4695 QCBORDecode_Init(&DCtx,
4696 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spDateTestInput),
4697 QCBOR_DECODE_MODE_NORMAL);
4698
4699 // Get the first item
4700 uCBORError = QCBORDecode_GetNext(&DCtx, &Item);
4701 if(uCBORError != QCBOR_SUCCESS) {
4702 return 1;
4703 }
4704 if(Item.uDataType != QCBOR_TYPE_DATE_STRING) {
4705 return 2;
4706 }
4707
4708 // Get a second item
4709 uCBORError = QCBORDecode_GetNext(&DCtx, &Item);
4710 if(uCBORError != QCBOR_SUCCESS) {
4711 return 2;
4712 }
4713 if(Item.uDataType != QCBOR_TYPE_DATE_EPOCH) {
4714 return 3;
4715 }
4716
4717 // A sequence can have stuff at the end that may
4718 // or may not be valid CBOR. The protocol decoder knows
4719 // when to stop by definition of the protocol, not
4720 // when the top-level map or array is ended.
4721 // Finish still has to be called to know that
4722 // maps and arrays (if there were any) were closed
4723 // off correctly. When called like this it
4724 // must return the error QCBOR_ERR_EXTRA_BYTES.
4725 uCBORError = QCBORDecode_Finish(&DCtx);
4726 if(uCBORError != QCBOR_ERR_EXTRA_BYTES) {
4727 return 4;
4728 }
4729
4730
4731 // --- Test an empty input ----
4732 uint8_t empty[1];
4733 UsefulBufC Empty = {empty, 0};
4734 QCBORDecode_Init(&DCtx,
4735 Empty,
4736 QCBOR_DECODE_MODE_NORMAL);
4737
4738 uCBORError = QCBORDecode_Finish(&DCtx);
4739 if(uCBORError != QCBOR_SUCCESS) {
4740 return 5;
4741 }
Laurence Lundblade2feb1e12020-07-15 03:50:45 -07004742
4743
Laurence Lundbladee3553422020-05-02 11:11:17 -07004744 // --- Sequence with unclosed indefinite length array ---
4745 static const uint8_t xx[] = {0x01, 0x9f, 0x02};
Laurence Lundblade2feb1e12020-07-15 03:50:45 -07004746
Laurence Lundbladee3553422020-05-02 11:11:17 -07004747 QCBORDecode_Init(&DCtx,
4748 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(xx),
4749 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade2feb1e12020-07-15 03:50:45 -07004750
Laurence Lundbladee3553422020-05-02 11:11:17 -07004751 // Get the first item
4752 uCBORError = QCBORDecode_GetNext(&DCtx, &Item);
4753 if(uCBORError != QCBOR_SUCCESS) {
4754 return 7;
4755 }
4756 if(Item.uDataType != QCBOR_TYPE_INT64) {
4757 return 8;
4758 }
Laurence Lundblade2feb1e12020-07-15 03:50:45 -07004759
Laurence Lundbladee3553422020-05-02 11:11:17 -07004760 // Get a second item
4761 uCBORError = QCBORDecode_GetNext(&DCtx, &Item);
4762 if(uCBORError != QCBOR_SUCCESS) {
4763 return 9;
4764 }
4765 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
4766 return 10;
4767 }
4768
4769 // Try to finish before consuming all bytes to confirm
4770 // that the still-open error is returned.
4771 uCBORError = QCBORDecode_Finish(&DCtx);
4772 if(uCBORError != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
4773 return 11;
4774 }
4775
Laurence Lundblade2feb1e12020-07-15 03:50:45 -07004776
Laurence Lundbladee3553422020-05-02 11:11:17 -07004777 // --- Sequence with a closed indefinite length array ---
4778 static const uint8_t yy[] = {0x01, 0x9f, 0xff};
Laurence Lundblade2feb1e12020-07-15 03:50:45 -07004779
Laurence Lundbladee3553422020-05-02 11:11:17 -07004780 QCBORDecode_Init(&DCtx,
4781 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(yy),
4782 QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade2feb1e12020-07-15 03:50:45 -07004783
Laurence Lundbladee3553422020-05-02 11:11:17 -07004784 // Get the first item
4785 uCBORError = QCBORDecode_GetNext(&DCtx, &Item);
4786 if(uCBORError != QCBOR_SUCCESS) {
4787 return 12;
4788 }
4789 if(Item.uDataType != QCBOR_TYPE_INT64) {
4790 return 13;
4791 }
Laurence Lundblade2feb1e12020-07-15 03:50:45 -07004792
Laurence Lundbladee3553422020-05-02 11:11:17 -07004793 // Get a second item
4794 uCBORError = QCBORDecode_GetNext(&DCtx, &Item);
4795 if(uCBORError != QCBOR_SUCCESS) {
4796 return 14;
4797 }
4798 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
4799 return 15;
4800 }
4801
4802 // Try to finish before consuming all bytes to confirm
4803 // that the still-open error is returned.
4804 uCBORError = QCBORDecode_Finish(&DCtx);
4805 if(uCBORError != QCBOR_SUCCESS) {
4806 return 16;
4807 }
4808
Laurence Lundblade2feb1e12020-07-15 03:50:45 -07004809
Laurence Lundbladee3553422020-05-02 11:11:17 -07004810 return 0;
4811}
4812
Laurence Lundbladee15326f2020-06-15 15:50:23 -07004813
Laurence Lundblade70ecead2020-06-15 19:40:06 -07004814
Laurence Lundbladee15326f2020-06-15 15:50:23 -07004815int32_t IntToTests()
4816{
4817 int nErrCode;
4818 int32_t n32;
4819 int16_t n16;
4820 int8_t n8;
4821 uint32_t u32;
4822 uint16_t u16;
4823 uint8_t u8;
4824 uint64_t u64;
4825
4826 nErrCode = QCBOR_Int64ToInt32(1, &n32);
4827 if(nErrCode == -1 || n32 != 1) {
4828 return 1;
4829 }
4830
4831 nErrCode = QCBOR_Int64ToInt32((int64_t)INT32_MAX, &n32);
4832 if(nErrCode == -1 || n32 != INT32_MAX) {
4833 return 2;
4834 }
4835
4836 nErrCode = QCBOR_Int64ToInt32((int64_t)INT32_MIN, &n32);
4837 if(nErrCode == -1 || n32 != INT32_MIN) {
4838 return 3;
4839 }
4840
4841 nErrCode = QCBOR_Int64ToInt32(((int64_t)INT32_MAX)+1, &n32);
4842 if(nErrCode != -1) {
4843 return 4;
4844 }
4845
4846 nErrCode = QCBOR_Int64ToInt32(((int64_t)INT32_MIN)-1, &n32);
4847 if(nErrCode != -1) {
4848 return 5;
4849 }
4850
4851
4852 nErrCode = QCBOR_Int64ToInt16((int64_t)INT16_MAX, &n16);
4853 if(nErrCode == -1 || n16 != INT16_MAX) {
4854 return 6;
4855 }
4856
4857 nErrCode = QCBOR_Int64ToInt16((int64_t)INT16_MIN, &n16);
4858 if(nErrCode == -1 || n16 != INT16_MIN) {
4859 return 7;
4860 }
4861
4862 nErrCode = QCBOR_Int64ToInt16(1, &n16);
4863 if(nErrCode == -1 || n16 != 1) {
4864 return 8;
4865 }
4866
4867 nErrCode = QCBOR_Int64ToInt16(((int64_t)INT16_MAX)+1, &n16);
4868 if(nErrCode != -1) {
4869 return 9;
4870 }
4871
4872 nErrCode = QCBOR_Int64ToInt16(((int64_t)INT16_MIN)-1, &n16);
4873 if(nErrCode != -1) {
4874 return 10;
4875 }
4876
4877
4878 nErrCode = QCBOR_Int64ToInt8(1, &n8);
4879 if(nErrCode == -1 || n8 != 1) {
4880 return 11;
4881 }
4882
4883 nErrCode = QCBOR_Int64ToInt8((int64_t)INT8_MAX, &n8);
4884 if(nErrCode == -1 || n8 != INT8_MAX) {
4885 return 12;
4886 }
4887
4888 nErrCode = QCBOR_Int64ToInt8((int64_t)INT8_MIN, &n8);
4889 if(nErrCode == -1 || n8 != INT8_MIN) {
4890 return 13;
4891 }
4892
4893 nErrCode = QCBOR_Int64ToInt8(((int64_t)INT8_MAX)+1, &n8);
4894 if(nErrCode != -1) {
4895 return 14;
4896 }
4897
4898 nErrCode = QCBOR_Int64ToInt8(((int64_t)INT8_MIN)-1, &n8);
4899 if(nErrCode != -1) {
4900 return 15;
4901 }
4902
4903
4904 nErrCode = QCBOR_Int64ToUInt32(1, &u32);
4905 if(nErrCode == -1 || u32 != 1) {
4906 return 16;
4907 }
4908
4909 nErrCode = QCBOR_Int64ToUInt32((int64_t)UINT32_MAX, &u32);
4910 if(nErrCode == -1 || u32 != UINT32_MAX) {
4911 return 17;
4912 }
4913
4914 nErrCode = QCBOR_Int64ToUInt32((int64_t)0, &u32);
4915 if(nErrCode == -1 || u32 != 0) {
4916 return 18;
4917 }
4918
4919 nErrCode = QCBOR_Int64ToUInt32(((int64_t)UINT32_MAX)+1, &u32);
4920 if(nErrCode != -1) {
4921 return 19;
4922 }
4923
4924 nErrCode = QCBOR_Int64ToUInt32((int64_t)-1, &u32);
4925 if(nErrCode != -1) {
4926 return 20;
4927 }
4928
4929
4930 nErrCode = QCBOR_Int64UToInt16((int64_t)UINT16_MAX, &u16);
4931 if(nErrCode == -1 || u16 != UINT16_MAX) {
4932 return 21;
4933 }
4934
4935 nErrCode = QCBOR_Int64UToInt16((int64_t)0, &u16);
4936 if(nErrCode == -1 || u16 != 0) {
4937 return 22;
4938 }
4939
4940 nErrCode = QCBOR_Int64UToInt16(1, &u16);
4941 if(nErrCode == -1 || u16 != 1) {
4942 return 23;
4943 }
4944
4945 nErrCode = QCBOR_Int64UToInt16(((int64_t)UINT16_MAX)+1, &u16);
4946 if(nErrCode != -1) {
4947 return 24;
4948 }
4949
4950 nErrCode = QCBOR_Int64UToInt16((int64_t)-1, &u16);
4951 if(nErrCode != -1) {
4952 return 25;
4953 }
4954
4955
4956 nErrCode = QCBOR_Int64ToUInt8((int64_t)UINT8_MAX, &u8);
4957 if(nErrCode == -1 || u8 != UINT8_MAX) {
4958 return 26;
4959 }
4960
4961 nErrCode = QCBOR_Int64ToUInt8((int64_t)0, &u8);
4962 if(nErrCode == -1 || u8 != 0) {
4963 return 27;
4964 }
4965
4966 nErrCode = QCBOR_Int64ToUInt8(1, &u8);
4967 if(nErrCode == -1 || u8 != 1) {
4968 return 28;
4969 }
4970
4971 nErrCode = QCBOR_Int64ToUInt8(((int64_t)UINT16_MAX)+1, &u8);
4972 if(nErrCode != -1) {
4973 return 29;
4974 }
4975
4976 nErrCode = QCBOR_Int64ToUInt8((int64_t)-1, &u8);
4977 if(nErrCode != -1) {
4978 return 30;
4979 }
4980
4981
4982 nErrCode = QCBOR_Int64ToUInt64(1, &u64);
4983 if(nErrCode == -1 || u64 != 1) {
4984 return 31;
4985 }
4986
4987 nErrCode = QCBOR_Int64ToUInt64(INT64_MAX, &u64);
4988 if(nErrCode == -1 || u64 != INT64_MAX) {
4989 return 32;
4990 }
4991
4992 nErrCode = QCBOR_Int64ToUInt64((int64_t)0, &u64);
4993 if(nErrCode == -1 || u64 != 0) {
4994 return 33;
4995 }
4996
4997 nErrCode = QCBOR_Int64ToUInt64((int64_t)-1, &u64);
4998 if(nErrCode != -1) {
4999 return 34;
5000 }
5001
5002 return 0;
5003}
5004
Laurence Lundblade0750fc42020-06-20 21:02:34 -07005005
Laurence Lundblade9bb039a2020-08-05 12:25:15 -07005006
5007
Laurence Lundblade0750fc42020-06-20 21:02:34 -07005008/*
5009A sequence with
5010 A wrapping bstr
5011 containing a map
5012 1
5013 2
5014 A wrapping bstr
5015 containing an array
5016 3
5017 wrapping bstr
5018 4
5019 5
5020 6
5021 array
5022 7
5023 8
5024
5025 */
5026
5027static UsefulBufC foo(UsefulBuf ffo)
5028{
5029 UsefulBufC Encoded;
5030 QCBOREncodeContext EC;
5031 QCBORError uErr;
5032
5033 QCBOREncode_Init(&EC, ffo);
5034
5035 QCBOREncode_BstrWrap(&EC);
5036 QCBOREncode_OpenMap(&EC);
5037 QCBOREncode_AddInt64ToMapN(&EC, 100, 1);
5038 QCBOREncode_AddInt64ToMapN(&EC, 200, 2);
5039 QCBOREncode_CloseMap(&EC);
5040 QCBOREncode_BstrWrap(&EC);
5041 QCBOREncode_OpenArray(&EC);
5042 QCBOREncode_AddInt64(&EC, 3);
5043 QCBOREncode_BstrWrap(&EC);
5044 QCBOREncode_AddInt64(&EC, 4);
5045 QCBOREncode_CloseBstrWrap(&EC, NULL);
5046 QCBOREncode_AddInt64(&EC, 5);
5047 QCBOREncode_CloseArray(&EC);
5048 QCBOREncode_CloseBstrWrap(&EC, NULL);
5049 QCBOREncode_AddInt64(&EC, 6);
5050 QCBOREncode_CloseBstrWrap(&EC, NULL);
5051 QCBOREncode_OpenArray(&EC);
5052 QCBOREncode_AddInt64(&EC, 7);
5053 QCBOREncode_AddInt64(&EC, 8);
5054 QCBOREncode_CloseArray(&EC);
5055
5056 uErr = QCBOREncode_Finish(&EC, &Encoded);
Laurence Lundblade40a04322020-06-27 22:52:52 -07005057 if(uErr) {
5058 Encoded = NULLUsefulBufC;
5059 }
Laurence Lundblade0750fc42020-06-20 21:02:34 -07005060
5061 return Encoded;
5062}
5063
5064
5065int32_t EnterBstrTest()
5066{
5067 MakeUsefulBufOnStack(ffo, 100);
5068
5069 QCBORDecodeContext DC;
5070
5071 QCBORDecode_Init(&DC, foo(ffo), 0);
5072
5073 int64_t i1, i2, i3, i4, i5, i6, i7, i8;
5074
5075
Laurence Lundbladef9175a92020-07-30 21:35:45 -07005076 QCBORDecode_EnterBstrWrapped(&DC, QCBOR_TAG_REQUIREMENT_NO_TAG, NULL);
Laurence Lundblade0750fc42020-06-20 21:02:34 -07005077 QCBORDecode_EnterMap(&DC);
5078 QCBORDecode_GetInt64InMapN(&DC, 100, &i1);
5079 QCBORDecode_GetInt64InMapN(&DC, 200, &i2);
5080 QCBORDecode_ExitMap(&DC);
Laurence Lundbladef9175a92020-07-30 21:35:45 -07005081 QCBORDecode_EnterBstrWrapped(&DC, QCBOR_TAG_REQUIREMENT_NO_TAG, NULL);
Laurence Lundblade0750fc42020-06-20 21:02:34 -07005082 QCBORDecode_EnterArray(&DC);
5083 QCBORDecode_GetInt64(&DC, &i3);
Laurence Lundbladef9175a92020-07-30 21:35:45 -07005084 QCBORDecode_EnterBstrWrapped(&DC, QCBOR_TAG_REQUIREMENT_NO_TAG, NULL);
Laurence Lundblade0750fc42020-06-20 21:02:34 -07005085 QCBORDecode_GetInt64(&DC, &i4);
5086 QCBORDecode_ExitBstrWrapped(&DC);
5087 QCBORDecode_GetInt64(&DC, &i5);
5088 QCBORDecode_ExitArray(&DC);
5089 QCBORDecode_ExitBstrWrapped(&DC);
5090 QCBORDecode_GetInt64(&DC, &i6);
5091 QCBORDecode_ExitBstrWrapped(&DC);
5092 QCBORDecode_EnterArray(&DC);
5093 QCBORDecode_GetInt64(&DC, &i7);
5094 QCBORDecode_GetInt64(&DC, &i8);
5095 QCBORDecode_ExitArray(&DC);
5096
5097 QCBORError uErr = QCBORDecode_Finish(&DC);
5098
5099 return (int32_t)uErr;
5100}
Laurence Lundblade37f46e52020-08-04 03:32:14 -07005101
5102
5103
5104
5105static const uint8_t spTaggedTypes[] = {
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005106 0xb2,
Laurence Lundblade37f46e52020-08-04 03:32:14 -07005107
Laurence Lundblade9bb039a2020-08-05 12:25:15 -07005108 // Date string
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005109 0x00,
Laurence Lundblade9bb039a2020-08-05 12:25:15 -07005110 0xc0, 0x74, 0x32, 0x30, 0x30, 0x33, 0x2D, 0x31, 0x32, 0x2D,
5111 0x31, 0x33, 0x54, 0x31, 0x38, 0x3A, 0x33, 0x30, 0x3A, 0x30,
5112 0x32, 0x5A,
Laurence Lundblade37f46e52020-08-04 03:32:14 -07005113
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005114 0x01,
Laurence Lundblade9bb039a2020-08-05 12:25:15 -07005115 0x74, 0x32, 0x30, 0x30, 0x33, 0x2D, 0x31, 0x32, 0x2D, 0x31,
5116 0x33, 0x54, 0x31, 0x38, 0x3A, 0x33, 0x30, 0x3A, 0x30, 0x32,
5117 0x5A,
Laurence Lundblade37f46e52020-08-04 03:32:14 -07005118
Laurence Lundblade9bb039a2020-08-05 12:25:15 -07005119 // Bignum
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005120 10,
Laurence Lundblade9bb039a2020-08-05 12:25:15 -07005121 0xC2, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
5122 0x09, 0x10,
Laurence Lundblade37f46e52020-08-04 03:32:14 -07005123
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005124 11,
Laurence Lundblade9bb039a2020-08-05 12:25:15 -07005125 0xC3, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
5126 0x09, 0x10,
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005127
Laurence Lundblade9bb039a2020-08-05 12:25:15 -07005128 // URL
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005129 20,
Laurence Lundblade9bb039a2020-08-05 12:25:15 -07005130 0xd8, 0x20, 0x6f, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F,
5131 0x63, 0x62, 0x6F, 0x72, 0x2E, 0x6D, 0x65, 0x2F,
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005132
Laurence Lundblade9bb039a2020-08-05 12:25:15 -07005133 21,
5134 0x6f, 0x68, 0x74, 0x74, 0x70, 0x3A, 0x2F, 0x2F, 0x63, 0x62,
5135 0x6F, 0x72, 0x2E, 0x6D, 0x65, 0x2F,
5136
5137 // B64
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005138 0x18, 0x1e,
Laurence Lundblade9bb039a2020-08-05 12:25:15 -07005139 0xd8, 0x22, 0x6c, 0x63, 0x47, 0x78, 0x6C, 0x59, 0x58, 0x4E,
5140 0x31, 0x63, 0x6D, 0x55, 0x75,
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005141
5142 0x18, 0x1f,
Laurence Lundblade9bb039a2020-08-05 12:25:15 -07005143 0x6c, 0x63, 0x47, 0x78, 0x6C, 0x59, 0x58, 0x4E, 0x31, 0x63,
5144 0x6D, 0x55, 0x75,
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005145
Laurence Lundblade9bb039a2020-08-05 12:25:15 -07005146 // B64URL
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005147 0x18, 0x28,
Laurence Lundblade9bb039a2020-08-05 12:25:15 -07005148 0xd8, 0x21, 0x6c, 0x63, 0x47, 0x78, 0x6C, 0x59, 0x58, 0x4E,
5149 0x31, 0x63, 0x6D, 0x55, 0x75,
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005150
5151 0x18, 0x29,
Laurence Lundblade9bb039a2020-08-05 12:25:15 -07005152 0x6c, 0x63, 0x47, 0x78, 0x6C, 0x59, 0x58, 0x4E, 0x31, 0x63,
5153 0x6D, 0x55, 0x75,
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005154
Laurence Lundblade9bb039a2020-08-05 12:25:15 -07005155 // Regex
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005156 0x18, 0x32,
Laurence Lundblade9bb039a2020-08-05 12:25:15 -07005157 0xd8, 0x23, 0x68, 0x31, 0x30, 0x30, 0x5C, 0x73, 0x2A, 0x6D,
5158 0x6B,
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005159
5160 0x18, 0x33,
5161 0x68, 0x31, 0x30, 0x30, 0x5C, 0x73, 0x2A, 0x6D, 0x6B,
5162
5163 // MIME
5164 0x18, 0x3c,
Laurence Lundblade9bb039a2020-08-05 12:25:15 -07005165 0xd8, 0x24, 0x72, 0x4D, 0x49, 0x4D, 0x45, 0x2D, 0x56, 0x65,
5166 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x31, 0x2E, 0x30,
5167 0x0A,
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005168
5169 0x18, 0x3d,
Laurence Lundblade9bb039a2020-08-05 12:25:15 -07005170 0x72, 0x4D, 0x49, 0x4D, 0x45, 0x2D, 0x56, 0x65, 0x72, 0x73,
5171 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x31, 0x2E, 0x30, 0x0A,
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005172
5173 0x18, 0x3e,
Laurence Lundblade9bb039a2020-08-05 12:25:15 -07005174 0xd9, 0x01, 0x01, 0x52, 0x4D, 0x49, 0x4D, 0x45, 0x2D, 0x56,
5175 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x31, 0x2E,
5176 0x30, 0x0A,
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005177
5178 0x18, 0x3f,
Laurence Lundblade9bb039a2020-08-05 12:25:15 -07005179 0x52, 0x4D, 0x49, 0x4D, 0x45, 0x2D, 0x56, 0x65, 0x72, 0x73,
5180 0x69, 0x6F, 0x6E, 0x3A, 0x20, 0x31, 0x2E, 0x30, 0x0A,
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005181
5182 // UUID
5183 0x18, 0x46,
Laurence Lundblade9bb039a2020-08-05 12:25:15 -07005184 0xd8, 0x25, 0x50, 0x53, 0x4D, 0x41, 0x52, 0x54, 0x43, 0x53,
5185 0x4C, 0x54, 0x54, 0x43, 0x46, 0x49, 0x43, 0x41, 0x32,
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005186
5187 0x18, 0x47,
Laurence Lundblade9bb039a2020-08-05 12:25:15 -07005188 0x50, 0x53, 0x4D, 0x41, 0x52, 0x54, 0x43, 0x53, 0x4C, 0x54,
5189 0x54, 0x43, 0x46, 0x49, 0x43, 0x41, 0x32
Laurence Lundblade37f46e52020-08-04 03:32:14 -07005190};
5191
5192int32_t DecodeTaggedTypeTests()
5193{
5194 QCBORDecodeContext DC;
5195 QCBORError uErr;
5196
5197 QCBORDecode_Init(&DC, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spTaggedTypes), 0);
5198
5199 UsefulBufC String;
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005200 bool bNeg;
Laurence Lundblade37f46e52020-08-04 03:32:14 -07005201
5202 QCBORDecode_EnterMap(&DC);
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005203 QCBORDecode_GetDateStringInMapN(&DC, 0, QCBOR_TAG_REQUIREMENT_MATCH_TAG, &String);
5204 QCBORDecode_GetDateStringInMapN(&DC, 0, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG, &String);
Laurence Lundblade37f46e52020-08-04 03:32:14 -07005205 if(QCBORDecode_GetError(&DC) != QCBOR_SUCCESS) {
5206 return 1;
5207 }
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005208 QCBORDecode_GetDateStringInMapN(&DC, 0, QCBOR_TAG_REQUIREMENT_NO_TAG, &String);
Laurence Lundblade37f46e52020-08-04 03:32:14 -07005209 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_UNEXPECTED_TYPE) {
5210 return 2;
5211 }
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005212 QCBORDecode_GetDateStringInMapN(&DC, 1, QCBOR_TAG_REQUIREMENT_MATCH_TAG, &String);
Laurence Lundblade37f46e52020-08-04 03:32:14 -07005213 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_UNEXPECTED_TYPE) {
5214 return 3;
5215 }
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005216 QCBORDecode_GetDateStringInMapN(&DC, 1, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG, &String);
5217 QCBORDecode_GetDateStringInMapN(&DC, 1, QCBOR_TAG_REQUIREMENT_NO_TAG, &String);
Laurence Lundblade37f46e52020-08-04 03:32:14 -07005218 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS) {
5219 return 4;
5220 }
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005221 QCBORDecode_GetDateStringInMapSZ(&DC, "xxx", QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG, &String);
5222 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_NOT_FOUND) {
5223 return 5;
5224 }
Laurence Lundblade37f46e52020-08-04 03:32:14 -07005225
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005226 QCBORDecode_GetBignumInMapN(&DC, 10, QCBOR_TAG_REQUIREMENT_MATCH_TAG, &String, &bNeg);
5227 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS ||
5228 bNeg != false) {
5229 return 10;
5230 }
5231 QCBORDecode_GetBignumInMapN(&DC, 11, QCBOR_TAG_REQUIREMENT_MATCH_TAG, &String, &bNeg);
5232 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS ||
5233 bNeg != true) {
5234 return 11;
5235 }
5236 QCBORDecode_GetBignumInMapN(&DC, 11, QCBOR_TAG_REQUIREMENT_NO_TAG, &String, &bNeg);
5237 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_UNEXPECTED_TYPE) {
5238 return 12;
5239 }
5240 QCBORDecode_GetBignumInMapN(&DC, 14, QCBOR_TAG_REQUIREMENT_NO_TAG, &String, &bNeg);
5241 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_NOT_FOUND) {
5242 return 13;
5243 }
5244 QCBORDecode_GetBignumInMapSZ(&DC, "xxx", QCBOR_TAG_REQUIREMENT_NO_TAG, &String, &bNeg);
5245 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_NOT_FOUND) {
5246 return 14;
5247 }
Laurence Lundblade37f46e52020-08-04 03:32:14 -07005248
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005249 QCBORDecode_GetURIInMapN(&DC, 20, QCBOR_TAG_REQUIREMENT_MATCH_TAG, &String);
5250 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS) {
5251 return 20;
5252 }
5253 QCBORDecode_GetURIInMapN(&DC, 21, QCBOR_TAG_REQUIREMENT_NO_TAG, &String);
5254 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS) {
5255 return 21;
5256 }
5257 QCBORDecode_GetURIInMapN(&DC, 22, QCBOR_TAG_REQUIREMENT_MATCH_TAG, &String);
5258 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_NOT_FOUND) {
5259 return 22;
5260 }
5261 QCBORDecode_GetURIInMapSZ(&DC, "xxx", QCBOR_TAG_REQUIREMENT_MATCH_TAG, &String);
5262 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_NOT_FOUND) {
5263 return 23;
5264 }
Laurence Lundblade37f46e52020-08-04 03:32:14 -07005265
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005266 QCBORDecode_GetB64InMapN(&DC, 30, QCBOR_TAG_REQUIREMENT_MATCH_TAG, &String);
5267 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS) {
5268 return 30;
5269 }
5270 QCBORDecode_GetB64InMapN(&DC, 31, QCBOR_TAG_REQUIREMENT_NO_TAG, &String);
5271 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS) {
5272 return 31;
5273 }
5274 QCBORDecode_GetB64InMapN(&DC, 32, QCBOR_TAG_REQUIREMENT_NO_TAG, &String);
5275 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_NOT_FOUND) {
5276 return 32;
5277 }
5278 QCBORDecode_GetB64InMapSZ(&DC, "xxx", QCBOR_TAG_REQUIREMENT_NO_TAG, &String);
5279 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_NOT_FOUND) {
5280 return 33;
5281 }
Laurence Lundblade37f46e52020-08-04 03:32:14 -07005282
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005283 QCBORDecode_GetB64URLInMapN(&DC, 40, QCBOR_TAG_REQUIREMENT_MATCH_TAG, &String);
5284 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS) {
5285 return 40;
5286 }
5287 QCBORDecode_GetB64URLInMapN(&DC, 41, QCBOR_TAG_REQUIREMENT_NO_TAG, &String);
5288 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS) {
5289 return 41;
5290 }
5291 QCBORDecode_GetB64URLInMapN(&DC, 42, QCBOR_TAG_REQUIREMENT_NO_TAG, &String);
5292 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_NOT_FOUND) {
5293 return 42;
5294 }
5295 QCBORDecode_GetB64URLInMapSZ(&DC, "xxx", QCBOR_TAG_REQUIREMENT_NO_TAG, &String);
5296 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_NOT_FOUND) {
5297 return 43;
5298 }
Laurence Lundblade37f46e52020-08-04 03:32:14 -07005299
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005300 QCBORDecode_GetRegexInMapN(&DC, 50, QCBOR_TAG_REQUIREMENT_MATCH_TAG, &String);
5301 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS) {
5302 return 50;
5303 }
5304 QCBORDecode_GetRegexInMapN(&DC, 51, QCBOR_TAG_REQUIREMENT_NO_TAG, &String);
5305 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS) {
5306 return 51;
5307 }
5308 QCBORDecode_GetRegexInMapN(&DC, 52, QCBOR_TAG_REQUIREMENT_MATCH_TAG, &String);
5309 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_NOT_FOUND) {
5310 return 52;
5311 }
5312 QCBORDecode_GetRegexInMapSZ(&DC, "xxx", QCBOR_TAG_REQUIREMENT_MATCH_TAG, &String);
5313 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_NOT_FOUND) {
5314 return 53;
5315 }
Laurence Lundblade37f46e52020-08-04 03:32:14 -07005316
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005317 // MIME
5318 bool bIsNot7Bit;
5319 QCBORDecode_GetMIMEMessageInMapN(&DC, 60, QCBOR_TAG_REQUIREMENT_MATCH_TAG, &String, &bIsNot7Bit);
5320 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS ||
5321 bIsNot7Bit == true) {
5322 return 60;
5323 }
5324 QCBORDecode_GetMIMEMessageInMapN(&DC, 61, QCBOR_TAG_REQUIREMENT_NO_TAG, &String, &bIsNot7Bit);
5325 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS ||
5326 bIsNot7Bit == true) {
5327 return 61;
5328 }
5329 QCBORDecode_GetMIMEMessageInMapN(&DC, 62, QCBOR_TAG_REQUIREMENT_MATCH_TAG, &String, &bIsNot7Bit);
5330 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS ||
5331 bIsNot7Bit == false) {
5332 return 62;
5333 }
5334 QCBORDecode_GetMIMEMessageInMapN(&DC, 63, QCBOR_TAG_REQUIREMENT_NO_TAG, &String, &bIsNot7Bit);
5335 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS ||
5336 bIsNot7Bit == false) {
5337 return 63;
5338 }
5339 QCBORDecode_GetMIMEMessageInMapN(&DC, 64, QCBOR_TAG_REQUIREMENT_MATCH_TAG, &String, &bNeg);
5340 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_NOT_FOUND) {
5341 return 64;
5342 }
5343 QCBORDecode_GetMIMEMessageInMapSZ(&DC, "zzz", QCBOR_TAG_REQUIREMENT_MATCH_TAG, &String, &bNeg);
5344 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_NOT_FOUND) {
5345 return 65;
5346 }
Laurence Lundblade37f46e52020-08-04 03:32:14 -07005347
Laurence Lundblade2f5e16d2020-08-04 20:35:23 -07005348 QCBORDecode_GetBinaryUUIDInMapN(&DC, 70, QCBOR_TAG_REQUIREMENT_MATCH_TAG, &String);
5349 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS) {
5350 return 70;
5351 }
5352 QCBORDecode_GetBinaryUUIDInMapN(&DC, 71, QCBOR_TAG_REQUIREMENT_NO_TAG, &String);
5353 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_SUCCESS) {
5354 return 71;
5355 }
5356 QCBORDecode_GetBinaryUUIDInMapN(&DC, 72, QCBOR_TAG_REQUIREMENT_MATCH_TAG, &String);
5357 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_NOT_FOUND) {
5358 return 72;
5359 }
5360 QCBORDecode_GetBinaryUUIDInMapSZ(&DC, "xxx", QCBOR_TAG_REQUIREMENT_MATCH_TAG, &String);
5361 if(QCBORDecode_GetAndResetError(&DC) != QCBOR_ERR_NOT_FOUND) {
5362 return 73;
5363 }
Laurence Lundblade37f46e52020-08-04 03:32:14 -07005364
Laurence Lundblade9bb039a2020-08-05 12:25:15 -07005365 // Improvement: add some more error test cases
5366
Laurence Lundblade37f46e52020-08-04 03:32:14 -07005367 QCBORDecode_ExitMap(&DC);
5368
5369 uErr = QCBORDecode_Finish(&DC);
5370 if(uErr != QCBOR_SUCCESS) {
5371 return 100;
5372 }
5373
5374 return 0;
5375}