5 #include "sw/device/silicon_creator/lib/cert/asn1.h"
10 #include "gtest/gtest.h"
21 #define EXPECT_EQ_CONST_ARRAY(array, array_size, expected_result) \
23 EXPECT_EQ(array_size, expected_result.size()); \
24 EXPECT_EQ(true, std::equal(expected_result.begin(), expected_result.end(), \
28 namespace asn1_unittest {
32 TEST(Asn1, CreateFinish) {
34 uint8_t buf[1] = {0xff};
36 EXPECT_EQ(asn1_start(&state, buf, 0), kErrorOk);
38 EXPECT_EQ(asn1_finish(&state, &out_size), kErrorOk);
39 EXPECT_EQ(out_size, 0);
40 EXPECT_EQ(buf[0], 0xff);
44 TEST(Asn1, PushByte) {
46 uint8_t buf[1] = {0xff};
47 EXPECT_EQ(asn1_start(&state, buf,
sizeof(buf)), kErrorOk);
48 asn1_push_byte(&state, 0xa5);
49 EXPECT_EQ(state.error, kErrorOk);
52 asn1_push_byte(&state, 0xb6);
53 EXPECT_EQ(state.error, kErrorAsn1BufferExhausted);
54 asn1_clear_error(&state);
57 EXPECT_EQ(asn1_finish(&state, &out_size), kErrorOk);
58 EXPECT_EQ(out_size, 1);
59 EXPECT_EQ(buf[0], 0xa5);
63 TEST(Asn1, PushBytes) {
65 uint8_t buf[3] = {0xff, 0xff, 0xff};
66 const std::array<uint8_t, 2> kData = {0xa5, 0xb6};
67 EXPECT_EQ(asn1_start(&state, buf,
sizeof(buf)), kErrorOk);
68 asn1_push_bytes(&state, kData.begin(), kData.size());
69 EXPECT_EQ(state.error, kErrorOk);
71 EXPECT_EQ(asn1_finish(&state, &out_size), kErrorOk);
72 EXPECT_EQ_CONST_ARRAY(buf, out_size, kData);
73 EXPECT_EQ(buf[2], 0xff);
77 TEST(Asn1, PushBytesOverflow) {
79 uint8_t buf[3] = {0xff, 0xff, 0xff};
80 const uint8_t kData[] = {0xa5, 0xb6, 0x32, 0xff};
81 EXPECT_EQ(asn1_start(&state, buf,
sizeof(buf)), kErrorOk);
82 asn1_push_bytes(&state, kData,
sizeof(kData));
83 EXPECT_EQ(state.error, kErrorAsn1BufferExhausted);
84 asn1_clear_error(&state);
88 TEST(Asn1, PushEmptyTag) {
91 EXPECT_EQ(asn1_start(&state, buf,
sizeof(buf)), kErrorOk);
93 asn1_start_tag(&state, &tag, kAsn1TagNumberSequence);
94 EXPECT_EQ(state.error, kErrorOk);
95 asn1_finish_tag(&tag);
96 EXPECT_EQ(state.error, kErrorOk);
98 EXPECT_EQ(asn1_finish(&state, &out_size), kErrorOk);
99 const std::array<uint8_t, 2> kExpectedResult = {
102 EXPECT_EQ_CONST_ARRAY(buf, out_size, kExpectedResult);
106 TEST(Asn1, PushBoolean) {
109 EXPECT_EQ(asn1_start(&state, buf,
sizeof(buf)), kErrorOk);
110 asn1_push_bool(&state, kAsn1TagNumberBoolean,
true);
111 EXPECT_EQ(state.error, kErrorOk);
112 asn1_push_bool(&state, kAsn1TagClassContext | 42,
false);
113 EXPECT_EQ(state.error, kErrorOk);
115 EXPECT_EQ(asn1_finish(&state, &out_size), kErrorOk);
116 const std::array<uint8_t, 6> kExpectedResult = {
119 0x01, 0x01, 0xff, 0xaa, 0x01, 0x00,
121 EXPECT_EQ_CONST_ARRAY(buf, out_size, kExpectedResult);
125 TEST(Asn1, PushInt32) {
128 EXPECT_EQ(asn1_start(&state, buf,
sizeof(buf)), kErrorOk);
129 asn1_push_uint32(&state, kAsn1TagNumberInteger, 0);
130 EXPECT_EQ(state.error, kErrorOk);
131 asn1_push_int32(&state, kAsn1TagNumberInteger, 0x1234);
132 EXPECT_EQ(state.error, kErrorOk);
133 asn1_push_uint32(&state, kAsn1TagNumberOctetString, 0x8000);
134 EXPECT_EQ(state.error, kErrorOk);
135 asn1_push_int32(&state, kAsn1TagNumberInteger, -1);
136 EXPECT_EQ(state.error, kErrorOk);
137 asn1_push_int32(&state, kAsn1TagNumberInteger, -3000);
138 EXPECT_EQ(state.error, kErrorOk);
140 EXPECT_EQ(asn1_finish(&state, &out_size), kErrorOk);
141 const std::array<uint8_t, 19> kExpectedResult = {
144 0x02, 0x01, 0x0, 0x02, 0x02, 0x12, 0x34,
147 0x04, 0x03, 0x00, 0x80, 0x00,
150 0x02, 0x01, 0xff, 0x02, 0x02, 0xf4, 0x48};
151 EXPECT_EQ_CONST_ARRAY(buf, out_size, kExpectedResult);
155 TEST(Asn1, PushIntUnsigned) {
159 const uint8_t kBigInt1[] = {0x00, 0x00, 0x00, 0x00,
161 const uint8_t kBigInt2[] = {0x00, 0x12, 0x34};
162 const uint8_t kBigInt3[] = {0x00, 0x00, 0x00, 0x80,
164 EXPECT_EQ(asn1_start(&state, buf,
sizeof(buf)), kErrorOk);
165 asn1_push_integer(&state, kAsn1TagNumberInteger,
false, kBigInt1,
167 EXPECT_EQ(state.error, kErrorOk);
168 asn1_push_integer(&state, kAsn1TagNumberInteger,
false, kBigInt2,
170 EXPECT_EQ(state.error, kErrorOk);
171 asn1_push_integer(&state, kAsn1TagNumberInteger,
false, kBigInt3,
173 EXPECT_EQ(state.error, kErrorOk);
175 EXPECT_EQ(asn1_finish(&state, &out_size), kErrorOk);
176 const std::array<uint8_t, 12> kExpectedResult = {
179 0x02, 0x01, 0x0, 0x02, 0x02, 0x12,
180 0x34, 0x02, 0x03, 0x00, 0x80, 0x00,
182 EXPECT_EQ_CONST_ARRAY(buf, out_size, kExpectedResult);
186 TEST(Asn1, PushIntSigned) {
190 const uint8_t kBigInt1[] = {0x00, 0x00, 0x00, 0x00,
192 const uint8_t kBigInt2[] = {0xff, 0xff, 0xff};
193 const uint8_t kBigInt3[] = {0xff, 0xff, 0xf4,
195 EXPECT_EQ(asn1_start(&state, buf,
sizeof(buf)), kErrorOk);
196 asn1_push_integer(&state, kAsn1TagNumberInteger,
true, kBigInt1,
198 EXPECT_EQ(state.error, kErrorOk);
199 asn1_push_integer(&state, kAsn1TagNumberInteger,
true, kBigInt2,
201 EXPECT_EQ(state.error, kErrorOk);
202 asn1_push_integer(&state, kAsn1TagNumberInteger,
true, kBigInt3,
204 EXPECT_EQ(state.error, kErrorOk);
206 EXPECT_EQ(asn1_finish(&state, &out_size), kErrorOk);
207 const std::array<uint8_t, 10> kExpectedResult = {
210 0x02, 0x01, 0x0, 0x02, 0x01, 0xff, 0x02, 0x02, 0xf4, 0x48,
212 EXPECT_EQ_CONST_ARRAY(buf, out_size, kExpectedResult);
216 TEST(Asn1, PushIntPad) {
220 const uint8_t kBigInt1[] = {0x42};
221 const uint8_t kBigInt2[] = {0x00, 0x80};
222 const uint8_t kBigInt3[] = {0x80, 0x01};
223 const uint8_t kBigInt4[] = {0x30, 0x47, 0x80, 0x01};
224 const uint8_t kBigInt5[] = {0x30, 0x47, 0x80, 0x01, 0x17};
225 EXPECT_EQ(asn1_start(&state, buf,
sizeof(buf)), kErrorOk);
226 asn1_push_integer_pad(&state,
false, kBigInt1,
sizeof(kBigInt1), 4);
227 EXPECT_EQ(state.error, kErrorOk);
228 asn1_push_integer_pad(&state,
true, kBigInt1,
sizeof(kBigInt1), 4);
229 EXPECT_EQ(state.error, kErrorOk);
230 asn1_push_integer_pad(&state,
false, kBigInt2,
sizeof(kBigInt2), 4);
231 EXPECT_EQ(state.error, kErrorOk);
232 asn1_push_integer_pad(&state,
true, kBigInt2,
sizeof(kBigInt2), 4);
233 EXPECT_EQ(state.error, kErrorOk);
234 asn1_push_integer_pad(&state,
false, kBigInt3,
sizeof(kBigInt3), 4);
235 EXPECT_EQ(state.error, kErrorOk);
236 asn1_push_integer_pad(&state,
true, kBigInt3,
sizeof(kBigInt3), 4);
237 EXPECT_EQ(state.error, kErrorOk);
238 asn1_push_integer_pad(&state,
false, kBigInt4,
sizeof(kBigInt4), 4);
239 EXPECT_EQ(state.error, kErrorOk);
240 asn1_push_integer_pad(&state,
true, kBigInt4,
sizeof(kBigInt4), 4);
241 EXPECT_EQ(state.error, kErrorOk);
243 asn1_push_integer_pad(&state,
true, kBigInt5,
sizeof(kBigInt5), 4);
244 EXPECT_EQ(state.error, kErrorAsn1PushIntegerPadInvalidArgument);
245 asn1_clear_error(&state);
248 EXPECT_EQ(asn1_finish(&state, &out_size), kErrorOk);
249 const std::array<uint8_t, 32> kExpectedResult = {
251 0x00, 0x00, 0x00, 0x42,
253 0x00, 0x00, 0x00, 0x42,
255 0x00, 0x00, 0x00, 0x80,
257 0x00, 0x00, 0x00, 0x80,
259 0x00, 0x00, 0x80, 0x01,
261 0xff, 0xff, 0x80, 0x01,
263 0x30, 0x47, 0x80, 0x01,
265 0x30, 0x47, 0x80, 0x01};
266 EXPECT_EQ_CONST_ARRAY(buf, out_size, kExpectedResult);
270 TEST(Asn1, PushStrings) {
273 EXPECT_EQ(asn1_start(&state, buf,
sizeof(buf)), kErrorOk);
274 const char kString1[] =
"lowRISC";
275 const char kString2[] =
"OpenTitanAndMore!";
276 const char kString3[] =
"";
277 asn1_push_string(&state, kAsn1TagNumberPrintableString, kString1,
279 EXPECT_EQ(state.error, kErrorOk);
281 asn1_push_string(&state, kAsn1TagNumberUtf8String, kString2, 9);
282 EXPECT_EQ(state.error, kErrorOk);
283 asn1_push_string(&state, kAsn1TagNumberOctetString, kString3,
285 EXPECT_EQ(state.error, kErrorOk);
287 EXPECT_EQ(asn1_finish(&state, &out_size), kErrorOk);
289 const std::array<uint8_t, 22> kExpectedResult = {
291 0x13, 0x07, 0x6c, 0x6f, 0x77, 0x52, 0x49, 0x53, 0x43,
293 0x0c, 0x09, 0x4f, 0x70, 0x65, 0x6e, 0x54, 0x69, 0x74, 0x61, 0x6e,
298 EXPECT_EQ_CONST_ARRAY(buf, out_size, kExpectedResult);
302 TEST(Asn1, PushBitString) {
305 EXPECT_EQ(asn1_start(&state, buf,
sizeof(buf)), kErrorOk);
309 asn1_start_tag(&state, &tag, kAsn1TagNumberBitString);
310 EXPECT_EQ(state.error, kErrorOk);
311 asn1_start_bitstring(&state, &bitstring);
312 EXPECT_EQ(state.error, kErrorOk);
313 asn1_finish_bitstring(&bitstring);
314 EXPECT_EQ(state.error, kErrorOk);
315 asn1_finish_tag(&tag);
316 EXPECT_EQ(state.error, kErrorOk);
318 asn1_start_tag(&state, &tag, kAsn1TagNumberBitString);
319 EXPECT_EQ(state.error, kErrorOk);
320 asn1_start_bitstring(&state, &bitstring);
321 EXPECT_EQ(state.error, kErrorOk);
322 asn1_bitstring_push_bit(&bitstring,
true);
323 EXPECT_EQ(state.error, kErrorOk);
324 asn1_finish_bitstring(&bitstring);
325 EXPECT_EQ(state.error, kErrorOk);
326 asn1_finish_tag(&tag);
327 EXPECT_EQ(state.error, kErrorOk);
329 asn1_start_tag(&state, &tag, kAsn1TagNumberBitString);
330 EXPECT_EQ(state.error, kErrorOk);
331 asn1_start_bitstring(&state, &bitstring);
332 EXPECT_EQ(state.error, kErrorOk);
333 asn1_bitstring_push_bit(&bitstring,
false);
334 EXPECT_EQ(state.error, kErrorOk);
335 asn1_finish_bitstring(&bitstring);
336 EXPECT_EQ(state.error, kErrorOk);
337 asn1_finish_tag(&tag);
338 EXPECT_EQ(state.error, kErrorOk);
340 const std::array<bool, 12> kBitString = {
341 true,
false,
true,
true,
false,
false,
342 false,
false,
true,
false,
false,
true,
344 asn1_start_tag(&state, &tag, kAsn1TagNumberBitString);
345 EXPECT_EQ(state.error, kErrorOk);
346 asn1_start_bitstring(&state, &bitstring);
347 EXPECT_EQ(state.error, kErrorOk);
348 for (
bool bit : kBitString) {
349 asn1_bitstring_push_bit(&bitstring, bit);
350 EXPECT_EQ(state.error, kErrorOk);
352 asn1_finish_bitstring(&bitstring);
353 EXPECT_EQ(state.error, kErrorOk);
354 asn1_finish_tag(&tag);
355 EXPECT_EQ(state.error, kErrorOk);
357 EXPECT_EQ(asn1_finish(&state, &out_size), kErrorOk);
358 const std::array<uint8_t, 16> kExpectedResult = {
363 0x03, 0x02, 0x7, 0x80,
365 0x03, 0x02, 0x7, 0x00,
368 0x03, 0x03, 0x04, 0b10110000, 0b10010000};
369 EXPECT_EQ_CONST_ARRAY(buf, out_size, kExpectedResult);
373 TEST(Asn1, PushRawOid) {
376 EXPECT_EQ(asn1_start(&state, buf,
sizeof(buf)), kErrorOk);
377 const uint8_t kRawOid[] = {0x88, 0x037, 0x03};
378 asn1_push_oid_raw(&state, kRawOid,
sizeof(kRawOid));
379 EXPECT_EQ(state.error, kErrorOk);
381 EXPECT_EQ(asn1_finish(&state, &out_size), kErrorOk);
382 const std::array<uint8_t, 5> kExpectedResult = {
385 0x06, 0x03, 0x88, 0x037, 0x03,
387 EXPECT_EQ_CONST_ARRAY(buf, out_size, kExpectedResult);
391 TEST(Asn1, PushHexStrings) {
394 EXPECT_EQ(asn1_start(&state, buf,
sizeof(buf)), kErrorOk);
395 const uint8_t kData[] = {0x01, 0x23, 0xab, 0xef};
396 asn1_push_hexstring(&state, kAsn1TagNumberPrintableString, kData,
398 EXPECT_EQ(state.error, kErrorOk);
400 EXPECT_EQ(asn1_finish(&state, &out_size), kErrorOk);
401 const std::array<uint8_t, 10> kExpectedResult = {
403 0x13, 0x08, 0x30, 0x31, 0x32, 0x33, 0x61, 0x62, 0x65, 0x66,
405 EXPECT_EQ_CONST_ARRAY(buf, out_size, kExpectedResult);
409 TEST(Asn1, TagOverflow) {
421 std::vector<uint8_t> buf;
422 const uint8_t kPattern = 0xa5;
424 const size_t kBufferSize = 1 + 1 + 0x100;
425 buf.resize(kBufferSize + 1, kPattern);
426 EXPECT_EQ(asn1_start(&state, &buf[0], kBufferSize), kErrorOk);
429 asn1_start_tag(&state, &tag, kAsn1TagNumberSequence);
430 EXPECT_EQ(state.error, kErrorOk);
432 std::vector<uint8_t> tmp;
433 tmp.resize(0x100, 0xff);
434 asn1_push_bytes(&state, &tmp[0], tmp.size());
435 EXPECT_EQ(state.error, kErrorOk);
438 asn1_finish_tag(&tag);
439 EXPECT_EQ(state.error, kErrorAsn1BufferExhausted);
440 asn1_clear_error(&state);
443 EXPECT_EQ(buf[kBufferSize], kPattern);
447 TEST(Asn1, TagLengthEncoding) {
449 std::vector<uint8_t> buf;
451 std::vector<uint8_t> expected;
453 #define ADD_BYTES(fill, fill_size, ...) \
455 std::vector<uint8_t> tmp(fill_size, fill); \
456 const uint8_t kData[] = {__VA_ARGS__}; \
457 expected.push_back(0x30); \
458 expected.insert(expected.end(), kData, \
459 kData + sizeof(kData)); \
460 expected.insert(expected.end(), tmp.begin(), tmp.end()); \
462 asn1_start_tag(&state, &tag, kAsn1TagNumberSequence); \
463 EXPECT_EQ(state.error, kErrorOk); \
464 asn1_push_bytes(&state, &tmp[0], tmp.size()); \
465 EXPECT_EQ(state.error, kErrorOk); \
466 asn1_finish_tag(&tag); \
467 EXPECT_EQ(state.error, kErrorOk); \
470 EXPECT_EQ(asn1_start(&state, &buf[0], buf.size()), kErrorOk);
471 ADD_BYTES(0x00, 0, 0x00);
472 ADD_BYTES(0xa5, 0x7f, 0x7f);
473 ADD_BYTES(0xb6, 0x80, 0x81, 0x80);
474 ADD_BYTES(0xc7, 0xff, 0x81, 0xff);
475 ADD_BYTES(0xd8, 0x100, 0x82, 0x01, 0x00);
476 ADD_BYTES(0xe9, 0xffff, 0x82, 0xff, 0xff);
478 EXPECT_EQ(asn1_finish(&state, &out_size), kErrorOk);
479 EXPECT_EQ(out_size, expected.size());
480 buf.resize(out_size);
481 EXPECT_EQ(buf, expected);