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_reader.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(CborReaderTest,Int1Byte)23*60b67249SAndroid Build Coastguard Worker TEST(CborReaderTest, Int1Byte) {
24*60b67249SAndroid Build Coastguard Worker const uint8_t buffer[] = {0, 23, 0x20, 0x37};
25*60b67249SAndroid Build Coastguard Worker int64_t val;
26*60b67249SAndroid Build Coastguard Worker CborIn in;
27*60b67249SAndroid Build Coastguard Worker CborInInit(buffer, sizeof(buffer), &in);
28*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadInt(&in, &val));
29*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0, val);
30*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadInt(&in, &val));
31*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(23, val);
32*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadInt(&in, &val));
33*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(-1, val);
34*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadInt(&in, &val));
35*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(-24, val);
36*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborInAtEnd(&in));
37*60b67249SAndroid Build Coastguard Worker }
38*60b67249SAndroid Build Coastguard Worker
TEST(CborReaderTest,Int2Bytes)39*60b67249SAndroid Build Coastguard Worker TEST(CborReaderTest, Int2Bytes) {
40*60b67249SAndroid Build Coastguard Worker const uint8_t buffer[] = {24, 24, 24, 0xff, 0x38, 24, 0x38, 0xff};
41*60b67249SAndroid Build Coastguard Worker int64_t val;
42*60b67249SAndroid Build Coastguard Worker CborIn in;
43*60b67249SAndroid Build Coastguard Worker CborInInit(buffer, sizeof(buffer), &in);
44*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadInt(&in, &val));
45*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(24, val);
46*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadInt(&in, &val));
47*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0xff, val);
48*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadInt(&in, &val));
49*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(-25, val);
50*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadInt(&in, &val));
51*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(-0x100, val);
52*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborInAtEnd(&in));
53*60b67249SAndroid Build Coastguard Worker }
54*60b67249SAndroid Build Coastguard Worker
TEST(CborReaderTest,Int3Bytes)55*60b67249SAndroid Build Coastguard Worker TEST(CborReaderTest, Int3Bytes) {
56*60b67249SAndroid Build Coastguard Worker const uint8_t buffer[] = {25, 0x01, 0x00, 25, 0xff, 0xff,
57*60b67249SAndroid Build Coastguard Worker 0x39, 0x01, 0x00, 0x39, 0xff, 0xff};
58*60b67249SAndroid Build Coastguard Worker int64_t val;
59*60b67249SAndroid Build Coastguard Worker CborIn in;
60*60b67249SAndroid Build Coastguard Worker CborInInit(buffer, sizeof(buffer), &in);
61*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadInt(&in, &val));
62*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0x100, val);
63*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadInt(&in, &val));
64*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0xffff, val);
65*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadInt(&in, &val));
66*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(-0x101, val);
67*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadInt(&in, &val));
68*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(-0x10000, val);
69*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborInAtEnd(&in));
70*60b67249SAndroid Build Coastguard Worker }
71*60b67249SAndroid Build Coastguard Worker
TEST(CborReaderTest,Int5Bytes)72*60b67249SAndroid Build Coastguard Worker TEST(CborReaderTest, Int5Bytes) {
73*60b67249SAndroid Build Coastguard Worker const uint8_t buffer[] = {26, 0x00, 0x01, 0x00, 0x00, 26, 0xff,
74*60b67249SAndroid Build Coastguard Worker 0xff, 0xff, 0xff, 0x3a, 0x00, 0x01, 0x00,
75*60b67249SAndroid Build Coastguard Worker 0x00, 0x3a, 0xff, 0xff, 0xff, 0xff};
76*60b67249SAndroid Build Coastguard Worker int64_t val;
77*60b67249SAndroid Build Coastguard Worker CborIn in;
78*60b67249SAndroid Build Coastguard Worker CborInInit(buffer, sizeof(buffer), &in);
79*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadInt(&in, &val));
80*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0x10000, val);
81*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadInt(&in, &val));
82*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0xffffffff, val);
83*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadInt(&in, &val));
84*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(-0x10001, val);
85*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadInt(&in, &val));
86*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(-0x100000000, val);
87*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborInAtEnd(&in));
88*60b67249SAndroid Build Coastguard Worker }
89*60b67249SAndroid Build Coastguard Worker
TEST(CborReaderTest,Int9Bytes)90*60b67249SAndroid Build Coastguard Worker TEST(CborReaderTest, Int9Bytes) {
91*60b67249SAndroid Build Coastguard Worker const uint8_t buffer[] = {
92*60b67249SAndroid Build Coastguard Worker 27, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 27, 0x7f, 0xff,
93*60b67249SAndroid Build Coastguard Worker 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3b, 0x00, 0x00, 0x00, 0x01, 0x00,
94*60b67249SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x3b, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
95*60b67249SAndroid Build Coastguard Worker int64_t val;
96*60b67249SAndroid Build Coastguard Worker CborIn in;
97*60b67249SAndroid Build Coastguard Worker CborInInit(buffer, sizeof(buffer), &in);
98*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadInt(&in, &val));
99*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0x100000000, val);
100*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadInt(&in, &val));
101*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(INT64_MAX, val);
102*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadInt(&in, &val));
103*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(-0x100000001, val);
104*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadInt(&in, &val));
105*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(INT64_MIN, val);
106*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborInAtEnd(&in));
107*60b67249SAndroid Build Coastguard Worker }
108*60b67249SAndroid Build Coastguard Worker
TEST(CborReaderTest,Uint9Bytes)109*60b67249SAndroid Build Coastguard Worker TEST(CborReaderTest, Uint9Bytes) {
110*60b67249SAndroid Build Coastguard Worker const uint8_t buffer[] = {27, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
111*60b67249SAndroid Build Coastguard Worker 27, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
112*60b67249SAndroid Build Coastguard Worker uint64_t val;
113*60b67249SAndroid Build Coastguard Worker CborIn in;
114*60b67249SAndroid Build Coastguard Worker CborInInit(buffer, sizeof(buffer), &in);
115*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadUint(&in, &val));
116*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0x100000000u, val);
117*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadUint(&in, &val));
118*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(UINT64_MAX, val);
119*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborInAtEnd(&in));
120*60b67249SAndroid Build Coastguard Worker }
121*60b67249SAndroid Build Coastguard Worker
TEST(CborReaderTest,IntByteOrder)122*60b67249SAndroid Build Coastguard Worker TEST(CborReaderTest, IntByteOrder) {
123*60b67249SAndroid Build Coastguard Worker const uint8_t buffer[] = {
124*60b67249SAndroid Build Coastguard Worker 25, 0x12, 0x34, 26, 0x12, 0x34, 0x56, 0x78, 27,
125*60b67249SAndroid Build Coastguard Worker 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
126*60b67249SAndroid Build Coastguard Worker };
127*60b67249SAndroid Build Coastguard Worker int64_t val;
128*60b67249SAndroid Build Coastguard Worker CborIn in;
129*60b67249SAndroid Build Coastguard Worker CborInInit(buffer, sizeof(buffer), &in);
130*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadInt(&in, &val));
131*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0x1234, val);
132*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadInt(&in, &val));
133*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0x12345678, val);
134*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadInt(&in, &val));
135*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0x123456789abcdef0, val);
136*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborInAtEnd(&in));
137*60b67249SAndroid Build Coastguard Worker }
138*60b67249SAndroid Build Coastguard Worker
TEST(CborReaderTest,IntMalformed)139*60b67249SAndroid Build Coastguard Worker TEST(CborReaderTest, IntMalformed) {
140*60b67249SAndroid Build Coastguard Worker const uint8_t kTooBigBuffer[] = {27, 0x80, 0, 0, 0, 0, 0, 0, 0};
141*60b67249SAndroid Build Coastguard Worker const uint8_t kTooSmallBuffer[] = {0x3b, 0x80, 0, 0, 0, 0, 0, 0, 0};
142*60b67249SAndroid Build Coastguard Worker const uint8_t kBadAddlBuffer[] = {30};
143*60b67249SAndroid Build Coastguard Worker const uint8_t kNegBadAddlBuffer[] = {0x3c};
144*60b67249SAndroid Build Coastguard Worker int64_t val;
145*60b67249SAndroid Build Coastguard Worker CborIn in;
146*60b67249SAndroid Build Coastguard Worker CborInInit(kTooBigBuffer, sizeof(kTooBigBuffer), &in);
147*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_MALFORMED, CborReadInt(&in, &val));
148*60b67249SAndroid Build Coastguard Worker CborInInit(kTooSmallBuffer, sizeof(kTooSmallBuffer), &in);
149*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_MALFORMED, CborReadInt(&in, &val));
150*60b67249SAndroid Build Coastguard Worker CborInInit(kBadAddlBuffer, sizeof(kBadAddlBuffer), &in);
151*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_MALFORMED, CborReadInt(&in, &val));
152*60b67249SAndroid Build Coastguard Worker CborInInit(kNegBadAddlBuffer, sizeof(kNegBadAddlBuffer), &in);
153*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_MALFORMED, CborReadInt(&in, &val));
154*60b67249SAndroid Build Coastguard Worker EXPECT_FALSE(CborInAtEnd(&in));
155*60b67249SAndroid Build Coastguard Worker }
156*60b67249SAndroid Build Coastguard Worker
TEST(CborReaderTest,IntTooShort)157*60b67249SAndroid Build Coastguard Worker TEST(CborReaderTest, IntTooShort) {
158*60b67249SAndroid Build Coastguard Worker const uint8_t buffer[] = {27, 0x40, 0, 0, 0, 0, 0, 0};
159*60b67249SAndroid Build Coastguard Worker int64_t val;
160*60b67249SAndroid Build Coastguard Worker CborIn in;
161*60b67249SAndroid Build Coastguard Worker CborInInit(buffer, sizeof(buffer), &in);
162*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_END, CborReadInt(&in, &val));
163*60b67249SAndroid Build Coastguard Worker EXPECT_FALSE(CborInAtEnd(&in));
164*60b67249SAndroid Build Coastguard Worker }
165*60b67249SAndroid Build Coastguard Worker
TEST(CborReaderTest,BstrEncoding)166*60b67249SAndroid Build Coastguard Worker TEST(CborReaderTest, BstrEncoding) {
167*60b67249SAndroid Build Coastguard Worker const uint8_t buffer[] = {0x45, 'h', 'e', 'l', 'l', 'o'};
168*60b67249SAndroid Build Coastguard Worker const uint8_t kData[] = {'h', 'e', 'l', 'l', 'o'};
169*60b67249SAndroid Build Coastguard Worker size_t data_size;
170*60b67249SAndroid Build Coastguard Worker const uint8_t* data;
171*60b67249SAndroid Build Coastguard Worker CborIn in;
172*60b67249SAndroid Build Coastguard Worker CborInInit(buffer, sizeof(buffer), &in);
173*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadBstr(&in, &data_size, &data));
174*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(sizeof(kData), data_size);
175*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(data, kData, data_size));
176*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborInAtEnd(&in));
177*60b67249SAndroid Build Coastguard Worker }
178*60b67249SAndroid Build Coastguard Worker
TEST(CborReaderTest,BstrLongEncoding)179*60b67249SAndroid Build Coastguard Worker TEST(CborReaderTest, BstrLongEncoding) {
180*60b67249SAndroid Build Coastguard Worker const uint8_t buffer[] = {
181*60b67249SAndroid Build Coastguard Worker 0x58, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00,
182*60b67249SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00,
183*60b67249SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99,
184*60b67249SAndroid Build Coastguard Worker };
185*60b67249SAndroid Build Coastguard Worker size_t data_size;
186*60b67249SAndroid Build Coastguard Worker const uint8_t* data;
187*60b67249SAndroid Build Coastguard Worker CborIn in;
188*60b67249SAndroid Build Coastguard Worker CborInInit(buffer, sizeof(buffer), &in);
189*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadBstr(&in, &data_size, &data));
190*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(32u, data_size);
191*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(data, buffer + 2, 32));
192*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborInAtEnd(&in));
193*60b67249SAndroid Build Coastguard Worker }
194*60b67249SAndroid Build Coastguard Worker
TEST(CborReaderTest,TstrEncoding)195*60b67249SAndroid Build Coastguard Worker TEST(CborReaderTest, TstrEncoding) {
196*60b67249SAndroid Build Coastguard Worker const uint8_t buffer[] = {0x65, 'w', 'o', 'r', 'l', 'd'};
197*60b67249SAndroid Build Coastguard Worker const char kStr[] = "world";
198*60b67249SAndroid Build Coastguard Worker size_t size;
199*60b67249SAndroid Build Coastguard Worker const char* str;
200*60b67249SAndroid Build Coastguard Worker CborIn in;
201*60b67249SAndroid Build Coastguard Worker CborInInit(buffer, sizeof(buffer), &in);
202*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadTstr(&in, &size, &str));
203*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(strlen(kStr), size);
204*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(str, kStr, size));
205*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborInAtEnd(&in));
206*60b67249SAndroid Build Coastguard Worker }
207*60b67249SAndroid Build Coastguard Worker
TEST(CborReaderTest,ArrayEncoding)208*60b67249SAndroid Build Coastguard Worker TEST(CborReaderTest, ArrayEncoding) {
209*60b67249SAndroid Build Coastguard Worker const uint8_t buffer[] = {0x98, 29};
210*60b67249SAndroid Build Coastguard Worker size_t num_elements;
211*60b67249SAndroid Build Coastguard Worker CborIn in;
212*60b67249SAndroid Build Coastguard Worker CborInInit(buffer, sizeof(buffer), &in);
213*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadArray(&in, &num_elements));
214*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(29u, num_elements);
215*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborInAtEnd(&in));
216*60b67249SAndroid Build Coastguard Worker }
217*60b67249SAndroid Build Coastguard Worker
TEST(CborReaderTest,MapEncoding)218*60b67249SAndroid Build Coastguard Worker TEST(CborReaderTest, MapEncoding) {
219*60b67249SAndroid Build Coastguard Worker const uint8_t buffer[] = {0xb9, 0x02, 0x50};
220*60b67249SAndroid Build Coastguard Worker size_t num_pairs;
221*60b67249SAndroid Build Coastguard Worker CborIn in;
222*60b67249SAndroid Build Coastguard Worker CborInInit(buffer, sizeof(buffer), &in);
223*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadMap(&in, &num_pairs));
224*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(592u, num_pairs);
225*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborInAtEnd(&in));
226*60b67249SAndroid Build Coastguard Worker }
227*60b67249SAndroid Build Coastguard Worker
TEST(CborReaderTest,FalseEncoding)228*60b67249SAndroid Build Coastguard Worker TEST(CborReaderTest, FalseEncoding) {
229*60b67249SAndroid Build Coastguard Worker const uint8_t buffer[] = {0xf4};
230*60b67249SAndroid Build Coastguard Worker CborIn in;
231*60b67249SAndroid Build Coastguard Worker CborInInit(buffer, sizeof(buffer), &in);
232*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadFalse(&in));
233*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborInAtEnd(&in));
234*60b67249SAndroid Build Coastguard Worker }
235*60b67249SAndroid Build Coastguard Worker
TEST(CborReaderTest,TrueEncoding)236*60b67249SAndroid Build Coastguard Worker TEST(CborReaderTest, TrueEncoding) {
237*60b67249SAndroid Build Coastguard Worker const uint8_t buffer[] = {0xf5};
238*60b67249SAndroid Build Coastguard Worker CborIn in;
239*60b67249SAndroid Build Coastguard Worker CborInInit(buffer, sizeof(buffer), &in);
240*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadTrue(&in));
241*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborInAtEnd(&in));
242*60b67249SAndroid Build Coastguard Worker }
243*60b67249SAndroid Build Coastguard Worker
TEST(CborReaderTest,NullEncoding)244*60b67249SAndroid Build Coastguard Worker TEST(CborReaderTest, NullEncoding) {
245*60b67249SAndroid Build Coastguard Worker const uint8_t buffer[] = {0xf6};
246*60b67249SAndroid Build Coastguard Worker CborIn in;
247*60b67249SAndroid Build Coastguard Worker CborInInit(buffer, sizeof(buffer), &in);
248*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadNull(&in));
249*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborInAtEnd(&in));
250*60b67249SAndroid Build Coastguard Worker }
251*60b67249SAndroid Build Coastguard Worker
TEST(CborReaderTest,TagEncoding)252*60b67249SAndroid Build Coastguard Worker TEST(CborReaderTest, TagEncoding) {
253*60b67249SAndroid Build Coastguard Worker const uint8_t buffer[] = {0xcf, 0xd8, 0x18, 0xd9, 0xd9, 0xf8, 0xda,
254*60b67249SAndroid Build Coastguard Worker 0x4f, 0x50, 0x53, 0x4e, 0xdb, 0x10, 0x00,
255*60b67249SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
256*60b67249SAndroid Build Coastguard Worker CborIn in;
257*60b67249SAndroid Build Coastguard Worker uint64_t tag;
258*60b67249SAndroid Build Coastguard Worker CborInInit(buffer, sizeof(buffer), &in);
259*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadTag(&in, &tag));
260*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(/* Unassigned */ 15u, tag);
261*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadTag(&in, &tag));
262*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(/* COSE_Sign1 */ 24u, tag);
263*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadTag(&in, &tag));
264*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(/* Byte string */ 0xd9f8u, tag);
265*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadTag(&in, &tag));
266*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(/* Openswan cfg */ 0x4f50534eu, tag);
267*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadTag(&in, &tag));
268*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(/* Unassigned */ 0x1000000000000000u, tag);
269*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborInAtEnd(&in));
270*60b67249SAndroid Build Coastguard Worker }
271*60b67249SAndroid Build Coastguard Worker
TEST(CborReaderTest,TagInvalid)272*60b67249SAndroid Build Coastguard Worker TEST(CborReaderTest, TagInvalid) {
273*60b67249SAndroid Build Coastguard Worker // The following tags are always invalid but are treated as any other tag.
274*60b67249SAndroid Build Coastguard Worker // Reference https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml.
275*60b67249SAndroid Build Coastguard Worker const uint8_t invalid16[] = {0xd9, 0xff, 0xff};
276*60b67249SAndroid Build Coastguard Worker const uint8_t invalid32[] = {0xda, 0xff, 0xff, 0xff, 0xff};
277*60b67249SAndroid Build Coastguard Worker const uint8_t invalid64[] = {0xdb, 0xff, 0xff, 0xff, 0xff,
278*60b67249SAndroid Build Coastguard Worker 0xff, 0xff, 0xff, 0xff};
279*60b67249SAndroid Build Coastguard Worker CborIn in;
280*60b67249SAndroid Build Coastguard Worker uint64_t tag;
281*60b67249SAndroid Build Coastguard Worker CborInInit(invalid16, sizeof(invalid16), &in);
282*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadTag(&in, &tag));
283*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborInAtEnd(&in));
284*60b67249SAndroid Build Coastguard Worker CborInInit(invalid32, sizeof(invalid32), &in);
285*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadTag(&in, &tag));
286*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborInAtEnd(&in));
287*60b67249SAndroid Build Coastguard Worker CborInInit(invalid64, sizeof(invalid64), &in);
288*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadTag(&in, &tag));
289*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborInAtEnd(&in));
290*60b67249SAndroid Build Coastguard Worker }
291*60b67249SAndroid Build Coastguard Worker
TEST(CborReaderTest,Skip)292*60b67249SAndroid Build Coastguard Worker TEST(CborReaderTest, Skip) {
293*60b67249SAndroid Build Coastguard Worker const uint8_t buffer[] = {0x84, 0x03, 0xa2, 0x82, 0x23, 0x05, 0xf4,
294*60b67249SAndroid Build Coastguard Worker 0x16, 0xf6, 0x61, 0x44, 0x41, 0xaa};
295*60b67249SAndroid Build Coastguard Worker const uint8_t tag[] = {0xc4, 0xf5};
296*60b67249SAndroid Build Coastguard Worker const uint8_t tagtag[] = {0xc4, 0xc4, 0xf5};
297*60b67249SAndroid Build Coastguard Worker const uint8_t nested_tag[] = {0x82, 0xa1, 0x02, 0xc7, 0x04, 0x09};
298*60b67249SAndroid Build Coastguard Worker CborIn in;
299*60b67249SAndroid Build Coastguard Worker CborInInit(buffer, sizeof(buffer), &in);
300*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadSkip(&in));
301*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborInAtEnd(&in));
302*60b67249SAndroid Build Coastguard Worker CborInInit(tag, sizeof(tag), &in);
303*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadSkip(&in));
304*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborInAtEnd(&in));
305*60b67249SAndroid Build Coastguard Worker CborInInit(tagtag, sizeof(tagtag), &in);
306*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadSkip(&in));
307*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborInAtEnd(&in));
308*60b67249SAndroid Build Coastguard Worker CborInInit(nested_tag, sizeof(nested_tag), &in);
309*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_OK, CborReadSkip(&in));
310*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborInAtEnd(&in));
311*60b67249SAndroid Build Coastguard Worker }
312*60b67249SAndroid Build Coastguard Worker
TEST(CborReaderTest,SkipTooDeeplyNestedMalformed)313*60b67249SAndroid Build Coastguard Worker TEST(CborReaderTest, SkipTooDeeplyNestedMalformed) {
314*60b67249SAndroid Build Coastguard Worker const uint8_t map[] = {0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1,
315*60b67249SAndroid Build Coastguard Worker 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1, 0xa1};
316*60b67249SAndroid Build Coastguard Worker const uint8_t array[] = {0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
317*60b67249SAndroid Build Coastguard Worker 0x82, 0x82, 0x82, 0x82, 0x82, 0x82,
318*60b67249SAndroid Build Coastguard Worker 0x82, 0x82, 0x82, 0x82, 0x82, 0x82};
319*60b67249SAndroid Build Coastguard Worker CborIn in;
320*60b67249SAndroid Build Coastguard Worker CborInInit(map, sizeof(map), &in);
321*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_MALFORMED, CborReadSkip(&in));
322*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0u, CborInOffset(&in));
323*60b67249SAndroid Build Coastguard Worker CborInInit(array, sizeof(array), &in);
324*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_MALFORMED, CborReadSkip(&in));
325*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0u, CborInOffset(&in));
326*60b67249SAndroid Build Coastguard Worker }
327*60b67249SAndroid Build Coastguard Worker
TEST(CborReaderTest,EmptyBufferAtEnd)328*60b67249SAndroid Build Coastguard Worker TEST(CborReaderTest, EmptyBufferAtEnd) {
329*60b67249SAndroid Build Coastguard Worker int64_t val;
330*60b67249SAndroid Build Coastguard Worker uint64_t uval;
331*60b67249SAndroid Build Coastguard Worker size_t size;
332*60b67249SAndroid Build Coastguard Worker const uint8_t* data;
333*60b67249SAndroid Build Coastguard Worker const char* str;
334*60b67249SAndroid Build Coastguard Worker CborIn in;
335*60b67249SAndroid Build Coastguard Worker CborInInit(nullptr, 0, &in);
336*60b67249SAndroid Build Coastguard Worker EXPECT_TRUE(CborInAtEnd(&in));
337*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_END, CborReadInt(&in, &val));
338*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_END, CborReadUint(&in, &uval));
339*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_END, CborReadBstr(&in, &size, &data));
340*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_END, CborReadTstr(&in, &size, &str));
341*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_END, CborReadArray(&in, &size));
342*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_END, CborReadMap(&in, &size));
343*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_END, CborReadFalse(&in));
344*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_END, CborReadTrue(&in));
345*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_END, CborReadNull(&in));
346*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_END, CborReadTag(&in, &uval));
347*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0u, CborInOffset(&in));
348*60b67249SAndroid Build Coastguard Worker }
349*60b67249SAndroid Build Coastguard Worker
TEST(CborReaderTest,NotFound)350*60b67249SAndroid Build Coastguard Worker TEST(CborReaderTest, NotFound) {
351*60b67249SAndroid Build Coastguard Worker const uint8_t buffer[] = {0xe0, 0x08};
352*60b67249SAndroid Build Coastguard Worker int64_t val;
353*60b67249SAndroid Build Coastguard Worker uint64_t uval;
354*60b67249SAndroid Build Coastguard Worker size_t size;
355*60b67249SAndroid Build Coastguard Worker const uint8_t* data;
356*60b67249SAndroid Build Coastguard Worker const char* str;
357*60b67249SAndroid Build Coastguard Worker CborIn in;
358*60b67249SAndroid Build Coastguard Worker CborInInit(buffer, sizeof(buffer), &in);
359*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_NOT_FOUND, CborReadInt(&in, &val));
360*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_NOT_FOUND, CborReadUint(&in, &uval));
361*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_NOT_FOUND, CborReadBstr(&in, &size, &data));
362*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_NOT_FOUND, CborReadTstr(&in, &size, &str));
363*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_NOT_FOUND, CborReadArray(&in, &size));
364*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_NOT_FOUND, CborReadMap(&in, &size));
365*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_NOT_FOUND, CborReadFalse(&in));
366*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_NOT_FOUND, CborReadTrue(&in));
367*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_NOT_FOUND, CborReadNull(&in));
368*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_NOT_FOUND, CborReadTag(&in, &uval));
369*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0u, CborInOffset(&in));
370*60b67249SAndroid Build Coastguard Worker }
371*60b67249SAndroid Build Coastguard Worker
TEST(CborReaderTest,SimpleValueNotFound)372*60b67249SAndroid Build Coastguard Worker TEST(CborReaderTest, SimpleValueNotFound) {
373*60b67249SAndroid Build Coastguard Worker const uint8_t buffer[] = {0xf7};
374*60b67249SAndroid Build Coastguard Worker CborIn in;
375*60b67249SAndroid Build Coastguard Worker CborInInit(buffer, sizeof(buffer), &in);
376*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_NOT_FOUND, CborReadFalse(&in));
377*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_NOT_FOUND, CborReadTrue(&in));
378*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_NOT_FOUND, CborReadNull(&in));
379*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0u, CborInOffset(&in));
380*60b67249SAndroid Build Coastguard Worker }
381*60b67249SAndroid Build Coastguard Worker
TEST(CborReaderTest,IndefiniteLengthMalformed)382*60b67249SAndroid Build Coastguard Worker TEST(CborReaderTest, IndefiniteLengthMalformed) {
383*60b67249SAndroid Build Coastguard Worker size_t size;
384*60b67249SAndroid Build Coastguard Worker const uint8_t* data;
385*60b67249SAndroid Build Coastguard Worker const char* str;
386*60b67249SAndroid Build Coastguard Worker CborIn in;
387*60b67249SAndroid Build Coastguard Worker const uint8_t bstr[] = {0x5f, 0x44, 0xaa, 0xbb, 0xcc, 0xdd,
388*60b67249SAndroid Build Coastguard Worker 0x43, 0xee, 0xff, 0x99, 0xff};
389*60b67249SAndroid Build Coastguard Worker CborInInit(bstr, sizeof(bstr), &in);
390*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_MALFORMED, CborReadBstr(&in, &size, &data));
391*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_MALFORMED, CborReadSkip(&in));
392*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0u, CborInOffset(&in));
393*60b67249SAndroid Build Coastguard Worker const uint8_t tstr[] = {0x7f, 0x64, 0x41, 0x42, 0x43, 0x44,
394*60b67249SAndroid Build Coastguard Worker 0x63, 0x30, 0x31, 0x32, 0xff};
395*60b67249SAndroid Build Coastguard Worker CborInInit(tstr, sizeof(tstr), &in);
396*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_MALFORMED, CborReadTstr(&in, &size, &str));
397*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_MALFORMED, CborReadSkip(&in));
398*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0u, CborInOffset(&in));
399*60b67249SAndroid Build Coastguard Worker const uint8_t array[] = {0x9f, 0x01, 0x82, 0x02, 0x03,
400*60b67249SAndroid Build Coastguard Worker 0x82, 0x04, 0x05, 0xff};
401*60b67249SAndroid Build Coastguard Worker CborInInit(array, sizeof(array), &in);
402*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_MALFORMED, CborReadArray(&in, &size));
403*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_MALFORMED, CborReadSkip(&in));
404*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0u, CborInOffset(&in));
405*60b67249SAndroid Build Coastguard Worker const uint8_t map[] = {0xbf, 0x63, 0x46, 0x75, 0x6e, 0xf5,
406*60b67249SAndroid Build Coastguard Worker 0x63, 0x41, 0x6d, 0x74, 0x21, 0xff};
407*60b67249SAndroid Build Coastguard Worker CborInInit(map, sizeof(map), &in);
408*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_MALFORMED, CborReadMap(&in, &size));
409*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(CBOR_READ_RESULT_MALFORMED, CborReadSkip(&in));
410*60b67249SAndroid Build Coastguard Worker EXPECT_EQ(0u, CborInOffset(&in));
411*60b67249SAndroid Build Coastguard Worker }
412*60b67249SAndroid Build Coastguard Worker }
413*60b67249SAndroid Build Coastguard Worker
414*60b67249SAndroid Build Coastguard Worker } // namespace
415