xref: /aosp_15_r20/bootable/recovery/tests/unit/asn1_decoder_test.cpp (revision e7c364b630b241adcb6c7726a21055250b91fdac)
1*e7c364b6SAndroid Build Coastguard Worker /*
2*e7c364b6SAndroid Build Coastguard Worker  * Copyright (C) 2013 The Android Open Source Project
3*e7c364b6SAndroid Build Coastguard Worker  *
4*e7c364b6SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*e7c364b6SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*e7c364b6SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*e7c364b6SAndroid Build Coastguard Worker  *
8*e7c364b6SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*e7c364b6SAndroid Build Coastguard Worker  *
10*e7c364b6SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*e7c364b6SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*e7c364b6SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e7c364b6SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*e7c364b6SAndroid Build Coastguard Worker  * limitations under the License.
15*e7c364b6SAndroid Build Coastguard Worker  */
16*e7c364b6SAndroid Build Coastguard Worker 
17*e7c364b6SAndroid Build Coastguard Worker #include <stdint.h>
18*e7c364b6SAndroid Build Coastguard Worker 
19*e7c364b6SAndroid Build Coastguard Worker #include <memory>
20*e7c364b6SAndroid Build Coastguard Worker 
21*e7c364b6SAndroid Build Coastguard Worker #include <gtest/gtest.h>
22*e7c364b6SAndroid Build Coastguard Worker 
23*e7c364b6SAndroid Build Coastguard Worker #include "private/asn1_decoder.h"
24*e7c364b6SAndroid Build Coastguard Worker 
TEST(Asn1DecoderTest,Empty_Failure)25*e7c364b6SAndroid Build Coastguard Worker TEST(Asn1DecoderTest, Empty_Failure) {
26*e7c364b6SAndroid Build Coastguard Worker   uint8_t empty[] = {};
27*e7c364b6SAndroid Build Coastguard Worker   asn1_context ctx(empty, sizeof(empty));
28*e7c364b6SAndroid Build Coastguard Worker 
29*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(nullptr, ctx.asn1_constructed_get());
30*e7c364b6SAndroid Build Coastguard Worker   ASSERT_FALSE(ctx.asn1_constructed_skip_all());
31*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(0, ctx.asn1_constructed_type());
32*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(nullptr, ctx.asn1_sequence_get());
33*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(nullptr, ctx.asn1_set_get());
34*e7c364b6SAndroid Build Coastguard Worker   ASSERT_FALSE(ctx.asn1_sequence_next());
35*e7c364b6SAndroid Build Coastguard Worker 
36*e7c364b6SAndroid Build Coastguard Worker   const uint8_t* junk;
37*e7c364b6SAndroid Build Coastguard Worker   size_t length;
38*e7c364b6SAndroid Build Coastguard Worker   ASSERT_FALSE(ctx.asn1_oid_get(&junk, &length));
39*e7c364b6SAndroid Build Coastguard Worker   ASSERT_FALSE(ctx.asn1_octet_string_get(&junk, &length));
40*e7c364b6SAndroid Build Coastguard Worker }
41*e7c364b6SAndroid Build Coastguard Worker 
TEST(Asn1DecoderTest,ConstructedGet_TruncatedLength_Failure)42*e7c364b6SAndroid Build Coastguard Worker TEST(Asn1DecoderTest, ConstructedGet_TruncatedLength_Failure) {
43*e7c364b6SAndroid Build Coastguard Worker   uint8_t truncated[] = { 0xA0, 0x82 };
44*e7c364b6SAndroid Build Coastguard Worker   asn1_context ctx(truncated, sizeof(truncated));
45*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(nullptr, ctx.asn1_constructed_get());
46*e7c364b6SAndroid Build Coastguard Worker }
47*e7c364b6SAndroid Build Coastguard Worker 
TEST(Asn1DecoderTest,ConstructedGet_LengthTooBig_Failure)48*e7c364b6SAndroid Build Coastguard Worker TEST(Asn1DecoderTest, ConstructedGet_LengthTooBig_Failure) {
49*e7c364b6SAndroid Build Coastguard Worker   uint8_t truncated[] = { 0xA0, 0x8a, 0xA5, 0x5A, 0xA5, 0x5A, 0xA5, 0x5A, 0xA5, 0x5A, 0xA5, 0x5A };
50*e7c364b6SAndroid Build Coastguard Worker   asn1_context ctx(truncated, sizeof(truncated));
51*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(nullptr, ctx.asn1_constructed_get());
52*e7c364b6SAndroid Build Coastguard Worker }
53*e7c364b6SAndroid Build Coastguard Worker 
TEST(Asn1DecoderTest,ConstructedGet_TooSmallForChild_Failure)54*e7c364b6SAndroid Build Coastguard Worker TEST(Asn1DecoderTest, ConstructedGet_TooSmallForChild_Failure) {
55*e7c364b6SAndroid Build Coastguard Worker   uint8_t data[] = { 0xA5, 0x02, 0x06, 0x01, 0x01 };
56*e7c364b6SAndroid Build Coastguard Worker   asn1_context ctx(data, sizeof(data));
57*e7c364b6SAndroid Build Coastguard Worker   std::unique_ptr<asn1_context> ptr(ctx.asn1_constructed_get());
58*e7c364b6SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, ptr);
59*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(5, ptr->asn1_constructed_type());
60*e7c364b6SAndroid Build Coastguard Worker   const uint8_t* oid;
61*e7c364b6SAndroid Build Coastguard Worker   size_t length;
62*e7c364b6SAndroid Build Coastguard Worker   ASSERT_FALSE(ptr->asn1_oid_get(&oid, &length));
63*e7c364b6SAndroid Build Coastguard Worker }
64*e7c364b6SAndroid Build Coastguard Worker 
TEST(Asn1DecoderTest,ConstructedGet_Success)65*e7c364b6SAndroid Build Coastguard Worker TEST(Asn1DecoderTest, ConstructedGet_Success) {
66*e7c364b6SAndroid Build Coastguard Worker   uint8_t data[] = { 0xA5, 0x03, 0x06, 0x01, 0x01 };
67*e7c364b6SAndroid Build Coastguard Worker   asn1_context ctx(data, sizeof(data));
68*e7c364b6SAndroid Build Coastguard Worker   std::unique_ptr<asn1_context> ptr(ctx.asn1_constructed_get());
69*e7c364b6SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, ptr);
70*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(5, ptr->asn1_constructed_type());
71*e7c364b6SAndroid Build Coastguard Worker   const uint8_t* oid;
72*e7c364b6SAndroid Build Coastguard Worker   size_t length;
73*e7c364b6SAndroid Build Coastguard Worker   ASSERT_TRUE(ptr->asn1_oid_get(&oid, &length));
74*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(1U, length);
75*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(0x01U, *oid);
76*e7c364b6SAndroid Build Coastguard Worker }
77*e7c364b6SAndroid Build Coastguard Worker 
TEST(Asn1DecoderTest,ConstructedSkipAll_TruncatedLength_Failure)78*e7c364b6SAndroid Build Coastguard Worker TEST(Asn1DecoderTest, ConstructedSkipAll_TruncatedLength_Failure) {
79*e7c364b6SAndroid Build Coastguard Worker   uint8_t truncated[] = { 0xA2, 0x82 };
80*e7c364b6SAndroid Build Coastguard Worker   asn1_context ctx(truncated, sizeof(truncated));
81*e7c364b6SAndroid Build Coastguard Worker   ASSERT_FALSE(ctx.asn1_constructed_skip_all());
82*e7c364b6SAndroid Build Coastguard Worker }
83*e7c364b6SAndroid Build Coastguard Worker 
TEST(Asn1DecoderTest,ConstructedSkipAll_Success)84*e7c364b6SAndroid Build Coastguard Worker TEST(Asn1DecoderTest, ConstructedSkipAll_Success) {
85*e7c364b6SAndroid Build Coastguard Worker   uint8_t data[] = { 0xA0, 0x03, 0x02, 0x01, 0x01, 0xA1, 0x03, 0x02, 0x01, 0x01, 0x06, 0x01, 0xA5 };
86*e7c364b6SAndroid Build Coastguard Worker   asn1_context ctx(data, sizeof(data));
87*e7c364b6SAndroid Build Coastguard Worker   ASSERT_TRUE(ctx.asn1_constructed_skip_all());
88*e7c364b6SAndroid Build Coastguard Worker   const uint8_t* oid;
89*e7c364b6SAndroid Build Coastguard Worker   size_t length;
90*e7c364b6SAndroid Build Coastguard Worker   ASSERT_TRUE(ctx.asn1_oid_get(&oid, &length));
91*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(1U, length);
92*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(0xA5U, *oid);
93*e7c364b6SAndroid Build Coastguard Worker }
94*e7c364b6SAndroid Build Coastguard Worker 
TEST(Asn1DecoderTest,SequenceGet_TruncatedLength_Failure)95*e7c364b6SAndroid Build Coastguard Worker TEST(Asn1DecoderTest, SequenceGet_TruncatedLength_Failure) {
96*e7c364b6SAndroid Build Coastguard Worker   uint8_t truncated[] = { 0x30, 0x82 };
97*e7c364b6SAndroid Build Coastguard Worker   asn1_context ctx(truncated, sizeof(truncated));
98*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(nullptr, ctx.asn1_sequence_get());
99*e7c364b6SAndroid Build Coastguard Worker }
100*e7c364b6SAndroid Build Coastguard Worker 
TEST(Asn1DecoderTest,SequenceGet_TooSmallForChild_Failure)101*e7c364b6SAndroid Build Coastguard Worker TEST(Asn1DecoderTest, SequenceGet_TooSmallForChild_Failure) {
102*e7c364b6SAndroid Build Coastguard Worker   uint8_t data[] = { 0x30, 0x02, 0x06, 0x01, 0x01 };
103*e7c364b6SAndroid Build Coastguard Worker   asn1_context ctx(data, sizeof(data));
104*e7c364b6SAndroid Build Coastguard Worker   std::unique_ptr<asn1_context> ptr(ctx.asn1_sequence_get());
105*e7c364b6SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, ptr);
106*e7c364b6SAndroid Build Coastguard Worker   const uint8_t* oid;
107*e7c364b6SAndroid Build Coastguard Worker   size_t length;
108*e7c364b6SAndroid Build Coastguard Worker   ASSERT_FALSE(ptr->asn1_oid_get(&oid, &length));
109*e7c364b6SAndroid Build Coastguard Worker }
110*e7c364b6SAndroid Build Coastguard Worker 
TEST(Asn1DecoderTest,SequenceGet_Success)111*e7c364b6SAndroid Build Coastguard Worker TEST(Asn1DecoderTest, SequenceGet_Success) {
112*e7c364b6SAndroid Build Coastguard Worker   uint8_t data[] = { 0x30, 0x03, 0x06, 0x01, 0x01 };
113*e7c364b6SAndroid Build Coastguard Worker   asn1_context ctx(data, sizeof(data));
114*e7c364b6SAndroid Build Coastguard Worker   std::unique_ptr<asn1_context> ptr(ctx.asn1_sequence_get());
115*e7c364b6SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, ptr);
116*e7c364b6SAndroid Build Coastguard Worker   const uint8_t* oid;
117*e7c364b6SAndroid Build Coastguard Worker   size_t length;
118*e7c364b6SAndroid Build Coastguard Worker   ASSERT_TRUE(ptr->asn1_oid_get(&oid, &length));
119*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(1U, length);
120*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(0x01U, *oid);
121*e7c364b6SAndroid Build Coastguard Worker }
122*e7c364b6SAndroid Build Coastguard Worker 
TEST(Asn1DecoderTest,SetGet_TruncatedLength_Failure)123*e7c364b6SAndroid Build Coastguard Worker TEST(Asn1DecoderTest, SetGet_TruncatedLength_Failure) {
124*e7c364b6SAndroid Build Coastguard Worker   uint8_t truncated[] = { 0x31, 0x82 };
125*e7c364b6SAndroid Build Coastguard Worker   asn1_context ctx(truncated, sizeof(truncated));
126*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(nullptr, ctx.asn1_set_get());
127*e7c364b6SAndroid Build Coastguard Worker }
128*e7c364b6SAndroid Build Coastguard Worker 
TEST(Asn1DecoderTest,SetGet_TooSmallForChild_Failure)129*e7c364b6SAndroid Build Coastguard Worker TEST(Asn1DecoderTest, SetGet_TooSmallForChild_Failure) {
130*e7c364b6SAndroid Build Coastguard Worker   uint8_t data[] = { 0x31, 0x02, 0x06, 0x01, 0x01 };
131*e7c364b6SAndroid Build Coastguard Worker   asn1_context ctx(data, sizeof(data));
132*e7c364b6SAndroid Build Coastguard Worker   std::unique_ptr<asn1_context> ptr(ctx.asn1_set_get());
133*e7c364b6SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, ptr);
134*e7c364b6SAndroid Build Coastguard Worker   const uint8_t* oid;
135*e7c364b6SAndroid Build Coastguard Worker   size_t length;
136*e7c364b6SAndroid Build Coastguard Worker   ASSERT_FALSE(ptr->asn1_oid_get(&oid, &length));
137*e7c364b6SAndroid Build Coastguard Worker }
138*e7c364b6SAndroid Build Coastguard Worker 
TEST(Asn1DecoderTest,SetGet_Success)139*e7c364b6SAndroid Build Coastguard Worker TEST(Asn1DecoderTest, SetGet_Success) {
140*e7c364b6SAndroid Build Coastguard Worker   uint8_t data[] = { 0x31, 0x03, 0x06, 0x01, 0xBA };
141*e7c364b6SAndroid Build Coastguard Worker   asn1_context ctx(data, sizeof(data));
142*e7c364b6SAndroid Build Coastguard Worker   std::unique_ptr<asn1_context> ptr(ctx.asn1_set_get());
143*e7c364b6SAndroid Build Coastguard Worker   ASSERT_NE(nullptr, ptr);
144*e7c364b6SAndroid Build Coastguard Worker   const uint8_t* oid;
145*e7c364b6SAndroid Build Coastguard Worker   size_t length;
146*e7c364b6SAndroid Build Coastguard Worker   ASSERT_TRUE(ptr->asn1_oid_get(&oid, &length));
147*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(1U, length);
148*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(0xBAU, *oid);
149*e7c364b6SAndroid Build Coastguard Worker }
150*e7c364b6SAndroid Build Coastguard Worker 
TEST(Asn1DecoderTest,OidGet_LengthZero_Failure)151*e7c364b6SAndroid Build Coastguard Worker TEST(Asn1DecoderTest, OidGet_LengthZero_Failure) {
152*e7c364b6SAndroid Build Coastguard Worker   uint8_t data[] = { 0x06, 0x00, 0x01 };
153*e7c364b6SAndroid Build Coastguard Worker   asn1_context ctx(data, sizeof(data));
154*e7c364b6SAndroid Build Coastguard Worker   const uint8_t* oid;
155*e7c364b6SAndroid Build Coastguard Worker   size_t length;
156*e7c364b6SAndroid Build Coastguard Worker   ASSERT_FALSE(ctx.asn1_oid_get(&oid, &length));
157*e7c364b6SAndroid Build Coastguard Worker }
158*e7c364b6SAndroid Build Coastguard Worker 
TEST(Asn1DecoderTest,OidGet_TooSmall_Failure)159*e7c364b6SAndroid Build Coastguard Worker TEST(Asn1DecoderTest, OidGet_TooSmall_Failure) {
160*e7c364b6SAndroid Build Coastguard Worker   uint8_t data[] = { 0x06, 0x01 };
161*e7c364b6SAndroid Build Coastguard Worker   asn1_context ctx(data, sizeof(data));
162*e7c364b6SAndroid Build Coastguard Worker   const uint8_t* oid;
163*e7c364b6SAndroid Build Coastguard Worker   size_t length;
164*e7c364b6SAndroid Build Coastguard Worker   ASSERT_FALSE(ctx.asn1_oid_get(&oid, &length));
165*e7c364b6SAndroid Build Coastguard Worker }
166*e7c364b6SAndroid Build Coastguard Worker 
TEST(Asn1DecoderTest,OidGet_Success)167*e7c364b6SAndroid Build Coastguard Worker TEST(Asn1DecoderTest, OidGet_Success) {
168*e7c364b6SAndroid Build Coastguard Worker   uint8_t data[] = { 0x06, 0x01, 0x99 };
169*e7c364b6SAndroid Build Coastguard Worker   asn1_context ctx(data, sizeof(data));
170*e7c364b6SAndroid Build Coastguard Worker   const uint8_t* oid;
171*e7c364b6SAndroid Build Coastguard Worker   size_t length;
172*e7c364b6SAndroid Build Coastguard Worker   ASSERT_TRUE(ctx.asn1_oid_get(&oid, &length));
173*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(1U, length);
174*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(0x99U, *oid);
175*e7c364b6SAndroid Build Coastguard Worker }
176*e7c364b6SAndroid Build Coastguard Worker 
TEST(Asn1DecoderTest,OctetStringGet_LengthZero_Failure)177*e7c364b6SAndroid Build Coastguard Worker TEST(Asn1DecoderTest, OctetStringGet_LengthZero_Failure) {
178*e7c364b6SAndroid Build Coastguard Worker   uint8_t data[] = { 0x04, 0x00, 0x55 };
179*e7c364b6SAndroid Build Coastguard Worker   asn1_context ctx(data, sizeof(data));
180*e7c364b6SAndroid Build Coastguard Worker   const uint8_t* string;
181*e7c364b6SAndroid Build Coastguard Worker   size_t length;
182*e7c364b6SAndroid Build Coastguard Worker   ASSERT_FALSE(ctx.asn1_octet_string_get(&string, &length));
183*e7c364b6SAndroid Build Coastguard Worker }
184*e7c364b6SAndroid Build Coastguard Worker 
TEST(Asn1DecoderTest,OctetStringGet_TooSmall_Failure)185*e7c364b6SAndroid Build Coastguard Worker TEST(Asn1DecoderTest, OctetStringGet_TooSmall_Failure) {
186*e7c364b6SAndroid Build Coastguard Worker   uint8_t data[] = { 0x04, 0x01 };
187*e7c364b6SAndroid Build Coastguard Worker   asn1_context ctx(data, sizeof(data));
188*e7c364b6SAndroid Build Coastguard Worker   const uint8_t* string;
189*e7c364b6SAndroid Build Coastguard Worker   size_t length;
190*e7c364b6SAndroid Build Coastguard Worker   ASSERT_FALSE(ctx.asn1_octet_string_get(&string, &length));
191*e7c364b6SAndroid Build Coastguard Worker }
192*e7c364b6SAndroid Build Coastguard Worker 
TEST(Asn1DecoderTest,OctetStringGet_Success)193*e7c364b6SAndroid Build Coastguard Worker TEST(Asn1DecoderTest, OctetStringGet_Success) {
194*e7c364b6SAndroid Build Coastguard Worker   uint8_t data[] = { 0x04, 0x01, 0xAA };
195*e7c364b6SAndroid Build Coastguard Worker   asn1_context ctx(data, sizeof(data));
196*e7c364b6SAndroid Build Coastguard Worker   const uint8_t* string;
197*e7c364b6SAndroid Build Coastguard Worker   size_t length;
198*e7c364b6SAndroid Build Coastguard Worker   ASSERT_TRUE(ctx.asn1_octet_string_get(&string, &length));
199*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(1U, length);
200*e7c364b6SAndroid Build Coastguard Worker   ASSERT_EQ(0xAAU, *string);
201*e7c364b6SAndroid Build Coastguard Worker }
202