blob: 57c4ff8dee25b3f4ba59ae2b7002fc9bc2bb67fc [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 Lundbladedc6e28e2018-10-11 19:19:27 +053032
Laurence Lundblade844bb5c2020-03-01 17:27:25 -080033#include "qcbor/qcbor_encode.h"
34#include "qcbor/qcbor_decode.h"
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080035#include "qcbor_encode_tests.h"
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080036
37
Laurence Lundblade369b90a2018-10-22 02:04:37 +053038/*
39 This is the test set for CBOR encoding.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080040
Laurence Lundblade369b90a2018-10-22 02:04:37 +053041 This is largely complete for the implemented.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080042
Laurence Lundblade369b90a2018-10-22 02:04:37 +053043 A few more things to do include:
44 - Add a test for counting the top level items and adding it back in with AddRaw()
45 - Run on some different CPUs like 32-bit and maybe even 16-bit
46 - Test the large array count limit
47 - Add the CBOR diagnostic output for every expected
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080048
Laurence Lundblade369b90a2018-10-22 02:04:37 +053049 */
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080050
Laurence Lundbladeee851742020-01-08 08:37:05 -080051//#define PRINT_FUNCTIONS_FOR_DEBUGGING
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080052
Laurence Lundbladeee851742020-01-08 08:37:05 -080053#ifdef PRINT_FUNCTIONS_FOR_DEBUGGING
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053054#include <stdio.h>
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080055
Laurence Lundbladeee851742020-01-08 08:37:05 -080056#if 0
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080057// ifdef these out to not have compiler warnings
58static void printencoded(const uint8_t *pEncoded, size_t nLen)
59{
Laurence Lundbladecafcfe12018-10-31 21:59:50 +070060 size_t i;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080061 for(i = 0; i < nLen; i++) {
62 uint8_t Z = pEncoded[i];
63 printf("%02x ", Z);
64 }
65 printf("\n");
66
67 fflush(stdout);
68}
Laurence Lundbladeee851742020-01-08 08:37:05 -080069#endif
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080070
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080071
Laurence Lundblade369b90a2018-10-22 02:04:37 +053072// Do the comparison and print out where it fails
73static int UsefulBuf_Compare_Print(UsefulBufC U1, UsefulBufC U2) {
Laurence Lundbladecafcfe12018-10-31 21:59:50 +070074 size_t i;
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053075 for(i = 0; i < U1.len; i++) {
76 if(((uint8_t *)U1.ptr)[i] != ((uint8_t *)U2.ptr)[i]) {
Laurence Lundbladeee851742020-01-08 08:37:05 -080077 printf("Position: %d Actual: 0x%x Expected: 0x%x\n",
78 (uint32_t)i,
79 ((uint8_t *)U1.ptr)[i],
80 ((uint8_t *)U2.ptr)[i]);
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053081 return 1;
82 }
83 }
84 return 0;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -080085
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053086}
87
Laurence Lundbladecafcfe12018-10-31 21:59:50 +070088#define CheckResults(Enc, Expected) \
Laurence Lundblade369b90a2018-10-22 02:04:37 +053089 UsefulBuf_Compare_Print(Enc, (UsefulBufC){Expected, sizeof(Expected)})
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +053090
Laurence Lundbladecafcfe12018-10-31 21:59:50 +070091#else
Laurence Lundblade2ded3d92018-10-09 21:36:11 +080092
93#define CheckResults(Enc, Expected) \
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +080094 UsefulBuf_Compare(Enc, (UsefulBufC){Expected, sizeof(Expected)})
95
Laurence Lundbladecafcfe12018-10-31 21:59:50 +070096#endif
97
98
Laurence Lundblade59289e52019-12-30 13:44:37 -080099#ifndef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA
100/*
101 Returns 0 if UsefulBufs are equal
102 Returns 1000000 + offeset if they are not equal.
103
104
105
106*/
107struct UBCompareDiagnostic {
108 uint8_t uActual;
109 uint8_t uExpected;
110 size_t uOffset;
111};
112
Laurence Lundbladeee851742020-01-08 08:37:05 -0800113static int32_t
114UsefulBuf_CompareWithDiagnostic(UsefulBufC Actual,
115 UsefulBufC Expected,
116 struct UBCompareDiagnostic *pDiag) {
Laurence Lundblade59289e52019-12-30 13:44:37 -0800117 size_t i;
118 for(i = 0; i < Actual.len; i++) {
119 if(((uint8_t *)Actual.ptr)[i] != ((uint8_t *)Expected.ptr)[i]) {
120 if(pDiag) {
121 pDiag->uActual = ((uint8_t *)Actual.ptr)[i];
122 pDiag->uExpected = ((uint8_t *)Expected.ptr)[i];
123 pDiag->uOffset = i;
124 }
Laurence Lundbladeee851742020-01-08 08:37:05 -0800125 // Cast to int is OK as this is only a diagnostic and the sizes
126 // here are never over a few KB.
127 return (int32_t)i + 1000000;
Laurence Lundblade59289e52019-12-30 13:44:37 -0800128 }
129 }
130 return 0;
131
132}
133#endif /* QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA */
134
Laurence Lundbladecafcfe12018-10-31 21:59:50 +0700135
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530136// One big buffer that is used by all the tests to encode into
137// Putting it in uninitialized data is better than using a lot
138// of stack. The tests should run on small devices too.
139static uint8_t spBigBuf[2200];
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800140
141
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800142
143/*
144 Some very minimal tests.
145 */
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800146int32_t BasicEncodeTest()
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800147{
148 // Very simple CBOR, a map with one boolean that is true in it
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800149 QCBOREncodeContext EC;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800150
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530151 QCBOREncode_Init(&EC, UsefulBuf_FROM_BYTE_ARRAY(spBigBuf));
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530152
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800153 QCBOREncode_OpenMap(&EC);
154 QCBOREncode_AddBoolToMapN(&EC, 66, true);
155 QCBOREncode_CloseMap(&EC);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800156
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800157 UsefulBufC Encoded;
Laurence Lundblade0595e932018-11-02 22:22:47 +0700158 if(QCBOREncode_Finish(&EC, &Encoded)) {
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530159 return -1;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800160 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800161
162
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800163 // Decode it and see that is right
164 QCBORDecodeContext DC;
165 QCBORItem Item;
166 QCBORDecode_Init(&DC, Encoded, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800167
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800168 QCBORDecode_GetNext(&DC, &Item);
169 if(Item.uDataType != QCBOR_TYPE_MAP) {
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530170 return -2;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800171 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800172
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800173 QCBORDecode_GetNext(&DC, &Item);
174 if(Item.uDataType != QCBOR_TYPE_TRUE) {
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530175 return -3;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800176 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800177
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800178 if(QCBORDecode_Finish(&DC)) {
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530179 return -4;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800180 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800181
182
Laurence Lundbladeee851742020-01-08 08:37:05 -0800183 // Make another encoded message with the CBOR from the previous
184 // put into this one
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530185 UsefulBuf_MAKE_STACK_UB(MemoryForEncoded2, 20);
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800186 QCBOREncode_Init(&EC, MemoryForEncoded2);
187 QCBOREncode_OpenArray(&EC);
188 QCBOREncode_AddUInt64(&EC, 451);
189 QCBOREncode_AddEncoded(&EC, Encoded);
190 QCBOREncode_OpenMap(&EC);
191 QCBOREncode_AddEncodedToMapN(&EC, -70000, Encoded);
192 QCBOREncode_CloseMap(&EC);
193 QCBOREncode_CloseArray(&EC);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800194
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800195 UsefulBufC Encoded2;
Laurence Lundblade0595e932018-11-02 22:22:47 +0700196 if(QCBOREncode_Finish(&EC, &Encoded2)) {
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530197 return -5;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800198 }
199 /*
200 [ // 0 1:3
201 451, // 1 1:2
202 { // 1 1:2 2:1
203 66: true // 2 1:1
204 },
205 { // 1 1:1 2:1
206 -70000: { // 2 1:1 2:1 3:1
207 66: true // 3 XXXXXX
208 }
209 }
210 ]
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800211
212
213
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800214 83 # array(3)
215 19 01C3 # unsigned(451)
216 A1 # map(1)
217 18 42 # unsigned(66)
218 F5 # primitive(21)
219 A1 # map(1)
220 3A 0001116F # negative(69999)
221 A1 # map(1)
222 18 42 # unsigned(66)
223 F5 # primitive(21)
224 */
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800225
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800226 // Decode it and see if it is OK
227 QCBORDecode_Init(&DC, Encoded2, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800228
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800229 // 0 1:3
230 QCBORDecode_GetNext(&DC, &Item);
231 if(Item.uDataType != QCBOR_TYPE_ARRAY || Item.val.uCount != 3) {
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530232 return -6;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800233 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800234
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800235 // 1 1:2
236 QCBORDecode_GetNext(&DC, &Item);
237 if(Item.uDataType != QCBOR_TYPE_INT64 || Item.val.uint64 != 451) {
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530238 return -7;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800239 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800240
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800241 // 1 1:2 2:1
242 QCBORDecode_GetNext(&DC, &Item);
243 if(Item.uDataType != QCBOR_TYPE_MAP || Item.val.uCount != 1) {
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530244 return -8;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800245 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800246
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800247 // 2 1:1
248 QCBORDecode_GetNext(&DC, &Item);
249 if(Item.uDataType != QCBOR_TYPE_TRUE) {
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530250 return -9;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800251 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800252
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800253 // 1 1:1 2:1
254 QCBORDecode_GetNext(&DC, &Item);
255 if(Item.uDataType != QCBOR_TYPE_MAP || Item.val.uCount != 1) {
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530256 return -10;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800257 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800258
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800259 // 2 1:1 2:1 3:1
260 QCBORDecode_GetNext(&DC, &Item);
Laurence Lundbladeee851742020-01-08 08:37:05 -0800261 if(Item.uDataType != QCBOR_TYPE_MAP ||
262 Item.val.uCount != 1 ||
263 Item.uLabelType != QCBOR_TYPE_INT64 ||
264 Item.label.int64 != -70000) {
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530265 return -11;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800266 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800267
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800268 // 3 XXXXXX
269 QCBORDecode_GetNext(&DC, &Item);
270 if(Item.uDataType != QCBOR_TYPE_TRUE || Item.uLabelType != QCBOR_TYPE_INT64 || Item.label.int64 != 66) {
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530271 return -12;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800272 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800273
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800274 if(QCBORDecode_Finish(&DC)) {
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530275 return -13;
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800276 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800277
Laurence Lundblade4d1ecba2018-10-12 21:22:30 +0800278 return 0;
279}
280
281
282
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530283static const uint8_t spExpectedEncodedAll[] = {
Laurence Lundblade3df8c7e2018-11-02 13:12:41 +0700284 0x98, 0x22, 0x66, 0x55, 0x49, 0x4e, 0x54, 0x36, 0x32, 0xd8,
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530285 0x64, 0x1a, 0x05, 0x5d, 0x23, 0x15, 0x65, 0x49, 0x4e, 0x54,
286 0x36, 0x34, 0xd8, 0x4c, 0x1b, 0x00, 0x00, 0x00, 0x12, 0x16,
287 0xaf, 0x2b, 0x15, 0x00, 0x38, 0x2b, 0xa4, 0x63, 0x4c, 0x42,
288 0x4c, 0x18, 0x4d, 0x23, 0x18, 0x58, 0x78, 0x1a, 0x4e, 0x45,
289 0x47, 0x4c, 0x42, 0x4c, 0x54, 0x48, 0x41, 0x54, 0x20, 0x49,
290 0x53, 0x20, 0x4b, 0x49, 0x4e, 0x44, 0x20, 0x4f, 0x46, 0x20,
291 0x4c, 0x4f, 0x4e, 0x47, 0x3b, 0x00, 0x00, 0x02, 0x2d, 0x9a,
292 0xc6, 0x94, 0x55, 0x3a, 0x05, 0xf5, 0xe0, 0xff, 0x3a, 0x2f,
Laurence Lundblade3df8c7e2018-11-02 13:12:41 +0700293 0xaf, 0x07, 0xff, 0xc1, 0x1a, 0x8e, 0x15, 0x1c, 0x8a,
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530294 0xa3, 0x74, 0x4c, 0x6f, 0x6e, 0x67, 0x4c, 0x69, 0x76, 0x65,
295 0x44, 0x65, 0x6e, 0x69, 0x73, 0x52, 0x69, 0x74, 0x63, 0x68,
296 0x69, 0x65, 0xc1, 0x1a, 0x53, 0x72, 0x4e, 0x00, 0x66, 0x74,
297 0x69, 0x6d, 0x65, 0x28, 0x29, 0xc1, 0x1a, 0x58, 0x0d, 0x41,
298 0x72, 0x39, 0x07, 0xb0, 0xc1, 0x1a, 0x58, 0x0d, 0x3f, 0x76,
299 0x42, 0xff, 0x00, 0xa3, 0x66, 0x62, 0x69, 0x6e, 0x62, 0x69,
300 0x6e, 0xda, 0x00, 0x01, 0x86, 0xa0, 0x41, 0x00, 0x66, 0x62,
301 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x43, 0x01, 0x02, 0x03, 0x00,
302 0x44, 0x04, 0x02, 0x03, 0xfe, 0x6f, 0x62, 0x61, 0x72, 0x20,
303 0x62, 0x61, 0x72, 0x20, 0x66, 0x6f, 0x6f, 0x20, 0x62, 0x61,
304 0x72, 0x64, 0x6f, 0x6f, 0x66, 0x0a, 0xd8, 0x20, 0x78, 0x6b,
305 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x73, 0x74, 0x61,
306 0x63, 0x6b, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77,
307 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x71, 0x75, 0x65, 0x73, 0x74,
308 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x32, 0x38, 0x30, 0x35, 0x39,
309 0x36, 0x39, 0x37, 0x2f, 0x68, 0x6f, 0x77, 0x2d, 0x64, 0x6f,
310 0x2d, 0x69, 0x2d, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x2d,
311 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x2d, 0x64, 0x65,
312 0x62, 0x75, 0x67, 0x2d, 0x61, 0x6e, 0x64, 0x2d, 0x72, 0x65,
313 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2d, 0x62, 0x75, 0x69, 0x6c,
314 0x64, 0x73, 0x2d, 0x69, 0x6e, 0x2d, 0x78, 0x63, 0x6f, 0x64,
315 0x65, 0x2d, 0x36, 0x2d, 0x37, 0x2d, 0x38, 0xd8, 0x22, 0x78,
316 0x1c, 0x59, 0x57, 0x35, 0x35, 0x49, 0x47, 0x4e, 0x68, 0x63,
317 0x6d, 0x35, 0x68, 0x62, 0x43, 0x42, 0x77, 0x62, 0x47, 0x56,
318 0x68, 0x63, 0x33, 0x56, 0x79, 0x5a, 0x51, 0x3d, 0x3d, 0xd8,
Laurence Lundblade4982f412020-09-18 23:02:18 -0700319 0x23, 0x67, 0x5b, 0x5e, 0x61, 0x62, 0x63, 0x5d, 0x2b, 0xd9,
320 0x01, 0x01, 0x59, 0x01, 0x57, 0x4d, 0x49, 0x4d, 0x45, 0x2d, 0x56,
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530321 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x31, 0x2e,
322 0x30, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d,
323 0x54, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x6d, 0x75, 0x6c, 0x74,
324 0x69, 0x70, 0x61, 0x72, 0x74, 0x2f, 0x6d, 0x69, 0x78, 0x65,
325 0x64, 0x3b, 0x0a, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72,
326 0x79, 0x3d, 0x22, 0x58, 0x58, 0x58, 0x58, 0x62, 0x6f, 0x75,
327 0x6e, 0x64, 0x61, 0x72, 0x79, 0x20, 0x74, 0x65, 0x78, 0x74,
328 0x22, 0x0a, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73,
329 0x20, 0x61, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61,
330 0x72, 0x74, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
331 0x20, 0x69, 0x6e, 0x20, 0x4d, 0x49, 0x4d, 0x45, 0x20, 0x66,
332 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x0a, 0x0a, 0x2d, 0x2d,
333 0x58, 0x58, 0x58, 0x58, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61,
334 0x72, 0x79, 0x20, 0x74, 0x65, 0x78, 0x74, 0x0a, 0x43, 0x6f,
335 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x54, 0x79, 0x70, 0x65,
336 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c, 0x61,
337 0x69, 0x6e, 0x0a, 0x0a, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69,
338 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79,
339 0x20, 0x74, 0x65, 0x78, 0x74, 0x0a, 0x0a, 0x2d, 0x2d, 0x58,
340 0x58, 0x58, 0x58, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72,
341 0x79, 0x20, 0x74, 0x65, 0x78, 0x74, 0x0a, 0x43, 0x6f, 0x6e,
342 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x54, 0x79, 0x70, 0x65, 0x3a,
343 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x69,
344 0x6e, 0x3b, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
345 0x2d, 0x44, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69,
346 0x6f, 0x6e, 0x3a, 0x20, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68,
347 0x6d, 0x65, 0x6e, 0x74, 0x3b, 0x0a, 0x66, 0x69, 0x6c, 0x65,
348 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x73, 0x74,
349 0x2e, 0x74, 0x78, 0x74, 0x22, 0x0a, 0x0a, 0x74, 0x68, 0x69,
350 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61,
351 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x20,
352 0x74, 0x65, 0x78, 0x74, 0x0a, 0x0a, 0x2d, 0x2d, 0x58, 0x58,
353 0x58, 0x58, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79,
354 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x2d, 0xae, 0x65, 0x23,
355 0x23, 0x23, 0x23, 0x23, 0x6f, 0x66, 0x6f, 0x6f, 0x20, 0x62,
356 0x61, 0x72, 0x20, 0x66, 0x6f, 0x6f, 0x20, 0x66, 0x6f, 0x6f,
357 0x64, 0x5f, 0x5f, 0x5f, 0x5f, 0x67, 0x66, 0x6f, 0x6f, 0x20,
358 0x62, 0x61, 0x72, 0x66, 0x28, 0x29, 0x28, 0x29, 0x28, 0x29,
359 0xd9, 0x03, 0xe8, 0x6b, 0x72, 0x61, 0x62, 0x20, 0x72, 0x61,
360 0x62, 0x20, 0x6f, 0x6f, 0x66, 0x16, 0x6f, 0x66, 0x6f, 0x6f,
361 0x20, 0x66, 0x6f, 0x6f, 0x20, 0x66, 0x6f, 0x6f, 0x20, 0x66,
362 0x6f, 0x6f, 0x62, 0x5e, 0x5e, 0x69, 0x6f, 0x6f, 0x6f, 0x6f,
363 0x6f, 0x6f, 0x6f, 0x6f, 0x66, 0x18, 0x63, 0x6d, 0x66, 0x66,
364 0x66, 0x66, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f,
365 0x66, 0x63, 0x52, 0x46, 0x43, 0xd8, 0x20, 0x78, 0x31, 0x68,
366 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x74, 0x6f, 0x6f,
367 0x6c, 0x73, 0x2e, 0x69, 0x65, 0x74, 0x66, 0x2e, 0x6f, 0x72,
368 0x67, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x2f, 0x72, 0x66, 0x63,
369 0x37, 0x30, 0x34, 0x39, 0x23, 0x73, 0x65, 0x63, 0x74, 0x69,
370 0x6f, 0x6e, 0x2d, 0x32, 0x2e, 0x34, 0x2e, 0x35, 0x18, 0x89,
371 0xd8, 0x20, 0x6f, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
372 0x63, 0x62, 0x6f, 0x72, 0x2e, 0x6d, 0x65, 0x2f, 0x68, 0x77,
373 0x68, 0x65, 0x6e, 0x69, 0x6d, 0x36, 0x34, 0xd8, 0x22, 0x6c,
374 0x63, 0x47, 0x78, 0x6c, 0x59, 0x58, 0x4e, 0x31, 0x63, 0x6d,
375 0x55, 0x75, 0x18, 0x40, 0xd8, 0x22, 0x68, 0x63, 0x33, 0x56,
376 0x79, 0x5a, 0x53, 0x34, 0x3d, 0x64, 0x70, 0x6f, 0x70, 0x6f,
377 0xd8, 0x23, 0x68, 0x31, 0x30, 0x30, 0x5c, 0x73, 0x2a, 0x6d,
378 0x6b, 0x38, 0x32, 0xd8, 0x23, 0x66, 0x70, 0x65, 0x72, 0x6c,
Laurence Lundblade4982f412020-09-18 23:02:18 -0700379 0x5c, 0x42, 0x63, 0x4e, 0x65, 0x64, 0xd9, 0x01, 0x01, 0x59, 0x01,
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530380 0x57, 0x4d, 0x49, 0x4d, 0x45, 0x2d, 0x56, 0x65, 0x72, 0x73,
381 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x31, 0x2e, 0x30, 0x0a, 0x43,
382 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x54, 0x79, 0x70,
383 0x65, 0x3a, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61,
384 0x72, 0x74, 0x2f, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x3b, 0x0a,
385 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x3d, 0x22,
386 0x58, 0x58, 0x58, 0x58, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61,
387 0x72, 0x79, 0x20, 0x74, 0x65, 0x78, 0x74, 0x22, 0x0a, 0x0a,
388 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20,
389 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x20,
390 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x69, 0x6e,
391 0x20, 0x4d, 0x49, 0x4d, 0x45, 0x20, 0x66, 0x6f, 0x72, 0x6d,
392 0x61, 0x74, 0x2e, 0x0a, 0x0a, 0x2d, 0x2d, 0x58, 0x58, 0x58,
393 0x58, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x20,
394 0x74, 0x65, 0x78, 0x74, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x65,
395 0x6e, 0x74, 0x2d, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74,
396 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x0a,
397 0x0a, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74,
398 0x68, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x74, 0x65,
399 0x78, 0x74, 0x0a, 0x0a, 0x2d, 0x2d, 0x58, 0x58, 0x58, 0x58,
400 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x20, 0x74,
401 0x65, 0x78, 0x74, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
402 0x74, 0x2d, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65,
403 0x78, 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x3b, 0x0a,
404 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x44, 0x69,
405 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a,
406 0x20, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e,
407 0x74, 0x3b, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d,
408 0x65, 0x3d, 0x22, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x74, 0x78,
409 0x74, 0x22, 0x0a, 0x0a, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69,
410 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x61,
411 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x65, 0x78,
412 0x74, 0x0a, 0x0a, 0x2d, 0x2d, 0x58, 0x58, 0x58, 0x58, 0x62,
413 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x20, 0x74, 0x65,
Laurence Lundblade4982f412020-09-18 23:02:18 -0700414 0x78, 0x74, 0x2d, 0x2d, 0x0a, 0xd9, 0x01, 0x01, 0x59, 0x01, 0x57,
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530415 0x4d, 0x49, 0x4d, 0x45, 0x2d, 0x56, 0x65, 0x72, 0x73, 0x69,
416 0x6f, 0x6e, 0x3a, 0x20, 0x31, 0x2e, 0x30, 0x0a, 0x43, 0x6f,
417 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x54, 0x79, 0x70, 0x65,
418 0x3a, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72,
419 0x74, 0x2f, 0x6d, 0x69, 0x78, 0x65, 0x64, 0x3b, 0x0a, 0x62,
420 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x3d, 0x22, 0x58,
421 0x58, 0x58, 0x58, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72,
422 0x79, 0x20, 0x74, 0x65, 0x78, 0x74, 0x22, 0x0a, 0x0a, 0x54,
423 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x6d,
424 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6d,
425 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x69, 0x6e, 0x20,
426 0x4d, 0x49, 0x4d, 0x45, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61,
427 0x74, 0x2e, 0x0a, 0x0a, 0x2d, 0x2d, 0x58, 0x58, 0x58, 0x58,
428 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x20, 0x74,
429 0x65, 0x78, 0x74, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
430 0x74, 0x2d, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65,
431 0x78, 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x0a, 0x0a,
432 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68,
433 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x74, 0x65, 0x78,
434 0x74, 0x0a, 0x0a, 0x2d, 0x2d, 0x58, 0x58, 0x58, 0x58, 0x62,
435 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x20, 0x74, 0x65,
436 0x78, 0x74, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
437 0x2d, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78,
438 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x3b, 0x0a, 0x43,
439 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x44, 0x69, 0x73,
440 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20,
441 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74,
442 0x3b, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65,
443 0x3d, 0x22, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x74, 0x78, 0x74,
444 0x22, 0x0a, 0x0a, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73,
445 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x74, 0x74, 0x61, 0x63,
446 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74,
447 0x0a, 0x0a, 0x2d, 0x2d, 0x58, 0x58, 0x58, 0x58, 0x62, 0x6f,
448 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x20, 0x74, 0x65, 0x78,
449 0x74, 0x2d, 0x2d, 0xc0, 0x74, 0x32, 0x30, 0x30, 0x33, 0x2d,
450 0x31, 0x32, 0x2d, 0x31, 0x33, 0x54, 0x31, 0x38, 0x3a, 0x33,
451 0x30, 0x3a, 0x30, 0x32, 0x5a, 0xa2, 0x68, 0x42, 0x65, 0x64,
452 0x20, 0x74, 0x69, 0x6d, 0x65, 0xc0, 0x78, 0x1c, 0x32, 0x30,
453 0x30, 0x33, 0x2d, 0x31, 0x32, 0x2d, 0x31, 0x33, 0x54, 0x31,
454 0x38, 0x3a, 0x33, 0x30, 0x3a, 0x30, 0x32, 0x2e, 0x32, 0x35,
455 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0x18, 0x58, 0xc0, 0x78,
456 0x1c, 0x32, 0x30, 0x30, 0x33, 0x2d, 0x31, 0x32, 0x2d, 0x31,
457 0x33, 0x54, 0x31, 0x38, 0x3a, 0x33, 0x30, 0x3a, 0x30, 0x32,
458 0x2e, 0x32, 0x35, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xf7,
459 0xa3, 0x64, 0x64, 0x61, 0x72, 0x65, 0xd8, 0x42, 0xf5, 0x62,
460 0x75, 0x75, 0xf4, 0x1a, 0x00, 0x0b, 0x41, 0x62, 0xf6, 0x80,
461 0xa3, 0x78, 0x1c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x61,
462 0x6e, 0x64, 0x20, 0x74, 0x61, 0x67, 0x67, 0x65, 0x64, 0x20,
463 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x61, 0x72, 0x72, 0x61,
464 0x79, 0xd9, 0x04, 0x45, 0x80, 0x65, 0x61, 0x6c, 0x61, 0x62,
465 0x6c, 0x80, 0x18, 0x2a, 0x80, 0xa1, 0x68, 0x69, 0x6e, 0x20,
466 0x61, 0x20, 0x6d, 0x61, 0x70, 0xa1, 0x19, 0x15, 0xb4, 0xa1,
467 0x6e, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x69, 0x6e, 0x20, 0x61,
468 0x20, 0x69, 0x6e, 0x20, 0x61, 0xd9, 0x23, 0x7f, 0xa0, 0xa5,
469 0x62, 0x73, 0x31, 0xd8, 0x58, 0xf8, 0xff, 0x62, 0x73, 0x32,
470 0xe0, 0x62, 0x73, 0x33, 0xd8, 0x58, 0xf8, 0x21, 0x1a, 0x05,
471 0x44, 0x8c, 0x06, 0xd8, 0x58, 0xf8, 0xff, 0x18, 0x59, 0xd8,
472 0x58, 0xf3, 0xd8, 0x25, 0x50, 0x53, 0x4d, 0x41, 0x52, 0x54,
473 0x43, 0x53, 0x4c, 0x54, 0x54, 0x43, 0x46, 0x49, 0x43, 0x41,
474 0x32, 0xa2, 0x64, 0x55, 0x55, 0x55, 0x55, 0xd8, 0x25, 0x50,
475 0x53, 0x4d, 0x41, 0x52, 0x54, 0x43, 0x53, 0x4c, 0x54, 0x54,
476 0x43, 0x46, 0x49, 0x43, 0x41, 0x32, 0x18, 0x63, 0xd8, 0x25,
477 0x50, 0x53, 0x4d, 0x41, 0x52, 0x54, 0x43, 0x53, 0x4c, 0x54,
478 0x54, 0x43, 0x46, 0x49, 0x43, 0x41, 0x32, 0xf5, 0xf4, 0xa2,
479 0x71, 0x47, 0x65, 0x6f, 0x72, 0x67, 0x65, 0x20, 0x69, 0x73,
480 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x6e, 0xf5, 0x19,
481 0x10, 0x41, 0xf5, 0xC2, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00,
482 0x00, 0x00, 0x00, 0x00, 0xC3, 0x49, 0x01, 0x00, 0x00, 0x00,
483 0x00, 0x00, 0x00, 0x00, 0x00, 0xA4, 0x63, 0x42, 0x4E, 0x2B,
484 0xC2, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
485 0x00, 0x18, 0x40, 0xC2, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00,
486 0x00, 0x00, 0x00, 0x00, 0x63, 0x42, 0x4E, 0x2D, 0xC3, 0x49,
487 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
488 0x3F, 0xC3, 0x49, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
489 0x00, 0x00
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800490};
491
492
493static const char *szMIME = "\
494MIME-Version: 1.0\n\
495Content-Type: multipart/mixed;\n\
496boundary=\"XXXXboundary text\"\n\
497\n\
498This is a multipart message in MIME format.\n\
499\n\
500--XXXXboundary text\n\
501Content-Type: text/plain\n\
502\n\
503this is the body text\n\
504\n\
505--XXXXboundary text\n\
506Content-Type: text/plain;\n\
507Content-Disposition: attachment;\n\
508filename=\"test.txt\"\n\
509\n\
510this is the attachment text\n\
511\n\
512--XXXXboundary text--";
513
514
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800515int32_t AllAddMethodsTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800516{
Laurence Lundblade323f8a92020-09-06 19:43:09 -0700517 // Improvement: this test should be broken down into several so it is more
Laurence Lundbladeee851742020-01-08 08:37:05 -0800518 // managable. Tags and labels could be more sensible
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800519 QCBOREncodeContext ECtx;
520 int nReturn = 0;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800521
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530522 QCBOREncode_Init(&ECtx, UsefulBuf_FROM_BYTE_ARRAY(spBigBuf));
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800523
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800524 QCBOREncode_OpenArray(&ECtx);
525
Laurence Lundbladeee851742020-01-08 08:37:05 -0800526 // Some ints that are tagged and have strings preceeding them
527 // (not labels becase it is not a map)
Laurence Lundblade067035b2018-11-28 17:35:25 -0800528 QCBOREncode_AddSZString(&ECtx, "UINT62");
Laurence Lundbladecafcfe12018-10-31 21:59:50 +0700529 QCBOREncode_AddTag(&ECtx, 100);
Laurence Lundblade067035b2018-11-28 17:35:25 -0800530 QCBOREncode_AddUInt64(&ECtx, 89989909);
531 QCBOREncode_AddSZString(&ECtx, "INT64");
Laurence Lundbladecafcfe12018-10-31 21:59:50 +0700532 QCBOREncode_AddTag(&ECtx, 76);
Laurence Lundblade067035b2018-11-28 17:35:25 -0800533 QCBOREncode_AddInt64(&ECtx, 77689989909);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800534 QCBOREncode_AddUInt64(&ECtx,0);
535 QCBOREncode_AddInt64(&ECtx, -44);
536
537 // ints that go in maps
538 QCBOREncode_OpenMap(&ECtx);
539 QCBOREncode_AddUInt64ToMap(&ECtx, "LBL", 77);
540 QCBOREncode_AddUInt64ToMapN(&ECtx, -4, 88);
541 QCBOREncode_AddInt64ToMap(&ECtx, "NEGLBLTHAT IS KIND OF LONG", -2394893489238);
542 QCBOREncode_AddInt64ToMapN(&ECtx, -100000000, -800000000);
543 QCBOREncode_CloseMap(&ECtx);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800544
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800545 // Epoch Date
546 QCBOREncode_AddDateEpoch(&ECtx, 2383748234);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800547
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800548 // Epoch date with labels
549 QCBOREncode_OpenMap(&ECtx);
Laurence Lundblade067035b2018-11-28 17:35:25 -0800550 QCBOREncode_AddDateEpochToMap(&ECtx, "LongLiveDenisRitchie", 1400000000);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800551 QCBOREncode_AddDateEpochToMap(&ECtx, "time()", 1477263730);
552 QCBOREncode_AddDateEpochToMapN(&ECtx, -1969, 1477263222);
553 QCBOREncode_CloseMap(&ECtx);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800554
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800555 // Binary blobs
556 QCBOREncode_AddBytes(&ECtx, ((UsefulBufC) {(uint8_t []){0xff, 0x00}, 2}));
557
558 // binary blobs in maps
559 QCBOREncode_OpenMap(&ECtx);
Laurence Lundblade067035b2018-11-28 17:35:25 -0800560 QCBOREncode_AddSZString(&ECtx, "binbin");
Laurence Lundbladecafcfe12018-10-31 21:59:50 +0700561 QCBOREncode_AddTag(&ECtx, 100000);
Laurence Lundblade067035b2018-11-28 17:35:25 -0800562 QCBOREncode_AddBytes(&ECtx, ((UsefulBufC) {(uint8_t []){0x00}, 1}));
563 QCBOREncode_AddBytesToMap(&ECtx, "blabel", ((UsefulBufC) {(uint8_t []){0x01, 0x02, 0x03}, 3}));
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800564 QCBOREncode_AddBytesToMapN(&ECtx, 0, ((UsefulBufC){(uint8_t []){0x04, 0x02, 0x03, 0xfe}, 4}));
565 QCBOREncode_CloseMap(&ECtx);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800566
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800567 // text blobs
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530568 QCBOREncode_AddText(&ECtx, UsefulBuf_FROM_SZ_LITERAL("bar bar foo bar"));
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800569 QCBOREncode_AddSZString(&ECtx, "oof\n");
Laurence Lundbladeee851742020-01-08 08:37:05 -0800570 const char *szURL =
571 "http://stackoverflow.com/questions/28059697/how-do-i-toggle-between-debug-and-release-builds-in-xcode-6-7-8";
572 QCBOREncode_AddURI(&ECtx, UsefulBuf_FromSZ(szURL));
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530573 QCBOREncode_AddB64Text(&ECtx, UsefulBuf_FROM_SZ_LITERAL("YW55IGNhcm5hbCBwbGVhc3VyZQ=="));
574 QCBOREncode_AddRegex(&ECtx, UsefulBuf_FROM_SZ_LITERAL("[^abc]+"));
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530575 QCBOREncode_AddMIMEData(&ECtx, UsefulBuf_FromSZ(szMIME));
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800576
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800577 // text blobs in maps
578 QCBOREncode_OpenMap(&ECtx);
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530579 QCBOREncode_AddTextToMap(&ECtx, "#####", UsefulBuf_FROM_SZ_LITERAL("foo bar foo foo"));
Laurence Lundblade067035b2018-11-28 17:35:25 -0800580 QCBOREncode_AddTextToMap(&ECtx, "____", UsefulBuf_FROM_SZ_LITERAL("foo bar"));
581 QCBOREncode_AddSZString(&ECtx, "()()()");
Laurence Lundbladecafcfe12018-10-31 21:59:50 +0700582 QCBOREncode_AddTag(&ECtx, 1000);
Laurence Lundblade067035b2018-11-28 17:35:25 -0800583 QCBOREncode_AddSZString(&ECtx, "rab rab oof");
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530584 QCBOREncode_AddTextToMapN(&ECtx,22, UsefulBuf_FROM_SZ_LITERAL("foo foo foo foo"));
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800585 QCBOREncode_AddSZStringToMap(&ECtx, "^^", "oooooooof");
586 QCBOREncode_AddSZStringToMapN(&ECtx, 99, "ffffoooooooof");
Laurence Lundbladeee851742020-01-08 08:37:05 -0800587 QCBOREncode_AddURIToMap(&ECtx,
588 "RFC",
589 UsefulBuf_FROM_SZ_LITERAL("https://tools.ietf.org/html/rfc7049#section-2.4.5"));
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530590 QCBOREncode_AddURIToMapN(&ECtx, 0x89, UsefulBuf_FROM_SZ_LITERAL("http://cbor.me/"));
591 QCBOREncode_AddB64TextToMap(&ECtx, "whenim64", UsefulBuf_FROM_SZ_LITERAL("cGxlYXN1cmUu"));
592 QCBOREncode_AddB64TextToMapN(&ECtx, 64, UsefulBuf_FROM_SZ_LITERAL("c3VyZS4="));
593 QCBOREncode_AddRegexToMap(&ECtx, "popo", UsefulBuf_FROM_SZ_LITERAL("100\\s*mk")); // x code string literal bug
594 QCBOREncode_AddRegexToMapN(&ECtx, -51, UsefulBuf_FROM_SZ_LITERAL("perl\\B")); // x code string literal bug
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530595 QCBOREncode_AddMIMEDataToMap(&ECtx, "Ned", UsefulBuf_FromSZ(szMIME));
596 QCBOREncode_AddMIMEDataToMapN(&ECtx, 10, UsefulBuf_FromSZ(szMIME));
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800597 QCBOREncode_CloseMap(&ECtx);
598
599 // Date strings
600 QCBOREncode_AddDateString(&ECtx, "2003-12-13T18:30:02Z");
601 QCBOREncode_OpenMap(&ECtx);
602 QCBOREncode_AddDateStringToMap(&ECtx, "Bed time", "2003-12-13T18:30:02.25+01:00");
603 QCBOREncode_AddDateStringToMapN(&ECtx, 88, "2003-12-13T18:30:02.25+01:00");
604 QCBOREncode_CloseMap(&ECtx);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800605
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800606 // true / false ...
607 QCBOREncode_AddSimple(&ECtx, CBOR_SIMPLEV_UNDEF);
608 QCBOREncode_OpenMap(&ECtx);
Laurence Lundblade067035b2018-11-28 17:35:25 -0800609 QCBOREncode_AddSZString(&ECtx, "dare");
Laurence Lundbladecafcfe12018-10-31 21:59:50 +0700610 QCBOREncode_AddTag(&ECtx, 66);
Laurence Lundblade067035b2018-11-28 17:35:25 -0800611 QCBOREncode_AddBool(&ECtx, true);
612 QCBOREncode_AddBoolToMap(&ECtx, "uu", false);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800613 QCBOREncode_AddSimpleToMapN(&ECtx, 737634, CBOR_SIMPLEV_NULL);
614 QCBOREncode_CloseMap(&ECtx);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800615
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800616 // opening an array
617 QCBOREncode_OpenArray(&ECtx);
618 QCBOREncode_CloseArray(&ECtx);
619
620 // opening arrays in a map
621 QCBOREncode_OpenMap(&ECtx);
Laurence Lundblade067035b2018-11-28 17:35:25 -0800622 QCBOREncode_AddSZString(&ECtx, "label and tagged empty array");
Laurence Lundbladecafcfe12018-10-31 21:59:50 +0700623 QCBOREncode_AddTag(&ECtx, 1093);
Laurence Lundblade067035b2018-11-28 17:35:25 -0800624 QCBOREncode_OpenArray(&ECtx);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800625 QCBOREncode_CloseArray(&ECtx);
626 QCBOREncode_OpenArrayInMap(&ECtx, "alabl");
627 QCBOREncode_CloseArray(&ECtx);
628 QCBOREncode_OpenArrayInMapN(&ECtx, 42);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800629 QCBOREncode_CloseArray(&ECtx);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800630 QCBOREncode_CloseMap(&ECtx);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800631
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800632 // opening maps with labels and tagging
633 QCBOREncode_OpenMap(&ECtx);
634 QCBOREncode_OpenMapInMap(&ECtx, "in a map");
635 QCBOREncode_OpenMapInMapN(&ECtx, 5556);
Laurence Lundblade067035b2018-11-28 17:35:25 -0800636 QCBOREncode_AddSZString(&ECtx, "in a in a in a");
Laurence Lundbladecafcfe12018-10-31 21:59:50 +0700637 QCBOREncode_AddTag(&ECtx, 9087);
Laurence Lundblade067035b2018-11-28 17:35:25 -0800638 QCBOREncode_OpenMap(&ECtx);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800639 QCBOREncode_CloseMap(&ECtx);
640 QCBOREncode_CloseMap(&ECtx);
641 QCBOREncode_CloseMap(&ECtx);
642 QCBOREncode_CloseMap(&ECtx);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800643
Laurence Lundblade067035b2018-11-28 17:35:25 -0800644
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800645 // Extended simple values (these are not standard...)
646 QCBOREncode_OpenMap(&ECtx);
Laurence Lundblade067035b2018-11-28 17:35:25 -0800647 QCBOREncode_AddSZString(&ECtx, "s1");
Laurence Lundbladecafcfe12018-10-31 21:59:50 +0700648 QCBOREncode_AddTag(&ECtx, 88);
Laurence Lundblade067035b2018-11-28 17:35:25 -0800649 QCBOREncode_AddSimple(&ECtx, 255);
650 QCBOREncode_AddSimpleToMap(&ECtx, "s2", 0);
651 QCBOREncode_AddSZString(&ECtx, "s3");
Laurence Lundbladecafcfe12018-10-31 21:59:50 +0700652 QCBOREncode_AddTag(&ECtx, 88);
Laurence Lundblade067035b2018-11-28 17:35:25 -0800653 QCBOREncode_AddSimple(&ECtx, 33);
654 QCBOREncode_AddInt64(&ECtx, 88378374); // label before tag
Laurence Lundbladecafcfe12018-10-31 21:59:50 +0700655 QCBOREncode_AddTag(&ECtx, 88);
Laurence Lundblade067035b2018-11-28 17:35:25 -0800656 QCBOREncode_AddSimple(&ECtx, 255);
657 QCBOREncode_AddInt64(&ECtx, 89); // label before tag
Laurence Lundbladecafcfe12018-10-31 21:59:50 +0700658 QCBOREncode_AddTag(&ECtx, 88);
Laurence Lundblade067035b2018-11-28 17:35:25 -0800659 QCBOREncode_AddSimple(&ECtx, 19);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800660 QCBOREncode_CloseMap(&ECtx);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800661
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800662 // UUIDs
Laurence Lundbladeee851742020-01-08 08:37:05 -0800663 static const uint8_t ppppUUID[] = {0x53, 0x4D, 0x41, 0x52, 0x54, 0x43,
664 0x53, 0x4C, 0x54, 0x54, 0x43, 0x46,
665 0x49, 0x43, 0x41, 0x32};
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800666 const UsefulBufC XXUUID = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(ppppUUID);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800667 QCBOREncode_AddBinaryUUID(&ECtx, XXUUID);
668 QCBOREncode_OpenMap(&ECtx);
669 QCBOREncode_AddBinaryUUIDToMap(&ECtx, "UUUU", XXUUID);
670 QCBOREncode_AddBinaryUUIDToMapN(&ECtx, 99, XXUUID);
671 QCBOREncode_CloseMap(&ECtx);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800672
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800673 // Bool
674 QCBOREncode_AddBool(&ECtx, true);
675 QCBOREncode_AddBool(&ECtx, false);
676 QCBOREncode_OpenMap(&ECtx);
677 QCBOREncode_AddBoolToMap(&ECtx, "George is the man", true);
678 QCBOREncode_AddBoolToMapN(&ECtx, 010101, true);
679 QCBOREncode_CloseMap(&ECtx);
680
681
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530682 static const uint8_t pBignum[] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -0800683 const UsefulBufC BIGNUM = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pBignum);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800684 QCBOREncode_AddPositiveBignum(&ECtx, BIGNUM);
685 QCBOREncode_AddNegativeBignum(&ECtx, BIGNUM);
686 QCBOREncode_OpenMap(&ECtx);
687 QCBOREncode_AddPositiveBignumToMap(&ECtx, "BN+", BIGNUM);
688 QCBOREncode_AddPositiveBignumToMapN(&ECtx, 64, BIGNUM);
689 QCBOREncode_AddNegativeBignumToMap(&ECtx, "BN-", BIGNUM);
690 QCBOREncode_AddNegativeBignumToMapN(&ECtx, -64, BIGNUM);
691 QCBOREncode_CloseMap(&ECtx);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800692
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800693 QCBOREncode_CloseArray(&ECtx);
694
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530695 UsefulBufC Enc;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800696
Laurence Lundblade0595e932018-11-02 22:22:47 +0700697 if(QCBOREncode_Finish(&ECtx, &Enc)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800698 nReturn = -1;
699 goto Done;
700 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800701
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530702 if(CheckResults(Enc, spExpectedEncodedAll))
703 nReturn = -2;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800704
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800705Done:
706 return nReturn;
707}
708
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530709/*
Jan Jongboom5d827882019-08-07 12:51:15 +0200710 98 30 # array(48)
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530711 3B 7FFFFFFFFFFFFFFF # negative(9223372036854775807)
712 3B 0000000100000000 # negative(4294967296)
713 3A FFFFFFFF # negative(4294967295)
714 3A FFFFFFFE # negative(4294967294)
715 3A FFFFFFFD # negative(4294967293)
716 3A 7FFFFFFF # negative(2147483647)
717 3A 7FFFFFFE # negative(2147483646)
718 3A 00010001 # negative(65537)
719 3A 00010000 # negative(65536)
720 39 FFFF # negative(65535)
721 39 FFFE # negative(65534)
722 39 FFFD # negative(65533)
723 39 0100 # negative(256)
724 38 FF # negative(255)
725 38 FE # negative(254)
726 38 FD # negative(253)
727 38 18 # negative(24)
728 37 # negative(23)
729 36 # negative(22)
730 20 # negative(0)
731 00 # unsigned(0)
732 00 # unsigned(0)
733 01 # unsigned(1)
734 16 # unsigned(22)
735 17 # unsigned(23)
736 18 18 # unsigned(24)
737 18 19 # unsigned(25)
738 18 1A # unsigned(26)
Jan Jongboom5d827882019-08-07 12:51:15 +0200739 18 1F # unsigned(31)
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530740 18 FE # unsigned(254)
741 18 FF # unsigned(255)
742 19 0100 # unsigned(256)
743 19 0101 # unsigned(257)
744 19 FFFE # unsigned(65534)
745 19 FFFF # unsigned(65535)
746 1A 00010000 # unsigned(65536)
747 1A 00010001 # unsigned(65537)
748 1A 00010002 # unsigned(65538)
749 1A 7FFFFFFF # unsigned(2147483647)
750 1A 7FFFFFFF # unsigned(2147483647)
751 1A 80000000 # unsigned(2147483648)
752 1A 80000001 # unsigned(2147483649)
753 1A FFFFFFFE # unsigned(4294967294)
754 1A FFFFFFFF # unsigned(4294967295)
755 1B 0000000100000000 # unsigned(4294967296)
756 1B 0000000100000001 # unsigned(4294967297)
757 1B 7FFFFFFFFFFFFFFF # unsigned(9223372036854775807)
758 1B FFFFFFFFFFFFFFFF # unsigned(18446744073709551615)
759 */
760static const uint8_t spExpectedEncodedInts[] = {
Jan Jongboom5d827882019-08-07 12:51:15 +0200761 0x98, 0x30, 0x3b, 0x7f, 0xff, 0xff, 0xff, 0xff,
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800762 0xff, 0xff, 0xff, 0x3b, 0x00, 0x00, 0x00, 0x01,
763 0x00, 0x00, 0x00, 0x00, 0x3a, 0xff, 0xff, 0xff,
764 0xff, 0x3a, 0xff, 0xff, 0xff, 0xfe, 0x3a, 0xff,
765 0xff, 0xff, 0xfd, 0x3a, 0x7f, 0xff, 0xff, 0xff,
766 0x3a, 0x7f, 0xff, 0xff, 0xfe, 0x3a, 0x00, 0x01,
767 0x00, 0x01, 0x3a, 0x00, 0x01, 0x00, 0x00, 0x39,
768 0xff, 0xff, 0x39, 0xff, 0xfe, 0x39, 0xff, 0xfd,
769 0x39, 0x01, 0x00, 0x38, 0xff, 0x38, 0xfe, 0x38,
770 0xfd, 0x38, 0x18, 0x37, 0x36, 0x20, 0x00, 0x00,
771 0x01, 0x16, 0x17, 0x18, 0x18, 0x18, 0x19, 0x18,
Jan Jongboom5d827882019-08-07 12:51:15 +0200772 0x1a, 0x18, 0x1f, 0x18, 0xfe, 0x18, 0xff, 0x19,
773 0x01, 0x00, 0x19, 0x01, 0x01, 0x19, 0xff, 0xfe,
774 0x19, 0xff, 0xff, 0x1a, 0x00, 0x01, 0x00, 0x00,
775 0x1a, 0x00, 0x01, 0x00, 0x01, 0x1a, 0x00, 0x01,
776 0x00, 0x02, 0x1a, 0x7f, 0xff, 0xff, 0xff, 0x1a,
777 0x7f, 0xff, 0xff, 0xff, 0x1a, 0x80, 0x00, 0x00,
778 0x00, 0x1a, 0x80, 0x00, 0x00, 0x01, 0x1a, 0xff,
779 0xff, 0xff, 0xfe, 0x1a, 0xff, 0xff, 0xff, 0xff,
780 0x1b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
781 0x00, 0x1b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
782 0x00, 0x01, 0x1b, 0x7f, 0xff, 0xff, 0xff, 0xff,
783 0xff, 0xff, 0xff, 0x1b, 0xff, 0xff, 0xff, 0xff,
784 0xff, 0xff, 0xff, 0xff};
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800785
786/*
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800787
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800788 Test the generation of integers. This also ends up testing
789 encoding of all the different lengths. It encodes integers
790 of many lengths and values, especially around the boundaries
791 for different types of integers. It compares the output
792 to expected values generated from http://cbor.me.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800793
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800794 */
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800795int32_t IntegerValuesTest1()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800796{
797 QCBOREncodeContext ECtx;
798 int nReturn = 0;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800799
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530800 QCBOREncode_Init(&ECtx, UsefulBuf_FROM_BYTE_ARRAY(spBigBuf));
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800801 QCBOREncode_OpenArray(&ECtx);
802
803 QCBOREncode_AddInt64(&ECtx, -9223372036854775807LL - 1);
804 QCBOREncode_AddInt64(&ECtx, -4294967297);
805 QCBOREncode_AddInt64(&ECtx, -4294967296);
806 QCBOREncode_AddInt64(&ECtx, -4294967295);
807 QCBOREncode_AddInt64(&ECtx, -4294967294);
808 QCBOREncode_AddInt64(&ECtx, -2147483648);
809 QCBOREncode_AddInt64(&ECtx, -2147483647);
810 QCBOREncode_AddInt64(&ECtx, -65538);
811 QCBOREncode_AddInt64(&ECtx, -65537);
812 QCBOREncode_AddInt64(&ECtx, -65536);
813 QCBOREncode_AddInt64(&ECtx, -65535);
814 QCBOREncode_AddInt64(&ECtx, -65534);
815 QCBOREncode_AddInt64(&ECtx, -257);
816 QCBOREncode_AddInt64(&ECtx, -256);
817 QCBOREncode_AddInt64(&ECtx, -255);
818 QCBOREncode_AddInt64(&ECtx, -254);
819 QCBOREncode_AddInt64(&ECtx, -25);
820 QCBOREncode_AddInt64(&ECtx, -24);
821 QCBOREncode_AddInt64(&ECtx, -23);
822 QCBOREncode_AddInt64(&ECtx, -1);
823 QCBOREncode_AddInt64(&ECtx, 0);
824 QCBOREncode_AddUInt64(&ECtx, 0ULL);
825 QCBOREncode_AddInt64(&ECtx, 1);
826 QCBOREncode_AddInt64(&ECtx, 22);
827 QCBOREncode_AddInt64(&ECtx, 23);
828 QCBOREncode_AddInt64(&ECtx, 24);
829 QCBOREncode_AddInt64(&ECtx, 25);
830 QCBOREncode_AddInt64(&ECtx, 26);
Jan Jongboom5d827882019-08-07 12:51:15 +0200831 QCBOREncode_AddInt64(&ECtx, 31);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800832 QCBOREncode_AddInt64(&ECtx, 254);
833 QCBOREncode_AddInt64(&ECtx, 255);
834 QCBOREncode_AddInt64(&ECtx, 256);
835 QCBOREncode_AddInt64(&ECtx, 257);
836 QCBOREncode_AddInt64(&ECtx, 65534);
837 QCBOREncode_AddInt64(&ECtx, 65535);
838 QCBOREncode_AddInt64(&ECtx, 65536);
839 QCBOREncode_AddInt64(&ECtx, 65537);
840 QCBOREncode_AddInt64(&ECtx, 65538);
841 QCBOREncode_AddInt64(&ECtx, 2147483647);
842 QCBOREncode_AddInt64(&ECtx, 2147483647);
843 QCBOREncode_AddInt64(&ECtx, 2147483648);
844 QCBOREncode_AddInt64(&ECtx, 2147483649);
845 QCBOREncode_AddInt64(&ECtx, 4294967294);
846 QCBOREncode_AddInt64(&ECtx, 4294967295);
847 QCBOREncode_AddInt64(&ECtx, 4294967296);
848 QCBOREncode_AddInt64(&ECtx, 4294967297);
849 QCBOREncode_AddInt64(&ECtx, 9223372036854775807LL);
850 QCBOREncode_AddUInt64(&ECtx, 18446744073709551615ULL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800851
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800852 QCBOREncode_CloseArray(&ECtx);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800853
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530854 UsefulBufC Enc;
Laurence Lundblade0595e932018-11-02 22:22:47 +0700855 if(QCBOREncode_Finish(&ECtx, &Enc)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800856 nReturn = -1;
857 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800858
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530859 if(CheckResults(Enc, spExpectedEncodedInts))
860 return -2;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800861
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800862 return(nReturn);
863}
864
865
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530866/*
867 85 # array(5)
868 F5 # primitive(21)
869 F4 # primitive(20)
870 F6 # primitive(22)
871 F7 # primitive(23)
872 A1 # map(1)
873 65 # text(5)
874 554E446566 # "UNDef"
875 F7 # primitive(23)
876 */
877static const uint8_t spExpectedEncodedSimple[] = {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800878 0x85, 0xf5, 0xf4, 0xf6, 0xf7, 0xa1, 0x65, 0x55, 0x4e, 0x44, 0x65, 0x66, 0xf7};
879
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800880int32_t SimpleValuesTest1()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800881{
882 QCBOREncodeContext ECtx;
883 int nReturn = 0;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800884
Laurence Lundblade4fe9f312018-10-22 10:22:39 +0530885 QCBOREncode_Init(&ECtx, UsefulBuf_FROM_BYTE_ARRAY(spBigBuf));
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800886 QCBOREncode_OpenArray(&ECtx);
Laurence Lundbladec6ec7ef2018-12-04 10:45:06 +0900887
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800888 QCBOREncode_AddSimple(&ECtx, CBOR_SIMPLEV_TRUE);
889 QCBOREncode_AddSimple(&ECtx, CBOR_SIMPLEV_FALSE);
890 QCBOREncode_AddSimple(&ECtx, CBOR_SIMPLEV_NULL);
891 QCBOREncode_AddSimple(&ECtx, CBOR_SIMPLEV_UNDEF);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800892
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800893 QCBOREncode_OpenMap(&ECtx);
894
895 QCBOREncode_AddSimpleToMap(&ECtx, "UNDef", CBOR_SIMPLEV_UNDEF);
896 QCBOREncode_CloseMap(&ECtx);
897
898 QCBOREncode_CloseArray(&ECtx);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800899
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +0530900 UsefulBufC ECBOR;
Laurence Lundblade0595e932018-11-02 22:22:47 +0700901 if(QCBOREncode_Finish(&ECtx, &ECBOR)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800902 nReturn = -1;
903 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800904
Laurence Lundblade369b90a2018-10-22 02:04:37 +0530905 if(CheckResults(ECBOR, spExpectedEncodedSimple))
906 return -2;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -0800907
Laurence Lundblade2ded3d92018-10-09 21:36:11 +0800908 return(nReturn);
909}
910
Jan Jongboom47d86c52019-07-25 08:54:16 +0200911/*
912 9F # array(5)
913 F5 # primitive(21)
914 F4 # primitive(20)
915 F6 # primitive(22)
916 F7 # primitive(23)
917 BF # map(1)
918 65 # text(5)
919 554E446566 # "UNDef"
920 F7 # primitive(23)
921 FF # break
922 FF # break
923 */
924static const uint8_t spExpectedEncodedSimpleIndefiniteLength[] = {
925 0x9f, 0xf5, 0xf4, 0xf6, 0xf7, 0xbf, 0x65, 0x55, 0x4e, 0x44, 0x65, 0x66, 0xf7, 0xff, 0xff};
926
Laurence Lundbladed8e1c512020-11-04 23:03:44 -0800927// 9F F5 F4 F6 F7 BF 65 55 4E 44 65 66 F7 F8 1F F8 1F 69 73 20 74 68 65 20
928
Laurence Lundbladec5fef682020-01-25 11:38:45 -0800929int32_t SimpleValuesIndefiniteLengthTest1()
Jan Jongboom47d86c52019-07-25 08:54:16 +0200930{
931 QCBOREncodeContext ECtx;
932 int nReturn = 0;
933
934 QCBOREncode_Init(&ECtx, UsefulBuf_FROM_BYTE_ARRAY(spBigBuf));
935 QCBOREncode_OpenArrayIndefiniteLength(&ECtx);
936
937 QCBOREncode_AddSimple(&ECtx, CBOR_SIMPLEV_TRUE);
938 QCBOREncode_AddSimple(&ECtx, CBOR_SIMPLEV_FALSE);
939 QCBOREncode_AddSimple(&ECtx, CBOR_SIMPLEV_NULL);
940 QCBOREncode_AddSimple(&ECtx, CBOR_SIMPLEV_UNDEF);
941
942 QCBOREncode_OpenMapIndefiniteLength(&ECtx);
943
944 QCBOREncode_AddSimpleToMap(&ECtx, "UNDef", CBOR_SIMPLEV_UNDEF);
945 QCBOREncode_CloseMapIndefiniteLength(&ECtx);
946
947 QCBOREncode_CloseArrayIndefiniteLength(&ECtx);
948
949 UsefulBufC ECBOR;
950 if(QCBOREncode_Finish(&ECtx, &ECBOR)) {
951 nReturn = -1;
952 }
953
954 if(CheckResults(ECBOR, spExpectedEncodedSimpleIndefiniteLength))
955 return -2;
956
957 return(nReturn);
958}
959
Jan Jongboom5d827882019-08-07 12:51:15 +0200960/*
961A5 # map(5)
962 63 # text(3)
963 617272 # "arr"
964 98 1F # array(31)
965 00 # unsigned(0)
966 01 # unsigned(1)
967 02 # unsigned(2)
968 03 # unsigned(3)
969 04 # unsigned(4)
970 05 # unsigned(5)
971 06 # unsigned(6)
972 07 # unsigned(7)
973 08 # unsigned(8)
974 09 # unsigned(9)
975 0A # unsigned(10)
976 0B # unsigned(11)
977 0C # unsigned(12)
978 0D # unsigned(13)
979 0E # unsigned(14)
980 0F # unsigned(15)
981 10 # unsigned(16)
982 11 # unsigned(17)
983 12 # unsigned(18)
984 13 # unsigned(19)
985 14 # unsigned(20)
986 15 # unsigned(21)
987 16 # unsigned(22)
988 17 # unsigned(23)
989 18 18 # unsigned(24)
990 18 19 # unsigned(25)
991 18 1A # unsigned(26)
992 18 1B # unsigned(27)
993 18 1C # unsigned(28)
994 18 1D # unsigned(29)
995 18 1E # unsigned(30)
996 63 # text(3)
997 6D6170 # "map"
998 B8 1F # map(31)
999 61 # text(1)
1000 61 # "a"
1001 00 # unsigned(0)
1002 61 # text(1)
1003 62 # "b"
1004 01 # unsigned(1)
1005 61 # text(1)
1006 63 # "c"
1007 02 # unsigned(2)
1008 61 # text(1)
1009 64 # "d"
1010 03 # unsigned(3)
1011 61 # text(1)
1012 65 # "e"
1013 04 # unsigned(4)
1014 61 # text(1)
1015 66 # "f"
1016 05 # unsigned(5)
1017 61 # text(1)
1018 67 # "g"
1019 06 # unsigned(6)
1020 61 # text(1)
1021 68 # "h"
1022 07 # unsigned(7)
1023 61 # text(1)
1024 69 # "i"
1025 08 # unsigned(8)
1026 61 # text(1)
1027 6A # "j"
1028 09 # unsigned(9)
1029 61 # text(1)
1030 6B # "k"
1031 0A # unsigned(10)
1032 61 # text(1)
1033 6C # "l"
1034 0B # unsigned(11)
1035 61 # text(1)
1036 6D # "m"
1037 0C # unsigned(12)
1038 61 # text(1)
1039 6E # "n"
1040 0D # unsigned(13)
1041 61 # text(1)
1042 6F # "o"
1043 0E # unsigned(14)
1044 61 # text(1)
1045 70 # "p"
1046 0F # unsigned(15)
1047 61 # text(1)
1048 71 # "q"
1049 10 # unsigned(16)
1050 61 # text(1)
1051 72 # "r"
1052 11 # unsigned(17)
1053 61 # text(1)
1054 73 # "s"
1055 12 # unsigned(18)
1056 61 # text(1)
1057 74 # "t"
1058 13 # unsigned(19)
1059 61 # text(1)
1060 75 # "u"
1061 14 # unsigned(20)
1062 61 # text(1)
1063 76 # "v"
1064 15 # unsigned(21)
1065 61 # text(1)
1066 77 # "w"
1067 16 # unsigned(22)
1068 61 # text(1)
1069 78 # "x"
1070 17 # unsigned(23)
1071 61 # text(1)
1072 79 # "y"
1073 18 18 # unsigned(24)
1074 61 # text(1)
1075 7A # "z"
1076 18 19 # unsigned(25)
1077 61 # text(1)
1078 41 # "A"
1079 18 1A # unsigned(26)
1080 61 # text(1)
1081 42 # "B"
1082 18 1B # unsigned(27)
1083 61 # text(1)
1084 43 # "C"
1085 18 1C # unsigned(28)
1086 61 # text(1)
1087 44 # "D"
1088 18 1D # unsigned(29)
1089 61 # text(1)
1090 45 # "E"
1091 18 1E # unsigned(30)
1092 65 # text(5)
1093 6D696E3331 # "min31"
1094 38 1E # negative(30)
1095 66 # text(6)
1096 706C75733331 # "plus31"
1097 18 1F # unsigned(31)
1098 63 # text(3)
1099 737472 # "str"
1100 78 1F # text(31)
1101 7465737474657374746573747465737474657374746573747163626F723131 # "testtesttesttesttesttestqcbor11"
1102 */
1103static const uint8_t EncodeLengthThirtyone[] = {
1104 0xa5, 0x63, 0x61, 0x72, 0x72, 0x98, 0x1f, 0x00, 0x01, 0x02, 0x03, 0x04,
1105 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
1106 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x18, 0x18, 0x19, 0x18,
1107 0x1a, 0x18, 0x1b, 0x18, 0x1c, 0x18, 0x1d, 0x18, 0x1e, 0x63, 0x6d, 0x61,
1108 0x70, 0xb8, 0x1f, 0x61, 0x61, 0x00, 0x61, 0x62, 0x01, 0x61, 0x63, 0x02,
1109 0x61, 0x64, 0x03, 0x61, 0x65, 0x04, 0x61, 0x66, 0x05, 0x61, 0x67, 0x06,
1110 0x61, 0x68, 0x07, 0x61, 0x69, 0x08, 0x61, 0x6a, 0x09, 0x61, 0x6b, 0x0a,
1111 0x61, 0x6c, 0x0b, 0x61, 0x6d, 0x0c, 0x61, 0x6e, 0x0d, 0x61, 0x6f, 0x0e,
1112 0x61, 0x70, 0x0f, 0x61, 0x71, 0x10, 0x61, 0x72, 0x11, 0x61, 0x73, 0x12,
1113 0x61, 0x74, 0x13, 0x61, 0x75, 0x14, 0x61, 0x76, 0x15, 0x61, 0x77, 0x16,
1114 0x61, 0x78, 0x17, 0x61, 0x79, 0x18, 0x18, 0x61, 0x7a, 0x18, 0x19, 0x61,
1115 0x41, 0x18, 0x1a, 0x61, 0x42, 0x18, 0x1b, 0x61, 0x43, 0x18, 0x1c, 0x61,
1116 0x44, 0x18, 0x1d, 0x61, 0x45, 0x18, 0x1e, 0x65, 0x6d, 0x69, 0x6e, 0x33,
1117 0x31, 0x38, 0x1e, 0x66, 0x70, 0x6c, 0x75, 0x73, 0x33, 0x31, 0x18, 0x1f,
1118 0x63, 0x73, 0x74, 0x72, 0x78, 0x1f, 0x74, 0x65, 0x73, 0x74, 0x74, 0x65,
1119 0x73, 0x74, 0x74, 0x65, 0x73, 0x74, 0x74, 0x65, 0x73, 0x74, 0x74, 0x65,
1120 0x73, 0x74, 0x74, 0x65, 0x73, 0x74, 0x71, 0x63, 0x62, 0x6f, 0x72, 0x31,
1121 0x31
1122};
1123
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001124int32_t EncodeLengthThirtyoneTest()
Jan Jongboom5d827882019-08-07 12:51:15 +02001125{
1126 QCBOREncodeContext ECtx;
1127 int nReturn = 0;
1128
1129 QCBOREncode_Init(&ECtx, UsefulBuf_FROM_BYTE_ARRAY(spBigBuf));
1130 QCBOREncode_OpenMap(&ECtx);
1131
1132 // add array with 31 items
1133 QCBOREncode_OpenArrayInMap(&ECtx, "arr");
1134 for (size_t ix = 0; ix < 31; ix++) {
Laurence Lundblade06350ea2020-01-27 19:32:40 -08001135 QCBOREncode_AddInt64(&ECtx, (int64_t)ix);
Jan Jongboom5d827882019-08-07 12:51:15 +02001136 }
1137 QCBOREncode_CloseArray(&ECtx);
1138
1139 // add map with 31 items
1140 QCBOREncode_OpenMapInMap(&ECtx, "map");
Laurence Lundblade06350ea2020-01-27 19:32:40 -08001141 for (int ix = 0; ix < 31; ix++) {
Jan Jongboom5d827882019-08-07 12:51:15 +02001142 // make sure we have unique keys in the map (a-z then follow by A-Z)
Laurence Lundblade06350ea2020-01-27 19:32:40 -08001143 int c = 'a';
Jan Jongboom5d827882019-08-07 12:51:15 +02001144 if (ix < 26) c = c + ix;
1145 else c = 'A' + (ix - 26);
Laurence Lundblade06350ea2020-01-27 19:32:40 -08001146 char buffer[2] = { (char)c, 0 };
Jan Jongboom5d827882019-08-07 12:51:15 +02001147 QCBOREncode_AddInt64ToMap(&ECtx, buffer, ix);
1148 }
1149 QCBOREncode_CloseMap(&ECtx);
1150
1151 // add -31 and +31
1152 QCBOREncode_AddInt64ToMap(&ECtx, "min31", -31);
1153 QCBOREncode_AddInt64ToMap(&ECtx, "plus31", 31);
1154
1155 // add string with length 31
1156 const char *str = "testtesttesttesttesttestqcbor11";
1157 UsefulBufC str_b = { str, 31 };
1158 QCBOREncode_AddTextToMap(&ECtx, "str", str_b);
1159
1160 QCBOREncode_CloseMap(&ECtx);
1161
1162 UsefulBufC ECBOR;
1163 if(QCBOREncode_Finish(&ECtx, &ECBOR)) {
1164 nReturn = -1;
1165 }
1166
1167 if(CheckResults(ECBOR, EncodeLengthThirtyone))
1168 return -2;
1169
1170 return(nReturn);
1171}
1172
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +05301173
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301174/*
1175 83 # array(3)
1176 C0 # tag(0)
1177 74 # text(20)
1178 323031332D30332D32315432303A30343A30305A # "2013-03-21T20:04:00Z"
1179 C1 # tag(1)
1180 1A 514B67B0 # unsigned(1363896240)
1181 A2 # map(2)
1182 78 19 # text(25)
1183 53616D706C6520446174652066726F6D205246432033333339 # "Sample Date from RFC 3339"
1184 C0 # tag(0)
1185 77 # text(23)
1186 313938352D30342D31325432333A32303A35302E35325A # "1985-04-12T23:20:50.52Z"
1187 62 # text(2)
1188 5344 # "SD"
1189 C1 # tag(1)
1190 19 03E7 # unsigned(999)
1191 */
1192static const uint8_t spExpectedEncodedDates[] = {
1193 0x83, 0xc0, 0x74, 0x32, 0x30, 0x31, 0x33, 0x2d, 0x30, 0x33,
1194 0x2d, 0x32, 0x31, 0x54, 0x32, 0x30, 0x3a, 0x30, 0x34, 0x3a,
1195 0x30, 0x30, 0x5a, 0xc1, 0x1a, 0x51, 0x4b, 0x67, 0xb0, 0xa2,
1196 0x78, 0x19, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x44,
1197 0x61, 0x74, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x52,
1198 0x46, 0x43, 0x20, 0x33, 0x33, 0x33, 0x39, 0xc0, 0x77, 0x31,
1199 0x39, 0x38, 0x35, 0x2d, 0x30, 0x34, 0x2d, 0x31, 0x32, 0x54,
1200 0x32, 0x33, 0x3a, 0x32, 0x30, 0x3a, 0x35, 0x30, 0x2e, 0x35,
1201 0x32, 0x5a, 0x62, 0x53, 0x44, 0xc1, 0x19, 0x03, 0xe7
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001202};
1203
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001204int32_t EncodeDateTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001205{
1206 QCBOREncodeContext ECtx;
1207 int nReturn = 0;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001208
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05301209 QCBOREncode_Init(&ECtx, UsefulBuf_FROM_BYTE_ARRAY(spBigBuf));
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001210
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001211 QCBOREncode_OpenArray(&ECtx);
1212
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001213
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001214 QCBOREncode_AddDateString(&ECtx, "2013-03-21T20:04:00Z"); // from CBOR RFC
1215 QCBOREncode_AddDateEpoch(&ECtx, 1363896240); // from CBOR RFC
1216
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001217
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001218 QCBOREncode_OpenMap(&ECtx);
1219
1220 QCBOREncode_AddDateStringToMap(&ECtx, "Sample Date from RFC 3339", "1985-04-12T23:20:50.52Z");
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001221
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001222 QCBOREncode_AddDateEpochToMap(&ECtx, "SD", 999);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001223
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001224 QCBOREncode_CloseMap(&ECtx);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001225
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001226 QCBOREncode_CloseArray(&ECtx);
1227
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301228 UsefulBufC ECBOR;
1229
Laurence Lundblade0595e932018-11-02 22:22:47 +07001230 if(QCBOREncode_Finish(&ECtx, &ECBOR)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001231 nReturn = -1;
1232 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001233
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301234 if(CheckResults(ECBOR, spExpectedEncodedDates))
1235 return -2;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001236
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001237 return(nReturn);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001238}
1239
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301240
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001241int32_t ArrayNestingTest1()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001242{
1243 QCBOREncodeContext ECtx;
1244 int i;
1245 int nReturn = 0;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001246
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05301247 QCBOREncode_Init(&ECtx, UsefulBuf_FROM_BYTE_ARRAY(spBigBuf));
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001248 for(i = QCBOR_MAX_ARRAY_NESTING; i; i--) {
1249 QCBOREncode_OpenArray(&ECtx);
1250 }
1251 for(i = QCBOR_MAX_ARRAY_NESTING; i; i--) {
1252 QCBOREncode_CloseArray(&ECtx);
1253 }
Laurence Lundblade0595e932018-11-02 22:22:47 +07001254 UsefulBufC Encoded;
1255 if(QCBOREncode_Finish(&ECtx, &Encoded)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001256 nReturn = -1;
1257 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001258
1259 return(nReturn);
1260}
1261
1262
1263
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001264int32_t ArrayNestingTest2()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001265{
1266 QCBOREncodeContext ECtx;
1267 int i;
1268 int nReturn = 0;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001269
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05301270 QCBOREncode_Init(&ECtx, UsefulBuf_FROM_BYTE_ARRAY(spBigBuf));
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001271 for(i = QCBOR_MAX_ARRAY_NESTING+1; i; i--) {
1272 QCBOREncode_OpenArray(&ECtx);
1273 }
1274 for(i = QCBOR_MAX_ARRAY_NESTING; i; i--) {
1275 QCBOREncode_CloseArray(&ECtx);
1276 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001277
Laurence Lundblade0595e932018-11-02 22:22:47 +07001278 UsefulBufC Encoded;
1279 if(QCBOREncode_Finish(&ECtx, &Encoded) != QCBOR_ERR_ARRAY_NESTING_TOO_DEEP) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001280 nReturn = -1;
1281 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001282
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001283 return(nReturn);
1284}
1285
1286
1287
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001288int32_t ArrayNestingTest3()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001289{
1290 QCBOREncodeContext ECtx;
1291 int i;
1292 int nReturn = 0;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001293
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05301294 QCBOREncode_Init(&ECtx, UsefulBuf_FROM_BYTE_ARRAY(spBigBuf));
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001295 for(i = QCBOR_MAX_ARRAY_NESTING; i; i--) {
1296 QCBOREncode_OpenArray(&ECtx);
1297 }
1298 for(i = QCBOR_MAX_ARRAY_NESTING+1 ; i; i--) {
1299 QCBOREncode_CloseArray(&ECtx);
1300 }
Laurence Lundblade0595e932018-11-02 22:22:47 +07001301 UsefulBufC Encoded;
1302 if(QCBOREncode_Finish(&ECtx, &Encoded) != QCBOR_ERR_TOO_MANY_CLOSES) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001303 nReturn = -1;
1304 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001305
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001306 return(nReturn);
1307}
1308
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001309
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301310/*
1311 81 # array(1)
1312 81 # array(1)
1313 81 # array(1)
1314 81 # array(1)
1315 80 # array(0)
1316*/
1317static const uint8_t spFiveArrarys[] = {0x81, 0x81, 0x81, 0x81, 0x80};
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001318
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001319// Validated at http://cbor.me and by manually examining its output
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301320/*
1321 82 # array(2)
1322 81 # array(1)
1323 81 # array(1)
1324 81 # array(1)
1325 81 # array(1)
1326 80 # array(0)
Jan Jongboom5d827882019-08-07 12:51:15 +02001327 98 30 # array(48)
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301328 3B 7FFFFFFFFFFFFFFF # negative(9223372036854775807)
1329 3B 0000000100000000 # negative(4294967296)
1330 3A FFFFFFFF # negative(4294967295)
1331 3A FFFFFFFE # negative(4294967294)
1332 3A FFFFFFFD # negative(4294967293)
1333 3A 7FFFFFFF # negative(2147483647)
1334 3A 7FFFFFFE # negative(2147483646)
1335 3A 00010001 # negative(65537)
1336 3A 00010000 # negative(65536)
1337 39 FFFF # negative(65535)
1338 39 FFFE # negative(65534)
1339 39 FFFD # negative(65533)
1340 39 0100 # negative(256)
1341 38 FF # negative(255)
1342 38 FE # negative(254)
1343 38 FD # negative(253)
1344 38 18 # negative(24)
1345 37 # negative(23)
1346 36 # negative(22)
1347 20 # negative(0)
1348 00 # unsigned(0)
1349 00 # unsigned(0)
1350 01 # unsigned(1)
1351 16 # unsigned(22)
1352 17 # unsigned(23)
1353 18 18 # unsigned(24)
1354 18 19 # unsigned(25)
1355 18 1A # unsigned(26)
Jan Jongboom5d827882019-08-07 12:51:15 +02001356 18 1F # unsigned(31)
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301357 18 FE # unsigned(254)
1358 18 FF # unsigned(255)
1359 19 0100 # unsigned(256)
1360 19 0101 # unsigned(257)
1361 19 FFFE # unsigned(65534)
1362 19 FFFF # unsigned(65535)
1363 1A 00010000 # unsigned(65536)
1364 1A 00010001 # unsigned(65537)
1365 1A 00010002 # unsigned(65538)
1366 1A 7FFFFFFF # unsigned(2147483647)
1367 1A 7FFFFFFF # unsigned(2147483647)
1368 1A 80000000 # unsigned(2147483648)
1369 1A 80000001 # unsigned(2147483649)
1370 1A FFFFFFFE # unsigned(4294967294)
1371 1A FFFFFFFF # unsigned(4294967295)
1372 1B 0000000100000000 # unsigned(4294967296)
1373 1B 0000000100000001 # unsigned(4294967297)
1374 1B 7FFFFFFFFFFFFFFF # unsigned(9223372036854775807)
1375 1B FFFFFFFFFFFFFFFF # unsigned(18446744073709551615)
1376 */
1377static const uint8_t spEncodeRawExpected[] = {
Jan Jongboom5d827882019-08-07 12:51:15 +02001378 0x82, 0x81, 0x81, 0x81, 0x81, 0x80, 0x98, 0x30,
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001379 0x3b, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1380 0xff, 0x3b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
1381 0x00, 0x00, 0x3a, 0xff, 0xff, 0xff, 0xff, 0x3a,
1382 0xff, 0xff, 0xff, 0xfe, 0x3a, 0xff, 0xff, 0xff,
1383 0xfd, 0x3a, 0x7f, 0xff, 0xff, 0xff, 0x3a, 0x7f,
1384 0xff, 0xff, 0xfe, 0x3a, 0x00, 0x01, 0x00, 0x01,
1385 0x3a, 0x00, 0x01, 0x00, 0x00, 0x39, 0xff, 0xff,
1386 0x39, 0xff, 0xfe, 0x39, 0xff, 0xfd, 0x39, 0x01,
1387 0x00, 0x38, 0xff, 0x38, 0xfe, 0x38, 0xfd, 0x38,
1388 0x18, 0x37, 0x36, 0x20, 0x00, 0x00, 0x01, 0x16,
1389 0x17, 0x18, 0x18, 0x18, 0x19, 0x18, 0x1a, 0x18,
Jan Jongboom5d827882019-08-07 12:51:15 +02001390 0x1f, 0x18, 0xfe, 0x18, 0xff, 0x19, 0x01, 0x00,
1391 0x19, 0x01, 0x01, 0x19, 0xff, 0xfe, 0x19, 0xff,
1392 0xff, 0x1a, 0x00, 0x01, 0x00, 0x00, 0x1a, 0x00,
1393 0x01, 0x00, 0x01, 0x1a, 0x00, 0x01, 0x00, 0x02,
1394 0x1a, 0x7f, 0xff, 0xff, 0xff, 0x1a, 0x7f, 0xff,
1395 0xff, 0xff, 0x1a, 0x80, 0x00, 0x00, 0x00, 0x1a,
1396 0x80, 0x00, 0x00, 0x01, 0x1a, 0xff, 0xff, 0xff,
1397 0xfe, 0x1a, 0xff, 0xff, 0xff, 0xff, 0x1b, 0x00,
1398 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x1b,
1399 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
1400 0x1b, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1401 0xff, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1402 0xff, 0xff};
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001403
1404
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001405int32_t EncodeRawTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001406{
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001407 QCBOREncodeContext ECtx;
1408
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05301409 QCBOREncode_Init(&ECtx, UsefulBuf_FROM_BYTE_ARRAY(spBigBuf));
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001410 QCBOREncode_OpenArray(&ECtx);
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05301411 QCBOREncode_AddEncoded(&ECtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spFiveArrarys));
1412 QCBOREncode_AddEncoded(&ECtx, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spExpectedEncodedInts));
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001413 QCBOREncode_CloseArray(&ECtx);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001414
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001415 UsefulBufC EncodedRawTest;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001416
Laurence Lundblade0595e932018-11-02 22:22:47 +07001417 if(QCBOREncode_Finish(&ECtx, &EncodedRawTest)) {
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001418 return -4;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001419 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001420
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301421 if(CheckResults(EncodedRawTest, spEncodeRawExpected)) {
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001422 return -5;
1423 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001424
Laurence Lundblade0fb6c6d2018-10-12 22:02:05 +08001425 return 0;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001426}
1427
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301428/*
1429 This returns a pointer to spBigBuf
1430 */
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001431static int32_t CreateMap(uint8_t **pEncoded, size_t *pEncodedLen)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001432{
1433 QCBOREncodeContext ECtx;
1434 int nReturn = -1;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001435
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001436 *pEncoded = NULL;
1437 *pEncodedLen = INT32_MAX;
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301438 size_t uFirstSizeEstimate = 0;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001439
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001440 // loop runs CBOR encoding twice. First with no buffer to
1441 // calucate the length so buffer can be allocated correctly,
1442 // and last with the buffer to do the actual encoding
1443 do {
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +05301444 QCBOREncode_Init(&ECtx, (UsefulBuf){*pEncoded, *pEncodedLen});
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001445 QCBOREncode_OpenMap(&ECtx);
1446 QCBOREncode_AddInt64ToMap(&ECtx, "first integer", 42);
1447 QCBOREncode_OpenArrayInMap(&ECtx, "an array of two strings");
1448 QCBOREncode_AddText(&ECtx, ((UsefulBufC) {"string1", 7}));
1449 QCBOREncode_AddText(&ECtx, ((UsefulBufC) {"string2", 7}));
1450 QCBOREncode_CloseArray(&ECtx);
1451 QCBOREncode_OpenMapInMap(&ECtx, "map in a map");
1452 QCBOREncode_AddBytesToMap(&ECtx,"bytes 1", ((UsefulBufC) { "xxxx", 4}));
1453 QCBOREncode_AddBytesToMap(&ECtx, "bytes 2",((UsefulBufC) { "yyyy", 4}));
1454 QCBOREncode_AddInt64ToMap(&ECtx, "another int", 98);
1455 QCBOREncode_AddTextToMap(&ECtx, "text 2", ((UsefulBufC) {"lies, damn lies and statistics", 30}));
1456 QCBOREncode_CloseMap(&ECtx);
1457 QCBOREncode_CloseMap(&ECtx);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001458
Laurence Lundblade0595e932018-11-02 22:22:47 +07001459 if(QCBOREncode_FinishGetSize(&ECtx, pEncodedLen))
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001460 goto Done;
1461 if(*pEncoded != NULL) {
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301462 if(uFirstSizeEstimate != *pEncodedLen) {
1463 nReturn = 1;
1464 } else {
1465 nReturn = 0;
1466 }
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001467 goto Done;
1468 }
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301469 *pEncoded = spBigBuf;
1470 uFirstSizeEstimate = *pEncodedLen;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001471
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001472 } while(1);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001473
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001474 Done:
1475 return(nReturn);
1476}
1477
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301478/*
1479 A3 # map(3)
1480 6D # text(13)
1481 666972737420696E7465676572 # "first integer"
1482 18 2A # unsigned(42)
1483 77 # text(23)
1484 616E206172726179206F662074776F20737472696E6773 # "an array of two strings"
1485 82 # array(2)
1486 67 # text(7)
1487 737472696E6731 # "string1"
1488 67 # text(7)
1489 737472696E6732 # "string2"
1490 6C # text(12)
1491 6D617020696E2061206D6170 # "map in a map"
1492 A4 # map(4)
1493 67 # text(7)
1494 62797465732031 # "bytes 1"
1495 44 # bytes(4)
1496 78787878 # "xxxx"
1497 67 # text(7)
1498 62797465732032 # "bytes 2"
1499 44 # bytes(4)
1500 79797979 # "yyyy"
1501 6B # text(11)
1502 616E6F7468657220696E74 # "another int"
1503 18 62 # unsigned(98)
1504 66 # text(6)
1505 746578742032 # "text 2"
1506 78 1E # text(30)
1507 6C6965732C2064616D6E206C69657320616E642073746174697374696373 # "lies, damn lies and statistics"
1508 */
1509static const uint8_t spValidMapEncoded[] = {
1510 0xa3, 0x6d, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x69, 0x6e,
1511 0x74, 0x65, 0x67, 0x65, 0x72, 0x18, 0x2a, 0x77, 0x61, 0x6e,
1512 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20,
1513 0x74, 0x77, 0x6f, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
1514 0x73, 0x82, 0x67, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x31,
1515 0x67, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x32, 0x6c, 0x6d,
1516 0x61, 0x70, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x6d, 0x61,
1517 0x70, 0xa4, 0x67, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x31,
1518 0x44, 0x78, 0x78, 0x78, 0x78, 0x67, 0x62, 0x79, 0x74, 0x65,
1519 0x73, 0x20, 0x32, 0x44, 0x79, 0x79, 0x79, 0x79, 0x6b, 0x61,
1520 0x6e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x74,
1521 0x18, 0x62, 0x66, 0x74, 0x65, 0x78, 0x74, 0x20, 0x32, 0x78,
1522 0x1e, 0x6c, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x64, 0x61, 0x6d,
1523 0x6e, 0x20, 0x6c, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64,
1524 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63,
1525 0x73 } ;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001526
1527
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001528int32_t MapEncodeTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001529{
1530 uint8_t *pEncodedMaps;
1531 size_t nEncodedMapLen;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001532
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001533 if(CreateMap(&pEncodedMaps, &nEncodedMapLen)) {
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301534 return -1;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001535 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001536
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001537 int nReturn = 0;
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301538 if(memcmp(spValidMapEncoded, pEncodedMaps, sizeof(spValidMapEncoded)))
1539 nReturn = 2;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001540
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001541 return(nReturn);
1542}
1543
1544
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001545/*
1546 @brief Encode the RTIC results
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001547
Laurence Lundbladeee851742020-01-08 08:37:05 -08001548 @param[in] nRResult CBOR_SIMPLEV_TRUE, CBOR_SIMPLEV_FALSE or
1549 CBOR_SIMPLEV_NULL
1550 @param[in] time Time stamp in UNIX epoch time or 0 for none
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001551 @param[in] szAlexString Diagnostic code.
1552 @param[in[ pOut Buffer to put the result in
Laurence Lundbladeee851742020-01-08 08:37:05 -08001553 @param[in/out] pnLen Size of pOut buffer when called; length of data
1554 output in buffer on return
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001555
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001556 @return
1557 One of the CBOR encoder errors. QCBOR_SUCCESS, which is has value 0, if no error.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001558
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001559 The size of pOut should be 30 bytes plus the length of pnLen. If you make it too
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001560 short an error will be returned. This function will never write off the end
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001561 of the buffer passed to it.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001562
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001563 If the result is 0, then the correct encoded CBOR is in pOut and *pnLen is the
1564 length of the encoded CBOR.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001565
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001566 */
1567
Laurence Lundbladeee851742020-01-08 08:37:05 -08001568static UsefulBufC
Laurence Lundblade06350ea2020-01-27 19:32:40 -08001569FormatRTICResults(uint8_t uRResult,
1570 int64_t time,
Laurence Lundbladeee851742020-01-08 08:37:05 -08001571 const char *szType,
1572 const char *szAlexString,
1573 UsefulBuf Storage)
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001574{
1575 // Buffer that the result will be written in to
1576 // It is fixed size and small that a stack variable will be fine
Laurence Lundbladeee851742020-01-08 08:37:05 -08001577 // QCBOREncode will never write off the end of this buffer. If it won't
1578 // fit QCBOREncode_Finish will return an error.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001579
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001580 // Context for the encoder
1581 QCBOREncodeContext ECtx;
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301582 QCBOREncode_Init(&ECtx, Storage);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001583
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001584 // All the RTIC results are grouped in a CBOR Map which will get turned into a JSON Object
1585 // Contents are label / value pairs
1586 QCBOREncode_OpenMap(&ECtx);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001587
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001588 { // Brace / indention just to show CBOR encoding nesting
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001589
Laurence Lundbladeee851742020-01-08 08:37:05 -08001590 // The result: 0 if scan happened and found nothing; 1 if it happened and
1591 // found something wrong; 2 if it didn't happen
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001592 QCBOREncode_AddSimpleToMap(&ECtx, "integrity", uRResult);
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001593
1594 // Add the diagnostic code
1595 QCBOREncode_AddSZStringToMap(&ECtx, "type", szType);
1596
1597 // Add a time stamp
1598 if(time) {
1599 QCBOREncode_AddDateEpochToMap(&ECtx, "time", time);
1600 }
1601
1602 // Add the diagnostic code
1603 QCBOREncode_AddSZStringToMap(&ECtx, "diag", szAlexString);
1604
1605 // Open a subordinate map for telemtry data
1606 QCBOREncode_OpenMapInMap(&ECtx, "telemetry");
1607
1608 { // Brace / indention just to show CBOR encoding nesting
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001609
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001610 // Add a few fake integers and buffers for now.
1611 QCBOREncode_AddInt64ToMap(&ECtx, "Shoe Size", 12);
1612
1613 // Add a few fake integers and buffers for now.
1614 QCBOREncode_AddInt64ToMap(&ECtx, "IQ", 0xffffffff);
1615
1616 // Add a few fake integers and buffers for now.
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301617 static const uint8_t pPV[] = {0x66, 0x67, 0x00, 0x56, 0xaa, 0xbb, 0x01, 0x01};
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -08001618 const UsefulBufC WSPV = {pPV, sizeof(pPV)};
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001619
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001620 QCBOREncode_AddBytesToMap(&ECtx, "WhaleSharkPatternVector", WSPV);
1621 }
1622 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001623
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001624 // Close the telemetry map
1625 QCBOREncode_CloseMap(&ECtx);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001626
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001627 // Close the map
1628 QCBOREncode_CloseMap(&ECtx);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001629
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301630 UsefulBufC Result;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001631
Laurence Lundblade0595e932018-11-02 22:22:47 +07001632 QCBOREncode_Finish(&ECtx, &Result);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001633
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301634 return Result;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001635}
1636
1637
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301638/*
1639 A5 # map(5)
1640 69 # text(9)
1641 696E74656772697479 # "integrity"
1642 F4 # primitive(20)
1643 64 # text(4)
1644 74797065 # "type"
1645 66 # text(6)
1646 726563656E74 # "recent"
1647 64 # text(4)
1648 74696D65 # "time"
1649 C1 # tag(1)
1650 1A 580D4172 # unsigned(1477263730)
1651 64 # text(4)
1652 64696167 # "diag"
1653 6A # text(10)
1654 30784131654335303031 # "0xA1eC5001"
1655 69 # text(9)
1656 74656C656D65747279 # "telemetry"
1657 A3 # map(3)
1658 69 # text(9)
1659 53686F652053697A65 # "Shoe Size"
1660 0C # unsigned(12)
1661 62 # text(2)
1662 4951 # "IQ"
1663 1A FFFFFFFF # unsigned(4294967295)
1664 77 # text(23)
1665 5768616C65536861726B5061747465726E566563746F72 # "WhaleSharkPatternVector"
1666 48 # bytes(8)
1667 66670056AABB0101 # "fg\x00V\xAA\xBB\x01\x01"
1668 */
1669static const uint8_t spExpectedRTIC[] = {
1670 0xa5, 0x69, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74,
1671 0x79, 0xf4, 0x64, 0x74, 0x79, 0x70, 0x65, 0x66, 0x72, 0x65,
1672 0x63, 0x65, 0x6e, 0x74, 0x64, 0x74, 0x69, 0x6d, 0x65, 0xc1,
1673 0x1a, 0x58, 0x0d, 0x41, 0x72, 0x64, 0x64, 0x69, 0x61, 0x67,
1674 0x6a, 0x30, 0x78, 0x41, 0x31, 0x65, 0x43, 0x35, 0x30, 0x30,
1675 0x31, 0x69, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72,
1676 0x79, 0xa3, 0x69, 0x53, 0x68, 0x6f, 0x65, 0x20, 0x53, 0x69,
1677 0x7a, 0x65, 0x0c, 0x62, 0x49, 0x51, 0x1a, 0xff, 0xff, 0xff,
1678 0xff, 0x77, 0x57, 0x68, 0x61, 0x6c, 0x65, 0x53, 0x68, 0x61,
1679 0x72, 0x6b, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x56,
1680 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x66, 0x67, 0x00, 0x56,
1681 0xaa, 0xbb, 0x01, 0x01};
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001682
1683
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001684int32_t RTICResultsTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001685{
Laurence Lundblade25c6c0a2018-12-17 13:21:59 -08001686 const UsefulBufC Encoded = FormatRTICResults(CBOR_SIMPLEV_FALSE, 1477263730,
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301687 "recent", "0xA1eC5001",
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05301688 UsefulBuf_FROM_BYTE_ARRAY(spBigBuf));
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301689 if(UsefulBuf_IsNULLC(Encoded)) {
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001690 return -1;
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301691 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001692
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301693 if(CheckResults(Encoded, spExpectedRTIC)) {
1694 return -2;
1695 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001696
1697 return 0;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001698}
1699
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +05301700
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301701/*
Laurence Lundblade83f5b7f2019-04-06 11:22:37 -07001702 The expected encoding for first test in BstrWrapTest()
Laurence Lundblade30dd0ba2019-05-26 23:37:30 +03001703
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301704 82 # array(2)
1705 19 01C3 # unsigned(451)
1706 43 # bytes(3)
1707 1901D2 # "\x19\x01\xD2"
1708*/
1709static const uint8_t spExpectedBstrWrap[] = {0x82, 0x19, 0x01, 0xC3, 0x43, 0x19, 0x01, 0xD2};
Laurence Lundbladedc6e28e2018-10-11 19:19:27 +05301710
Laurence Lundblade684aec22018-10-12 19:33:53 +08001711/*
Laurence Lundbladeda532272019-04-07 11:40:17 -07001712 81 #array(1)
1713 0x58 0x25 # string of length 37 (length of "This is longer than twenty four bytes")
1714 */
1715static const uint8_t spExpectedTypeAndLen[] = {0x81, 0x58, 0x25};
1716
1717/*
Laurence Lundblade684aec22018-10-12 19:33:53 +08001718 Very basic bstr wrapping test
1719 */
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301720int BstrWrapTest()
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001721{
Laurence Lundblade684aec22018-10-12 19:33:53 +08001722 QCBOREncodeContext EC;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001723
Laurence Lundblade83f5b7f2019-04-06 11:22:37 -07001724 // First test - make some wrapped CBOR and see that it is as expected
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05301725 QCBOREncode_Init(&EC, UsefulBuf_FROM_BYTE_ARRAY(spBigBuf));
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001726
Laurence Lundblade684aec22018-10-12 19:33:53 +08001727 QCBOREncode_OpenArray(&EC);
1728 QCBOREncode_AddUInt64(&EC, 451);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001729
Laurence Lundblade684aec22018-10-12 19:33:53 +08001730 QCBOREncode_BstrWrap(&EC);
1731 QCBOREncode_AddUInt64(&EC, 466);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001732
Laurence Lundblade684aec22018-10-12 19:33:53 +08001733 UsefulBufC Wrapped;
1734 QCBOREncode_CloseBstrWrap(&EC, &Wrapped);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001735
Laurence Lundblade684aec22018-10-12 19:33:53 +08001736 QCBOREncode_CloseArray(&EC);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001737
Laurence Lundblade684aec22018-10-12 19:33:53 +08001738 UsefulBufC Encoded;
Laurence Lundblade0595e932018-11-02 22:22:47 +07001739 if(QCBOREncode_Finish(&EC, &Encoded)) {
Laurence Lundblade684aec22018-10-12 19:33:53 +08001740 return -1;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001741 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001742
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301743 if(CheckResults(Encoded, spExpectedBstrWrap)) {
Laurence Lundblade684aec22018-10-12 19:33:53 +08001744 return -2;
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001745 }
Laurence Lundbladedf1c1cf2019-01-17 11:55:05 -08001746
Laurence Lundblade83f5b7f2019-04-06 11:22:37 -07001747 // Second test - see if the length of the wrapped
1748 // bstr is correct. Also tests bstr wrapping
1749 // in length calculation only mode.
Laurence Lundblade7412f812019-01-01 18:49:36 -08001750 QCBOREncode_Init(&EC, (UsefulBuf){NULL, INT32_MAX});
1751 QCBOREncode_OpenArray(&EC);
1752 QCBOREncode_BstrWrap(&EC);
1753 QCBOREncode_OpenArray(&EC);
1754 QCBOREncode_AddNULL(&EC);
1755 QCBOREncode_CloseArray(&EC);
1756 UsefulBufC BStr;
1757 QCBOREncode_CloseBstrWrap(&EC, &BStr);
Laurence Lundbladeee851742020-01-08 08:37:05 -08001758 // 3 is one byte for the wrapping bstr, 1 for an array of length 1,
1759 // and 1 byte for a NULL
Laurence Lundblade83f5b7f2019-04-06 11:22:37 -07001760 if(BStr.ptr != NULL || BStr.len != 3) {
Laurence Lundblade7412f812019-01-01 18:49:36 -08001761 return -5;
1762 }
Laurence Lundblade30dd0ba2019-05-26 23:37:30 +03001763
Laurence Lundbladeda532272019-04-07 11:40:17 -07001764 // Third, test QCBOREncode_AddBytesLenOnly() here as it is part of the
1765 // bstr wrapping use cases.
1766 UsefulBuf_MAKE_STACK_UB(StuffBuf, 50);
1767 QCBOREncode_Init(&EC, StuffBuf);
1768 QCBOREncode_OpenArray(&EC);
1769 QCBOREncode_AddBytesLenOnly(&EC, UsefulBuf_FROM_SZ_LITERAL("This is longer than twenty four bytes"));
1770 QCBOREncode_CloseArray(&EC);
1771 if(QCBOREncode_Finish(&EC, &Encoded)) {
1772 return -6;
1773 }
1774 if(CheckResults(Encoded, spExpectedTypeAndLen)) {
1775 return -7;
1776 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001777
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001778 return 0;
1779}
1780
Laurence Lundblade2ded3d92018-10-09 21:36:11 +08001781
1782
Laurence Lundbladec5fef682020-01-25 11:38:45 -08001783int32_t BstrWrapErrorTest()
Laurence Lundblade684aec22018-10-12 19:33:53 +08001784{
Laurence Lundblade684aec22018-10-12 19:33:53 +08001785 QCBOREncodeContext EC;
Laurence Lundbladed8e1c512020-11-04 23:03:44 -08001786 UsefulBufC Wrapped;
1787 UsefulBufC Encoded2;
1788
1789#ifndef QCBOR_DISABLE_ENCODE_USAGE_GUARDS
1790 // ---- Test closing a bstrwrap when it is an array that is open ---------
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001791
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05301792 QCBOREncode_Init(&EC, UsefulBuf_FROM_BYTE_ARRAY(spBigBuf));
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001793
Laurence Lundblade684aec22018-10-12 19:33:53 +08001794 QCBOREncode_OpenArray(&EC);
1795 QCBOREncode_AddUInt64(&EC, 451);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001796
Laurence Lundblade684aec22018-10-12 19:33:53 +08001797 QCBOREncode_BstrWrap(&EC);
1798 QCBOREncode_AddUInt64(&EC, 466);
1799 QCBOREncode_OpenArray(&EC);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001800
Laurence Lundblade684aec22018-10-12 19:33:53 +08001801 QCBOREncode_CloseBstrWrap(&EC, &Wrapped);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001802
Laurence Lundblade684aec22018-10-12 19:33:53 +08001803 QCBOREncode_CloseArray(&EC);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001804
Laurence Lundblade0595e932018-11-02 22:22:47 +07001805 if(QCBOREncode_Finish(&EC, &Encoded2) != QCBOR_ERR_CLOSE_MISMATCH) {
Laurence Lundblade684aec22018-10-12 19:33:53 +08001806 return -1;
1807 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001808
Laurence Lundbladeee851742020-01-08 08:37:05 -08001809 // -------- test closing a bstrwrap when nothing is open ----------------
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05301810 QCBOREncode_Init(&EC, UsefulBuf_FROM_BYTE_ARRAY(spBigBuf));
Laurence Lundblade684aec22018-10-12 19:33:53 +08001811 QCBOREncode_CloseBstrWrap(&EC, &Wrapped);
Laurence Lundblade0595e932018-11-02 22:22:47 +07001812 if(QCBOREncode_Finish(&EC, &Encoded2) != QCBOR_ERR_TOO_MANY_CLOSES) {
Laurence Lundblade684aec22018-10-12 19:33:53 +08001813 return -2;
1814 }
Laurence Lundbladed8e1c512020-11-04 23:03:44 -08001815#endif /* QCBOR_DISABLE_ENCODE_USAGE_GUARDS */
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001816
Laurence Lundblade684aec22018-10-12 19:33:53 +08001817 // --------------- test nesting too deep ----------------------------------
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05301818 QCBOREncode_Init(&EC, UsefulBuf_FROM_BYTE_ARRAY(spBigBuf));
Laurence Lundblade684aec22018-10-12 19:33:53 +08001819 for(int i = 1; i < 18; i++) {
1820 QCBOREncode_BstrWrap(&EC);
1821 }
1822 QCBOREncode_AddBool(&EC, true);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001823
Laurence Lundblade684aec22018-10-12 19:33:53 +08001824 for(int i = 1; i < 18; i++) {
1825 QCBOREncode_CloseBstrWrap(&EC, &Wrapped);
1826 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001827
Laurence Lundblade0595e932018-11-02 22:22:47 +07001828 if(QCBOREncode_Finish(&EC, &Encoded2) != QCBOR_ERR_ARRAY_NESTING_TOO_DEEP) {
Laurence Lundblade684aec22018-10-12 19:33:53 +08001829 return -3;
1830 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001831
Laurence Lundblade684aec22018-10-12 19:33:53 +08001832 return 0;
1833}
1834
1835
Laurence Lundblade684aec22018-10-12 19:33:53 +08001836/*
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00001837 This is bstr wrapped CBOR in 6 levels.
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001838
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00001839 [
1840 h'82004E82014B8202488203458204428105',
1841 {
1842 32:h'A3101018406568656C6C6F18215828A3111118416568656C6C6F18225819A312121
1843 8426568656C6C6F18234BA2131318436568656C6C6F'
1844 }
1845 ]
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001846
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00001847 Unwrapping the first byte string in the above gives
1848 [0, h'82014B8202488203458204428105']
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301849
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00001850 Unwrapping again, the byte string immediately above gives
1851 [1, h'8202488203458204428105']
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301852
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00001853 ...
1854
1855 Unrapping the second byte string in the top-level CBOR above gives
1856 {16: 16,
1857 64: "hello",
1858 33: h'A3111118416568656C6C6F18225819A3121218426568656C6C6F18234BA2....
1859 }
1860
1861 Unwrapping again, the byte string immediately above gives
1862 {17: 17,
1863 65: "hello",
1864 34: h'A3121218426568656C6C6F18234BA2131318436568656C6C6F'
1865 }
1866
1867 ...
1868
Laurence Lundblade369b90a2018-10-22 02:04:37 +05301869 */
1870static const uint8_t spExpectedDeepBstr[] =
Laurence Lundblade684aec22018-10-12 19:33:53 +08001871{
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00001872 0x82, 0x51, 0x82, 0x00, 0x4E, 0x82, 0x01, 0x4B,
1873 0x82, 0x02, 0x48, 0x82, 0x03, 0x45, 0x82, 0x04,
1874 0x42, 0x81, 0x05, 0xA1, 0x18, 0x20, 0x58, 0x37,
1875 0xA3, 0x10, 0x10, 0x18, 0x40, 0x65, 0x68, 0x65,
1876 0x6C, 0x6C, 0x6F, 0x18, 0x21, 0x58, 0x28, 0xA3,
1877 0x11, 0x11, 0x18, 0x41, 0x65, 0x68, 0x65, 0x6C,
1878 0x6C, 0x6F, 0x18, 0x22, 0x58, 0x19, 0xA3, 0x12,
1879 0x12, 0x18, 0x42, 0x65, 0x68, 0x65, 0x6C, 0x6C,
1880 0x6F, 0x18, 0x23, 0x4B, 0xA2, 0x13, 0x13, 0x18,
1881 0x43, 0x65, 0x68, 0x65, 0x6C, 0x6C, 0x6F
Laurence Lundblade684aec22018-10-12 19:33:53 +08001882};
1883
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00001884
1885/*
1886 Get an int64 out of the decoder or fail.
1887 */
1888static int32_t GetInt64(QCBORDecodeContext *pDC, int64_t *pInt)
Laurence Lundblade684aec22018-10-12 19:33:53 +08001889{
Laurence Lundblade684aec22018-10-12 19:33:53 +08001890 QCBORItem Item;
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00001891 int32_t nReturn;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001892
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00001893 nReturn = (int32_t)QCBORDecode_GetNext(pDC, &Item);
Laurence Lundblade684aec22018-10-12 19:33:53 +08001894 if(nReturn) {
1895 return nReturn;
1896 }
Laurence Lundblade684aec22018-10-12 19:33:53 +08001897 if(Item.uDataType != QCBOR_TYPE_INT64) {
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00001898 return -1;
Laurence Lundblade684aec22018-10-12 19:33:53 +08001899 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001900
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00001901 *pInt = Item.val.int64;
Laurence Lundblade684aec22018-10-12 19:33:53 +08001902 return 0;
1903}
1904
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00001905/*
1906 Get an array out of the decoder or fail.
1907 */
1908static int32_t GetArray(QCBORDecodeContext *pDC, uint16_t *pInt)
Laurence Lundblade684aec22018-10-12 19:33:53 +08001909{
Laurence Lundblade684aec22018-10-12 19:33:53 +08001910 QCBORItem Item;
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00001911 int32_t nReturn;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001912
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00001913 nReturn = (int32_t)QCBORDecode_GetNext(pDC, &Item);
Laurence Lundblade684aec22018-10-12 19:33:53 +08001914 if(nReturn) {
1915 return nReturn;
1916 }
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00001917 if(Item.uDataType != QCBOR_TYPE_ARRAY) {
1918 return -1;
1919 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08001920
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00001921 *pInt = Item.val.uCount;
1922 return 0;
1923}
1924
1925/*
1926 Get a map out of the decoder or fail.
1927 */
1928static int32_t GetMap(QCBORDecodeContext *pDC, uint16_t *pInt)
1929{
1930 QCBORItem Item;
1931 int32_t nReturn;
1932
1933 nReturn = (int32_t)QCBORDecode_GetNext(pDC, &Item);
Laurence Lundblade684aec22018-10-12 19:33:53 +08001934 if(nReturn) {
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00001935 return nReturn;
1936 }
1937 if(Item.uDataType != QCBOR_TYPE_MAP) {
1938 return -1;
1939 }
1940
1941 *pInt = Item.val.uCount;
1942 return 0;
1943}
1944
1945/*
1946 Get a byte string out of the decoder or fail.
1947 */
1948static int32_t GetByteString(QCBORDecodeContext *pDC, UsefulBufC *pBstr)
1949{
1950 QCBORItem Item;
1951 int32_t nReturn;
1952
1953 nReturn = (int32_t)QCBORDecode_GetNext(pDC, &Item);
1954 if(nReturn) {
1955 return nReturn;
1956 }
1957 if(Item.uDataType != QCBOR_TYPE_BYTE_STRING) {
Laurence Lundblade323f8a92020-09-06 19:43:09 -07001958 return QCBOR_ERR_UNEXPECTED_TYPE;
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00001959 }
1960
1961 *pBstr = Item.val.string;
1962 return 0;
1963}
1964
1965/*
1966 Get a byte string out of the decoder or fail.
1967 */
1968static int32_t GetTextString(QCBORDecodeContext *pDC, UsefulBufC *pTstr)
1969{
1970 QCBORItem Item;
1971 int nReturn;
1972
1973 nReturn = (int32_t)QCBORDecode_GetNext(pDC, &Item);
1974 if(nReturn) {
1975 return nReturn;
Laurence Lundblade684aec22018-10-12 19:33:53 +08001976 }
1977 if(Item.uDataType != QCBOR_TYPE_TEXT_STRING) {
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00001978 return -1;
Laurence Lundblade684aec22018-10-12 19:33:53 +08001979 }
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00001980
1981 *pTstr = Item.val.string;
1982 return 0;
1983}
1984
1985
1986/*
1987 Recursively decode array containing a little CBOR and a bstr wrapped array
1988 with a little CBOR and a bstr wrapped array...
1989
1990 Part of bstr_wrap_nest_test.
1991 */static int32_t DecodeNextNested(UsefulBufC Wrapped)
1992{
1993 int64_t nInt;
1994 UsefulBufC Bstr;
1995 uint16_t nArrayCount;
1996 QCBORDecodeContext DC;
1997 int32_t nResult;
1998
1999 QCBORDecode_Init(&DC, Wrapped, QCBOR_DECODE_MODE_NORMAL);
2000
2001 if(GetArray(&DC, &nArrayCount) || nArrayCount < 1 || nArrayCount > 2) {
2002 return -10;
2003 }
2004
2005 if(GetInt64(&DC, &nInt)) {
Laurence Lundblade684aec22018-10-12 19:33:53 +08002006 return -11;
2007 }
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00002008
2009 nResult = GetByteString(&DC, &Bstr);
2010 if(nResult == QCBOR_ERR_HIT_END || nResult == QCBOR_ERR_NO_MORE_ITEMS) {
2011 if(nArrayCount != 1) {
2012 return -12;
2013 } else {
2014 // successful exit
2015 return 0;
2016 }
2017 }
2018 if(nResult) {
2019 return -13;
Laurence Lundblade684aec22018-10-12 19:33:53 +08002020 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002021
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00002022 // tail recursion; good compilers will reuse the stack frame
2023 return DecodeNextNested(Bstr);
2024}
2025
2026
2027/*
2028 Recursively decode map containing a little CBOR and a bstr wrapped map
2029 with a little CBOR and a bstr wrapped map...
2030
2031 Part of bstr_wrap_nest_test.
2032 */
2033static int32_t DecodeNextNested2(UsefulBufC Wrapped)
2034{
2035 int32_t nResult;
2036 uint16_t nMapCount;
2037 int64_t nInt;
2038 UsefulBufC Bstr;
2039 QCBORDecodeContext DC;
2040
2041 QCBORDecode_Init(&DC, Wrapped, QCBOR_DECODE_MODE_NORMAL);
2042
2043 if(GetMap(&DC, &nMapCount) || nMapCount < 2 || nMapCount > 3) {
2044 return -20;
Laurence Lundblade684aec22018-10-12 19:33:53 +08002045 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002046
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00002047 if(GetInt64(&DC, &nInt)) {
2048 return -21;
2049 }
2050
2051 // The "hello"
2052 if(GetTextString(&DC, &Bstr)) {
2053 return -22;
2054 }
2055
2056 nResult = GetByteString(&DC, &Bstr);
2057 if(nResult == QCBOR_ERR_HIT_END || nResult == QCBOR_ERR_NO_MORE_ITEMS) {
2058 if(nMapCount == 2) {
2059 // successful exit
2060 return 0;
2061 } else {
2062 return -23;
2063 }
2064 }
2065
2066 if(nResult) {
2067 return -24;
2068 }
2069
2070 // tail recursion; good compilers will reuse the stack frame
2071 return DecodeNextNested2(Bstr);
Laurence Lundblade684aec22018-10-12 19:33:53 +08002072}
2073
2074
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002075int32_t BstrWrapNestTest()
Laurence Lundblade684aec22018-10-12 19:33:53 +08002076{
Laurence Lundblade684aec22018-10-12 19:33:53 +08002077 QCBOREncodeContext EC;
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05302078 QCBOREncode_Init(&EC, UsefulBuf_FROM_BYTE_ARRAY(spBigBuf));
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002079
Laurence Lundblade684aec22018-10-12 19:33:53 +08002080 // ---- Make a complicated nested CBOR structure ---
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00002081 #define BSTR_TEST_DEPTH 6
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002082
Laurence Lundblade972e59c2018-11-11 15:57:23 +07002083 QCBOREncode_OpenArray(&EC);
2084
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00002085 for(int i = 0; i < BSTR_TEST_DEPTH; i++) {
Laurence Lundblade684aec22018-10-12 19:33:53 +08002086 QCBOREncode_BstrWrap(&EC);
Laurence Lundblade684aec22018-10-12 19:33:53 +08002087 QCBOREncode_OpenArray(&EC);
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00002088 QCBOREncode_AddInt64(&EC, i);
2089 }
2090 for(int i = 0; i < BSTR_TEST_DEPTH; i++) {
2091 QCBOREncode_CloseArray(&EC);
2092 QCBOREncode_CloseBstrWrap(&EC, NULL);
Laurence Lundblade684aec22018-10-12 19:33:53 +08002093 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002094
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00002095 QCBOREncode_OpenMap(&EC);
2096 for(int i = 0; i < (BSTR_TEST_DEPTH-2); i++) {
2097 QCBOREncode_BstrWrapInMapN(&EC, i+0x20);
2098 QCBOREncode_OpenMap(&EC);
2099 QCBOREncode_AddInt64ToMapN(&EC, i+0x10, i+0x10);
Laurence Lundblade684aec22018-10-12 19:33:53 +08002100 QCBOREncode_AddSZStringToMapN(&EC, i+0x40, "hello");
Laurence Lundblade684aec22018-10-12 19:33:53 +08002101 }
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00002102
2103 for(int i = 0; i < (BSTR_TEST_DEPTH-2); i++) {
2104 QCBOREncode_CloseMap(&EC);
2105 QCBOREncode_CloseBstrWrap(&EC, NULL);
2106 }
2107 QCBOREncode_CloseMap(&EC);
2108
Laurence Lundblade684aec22018-10-12 19:33:53 +08002109 QCBOREncode_CloseArray(&EC);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002110
Laurence Lundblade684aec22018-10-12 19:33:53 +08002111 UsefulBufC Encoded;
Laurence Lundblade0595e932018-11-02 22:22:47 +07002112 if(QCBOREncode_Finish(&EC, &Encoded)) {
Laurence Lundblade684aec22018-10-12 19:33:53 +08002113 return -1;
2114 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002115
Laurence Lundblade684aec22018-10-12 19:33:53 +08002116 // ---Compare it to expected. Expected was hand checked with use of CBOR playground ----
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05302117 if(UsefulBuf_Compare(UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spExpectedDeepBstr), Encoded)) {
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00002118 return -2;
Laurence Lundblade684aec22018-10-12 19:33:53 +08002119 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002120
Laurence Lundblade684aec22018-10-12 19:33:53 +08002121 // ---- Decode it and see if it is OK ------
2122 QCBORDecodeContext DC;
2123 QCBORDecode_Init(&DC, Encoded, QCBOR_DECODE_MODE_NORMAL);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002124
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00002125 UsefulBufC Bstr;
2126 uint16_t nArrayCount;
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002127
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00002128 // Array surrounding the the whole thing
2129 if(GetArray(&DC, &nArrayCount) || nArrayCount != 2) {
Laurence Lundblade684aec22018-10-12 19:33:53 +08002130 return -3;
2131 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002132
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00002133 // Get the byte string wrapping some array stuff
2134 if(GetByteString(&DC, &Bstr)) {
2135 return -4;
2136 }
2137
2138 // Decode the wrapped nested structure
2139 int nReturn = DecodeNextNested(Bstr);
Laurence Lundblade684aec22018-10-12 19:33:53 +08002140 if(nReturn) {
2141 return nReturn;
2142 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002143
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00002144 // A map enclosing some map-oriented bstr wraps
2145 if(GetMap(&DC, &nArrayCount)) {
2146 return -5;
Laurence Lundblade684aec22018-10-12 19:33:53 +08002147 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002148
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00002149 // Get the byte string wrapping some array stuff
2150 if(GetByteString(&DC, &Bstr)) {
2151 return -6;
Laurence Lundblade684aec22018-10-12 19:33:53 +08002152 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002153
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00002154 // Decode the wrapped nested structure
2155 nReturn = DecodeNextNested2(Bstr);
Laurence Lundblade684aec22018-10-12 19:33:53 +08002156 if(nReturn) {
2157 return nReturn;
2158 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002159
Laurence Lundblade684aec22018-10-12 19:33:53 +08002160 if(QCBORDecode_Finish(&DC)) {
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00002161 return -7;
Laurence Lundblade684aec22018-10-12 19:33:53 +08002162 }
Laurence Lundbladedf1c1cf2019-01-17 11:55:05 -08002163
Laurence Lundblade684aec22018-10-12 19:33:53 +08002164 return 0;
2165}
2166
2167
Laurence Lundblade83f5b7f2019-04-06 11:22:37 -07002168static const uint8_t spCoseSign1Signature[] = {
Laurence Lundblade369b90a2018-10-22 02:04:37 +05302169 0x8e, 0xb3, 0x3e, 0x4c, 0xa3, 0x1d, 0x1c, 0x46, 0x5a, 0xb0,
2170 0x5a, 0xac, 0x34, 0xcc, 0x6b, 0x23, 0xd5, 0x8f, 0xef, 0x5c,
2171 0x08, 0x31, 0x06, 0xc4, 0xd2, 0x5a, 0x91, 0xae, 0xf0, 0xb0,
2172 0x11, 0x7e, 0x2a, 0xf9, 0xa2, 0x91, 0xaa, 0x32, 0xe1, 0x4a,
2173 0xb8, 0x34, 0xdc, 0x56, 0xed, 0x2a, 0x22, 0x34, 0x44, 0x54,
2174 0x7e, 0x01, 0xf1, 0x1d, 0x3b, 0x09, 0x16, 0xe5, 0xa4, 0xc3,
2175 0x45, 0xca, 0xcb, 0x36};
2176
2177/*
2178 D2 # tag(18)
2179 84 # array(4)
2180 43 # bytes(3)
2181 A10126 # "\xA1\x01&"
2182 A1 # map(1)
2183 04 # unsigned(4)
2184 42 # bytes(2)
2185 3131 # "11"
2186 54 # bytes(20)
2187 546869732069732074686520636F6E74656E742E # "This is the content."
2188 58 40 # bytes(64)
Laurence Lundblade83f5b7f2019-04-06 11:22:37 -07002189 8EB33E4CA31D1C465AB05AAC34CC6B23D58FEF5C083106C4D25
2190 A91AEF0B0117E2AF9A291AA32E14AB834DC56ED2A223444547E
2191 01F11D3B0916E5A4C345CACB36 # "\x8E\xB3>L\xA3\x1D\x1CFZ\xB0Z\xAC4
2192 \xCCk#\xD5\x8F\xEF\b1\x06\xC4\xD2Z
2193 \x91\xAE\xF0\xB0\x11~*\xF9\xA2\x91
2194 \xAA2\xE1J\xB84\xDCV\xED*\"4DT~\x01
2195 \xF1\x1D;\t\x16\xE5\xA4\xC3E\xCA
2196 \xCB6"
Laurence Lundblade369b90a2018-10-22 02:04:37 +05302197 */
Laurence Lundblade83f5b7f2019-04-06 11:22:37 -07002198static const uint8_t spCoseSign1TBSExpected[] = {
Laurence Lundblade369b90a2018-10-22 02:04:37 +05302199 0xD2, 0x84, 0x43, 0xA1, 0x01, 0x26, 0xA1, 0x04, 0x42, 0x31,
2200 0x31, 0x54, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20,
2201 0x74, 0x68, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x65, 0x6E,
2202 0x74, 0x2E, 0x58, 0x40, 0x8E, 0xB3, 0x3E, 0x4C, 0xA3, 0x1D,
2203 0x1C, 0x46, 0x5A, 0xB0, 0x5A, 0xAC, 0x34, 0xCC, 0x6B, 0x23,
2204 0xD5, 0x8F, 0xEF, 0x5C, 0x08, 0x31, 0x06, 0xC4, 0xD2, 0x5A,
2205 0x91, 0xAE, 0xF0, 0xB0, 0x11, 0x7E, 0x2A, 0xF9, 0xA2, 0x91,
2206 0xAA, 0x32, 0xE1, 0x4A, 0xB8, 0x34, 0xDC, 0x56, 0xED, 0x2A,
2207 0x22, 0x34, 0x44, 0x54, 0x7E, 0x01, 0xF1, 0x1D, 0x3B, 0x09,
2208 0x16, 0xE5, 0xA4, 0xC3, 0x45, 0xCA, 0xCB, 0x36};
2209
Laurence Lundblade83f5b7f2019-04-06 11:22:37 -07002210static const uint8_t pProtectedHeaders[] = {0xa1, 0x01, 0x26};
2211
2212
Laurence Lundblade684aec22018-10-12 19:33:53 +08002213/*
Laurence Lundblade83f5b7f2019-04-06 11:22:37 -07002214 This corresponds exactly to the example in RFC 8152 section
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00002215 C.2.1. This doesn't actually verify the signature (however
2216 the t_cose implementation does).
Laurence Lundblade684aec22018-10-12 19:33:53 +08002217 */
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002218int32_t CoseSign1TBSTest()
Laurence Lundblade684aec22018-10-12 19:33:53 +08002219{
2220 // All of this is from RFC 8152 C.2.1
Laurence Lundblade83f5b7f2019-04-06 11:22:37 -07002221 const char *szKid = "11";
2222 const UsefulBufC Kid = UsefulBuf_FromSZ(szKid);
2223 const char *szPayload = "This is the content.";
2224 const UsefulBufC Payload = UsefulBuf_FromSZ(szPayload);
2225 const UsefulBufC ProtectedHeaders = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(pProtectedHeaders);
2226 const UsefulBufC Signature = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spCoseSign1Signature);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002227
Laurence Lundblade684aec22018-10-12 19:33:53 +08002228 QCBOREncodeContext EC;
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00002229
2230 // --------QCBOREncode_CloseBstrWrap2(&EC, **false** ----------------------
Laurence Lundblade4fe9f312018-10-22 10:22:39 +05302231 QCBOREncode_Init(&EC, UsefulBuf_FROM_BYTE_ARRAY(spBigBuf));
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002232
Laurence Lundblade684aec22018-10-12 19:33:53 +08002233 // top level array for cose sign1, 18 is the tag for COSE sign
Laurence Lundbladec6ec7ef2018-12-04 10:45:06 +09002234 QCBOREncode_AddTag(&EC, CBOR_TAG_COSE_SIGN1);
Laurence Lundblade067035b2018-11-28 17:35:25 -08002235 QCBOREncode_OpenArray(&EC);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002236
Laurence Lundblade684aec22018-10-12 19:33:53 +08002237 // Add protected headers
2238 QCBOREncode_AddBytes(&EC, ProtectedHeaders);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002239
Laurence Lundblade684aec22018-10-12 19:33:53 +08002240 // Empty map with unprotected headers
2241 QCBOREncode_OpenMap(&EC);
2242 QCBOREncode_AddBytesToMapN(&EC, 4, Kid);
2243 QCBOREncode_CloseMap(&EC);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002244
Laurence Lundblade684aec22018-10-12 19:33:53 +08002245 // The payload
2246 UsefulBufC WrappedPayload;
2247 QCBOREncode_BstrWrap(&EC);
Laurence Lundblade83f5b7f2019-04-06 11:22:37 -07002248 // Payload is not actually CBOR in example C.2.1 like it would be
2249 // for a CWT or EAT. It is just a text string.
2250 QCBOREncode_AddEncoded(&EC, Payload);
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00002251 QCBOREncode_CloseBstrWrap2(&EC, false, &WrappedPayload);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002252
Laurence Lundblade684aec22018-10-12 19:33:53 +08002253 // Check we got back the actual payload expected
Laurence Lundblade83f5b7f2019-04-06 11:22:37 -07002254 // The extra "T" is 0x54, which is the initial byte a bstr of length 20.
2255 if(UsefulBuf_Compare(WrappedPayload,
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00002256 UsefulBuf_FROM_SZ_LITERAL("This is the content."))) {
Laurence Lundblade684aec22018-10-12 19:33:53 +08002257 return -1;
2258 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002259
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00002260/* if(UsefulBuf_Compare(WrappedPayload,
2261 UsefulBuf_FROM_SZ_LITERAL("TThis is the content."))) {
2262 return -1;
2263 } */
2264
Laurence Lundblade684aec22018-10-12 19:33:53 +08002265 // The signature
2266 QCBOREncode_AddBytes(&EC, Signature);
2267 QCBOREncode_CloseArray(&EC);
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002268
Laurence Lundblade684aec22018-10-12 19:33:53 +08002269 // Finish and check the results
2270 UsefulBufC COSE_Sign1;
Laurence Lundblade0595e932018-11-02 22:22:47 +07002271 if(QCBOREncode_Finish(&EC, &COSE_Sign1)) {
Laurence Lundblade684aec22018-10-12 19:33:53 +08002272 return -2;
2273 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002274
Laurence Lundblade684aec22018-10-12 19:33:53 +08002275 // 98 is the size from RFC 8152 C.2.1
2276 if(COSE_Sign1.len != 98) {
2277 return -3;
2278 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002279
Laurence Lundblade83f5b7f2019-04-06 11:22:37 -07002280 // It would be good to compare this to the output from a COSE
2281 // implementation like COSE-C. This has been checked against the
2282 // CBOR playground.
2283 if(CheckResults(COSE_Sign1, spCoseSign1TBSExpected)) {
Laurence Lundblade684aec22018-10-12 19:33:53 +08002284 return -4;
2285 }
Laurence Lundblade3aee3a32018-12-17 16:17:45 -08002286
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00002287
2288 // --------QCBOREncode_CloseBstrWrap2(&EC, **true** ------------------------
2289 QCBOREncode_Init(&EC, UsefulBuf_FROM_BYTE_ARRAY(spBigBuf));
2290
2291 // top level array for cose sign1, 18 is the tag for COSE sign
2292 QCBOREncode_AddTag(&EC, CBOR_TAG_COSE_SIGN1);
2293 QCBOREncode_OpenArray(&EC);
2294
2295 // Add protected headers
2296 QCBOREncode_AddBytes(&EC, ProtectedHeaders);
2297
2298 // Empty map with unprotected headers
2299 QCBOREncode_OpenMap(&EC);
2300 QCBOREncode_AddBytesToMapN(&EC, 4, Kid);
2301 QCBOREncode_CloseMap(&EC);
2302
2303 // The payload
2304 QCBOREncode_BstrWrap(&EC);
2305 // Payload is not actually CBOR in example C.2.1 like it would be
2306 // for a CWT or EAT. It is just a text string.
2307 QCBOREncode_AddEncoded(&EC, Payload);
2308 QCBOREncode_CloseBstrWrap2(&EC, true, &WrappedPayload);
2309
2310 // Check we got back the actual payload expected
2311 // The extra "T" is 0x54, which is the initial byte a bstr of length 20.
2312 if(UsefulBuf_Compare(WrappedPayload,
2313 UsefulBuf_FROM_SZ_LITERAL("TThis is the content."))) {
2314 return -11;
2315 }
2316
2317 // The signature
2318 QCBOREncode_AddBytes(&EC, Signature);
2319 QCBOREncode_CloseArray(&EC);
2320
2321 // Finish and check the results
2322 if(QCBOREncode_Finish(&EC, &COSE_Sign1)) {
2323 return -12;
2324 }
2325
2326 // 98 is the size from RFC 8152 C.2.1
2327 if(COSE_Sign1.len != 98) {
2328 return -13;
2329 }
2330
2331 // It would be good to compare this to the output from a COSE
2332 // implementation like COSE-C. This has been checked against the
2333 // CBOR playground.
2334 if(CheckResults(COSE_Sign1, spCoseSign1TBSExpected)) {
2335 return -14;
2336 }
2337
Laurence Lundblade684aec22018-10-12 19:33:53 +08002338 return 0;
2339}
2340
Laurence Lundblade1ef8b2d2018-12-14 23:13:34 -08002341
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002342int32_t EncodeErrorTests()
Laurence Lundblade1ef8b2d2018-12-14 23:13:34 -08002343{
2344 QCBOREncodeContext EC;
Laurence Lundbladedf1c1cf2019-01-17 11:55:05 -08002345
2346
Laurence Lundbladef2a58f62018-12-16 00:43:34 -08002347 // ------ Test for QCBOR_ERR_BUFFER_TOO_LARGE ------
Laurence Lundbladeee851742020-01-08 08:37:05 -08002348 // Do all of these tests with NULL buffers so no actual
2349 // large allocations are neccesary
Laurence Lundblade30dd0ba2019-05-26 23:37:30 +03002350 const UsefulBuf Buffer = (UsefulBuf){NULL, UINT32_MAX};
Laurence Lundbladedf1c1cf2019-01-17 11:55:05 -08002351
Laurence Lundbladed39cd392019-01-11 18:17:38 -08002352 // First verify no error from a big buffer
2353 QCBOREncode_Init(&EC, Buffer);
Laurence Lundblade1ef8b2d2018-12-14 23:13:34 -08002354 QCBOREncode_OpenArray(&EC);
Laurence Lundbladed39cd392019-01-11 18:17:38 -08002355 // 6 is the CBOR overhead for opening the array and encodng the length
2356 // This exactly fills the buffer.
2357 QCBOREncode_AddBytes(&EC, (UsefulBufC){NULL, UINT32_MAX-6});
Laurence Lundblade1ef8b2d2018-12-14 23:13:34 -08002358 QCBOREncode_CloseArray(&EC);
2359 size_t xx;
2360 if(QCBOREncode_FinishGetSize(&EC, &xx) != QCBOR_SUCCESS) {
2361 return -1;
2362 }
Laurence Lundblade1ef8b2d2018-12-14 23:13:34 -08002363
Laurence Lundbladed39cd392019-01-11 18:17:38 -08002364 // Second verify error from an array in encoded output too large
Laurence Lundblade30dd0ba2019-05-26 23:37:30 +03002365 // Also test fetching the error code before finish
Laurence Lundbladed8e1c512020-11-04 23:03:44 -08002366 QCBOREncode_Init(&EC, (UsefulBuf){NULL, UINT32_MAX});
Laurence Lundblade1ef8b2d2018-12-14 23:13:34 -08002367 QCBOREncode_OpenArray(&EC);
Laurence Lundbladed8e1c512020-11-04 23:03:44 -08002368 QCBOREncode_AddBytes(&EC, (UsefulBufC){NULL, UINT32_MAX-10});
Laurence Lundbladed39cd392019-01-11 18:17:38 -08002369 QCBOREncode_OpenArray(&EC); // Where QCBOR internally encounters and records error
Laurence Lundblade30dd0ba2019-05-26 23:37:30 +03002370 if(QCBOREncode_GetErrorState(&EC) != QCBOR_ERR_BUFFER_TOO_LARGE) {
2371 // Error fetch failed.
Laurence Lundbladed8e1c512020-11-04 23:03:44 -08002372 return -122;
Laurence Lundblade30dd0ba2019-05-26 23:37:30 +03002373 }
Laurence Lundblade1ef8b2d2018-12-14 23:13:34 -08002374 QCBOREncode_CloseArray(&EC);
2375 QCBOREncode_CloseArray(&EC);
2376 if(QCBOREncode_FinishGetSize(&EC, &xx) != QCBOR_ERR_BUFFER_TOO_LARGE) {
2377 return -2;
2378 }
Laurence Lundbladedf1c1cf2019-01-17 11:55:05 -08002379
Laurence Lundbladed39cd392019-01-11 18:17:38 -08002380 // Third, fit an array in exactly at max position allowed
2381 QCBOREncode_Init(&EC, Buffer);
2382 QCBOREncode_OpenArray(&EC);
2383 QCBOREncode_AddBytes(&EC, (UsefulBufC){NULL, QCBOR_MAX_ARRAY_OFFSET-6});
2384 QCBOREncode_OpenArray(&EC);
2385 QCBOREncode_CloseArray(&EC);
2386 QCBOREncode_CloseArray(&EC);
2387 if(QCBOREncode_FinishGetSize(&EC, &xx) != QCBOR_SUCCESS) {
2388 return -10;
2389 }
2390
2391
Laurence Lundbladef2a58f62018-12-16 00:43:34 -08002392 // ----- QCBOR_ERR_BUFFER_TOO_SMALL --------------
2393 // Work close to the 4GB size limit for a better test
2394 const uint32_t uLargeSize = UINT32_MAX - 1024;
Laurence Lundblade30dd0ba2019-05-26 23:37:30 +03002395 const UsefulBuf Large = (UsefulBuf){NULL,uLargeSize};
Laurence Lundbladef2a58f62018-12-16 00:43:34 -08002396
2397 QCBOREncode_Init(&EC, Large);
2398 QCBOREncode_OpenArray(&EC);
2399 QCBOREncode_AddBytes(&EC, (UsefulBufC){NULL, uLargeSize/2 + 1});
2400 QCBOREncode_CloseArray(&EC);
2401 if(QCBOREncode_FinishGetSize(&EC, &xx) != QCBOR_SUCCESS) {
2402 // Making sure it succeeds when it should first
2403 return -3;
2404 }
2405
2406 QCBOREncode_Init(&EC, Large);
2407 QCBOREncode_OpenArray(&EC);
2408 QCBOREncode_AddBytes(&EC, (UsefulBufC){NULL, uLargeSize/2 + 1});
2409 QCBOREncode_AddBytes(&EC, (UsefulBufC){NULL, uLargeSize/2});
2410 QCBOREncode_CloseArray(&EC);
2411 if(QCBOREncode_FinishGetSize(&EC, &xx) != QCBOR_ERR_BUFFER_TOO_SMALL) {
2412 // Now just 1 byte over, see that it fails
2413 return -4;
2414 }
Laurence Lundbladedf1c1cf2019-01-17 11:55:05 -08002415
2416
Laurence Lundbladef2a58f62018-12-16 00:43:34 -08002417 // ----- QCBOR_ERR_ARRAY_NESTING_TOO_DEEP -------
2418 QCBOREncode_Init(&EC, Large);
2419 for(int i = QCBOR_MAX_ARRAY_NESTING; i > 0; i--) {
2420 QCBOREncode_OpenArray(&EC);
2421 }
2422 for(int i = QCBOR_MAX_ARRAY_NESTING; i > 0; i--) {
2423 QCBOREncode_CloseArray(&EC);
2424 }
2425 if(QCBOREncode_FinishGetSize(&EC, &xx) != QCBOR_SUCCESS) {
2426 // Making sure it succeeds when it should first
2427 return -5;
2428 }
2429
2430 QCBOREncode_Init(&EC, Large);
2431 for(int i = QCBOR_MAX_ARRAY_NESTING+1; i > 0; i--) {
2432 QCBOREncode_OpenArray(&EC);
2433 }
2434 for(int i = QCBOR_MAX_ARRAY_NESTING+1; i > 0; i--) {
2435 QCBOREncode_CloseArray(&EC);
2436 }
2437 if(QCBOREncode_FinishGetSize(&EC, &xx) != QCBOR_ERR_ARRAY_NESTING_TOO_DEEP) {
2438 // One more level to cause error
2439 return -6;
2440 }
Laurence Lundbladedf1c1cf2019-01-17 11:55:05 -08002441
2442
Laurence Lundbladed8e1c512020-11-04 23:03:44 -08002443#ifndef QCBOR_DISABLE_ENCODE_USAGE_GUARDS
Laurence Lundbladef2a58f62018-12-16 00:43:34 -08002444 // ------ QCBOR_ERR_TOO_MANY_CLOSES --------
2445 QCBOREncode_Init(&EC, Large);
2446 for(int i = QCBOR_MAX_ARRAY_NESTING; i > 0; i--) {
2447 QCBOREncode_OpenArray(&EC);
2448 }
2449 for(int i = QCBOR_MAX_ARRAY_NESTING+1; i > 0; i--) {
2450 QCBOREncode_CloseArray(&EC);
2451 }
2452 if(QCBOREncode_FinishGetSize(&EC, &xx) != QCBOR_ERR_TOO_MANY_CLOSES) {
2453 // One more level to cause error
2454 return -7;
2455 }
Laurence Lundbladedf1c1cf2019-01-17 11:55:05 -08002456
2457
Laurence Lundbladef2a58f62018-12-16 00:43:34 -08002458 // ------ QCBOR_ERR_CLOSE_MISMATCH --------
2459 QCBOREncode_Init(&EC, Large);
2460 QCBOREncode_OpenArray(&EC);
2461 UsefulBufC Wrap;
2462 QCBOREncode_CloseBstrWrap(&EC, &Wrap);
2463 if(QCBOREncode_FinishGetSize(&EC, &xx) != QCBOR_ERR_CLOSE_MISMATCH) {
2464 return -8;
2465 }
2466
2467
2468 // ------ QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN ---------
2469 QCBOREncode_Init(&EC, Large);
2470 for(int i = QCBOR_MAX_ARRAY_NESTING; i > 0; i--) {
2471 QCBOREncode_OpenArray(&EC);
2472 }
2473 for(int i = QCBOR_MAX_ARRAY_NESTING-1; i > 0; i--) {
2474 QCBOREncode_CloseArray(&EC);
2475 }
2476 if(QCBOREncode_FinishGetSize(&EC, &xx) != QCBOR_ERR_ARRAY_OR_MAP_STILL_OPEN) {
2477 // One more level to cause error
2478 return -9;
2479 }
Laurence Lundbladed8e1c512020-11-04 23:03:44 -08002480#endif /* QCBOR_DISABLE_ENCODE_USAGE_GUARDS */
Laurence Lundbladedf1c1cf2019-01-17 11:55:05 -08002481
Laurence Lundblade241705e2018-12-30 18:56:14 -08002482 /* QCBOR_ERR_ARRAY_TOO_LONG is not tested here as
2483 it would require a 64KB of RAM to test */
Laurence Lundbladef2a58f62018-12-16 00:43:34 -08002484
Laurence Lundblade30dd0ba2019-05-26 23:37:30 +03002485
2486 // ----- Test the check for NULL buffer ------
2487 QCBOREncode_Init(&EC, Buffer);
2488 if(QCBOREncode_IsBufferNULL(&EC) == 0) {
2489 return -11;
2490 }
2491
Laurence Lundbladed8e1c512020-11-04 23:03:44 -08002492#ifndef QCBOR_DISABLE_ENCODE_USAGE_GUARDS
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07002493 // ------ QCBOR_ERR_UNSUPPORTED --------
2494 QCBOREncode_Init(&EC, Large);
2495 QCBOREncode_OpenArray(&EC);
2496 QCBOREncode_AddSimple(&EC, 24); // CBOR_SIMPLEV_RESERVED_START
Laurence Lundbladea9489f82020-09-12 13:50:56 -07002497 if(QCBOREncode_FinishGetSize(&EC, &xx) != QCBOR_ERR_ENCODE_UNSUPPORTED) {
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07002498 return -12;
2499 }
2500
2501 QCBOREncode_Init(&EC, Large);
2502 QCBOREncode_OpenArray(&EC);
2503 QCBOREncode_AddSimple(&EC, 31); // CBOR_SIMPLEV_RESERVED_END
Laurence Lundbladea9489f82020-09-12 13:50:56 -07002504 if(QCBOREncode_FinishGetSize(&EC, &xx) != QCBOR_ERR_ENCODE_UNSUPPORTED) {
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07002505 return -13;
2506 }
Laurence Lundbladed8e1c512020-11-04 23:03:44 -08002507#endif /* #ifndef QCBOR_DISABLE_ENCODE_USAGE_GUARDS */
2508
Laurence Lundbladebb1062e2019-08-12 23:28:54 -07002509
Laurence Lundblade1ef8b2d2018-12-14 23:13:34 -08002510 return 0;
2511}
Laurence Lundblade59289e52019-12-30 13:44:37 -08002512
2513
2514#ifndef QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA
2515/*
2516 [
2517 4([-1, 3]),
2518 4([-20, 4759477275222530853136]),
2519 4([9223372036854775807, -4759477275222530853137]),
2520 5([300, 100]),
2521 5([-20, 4759477275222530853136]),
2522 5([-9223372036854775808, -4759477275222530853137])
2523 ]
2524 */
2525static const uint8_t spExpectedExponentAndMantissaArray[] = {
2526 0x86, 0xC4, 0x82, 0x20, 0x03, 0xC4, 0x82, 0x33,
2527 0xC2, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
2528 0x07, 0x08, 0x09, 0x10, 0xC4, 0x82, 0x1B, 0x7F,
2529 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3,
2530 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2531 0x08, 0x09, 0x10, 0xC5, 0x82, 0x19, 0x01, 0x2C,
2532 0x18, 0x64, 0xC5, 0x82, 0x33, 0xC2, 0x4A, 0x01,
2533 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
2534 0x10, 0xC5, 0x82, 0x3B, 0x7F, 0xFF, 0xFF, 0xFF,
2535 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x4A, 0x01, 0x02,
2536 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10};
2537
2538
2539/*
2540 {
2541 "decimal fraction": 4([-1, 3]),
2542 300: 4([-1, 3]),
2543 "decimal fraction bignum postive": 4([-200, 4759477275222530853136]),
2544 400: 4([2147483647, 4759477275222530853136]),
2545 "decimal fraction bignum negative": 4([9223372036854775807, -4759477275222530853137]),
2546 500: 4([9223372036854775807, -4759477275222530853137]),
2547 "big float": 5([300, 100]),
2548 600: 5([300, 100]),
2549 "big float bignum positive": 5([-20, 4759477275222530853136]),
2550 700: 5([-20, 4759477275222530853136]),
2551 "big float bignum negative": 5([-9223372036854775808, -4759477275222530853137]),
2552 800: 5([-9223372036854775808, -4759477275222530853137])
2553 }
2554 */
2555static const uint8_t spExpectedExponentAndMantissaMap[] = {
2556 0xAC, 0x70, 0x64, 0x65, 0x63, 0x69, 0x6D, 0x61,
2557 0x6C, 0x20, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69,
2558 0x6F, 0x6E, 0xC4, 0x82, 0x20, 0x03, 0x19, 0x01,
2559 0x2C, 0xC4, 0x82, 0x20, 0x03, 0x78, 0x1F, 0x64,
2560 0x65, 0x63, 0x69, 0x6D, 0x61, 0x6C, 0x20, 0x66,
2561 0x72, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20,
2562 0x62, 0x69, 0x67, 0x6E, 0x75, 0x6D, 0x20, 0x70,
2563 0x6F, 0x73, 0x74, 0x69, 0x76, 0x65, 0xC4, 0x82,
2564 0x38, 0xC7, 0xC2, 0x4A, 0x01, 0x02, 0x03, 0x04,
2565 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x19, 0x01,
2566 0x90, 0xC4, 0x82, 0x1A, 0x7F, 0xFF, 0xFF, 0xFF,
2567 0xC2, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
2568 0x07, 0x08, 0x09, 0x10, 0x78, 0x20, 0x64, 0x65,
2569 0x63, 0x69, 0x6D, 0x61, 0x6C, 0x20, 0x66, 0x72,
2570 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x62,
2571 0x69, 0x67, 0x6E, 0x75, 0x6D, 0x20, 0x6E, 0x65,
2572 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0xC4, 0x82,
2573 0x1B, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
2574 0xFF, 0xC3, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05,
2575 0x06, 0x07, 0x08, 0x09, 0x10, 0x19, 0x01, 0xF4,
2576 0xC4, 0x82, 0x1B, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF,
2577 0xFF, 0xFF, 0xFF, 0xC3, 0x4A, 0x01, 0x02, 0x03,
2578 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x69,
2579 0x62, 0x69, 0x67, 0x20, 0x66, 0x6C, 0x6F, 0x61,
2580 0x74, 0xC5, 0x82, 0x19, 0x01, 0x2C, 0x18, 0x64,
2581 0x19, 0x02, 0x58, 0xC5, 0x82, 0x19, 0x01, 0x2C,
2582 0x18, 0x64, 0x78, 0x19, 0x62, 0x69, 0x67, 0x20,
2583 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x20, 0x62, 0x69,
2584 0x67, 0x6E, 0x75, 0x6D, 0x20, 0x70, 0x6F, 0x73,
2585 0x69, 0x74, 0x69, 0x76, 0x65, 0xC5, 0x82, 0x33,
2586 0xC2, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
2587 0x07, 0x08, 0x09, 0x10, 0x19, 0x02, 0xBC, 0xC5,
2588 0x82, 0x33, 0xC2, 0x4A, 0x01, 0x02, 0x03, 0x04,
2589 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x78, 0x19,
2590 0x62, 0x69, 0x67, 0x20, 0x66, 0x6C, 0x6F, 0x61,
2591 0x74, 0x20, 0x62, 0x69, 0x67, 0x6E, 0x75, 0x6D,
2592 0x20, 0x6E, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76,
2593 0x65, 0xC5, 0x82, 0x3B, 0x7F, 0xFF, 0xFF, 0xFF,
2594 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x4A, 0x01, 0x02,
2595 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,
2596 0x19, 0x03, 0x20, 0xC5, 0x82, 0x3B, 0x7F, 0xFF,
2597 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x4A,
2598 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
2599 0x09, 0x10
2600};
2601
2602
Laurence Lundbladec5fef682020-01-25 11:38:45 -08002603int32_t ExponentAndMantissaEncodeTests()
Laurence Lundblade59289e52019-12-30 13:44:37 -08002604{
2605 QCBOREncodeContext EC;
2606 UsefulBufC EncodedExponentAndMantissa;
2607
2608 // Constant for the big number used in all the tests.
2609 static const uint8_t spBigNum[] = {0x01, 0x02, 0x03, 0x04, 0x05,
2610 0x06, 0x07, 0x08, 0x09, 0x010};
2611 const UsefulBufC BigNum = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spBigNum);
2612
2613 QCBOREncode_Init(&EC, UsefulBuf_FROM_BYTE_ARRAY(spBigBuf));
2614 QCBOREncode_OpenArray(&EC);
2615 QCBOREncode_AddDecimalFraction(&EC, 3, -1); // 3 * (10 ^ -1)
2616 QCBOREncode_AddDecimalFractionBigNum(&EC, BigNum , false, -20);
2617 QCBOREncode_AddDecimalFractionBigNum(&EC, BigNum, true, INT64_MAX);
2618 QCBOREncode_AddBigFloat(&EC, 100, 300);
2619 QCBOREncode_AddBigFloatBigNum(&EC, BigNum, false, -20);
2620 QCBOREncode_AddBigFloatBigNum(&EC, BigNum, true, INT64_MIN);
2621 QCBOREncode_CloseArray(&EC);
2622
2623 if(QCBOREncode_Finish(&EC, &EncodedExponentAndMantissa)) {
2624 return -2;
2625 }
2626
2627 int nReturn = UsefulBuf_CompareWithDiagnostic(EncodedExponentAndMantissa,
2628 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spExpectedExponentAndMantissaArray),
2629 NULL);
2630 if(nReturn) {
2631 return nReturn;
2632 }
2633
2634 QCBOREncode_Init(&EC, UsefulBuf_FROM_BYTE_ARRAY(spBigBuf));
2635 QCBOREncode_OpenMap(&EC);
2636
2637 QCBOREncode_AddDecimalFractionToMap(&EC, "decimal fraction", 3, -1);
2638
2639 QCBOREncode_AddDecimalFractionToMapN(&EC, 300, 3, -1);
2640
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002641 QCBOREncode_AddDecimalFractionBigNumToMapSZ(&EC,
Laurence Lundblade59289e52019-12-30 13:44:37 -08002642 "decimal fraction bignum postive",
2643 BigNum,
2644 false,
2645 -200);
2646
2647 QCBOREncode_AddDecimalFractionBigNumToMapN(&EC,
2648 400,
2649 BigNum,
2650 false,
2651 INT32_MAX);
2652
Laurence Lundbladeae66d3f2020-09-14 18:12:08 -07002653 QCBOREncode_AddDecimalFractionBigNumToMapSZ(&EC,
Laurence Lundblade59289e52019-12-30 13:44:37 -08002654 "decimal fraction bignum negative",
2655 BigNum,
2656 true,
2657 INT64_MAX);
2658
2659 QCBOREncode_AddDecimalFractionBigNumToMapN(&EC,
2660 500,
2661 BigNum,
2662 true,
2663 INT64_MAX);
2664
2665 QCBOREncode_AddBigFloatToMap(&EC, "big float", 100, 300);
2666
2667 QCBOREncode_AddBigFloatToMapN(&EC, 600, 100, 300);
2668
2669 QCBOREncode_AddBigFloatBigNumToMap(&EC,
2670 "big float bignum positive",
2671 BigNum,
2672 false,
2673 -20);
2674
2675 QCBOREncode_AddBigFloatBigNumToMapN(&EC,
2676 700,
2677 BigNum,
2678 false,
2679 -20);
2680
2681 QCBOREncode_AddBigFloatBigNumToMap(&EC,
2682 "big float bignum negative",
2683 BigNum,
2684 true,
2685 INT64_MIN);
2686
2687 QCBOREncode_AddBigFloatBigNumToMapN(&EC,
2688 800,
2689 BigNum,
2690 true,
2691 INT64_MIN);
2692
2693 QCBOREncode_CloseMap(&EC);
2694
2695 if(QCBOREncode_Finish(&EC, &EncodedExponentAndMantissa)) {
2696 return -3;
2697 }
2698
2699
2700 struct UBCompareDiagnostic Diag;
2701
2702 nReturn = UsefulBuf_CompareWithDiagnostic(EncodedExponentAndMantissa,
2703 UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spExpectedExponentAndMantissaMap),
2704 &Diag);
2705 if(nReturn) {
2706 return nReturn + 1000000; // +1000000 to distinguish from first test above
2707 }
2708
2709 return 0;
2710}
2711
2712#endif /* QCBOR_CONFIG_DISABLE_EXP_AND_MANTISSA */
Laurence Lundbladec9f0fbc2020-02-07 10:48:33 +00002713
2714
2715int32_t QCBORHeadTest()
2716{
2717 /* This test doesn't have to be extensive, because just about every
2718 * other test exercises QCBOREncode_EncodeHead().
2719 */
2720 // ---- basic test to encode a zero ----
2721 MakeUsefulBufOnStack(RightSize, QCBOR_HEAD_BUFFER_SIZE);
2722
2723 UsefulBufC encoded = QCBOREncode_EncodeHead(RightSize,
2724 CBOR_MAJOR_TYPE_POSITIVE_INT,
2725 0,
2726 0);
2727
2728 static const uint8_t expectedZero[] = {0x00};
2729
2730 if(UsefulBuf_Compare(encoded, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(expectedZero))) {
2731 return -1;
2732 }
2733
2734 // ---- Encode a zero padded out to an 8 byte integer ----
2735 encoded = QCBOREncode_EncodeHead(RightSize,
2736 CBOR_MAJOR_TYPE_POSITIVE_INT,
2737 8, // uMinSize is 8 bytes
2738 0);
2739
2740 static const uint8_t expected9bytes[] = {0x1b, 0x00, 0x00, 0x00, 0x00,
2741 0x00, 0x00, 0x00, 0x00};
2742
2743 if(UsefulBuf_Compare(encoded, UsefulBuf_FROM_BYTE_ARRAY_LITERAL(expected9bytes))) {
2744 return -2;
2745 }
2746
2747
2748 // ---- Try to encode into too-small a buffer ----
2749 MakeUsefulBufOnStack(TooSmall, QCBOR_HEAD_BUFFER_SIZE-1);
2750
2751 encoded = QCBOREncode_EncodeHead(TooSmall,
2752 CBOR_MAJOR_TYPE_POSITIVE_INT,
2753 0,
2754 0);
2755
2756 if(!UsefulBuf_IsNULLC(encoded)) {
2757 return -3;
2758 }
2759
2760 return 0;
2761}