1*60b67249SAndroid Build Coastguard Worker // Copyright 2021 Google LLC
2*60b67249SAndroid Build Coastguard Worker //
3*60b67249SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*60b67249SAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*60b67249SAndroid Build Coastguard Worker // the License at
6*60b67249SAndroid Build Coastguard Worker //
7*60b67249SAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*60b67249SAndroid Build Coastguard Worker //
9*60b67249SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*60b67249SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*60b67249SAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*60b67249SAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*60b67249SAndroid Build Coastguard Worker // the License.
14*60b67249SAndroid Build Coastguard Worker
15*60b67249SAndroid Build Coastguard Worker #include "dice/cbor_writer.h"
16*60b67249SAndroid Build Coastguard Worker
17*60b67249SAndroid Build Coastguard Worker #include "dice/test_framework.h"
18*60b67249SAndroid Build Coastguard Worker
19*60b67249SAndroid Build Coastguard Worker namespace {
20*60b67249SAndroid Build Coastguard Worker
21*60b67249SAndroid Build Coastguard Worker extern "C" {
22*60b67249SAndroid Build Coastguard Worker
TEST(CborWriterTest,Int1ByteEncoding)23*60b67249SAndroid Build Coastguard Worker TEST(CborWriterTest, Int1ByteEncoding) {
24*60b67249SAndroid Build Coastguard Worker const uint8_t kExpectedEncoding[] = {0, 23, 0x20, 0x37};
25*60b67249SAndroid Build Coastguard Worker uint8_t buffer[64];
26*60b67249SAndroid Build Coastguard Worker CborOut out;
27*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
28*60b67249SAndroid Build Coastguard Worker CborWriteInt(0, &out);
29*60b67249SAndroid Build Coastguard Worker CborWriteInt(23, &out);
30*60b67249SAndroid Build Coastguard Worker CborWriteInt(-1, &out);
31*60b67249SAndroid Build Coastguard Worker CborWriteInt(-24, &out);
32*60b67249SAndroid Build Coastguard Worker EXPECT_FALSE(CborOutOverflowed(&out));
33*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buffer, kExpectedEncoding, sizeof(kExpectedEncoding)));
34*60b67249SAndroid Build Coastguard Worker }
35*60b67249SAndroid Build Coastguard Worker
TEST(CborWriterTest,Int2Bytes)36*60b67249SAndroid Build Coastguard Worker TEST(CborWriterTest, Int2Bytes) {
37*60b67249SAndroid Build Coastguard Worker const uint8_t kExpectedEncoding[] = {24, 24, 24, 0xff, 0x38, 24, 0x38, 0xff};
38*60b67249SAndroid Build Coastguard Worker uint8_t buffer[64];
39*60b67249SAndroid Build Coastguard Worker CborOut out;
40*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
41*60b67249SAndroid Build Coastguard Worker CborWriteInt(24, &out);
42*60b67249SAndroid Build Coastguard Worker CborWriteInt(0xff, &out);
43*60b67249SAndroid Build Coastguard Worker CborWriteInt(-25, &out);
44*60b67249SAndroid Build Coastguard Worker CborWriteInt(-0x100, &out);
45*60b67249SAndroid Build Coastguard Worker EXPECT_FALSE(CborOutOverflowed(&out));
46*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buffer, kExpectedEncoding, sizeof(kExpectedEncoding)));
47*60b67249SAndroid Build Coastguard Worker }
48*60b67249SAndroid Build Coastguard Worker
TEST(CborWriterTest,Int3Bytes)49*60b67249SAndroid Build Coastguard Worker TEST(CborWriterTest, Int3Bytes) {
50*60b67249SAndroid Build Coastguard Worker const uint8_t kExpectedEncoding[] = {25, 0x01, 0x00, 25, 0xff, 0xff,
51*60b67249SAndroid Build Coastguard Worker 0x39, 0x01, 0x00, 0x39, 0xff, 0xff};
52*60b67249SAndroid Build Coastguard Worker uint8_t buffer[64];
53*60b67249SAndroid Build Coastguard Worker CborOut out;
54*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
55*60b67249SAndroid Build Coastguard Worker CborWriteInt(0x100, &out);
56*60b67249SAndroid Build Coastguard Worker CborWriteInt(0xffff, &out);
57*60b67249SAndroid Build Coastguard Worker CborWriteInt(-0x101, &out);
58*60b67249SAndroid Build Coastguard Worker CborWriteInt(-0x10000, &out);
59*60b67249SAndroid Build Coastguard Worker EXPECT_FALSE(CborOutOverflowed(&out));
60*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buffer, kExpectedEncoding, sizeof(kExpectedEncoding)));
61*60b67249SAndroid Build Coastguard Worker }
62*60b67249SAndroid Build Coastguard Worker
TEST(CborWriterTest,Int5Bytes)63*60b67249SAndroid Build Coastguard Worker TEST(CborWriterTest, Int5Bytes) {
64*60b67249SAndroid Build Coastguard Worker const uint8_t kExpectedEncoding[] = {26, 0x00, 0x01, 0x00, 0x00, 26, 0xff,
65*60b67249SAndroid Build Coastguard Worker 0xff, 0xff, 0xff, 0x3a, 0x00, 0x01, 0x00,
66*60b67249SAndroid Build Coastguard Worker 0x00, 0x3a, 0xff, 0xff, 0xff, 0xff};
67*60b67249SAndroid Build Coastguard Worker uint8_t buffer[64];
68*60b67249SAndroid Build Coastguard Worker CborOut out;
69*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
70*60b67249SAndroid Build Coastguard Worker CborWriteInt(0x10000, &out);
71*60b67249SAndroid Build Coastguard Worker CborWriteInt(0xffffffff, &out);
72*60b67249SAndroid Build Coastguard Worker CborWriteInt(-0x10001, &out);
73*60b67249SAndroid Build Coastguard Worker CborWriteInt(-0x100000000, &out);
74*60b67249SAndroid Build Coastguard Worker EXPECT_FALSE(CborOutOverflowed(&out));
75*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buffer, kExpectedEncoding, sizeof(kExpectedEncoding)));
76*60b67249SAndroid Build Coastguard Worker }
77*60b67249SAndroid Build Coastguard Worker
TEST(CborWriterTest,Int9Bytes)78*60b67249SAndroid Build Coastguard Worker TEST(CborWriterTest, Int9Bytes) {
79*60b67249SAndroid Build Coastguard Worker const uint8_t kExpectedEncoding[] = {
80*60b67249SAndroid Build Coastguard Worker 27, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 27, 0x7f, 0xff,
81*60b67249SAndroid Build Coastguard Worker 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3b, 0x00, 0x00, 0x00, 0x01, 0x00,
82*60b67249SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x3b, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
83*60b67249SAndroid Build Coastguard Worker uint8_t buffer[64];
84*60b67249SAndroid Build Coastguard Worker CborOut out;
85*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
86*60b67249SAndroid Build Coastguard Worker CborWriteInt(0x100000000, &out);
87*60b67249SAndroid Build Coastguard Worker CborWriteInt(INT64_MAX, &out);
88*60b67249SAndroid Build Coastguard Worker CborWriteInt(-0x100000001, &out);
89*60b67249SAndroid Build Coastguard Worker CborWriteInt(INT64_MIN, &out);
90*60b67249SAndroid Build Coastguard Worker EXPECT_FALSE(CborOutOverflowed(&out));
91*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buffer, kExpectedEncoding, sizeof(kExpectedEncoding)));
92*60b67249SAndroid Build Coastguard Worker }
93*60b67249SAndroid Build Coastguard Worker
TEST(CborWriterTest,Uint9Bytes)94*60b67249SAndroid Build Coastguard Worker TEST(CborWriterTest, Uint9Bytes) {
95*60b67249SAndroid Build Coastguard Worker const uint8_t kExpectedEncoding[] = {27, 0x00, 0x00, 0x00, 0x01, 0x00,
96*60b67249SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 27, 0xff, 0xff,
97*60b67249SAndroid Build Coastguard Worker 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
98*60b67249SAndroid Build Coastguard Worker uint8_t buffer[64];
99*60b67249SAndroid Build Coastguard Worker CborOut out;
100*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
101*60b67249SAndroid Build Coastguard Worker CborWriteUint(0x100000000, &out);
102*60b67249SAndroid Build Coastguard Worker CborWriteUint(UINT64_MAX, &out);
103*60b67249SAndroid Build Coastguard Worker EXPECT_FALSE(CborOutOverflowed(&out));
104*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buffer, kExpectedEncoding, sizeof(kExpectedEncoding)));
105*60b67249SAndroid Build Coastguard Worker }
106*60b67249SAndroid Build Coastguard Worker
TEST(CborWriterTest,IntByteOrder)107*60b67249SAndroid Build Coastguard Worker TEST(CborWriterTest, IntByteOrder) {
108*60b67249SAndroid Build Coastguard Worker const uint8_t kExpectedEncoding[] = {
109*60b67249SAndroid Build Coastguard Worker 25, 0x12, 0x34, 26, 0x12, 0x34, 0x56, 0x78, 27,
110*60b67249SAndroid Build Coastguard Worker 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
111*60b67249SAndroid Build Coastguard Worker };
112*60b67249SAndroid Build Coastguard Worker uint8_t buffer[64];
113*60b67249SAndroid Build Coastguard Worker CborOut out;
114*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
115*60b67249SAndroid Build Coastguard Worker CborWriteInt(0x1234, &out);
116*60b67249SAndroid Build Coastguard Worker CborWriteInt(0x12345678, &out);
117*60b67249SAndroid Build Coastguard Worker CborWriteInt(0x123456789abcdef0, &out);
118*60b67249SAndroid Build Coastguard Worker EXPECT_FALSE(CborOutOverflowed(&out));
119*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buffer, kExpectedEncoding, sizeof(kExpectedEncoding)));
120*60b67249SAndroid Build Coastguard Worker }
121*60b67249SAndroid Build Coastguard Worker
TEST(CborWriterTest,BstrEncoding)122*60b67249SAndroid Build Coastguard Worker TEST(CborWriterTest, BstrEncoding) {
123*60b67249SAndroid Build Coastguard Worker const uint8_t kExpectedEncoding[] = {0x45, 'h', 'e', 'l', 'l', 'o'};
124*60b67249SAndroid Build Coastguard Worker const uint8_t kData[] = {'h', 'e', 'l', 'l', 'o'};
125*60b67249SAndroid Build Coastguard Worker uint8_t buffer[64];
126*60b67249SAndroid Build Coastguard Worker CborOut out;
127*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
128*60b67249SAndroid Build Coastguard Worker CborWriteBstr(sizeof(kData), kData, &out);
129*60b67249SAndroid Build Coastguard Worker EXPECT_FALSE(CborOutOverflowed(&out));
130*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buffer, kExpectedEncoding, sizeof(kExpectedEncoding)));
131*60b67249SAndroid Build Coastguard Worker }
132*60b67249SAndroid Build Coastguard Worker
TEST(CborWriterTest,BstrAllocEncoding)133*60b67249SAndroid Build Coastguard Worker TEST(CborWriterTest, BstrAllocEncoding) {
134*60b67249SAndroid Build Coastguard Worker const uint8_t kExpectedEncoding[] = {0x45, 'a', 'l', 'l', 'o', 'c'};
135*60b67249SAndroid Build Coastguard Worker const uint8_t kData[] = {'a', 'l', 'l', 'o', 'c'};
136*60b67249SAndroid Build Coastguard Worker uint8_t buffer[64];
137*60b67249SAndroid Build Coastguard Worker uint8_t* ptr;
138*60b67249SAndroid Build Coastguard Worker CborOut out;
139*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
140*60b67249SAndroid Build Coastguard Worker ptr = CborAllocBstr(sizeof(kData), &out);
141*60b67249SAndroid Build Coastguard Worker EXPECT_NE(nullptr, ptr);
142*60b67249SAndroid Build Coastguard Worker EXPECT_FALSE(CborOutOverflowed(&out));
143*60b67249SAndroid Build Coastguard Worker memcpy(ptr, kData, sizeof(kData));
144*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buffer, kExpectedEncoding, sizeof(kExpectedEncoding)));
145*60b67249SAndroid Build Coastguard Worker }
146*60b67249SAndroid Build Coastguard Worker
TEST(CborWriterTest,TstrEncoding)147*60b67249SAndroid Build Coastguard Worker TEST(CborWriterTest, TstrEncoding) {
148*60b67249SAndroid Build Coastguard Worker const uint8_t kExpectedEncoding[] = {0x65, 'w', 'o', 'r', 'l', 'd'};
149*60b67249SAndroid Build Coastguard Worker uint8_t buffer[64];
150*60b67249SAndroid Build Coastguard Worker CborOut out;
151*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
152*60b67249SAndroid Build Coastguard Worker CborWriteTstr("world", &out);
153*60b67249SAndroid Build Coastguard Worker EXPECT_FALSE(CborOutOverflowed(&out));
154*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buffer, kExpectedEncoding, sizeof(kExpectedEncoding)));
155*60b67249SAndroid Build Coastguard Worker }
156*60b67249SAndroid Build Coastguard Worker
TEST(CborWriterTest,TstrAllocEncoding)157*60b67249SAndroid Build Coastguard Worker TEST(CborWriterTest, TstrAllocEncoding) {
158*60b67249SAndroid Build Coastguard Worker const uint8_t kExpectedEncoding[] = {0x65, 's', 'p', 'a', 'c', 'e'};
159*60b67249SAndroid Build Coastguard Worker const char kStr[] = "space";
160*60b67249SAndroid Build Coastguard Worker char* ptr;
161*60b67249SAndroid Build Coastguard Worker uint8_t buffer[64];
162*60b67249SAndroid Build Coastguard Worker CborOut out;
163*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
164*60b67249SAndroid Build Coastguard Worker ptr = CborAllocTstr(strlen(kStr), &out);
165*60b67249SAndroid Build Coastguard Worker EXPECT_NE(nullptr, ptr);
166*60b67249SAndroid Build Coastguard Worker EXPECT_FALSE(CborOutOverflowed(&out));
167*60b67249SAndroid Build Coastguard Worker memcpy(ptr, kStr, sizeof(kStr));
168*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buffer, kExpectedEncoding, sizeof(kExpectedEncoding)));
169*60b67249SAndroid Build Coastguard Worker }
170*60b67249SAndroid Build Coastguard Worker
TEST(CborWriterTest,ArrayEncoding)171*60b67249SAndroid Build Coastguard Worker TEST(CborWriterTest, ArrayEncoding) {
172*60b67249SAndroid Build Coastguard Worker const uint8_t kExpectedEncoding[] = {0x98, 29};
173*60b67249SAndroid Build Coastguard Worker uint8_t buffer[64];
174*60b67249SAndroid Build Coastguard Worker CborOut out;
175*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
176*60b67249SAndroid Build Coastguard Worker CborWriteArray(/*num_elements=*/29, &out);
177*60b67249SAndroid Build Coastguard Worker EXPECT_FALSE(CborOutOverflowed(&out));
178*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buffer, kExpectedEncoding, sizeof(kExpectedEncoding)));
179*60b67249SAndroid Build Coastguard Worker }
180*60b67249SAndroid Build Coastguard Worker
TEST(CborWriterTest,MapEncoding)181*60b67249SAndroid Build Coastguard Worker TEST(CborWriterTest, MapEncoding) {
182*60b67249SAndroid Build Coastguard Worker const uint8_t kExpectedEncoding[] = {0xb9, 0x02, 0x50};
183*60b67249SAndroid Build Coastguard Worker uint8_t buffer[64];
184*60b67249SAndroid Build Coastguard Worker CborOut out;
185*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
186*60b67249SAndroid Build Coastguard Worker CborWriteMap(/*num_pairs=*/592, &out);
187*60b67249SAndroid Build Coastguard Worker EXPECT_FALSE(CborOutOverflowed(&out));
188*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buffer, kExpectedEncoding, sizeof(kExpectedEncoding)));
189*60b67249SAndroid Build Coastguard Worker }
190*60b67249SAndroid Build Coastguard Worker
TEST(CborWriterTest,TagEncoding)191*60b67249SAndroid Build Coastguard Worker TEST(CborWriterTest, TagEncoding) {
192*60b67249SAndroid Build Coastguard Worker const uint8_t kExpectedEncoding[] = {0xcf, 0xd8, 0x18, 0xd9, 0xd9, 0xf8, 0xda,
193*60b67249SAndroid Build Coastguard Worker 0x4f, 0x50, 0x53, 0x4e, 0xdb, 0x10, 0x00,
194*60b67249SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
195*60b67249SAndroid Build Coastguard Worker uint8_t buffer[64];
196*60b67249SAndroid Build Coastguard Worker CborOut out;
197*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
198*60b67249SAndroid Build Coastguard Worker CborWriteTag(/*tag=*/15, &out);
199*60b67249SAndroid Build Coastguard Worker CborWriteTag(/*tag=*/24, &out);
200*60b67249SAndroid Build Coastguard Worker CborWriteTag(/*tag=*/0xd9f8u, &out);
201*60b67249SAndroid Build Coastguard Worker CborWriteTag(/*tag=*/0x4f50534eu, &out);
202*60b67249SAndroid Build Coastguard Worker CborWriteTag(/*tag=*/0x1000000000000000u, &out);
203*60b67249SAndroid Build Coastguard Worker EXPECT_FALSE(CborOutOverflowed(&out));
204*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buffer, kExpectedEncoding, sizeof(kExpectedEncoding)));
205*60b67249SAndroid Build Coastguard Worker }
206*60b67249SAndroid Build Coastguard Worker
TEST(CborWriterTest,FalseEncoding)207*60b67249SAndroid Build Coastguard Worker TEST(CborWriterTest, FalseEncoding) {
208*60b67249SAndroid Build Coastguard Worker const uint8_t kExpectedEncoding[] = {0xf4};
209*60b67249SAndroid Build Coastguard Worker uint8_t buffer[64];
210*60b67249SAndroid Build Coastguard Worker CborOut out;
211*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
212*60b67249SAndroid Build Coastguard Worker CborWriteFalse(&out);
213*60b67249SAndroid Build Coastguard Worker EXPECT_FALSE(CborOutOverflowed(&out));
214*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buffer, kExpectedEncoding, sizeof(kExpectedEncoding)));
215*60b67249SAndroid Build Coastguard Worker }
216*60b67249SAndroid Build Coastguard Worker
TEST(CborWriterTest,TrueEncoding)217*60b67249SAndroid Build Coastguard Worker TEST(CborWriterTest, TrueEncoding) {
218*60b67249SAndroid Build Coastguard Worker const uint8_t kExpectedEncoding[] = {0xf5};
219*60b67249SAndroid Build Coastguard Worker uint8_t buffer[64];
220*60b67249SAndroid Build Coastguard Worker CborOut out;
221*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
222*60b67249SAndroid Build Coastguard Worker CborWriteTrue(&out);
223*60b67249SAndroid Build Coastguard Worker EXPECT_FALSE(CborOutOverflowed(&out));
224*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buffer, kExpectedEncoding, sizeof(kExpectedEncoding)));
225*60b67249SAndroid Build Coastguard Worker }
226*60b67249SAndroid Build Coastguard Worker
TEST(CborWriterTest,NullEncoding)227*60b67249SAndroid Build Coastguard Worker TEST(CborWriterTest, NullEncoding) {
228*60b67249SAndroid Build Coastguard Worker const uint8_t kExpectedEncoding[] = {0xf6};
229*60b67249SAndroid Build Coastguard Worker uint8_t buffer[64];
230*60b67249SAndroid Build Coastguard Worker CborOut out;
231*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
232*60b67249SAndroid Build Coastguard Worker CborWriteNull(&out);
233*60b67249SAndroid Build Coastguard Worker EXPECT_FALSE(CborOutOverflowed(&out));
234*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(buffer, kExpectedEncoding, sizeof(kExpectedEncoding)));
235*60b67249SAndroid Build Coastguard Worker }
236*60b67249SAndroid Build Coastguard Worker
TEST(CborWriterTest,CborOutInvariants)237*60b67249SAndroid Build Coastguard Worker TEST(CborWriterTest, CborOutInvariants) {
238*60b67249SAndroid Build Coastguard Worker const uint8_t kData[] = {0xb2, 0x34, 0x75, 0x92, 0x52};
239*60b67249SAndroid Build Coastguard Worker uint8_t buffer[64];
240*60b67249SAndroid Build Coastguard Worker CborOut out;
241*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
242*60b67249SAndroid Build Coastguard Worker CborWriteInt(0xab34, &out);
243*60b67249SAndroid Build Coastguard Worker CborWriteBstr(sizeof(kData), kData, &out);
244*60b67249SAndroid Build Coastguard Worker EXPECT_NE(nullptr, CborAllocBstr(7, &out));
245*60b67249SAndroid Build Coastguard Worker CborWriteTstr("A string", &out);
246*60b67249SAndroid Build Coastguard Worker EXPECT_NE(nullptr, CborAllocTstr(6, &out));
247*60b67249SAndroid Build Coastguard Worker CborWriteArray(/*num_elements=*/16, &out);
248*60b67249SAndroid Build Coastguard Worker CborWriteMap(/*num_pairs=*/35, &out);
249*60b67249SAndroid Build Coastguard Worker CborWriteTag(/*tag=*/15, &out);
250*60b67249SAndroid Build Coastguard Worker CborWriteFalse(&out);
251*60b67249SAndroid Build Coastguard Worker CborWriteTrue(&out);
252*60b67249SAndroid Build Coastguard Worker CborWriteNull(&out);
253*60b67249SAndroid Build Coastguard Worker EXPECT_FALSE(CborOutOverflowed(&out));
254*60b67249SAndroid Build Coastguard Worker // Offset is the cumulative size.
255*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(3 + 6 + 8 + 9 + 7 + 1 + 2 + 1 + 1 + 1 + 1u, CborOutSize(&out));
256*60b67249SAndroid Build Coastguard Worker }
257*60b67249SAndroid Build Coastguard Worker
TEST(CborWriterTest,NullBufferForMeasurement)258*60b67249SAndroid Build Coastguard Worker TEST(CborWriterTest, NullBufferForMeasurement) {
259*60b67249SAndroid Build Coastguard Worker const uint8_t kData[] = {16, 102, 246, 12, 156, 35, 84};
260*60b67249SAndroid Build Coastguard Worker CborOut out;
261*60b67249SAndroid Build Coastguard Worker CborOutInit(nullptr, 0, &out);
262*60b67249SAndroid Build Coastguard Worker CborWriteNull(&out);
263*60b67249SAndroid Build Coastguard Worker CborWriteTrue(&out);
264*60b67249SAndroid Build Coastguard Worker CborWriteFalse(&out);
265*60b67249SAndroid Build Coastguard Worker CborWriteTag(/*tag=*/15, &out);
266*60b67249SAndroid Build Coastguard Worker CborWriteMap(/*num_pairs=*/623, &out);
267*60b67249SAndroid Build Coastguard Worker CborWriteArray(/*num_elements=*/70000, &out);
268*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, CborAllocTstr(8, &out));
269*60b67249SAndroid Build Coastguard Worker CborWriteTstr("length", &out);
270*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, CborAllocBstr(1, &out));
271*60b67249SAndroid Build Coastguard Worker CborWriteBstr(sizeof(kData), kData, &out);
272*60b67249SAndroid Build Coastguard Worker CborWriteInt(-10002000, &out);
273*60b67249SAndroid Build Coastguard Worker // Measurement has occurred, but output did not.
274*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
275*60b67249SAndroid Build Coastguard Worker // Offset is the cumulative size.
276*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(1 + 1 + 1 + 1 + 3 + 5 + 9 + 7 + 2 + 8 + 5u, CborOutSize(&out));
277*60b67249SAndroid Build Coastguard Worker }
278*60b67249SAndroid Build Coastguard Worker
TEST(CborWriterTest,BufferTooSmall)279*60b67249SAndroid Build Coastguard Worker TEST(CborWriterTest, BufferTooSmall) {
280*60b67249SAndroid Build Coastguard Worker const uint8_t kData[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
281*60b67249SAndroid Build Coastguard Worker uint8_t buffer[1];
282*60b67249SAndroid Build Coastguard Worker CborOut out;
283*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
284*60b67249SAndroid Build Coastguard Worker // Reset offset each time as it may be corrupted on failures.
285*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
286*60b67249SAndroid Build Coastguard Worker CborWriteInt(-55667788, &out);
287*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
288*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
289*60b67249SAndroid Build Coastguard Worker CborWriteBstr(sizeof(kData), kData, &out);
290*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
291*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
292*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, CborAllocBstr(sizeof(kData), &out));
293*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
294*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
295*60b67249SAndroid Build Coastguard Worker CborWriteTstr("Buffer too small", &out);
296*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
297*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
298*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, CborAllocTstr(16, &out));
299*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
300*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
301*60b67249SAndroid Build Coastguard Worker CborWriteArray(/*num_elements=*/563, &out);
302*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
303*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
304*60b67249SAndroid Build Coastguard Worker CborWriteMap(/*num_pairs=*/29, &out);
305*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
306*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, 0, &out);
307*60b67249SAndroid Build Coastguard Worker CborWriteFalse(&out);
308*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
309*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, 0, &out);
310*60b67249SAndroid Build Coastguard Worker CborWriteTrue(&out);
311*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
312*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, 0, &out);
313*60b67249SAndroid Build Coastguard Worker CborWriteNull(&out);
314*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
315*60b67249SAndroid Build Coastguard Worker }
316*60b67249SAndroid Build Coastguard Worker
TEST(CborWriterTest,NotEnoughRemainingSpace)317*60b67249SAndroid Build Coastguard Worker TEST(CborWriterTest, NotEnoughRemainingSpace) {
318*60b67249SAndroid Build Coastguard Worker const uint8_t kData[] = {0xff, 0xee, 0xdd, 0xcc};
319*60b67249SAndroid Build Coastguard Worker uint8_t zeros[64] = {0};
320*60b67249SAndroid Build Coastguard Worker uint8_t buffer[64];
321*60b67249SAndroid Build Coastguard Worker CborOut out;
322*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
323*60b67249SAndroid Build Coastguard Worker CborWriteBstr(sizeof(buffer) - 3, zeros, &out);
324*60b67249SAndroid Build Coastguard Worker CborWriteInt(-36, &out);
325*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
326*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
327*60b67249SAndroid Build Coastguard Worker CborWriteBstr(sizeof(buffer) - 3, zeros, &out);
328*60b67249SAndroid Build Coastguard Worker CborWriteBstr(sizeof(kData), kData, &out);
329*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
330*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
331*60b67249SAndroid Build Coastguard Worker CborWriteBstr(sizeof(buffer) - 3, zeros, &out);
332*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, CborAllocBstr(sizeof(kData), &out));
333*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
334*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
335*60b67249SAndroid Build Coastguard Worker CborWriteBstr(sizeof(buffer) - 3, zeros, &out);
336*60b67249SAndroid Build Coastguard Worker CborWriteTstr("Won't fit", &out);
337*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
338*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
339*60b67249SAndroid Build Coastguard Worker CborWriteBstr(sizeof(buffer) - 3, zeros, &out);
340*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, CborAllocTstr(4, &out));
341*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
342*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
343*60b67249SAndroid Build Coastguard Worker CborWriteBstr(sizeof(buffer) - 3, zeros, &out);
344*60b67249SAndroid Build Coastguard Worker CborWriteArray(/*num_elements=*/352, &out);
345*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
346*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
347*60b67249SAndroid Build Coastguard Worker CborWriteBstr(sizeof(buffer) - 3, zeros, &out);
348*60b67249SAndroid Build Coastguard Worker CborWriteMap(/*num_pairs=*/73, &out);
349*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
350*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
351*60b67249SAndroid Build Coastguard Worker CborWriteBstr(sizeof(buffer) - 2, zeros, &out);
352*60b67249SAndroid Build Coastguard Worker CborWriteFalse(&out);
353*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
354*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
355*60b67249SAndroid Build Coastguard Worker CborWriteBstr(sizeof(buffer) - 2, zeros, &out);
356*60b67249SAndroid Build Coastguard Worker CborWriteTrue(&out);
357*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
358*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
359*60b67249SAndroid Build Coastguard Worker CborWriteBstr(sizeof(buffer) - 2, zeros, &out);
360*60b67249SAndroid Build Coastguard Worker CborWriteNull(&out);
361*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
362*60b67249SAndroid Build Coastguard Worker }
363*60b67249SAndroid Build Coastguard Worker
TEST(CborWriterTest,OffsetOverflow)364*60b67249SAndroid Build Coastguard Worker TEST(CborWriterTest, OffsetOverflow) {
365*60b67249SAndroid Build Coastguard Worker const uint8_t kData[] = {0xff, 0xee, 0xdd, 0xcc};
366*60b67249SAndroid Build Coastguard Worker uint8_t buffer[64];
367*60b67249SAndroid Build Coastguard Worker CborOut out;
368*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
369*60b67249SAndroid Build Coastguard Worker CborWriteBstr(SIZE_MAX - 10, nullptr, &out);
370*60b67249SAndroid Build Coastguard Worker CborWriteInt(0x234198adb, &out);
371*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
372*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
373*60b67249SAndroid Build Coastguard Worker CborWriteBstr(SIZE_MAX - 10, nullptr, &out);
374*60b67249SAndroid Build Coastguard Worker CborWriteBstr(sizeof(kData), kData, &out);
375*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
376*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
377*60b67249SAndroid Build Coastguard Worker CborWriteBstr(SIZE_MAX - 10, nullptr, &out);
378*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, CborAllocBstr(sizeof(kData), &out));
379*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
380*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
381*60b67249SAndroid Build Coastguard Worker CborWriteBstr(SIZE_MAX - 10, nullptr, &out);
382*60b67249SAndroid Build Coastguard Worker CborWriteTstr("Overflow", &out);
383*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
384*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
385*60b67249SAndroid Build Coastguard Worker CborWriteBstr(SIZE_MAX - 10, nullptr, &out);
386*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, CborAllocTstr(4, &out));
387*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
388*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
389*60b67249SAndroid Build Coastguard Worker CborWriteBstr(SIZE_MAX - 10, nullptr, &out);
390*60b67249SAndroid Build Coastguard Worker CborWriteArray(/*num_elements=*/41, &out);
391*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
392*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
393*60b67249SAndroid Build Coastguard Worker CborWriteBstr(SIZE_MAX - 10, nullptr, &out);
394*60b67249SAndroid Build Coastguard Worker CborWriteMap(/*num_pairs=*/998844, &out);
395*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
396*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
397*60b67249SAndroid Build Coastguard Worker CborWriteBstr(SIZE_MAX - 9, nullptr, &out);
398*60b67249SAndroid Build Coastguard Worker CborWriteFalse(&out);
399*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
400*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
401*60b67249SAndroid Build Coastguard Worker CborWriteBstr(SIZE_MAX - 9, nullptr, &out);
402*60b67249SAndroid Build Coastguard Worker CborWriteTrue(&out);
403*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
404*60b67249SAndroid Build Coastguard Worker CborOutInit(buffer, sizeof(buffer), &out);
405*60b67249SAndroid Build Coastguard Worker CborWriteBstr(SIZE_MAX - 9, nullptr, &out);
406*60b67249SAndroid Build Coastguard Worker CborWriteNull(&out);
407*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
408*60b67249SAndroid Build Coastguard Worker }
409*60b67249SAndroid Build Coastguard Worker
TEST(CborWriterTest,MeasurementOffsetOverflow)410*60b67249SAndroid Build Coastguard Worker TEST(CborWriterTest, MeasurementOffsetOverflow) {
411*60b67249SAndroid Build Coastguard Worker const uint8_t kData[] = {0xf0, 0x0f, 0xca, 0xfe, 0xfe, 0xed};
412*60b67249SAndroid Build Coastguard Worker CborOut out;
413*60b67249SAndroid Build Coastguard Worker CborOutInit(nullptr, 0, &out);
414*60b67249SAndroid Build Coastguard Worker CborWriteBstr(SIZE_MAX - 10, nullptr, &out);
415*60b67249SAndroid Build Coastguard Worker CborWriteInt(0x1419823646241245, &out);
416*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
417*60b67249SAndroid Build Coastguard Worker CborOutInit(nullptr, 0, &out);
418*60b67249SAndroid Build Coastguard Worker CborWriteBstr(SIZE_MAX - 10, nullptr, &out);
419*60b67249SAndroid Build Coastguard Worker CborWriteBstr(sizeof(kData), kData, &out);
420*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
421*60b67249SAndroid Build Coastguard Worker CborOutInit(nullptr, 0, &out);
422*60b67249SAndroid Build Coastguard Worker CborWriteBstr(SIZE_MAX - 10, nullptr, &out);
423*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, CborAllocBstr(sizeof(kData), &out));
424*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
425*60b67249SAndroid Build Coastguard Worker CborOutInit(nullptr, 0, &out);
426*60b67249SAndroid Build Coastguard Worker CborWriteBstr(SIZE_MAX - 10, nullptr, &out);
427*60b67249SAndroid Build Coastguard Worker CborWriteTstr("Measured overflow", &out);
428*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
429*60b67249SAndroid Build Coastguard Worker CborOutInit(nullptr, 0, &out);
430*60b67249SAndroid Build Coastguard Worker CborWriteBstr(SIZE_MAX - 10, nullptr, &out);
431*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, CborAllocTstr(6, &out));
432*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
433*60b67249SAndroid Build Coastguard Worker CborOutInit(nullptr, 0, &out);
434*60b67249SAndroid Build Coastguard Worker CborWriteBstr(SIZE_MAX - 10, nullptr, &out);
435*60b67249SAndroid Build Coastguard Worker CborWriteArray(/*num_elements=*/4073290018, &out);
436*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
437*60b67249SAndroid Build Coastguard Worker CborOutInit(nullptr, 0, &out);
438*60b67249SAndroid Build Coastguard Worker CborWriteBstr(SIZE_MAX - 10, nullptr, &out);
439*60b67249SAndroid Build Coastguard Worker CborWriteMap(/*num_pairs=*/92, &out);
440*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
441*60b67249SAndroid Build Coastguard Worker CborOutInit(nullptr, 0, &out);
442*60b67249SAndroid Build Coastguard Worker CborWriteBstr(SIZE_MAX - 9, nullptr, &out);
443*60b67249SAndroid Build Coastguard Worker CborWriteFalse(&out);
444*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
445*60b67249SAndroid Build Coastguard Worker CborOutInit(nullptr, 0, &out);
446*60b67249SAndroid Build Coastguard Worker CborWriteBstr(SIZE_MAX - 9, nullptr, &out);
447*60b67249SAndroid Build Coastguard Worker CborWriteTrue(&out);
448*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
449*60b67249SAndroid Build Coastguard Worker CborOutInit(nullptr, 0, &out);
450*60b67249SAndroid Build Coastguard Worker CborWriteBstr(SIZE_MAX - 9, nullptr, &out);
451*60b67249SAndroid Build Coastguard Worker CborWriteNull(&out);
452*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborOutOverflowed(&out));
453*60b67249SAndroid Build Coastguard Worker }
454*60b67249SAndroid Build Coastguard Worker }
455*60b67249SAndroid Build Coastguard Worker
456*60b67249SAndroid Build Coastguard Worker } // namespace
457