Home | History | Annotate | Download | only in bytestring
      1 /* Copyright (c) 2014, Google Inc.
      2  *
      3  * Permission to use, copy, modify, and/or distribute this software for any
      4  * purpose with or without fee is hereby granted, provided that the above
      5  * copyright notice and this permission notice appear in all copies.
      6  *
      7  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
      8  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
      9  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
     10  * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     11  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
     12  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
     13  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
     14 
     15 #if !defined(__STDC_CONSTANT_MACROS)
     16 #define __STDC_CONSTANT_MACROS
     17 #endif
     18 
     19 #include <stdio.h>
     20 #include <stdlib.h>
     21 #include <string.h>
     22 
     23 #include <vector>
     24 
     25 #include <gtest/gtest.h>
     26 
     27 #include <openssl/bytestring.h>
     28 #include <openssl/crypto.h>
     29 
     30 #include "internal.h"
     31 #include "../internal.h"
     32 #include "../test/test_util.h"
     33 
     34 
     35 TEST(CBSTest, Skip) {
     36   static const uint8_t kData[] = {1, 2, 3};
     37   CBS data;
     38 
     39   CBS_init(&data, kData, sizeof(kData));
     40   EXPECT_EQ(3u, CBS_len(&data));
     41   EXPECT_TRUE(CBS_skip(&data, 1));
     42   EXPECT_EQ(2u, CBS_len(&data));
     43   EXPECT_TRUE(CBS_skip(&data, 2));
     44   EXPECT_EQ(0u, CBS_len(&data));
     45   EXPECT_FALSE(CBS_skip(&data, 1));
     46 }
     47 
     48 TEST(CBSTest, GetUint) {
     49   static const uint8_t kData[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
     50   uint8_t u8;
     51   uint16_t u16;
     52   uint32_t u32;
     53   CBS data;
     54 
     55   CBS_init(&data, kData, sizeof(kData));
     56   ASSERT_TRUE(CBS_get_u8(&data, &u8));
     57   EXPECT_EQ(1u, u8);
     58   ASSERT_TRUE(CBS_get_u16(&data, &u16));
     59   EXPECT_EQ(0x203u, u16);
     60   ASSERT_TRUE(CBS_get_u24(&data, &u32));
     61   EXPECT_EQ(0x40506u, u32);
     62   ASSERT_TRUE(CBS_get_u32(&data, &u32));
     63   EXPECT_EQ(0x708090au, u32);
     64   ASSERT_TRUE(CBS_get_last_u8(&data, &u8));
     65   EXPECT_EQ(0xcu, u8);
     66   ASSERT_TRUE(CBS_get_last_u8(&data, &u8));
     67   EXPECT_EQ(0xbu, u8);
     68   EXPECT_FALSE(CBS_get_u8(&data, &u8));
     69   EXPECT_FALSE(CBS_get_last_u8(&data, &u8));
     70 }
     71 
     72 TEST(CBSTest, GetPrefixed) {
     73   static const uint8_t kData[] = {1, 2, 0, 2, 3, 4, 0, 0, 3, 3, 2, 1};
     74   uint8_t u8;
     75   uint16_t u16;
     76   uint32_t u32;
     77   CBS data, prefixed;
     78 
     79   CBS_init(&data, kData, sizeof(kData));
     80   ASSERT_TRUE(CBS_get_u8_length_prefixed(&data, &prefixed));
     81   EXPECT_EQ(1u, CBS_len(&prefixed));
     82   ASSERT_TRUE(CBS_get_u8(&prefixed, &u8));
     83   EXPECT_EQ(2u, u8);
     84   ASSERT_TRUE(CBS_get_u16_length_prefixed(&data, &prefixed));
     85   EXPECT_EQ(2u, CBS_len(&prefixed));
     86   ASSERT_TRUE(CBS_get_u16(&prefixed, &u16));
     87   EXPECT_EQ(0x304u, u16);
     88   ASSERT_TRUE(CBS_get_u24_length_prefixed(&data, &prefixed));
     89   EXPECT_EQ(3u, CBS_len(&prefixed));
     90   ASSERT_TRUE(CBS_get_u24(&prefixed, &u32));
     91   EXPECT_EQ(0x30201u, u32);
     92 }
     93 
     94 TEST(CBSTest, GetPrefixedBad) {
     95   static const uint8_t kData1[] = {2, 1};
     96   static const uint8_t kData2[] = {0, 2, 1};
     97   static const uint8_t kData3[] = {0, 0, 2, 1};
     98   CBS data, prefixed;
     99 
    100   CBS_init(&data, kData1, sizeof(kData1));
    101   EXPECT_FALSE(CBS_get_u8_length_prefixed(&data, &prefixed));
    102 
    103   CBS_init(&data, kData2, sizeof(kData2));
    104   EXPECT_FALSE(CBS_get_u16_length_prefixed(&data, &prefixed));
    105 
    106   CBS_init(&data, kData3, sizeof(kData3));
    107   EXPECT_FALSE(CBS_get_u24_length_prefixed(&data, &prefixed));
    108 }
    109 
    110 TEST(CBSTest, GetASN1) {
    111   static const uint8_t kData1[] = {0x30, 2, 1, 2};
    112   static const uint8_t kData2[] = {0x30, 3, 1, 2};
    113   static const uint8_t kData3[] = {0x30, 0x80};
    114   static const uint8_t kData4[] = {0x30, 0x81, 1, 1};
    115   static const uint8_t kData5[4 + 0x80] = {0x30, 0x82, 0, 0x80};
    116   static const uint8_t kData6[] = {0xa1, 3, 0x4, 1, 1};
    117   static const uint8_t kData7[] = {0xa1, 3, 0x4, 2, 1};
    118   static const uint8_t kData8[] = {0xa1, 3, 0x2, 1, 1};
    119   static const uint8_t kData9[] = {0xa1, 3, 0x2, 1, 0xff};
    120 
    121   CBS data, contents;
    122   int present;
    123   uint64_t value;
    124 
    125   CBS_init(&data, kData1, sizeof(kData1));
    126   EXPECT_FALSE(CBS_peek_asn1_tag(&data, 0x1));
    127   EXPECT_TRUE(CBS_peek_asn1_tag(&data, 0x30));
    128 
    129   ASSERT_TRUE(CBS_get_asn1(&data, &contents, 0x30));
    130   EXPECT_EQ(Bytes("\x01\x02"), Bytes(CBS_data(&contents), CBS_len(&contents)));
    131 
    132   CBS_init(&data, kData2, sizeof(kData2));
    133   // data is truncated
    134   EXPECT_FALSE(CBS_get_asn1(&data, &contents, 0x30));
    135 
    136   CBS_init(&data, kData3, sizeof(kData3));
    137   // zero byte length of length
    138   EXPECT_FALSE(CBS_get_asn1(&data, &contents, 0x30));
    139 
    140   CBS_init(&data, kData4, sizeof(kData4));
    141   // long form mistakenly used.
    142   EXPECT_FALSE(CBS_get_asn1(&data, &contents, 0x30));
    143 
    144   CBS_init(&data, kData5, sizeof(kData5));
    145   // length takes too many bytes.
    146   EXPECT_FALSE(CBS_get_asn1(&data, &contents, 0x30));
    147 
    148   CBS_init(&data, kData1, sizeof(kData1));
    149   // wrong tag.
    150   EXPECT_FALSE(CBS_get_asn1(&data, &contents, 0x31));
    151 
    152   CBS_init(&data, NULL, 0);
    153   // peek at empty data.
    154   EXPECT_FALSE(CBS_peek_asn1_tag(&data, 0x30));
    155 
    156   CBS_init(&data, NULL, 0);
    157   // optional elements at empty data.
    158   ASSERT_TRUE(CBS_get_optional_asn1(&data, &contents, &present, 0xa0));
    159   EXPECT_FALSE(present);
    160   ASSERT_TRUE(
    161       CBS_get_optional_asn1_octet_string(&data, &contents, &present, 0xa0));
    162   EXPECT_FALSE(present);
    163   EXPECT_EQ(0u, CBS_len(&contents));
    164   ASSERT_TRUE(CBS_get_optional_asn1_octet_string(&data, &contents, NULL, 0xa0));
    165   EXPECT_EQ(0u, CBS_len(&contents));
    166   ASSERT_TRUE(CBS_get_optional_asn1_uint64(&data, &value, 0xa0, 42));
    167   EXPECT_EQ(42u, value);
    168 
    169   CBS_init(&data, kData6, sizeof(kData6));
    170   // optional element.
    171   ASSERT_TRUE(CBS_get_optional_asn1(&data, &contents, &present, 0xa0));
    172   EXPECT_FALSE(present);
    173   ASSERT_TRUE(CBS_get_optional_asn1(&data, &contents, &present, 0xa1));
    174   EXPECT_TRUE(present);
    175   EXPECT_EQ(Bytes("\x04\x01\x01"),
    176             Bytes(CBS_data(&contents), CBS_len(&contents)));
    177 
    178   CBS_init(&data, kData6, sizeof(kData6));
    179   // optional octet string.
    180   ASSERT_TRUE(
    181       CBS_get_optional_asn1_octet_string(&data, &contents, &present, 0xa0));
    182   EXPECT_FALSE(present);
    183   EXPECT_EQ(0u, CBS_len(&contents));
    184   ASSERT_TRUE(
    185       CBS_get_optional_asn1_octet_string(&data, &contents, &present, 0xa1));
    186   EXPECT_TRUE(present);
    187   EXPECT_EQ(Bytes("\x01"), Bytes(CBS_data(&contents), CBS_len(&contents)));
    188 
    189   CBS_init(&data, kData7, sizeof(kData7));
    190   // invalid optional octet string.
    191   EXPECT_FALSE(
    192       CBS_get_optional_asn1_octet_string(&data, &contents, &present, 0xa1));
    193 
    194   CBS_init(&data, kData8, sizeof(kData8));
    195   // optional integer.
    196   ASSERT_TRUE(CBS_get_optional_asn1_uint64(&data, &value, 0xa0, 42));
    197   EXPECT_EQ(42u, value);
    198   ASSERT_TRUE(CBS_get_optional_asn1_uint64(&data, &value, 0xa1, 42));
    199   EXPECT_EQ(1u, value);
    200 
    201   CBS_init(&data, kData9, sizeof(kData9));
    202   // invalid optional integer.
    203   EXPECT_FALSE(CBS_get_optional_asn1_uint64(&data, &value, 0xa1, 42));
    204 
    205   unsigned tag;
    206   CBS_init(&data, kData1, sizeof(kData1));
    207   ASSERT_TRUE(CBS_get_any_asn1(&data, &contents, &tag));
    208   EXPECT_EQ(CBS_ASN1_SEQUENCE, tag);
    209   EXPECT_EQ(Bytes("\x01\x02"), Bytes(CBS_data(&contents), CBS_len(&contents)));
    210 
    211   size_t header_len;
    212   CBS_init(&data, kData1, sizeof(kData1));
    213   ASSERT_TRUE(CBS_get_any_asn1_element(&data, &contents, &tag, &header_len));
    214   EXPECT_EQ(CBS_ASN1_SEQUENCE, tag);
    215   EXPECT_EQ(2u, header_len);
    216   EXPECT_EQ(Bytes("\x30\x02\x01\x02"),
    217             Bytes(CBS_data(&contents), CBS_len(&contents)));
    218 }
    219 
    220 TEST(CBSTest, GetOptionalASN1Bool) {
    221   static const uint8_t kTrue[] = {0x0a, 3, CBS_ASN1_BOOLEAN, 1, 0xff};
    222   static const uint8_t kFalse[] = {0x0a, 3, CBS_ASN1_BOOLEAN, 1, 0x00};
    223   static const uint8_t kInvalid[] = {0x0a, 3, CBS_ASN1_BOOLEAN, 1, 0x01};
    224 
    225   CBS data;
    226   CBS_init(&data, NULL, 0);
    227   int val = 2;
    228   ASSERT_TRUE(CBS_get_optional_asn1_bool(&data, &val, 0x0a, 0));
    229   EXPECT_EQ(0, val);
    230 
    231   CBS_init(&data, kTrue, sizeof(kTrue));
    232   val = 2;
    233   ASSERT_TRUE(CBS_get_optional_asn1_bool(&data, &val, 0x0a, 0));
    234   EXPECT_EQ(1, val);
    235 
    236   CBS_init(&data, kFalse, sizeof(kFalse));
    237   val = 2;
    238   ASSERT_TRUE(CBS_get_optional_asn1_bool(&data, &val, 0x0a, 1));
    239   EXPECT_EQ(0, val);
    240 
    241   CBS_init(&data, kInvalid, sizeof(kInvalid));
    242   EXPECT_FALSE(CBS_get_optional_asn1_bool(&data, &val, 0x0a, 1));
    243 }
    244 
    245 // Test that CBB_init may be used on an uninitialized input.
    246 TEST(CBBTest, InitUninitialized) {
    247   CBB cbb;
    248   ASSERT_TRUE(CBB_init(&cbb, 100));
    249   CBB_cleanup(&cbb);
    250 }
    251 
    252 TEST(CBBTest, Basic) {
    253   static const uint8_t kExpected[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0xa, 0xb, 0xc};
    254   uint8_t *buf;
    255   size_t buf_len;
    256 
    257   bssl::ScopedCBB cbb;
    258   ASSERT_TRUE(CBB_init(cbb.get(), 100));
    259   cbb.Reset();
    260 
    261   ASSERT_TRUE(CBB_init(cbb.get(), 0));
    262   ASSERT_TRUE(CBB_add_u8(cbb.get(), 1));
    263   ASSERT_TRUE(CBB_add_u16(cbb.get(), 0x203));
    264   ASSERT_TRUE(CBB_add_u24(cbb.get(), 0x40506));
    265   ASSERT_TRUE(CBB_add_u32(cbb.get(), 0x708090a));
    266   ASSERT_TRUE(CBB_add_bytes(cbb.get(), (const uint8_t *)"\x0b\x0c", 2));
    267   ASSERT_TRUE(CBB_finish(cbb.get(), &buf, &buf_len));
    268 
    269   bssl::UniquePtr<uint8_t> scoper(buf);
    270   EXPECT_EQ(Bytes(kExpected), Bytes(buf, buf_len));
    271 }
    272 
    273 TEST(CBBTest, Fixed) {
    274   bssl::ScopedCBB cbb;
    275   uint8_t buf[1];
    276   uint8_t *out_buf;
    277   size_t out_size;
    278 
    279   ASSERT_TRUE(CBB_init_fixed(cbb.get(), NULL, 0));
    280   ASSERT_TRUE(CBB_finish(cbb.get(), &out_buf, &out_size));
    281   EXPECT_EQ(NULL, out_buf);
    282   EXPECT_EQ(0u, out_size);
    283 
    284   cbb.Reset();
    285   ASSERT_TRUE(CBB_init_fixed(cbb.get(), buf, 1));
    286   ASSERT_TRUE(CBB_add_u8(cbb.get(), 1));
    287   ASSERT_TRUE(CBB_finish(cbb.get(), &out_buf, &out_size));
    288   EXPECT_EQ(buf, out_buf);
    289   EXPECT_EQ(1u, out_size);
    290   EXPECT_EQ(1u, buf[0]);
    291 
    292   cbb.Reset();
    293   ASSERT_TRUE(CBB_init_fixed(cbb.get(), buf, 1));
    294   ASSERT_TRUE(CBB_add_u8(cbb.get(), 1));
    295   EXPECT_FALSE(CBB_add_u8(cbb.get(), 2));
    296 }
    297 
    298 // Test that calling CBB_finish on a child does nothing.
    299 TEST(CBBTest, FinishChild) {
    300   CBB child;
    301   uint8_t *out_buf;
    302   size_t out_size;
    303 
    304   bssl::ScopedCBB cbb;
    305   ASSERT_TRUE(CBB_init(cbb.get(), 16));
    306   ASSERT_TRUE(CBB_add_u8_length_prefixed(cbb.get(), &child));
    307 
    308   EXPECT_FALSE(CBB_finish(&child, &out_buf, &out_size));
    309 
    310   ASSERT_TRUE(CBB_finish(cbb.get(), &out_buf, &out_size));
    311   bssl::UniquePtr<uint8_t> scoper(out_buf);
    312   ASSERT_EQ(1u, out_size);
    313   EXPECT_EQ(0u, out_buf[0]);
    314 }
    315 
    316 TEST(CBBTest, Prefixed) {
    317   static const uint8_t kExpected[] = {0, 1, 1, 0, 2, 2, 3, 0, 0, 3,
    318                                       4, 5, 6, 5, 4, 1, 0, 1, 2};
    319   uint8_t *buf;
    320   size_t buf_len;
    321   bssl::ScopedCBB cbb;
    322   CBB contents, inner_contents, inner_inner_contents;
    323   ASSERT_TRUE(CBB_init(cbb.get(), 0));
    324   EXPECT_EQ(0u, CBB_len(cbb.get()));
    325   ASSERT_TRUE(CBB_add_u8_length_prefixed(cbb.get(), &contents));
    326   ASSERT_TRUE(CBB_add_u8_length_prefixed(cbb.get(), &contents));
    327   ASSERT_TRUE(CBB_add_u8(&contents, 1));
    328   EXPECT_EQ(1u, CBB_len(&contents));
    329   ASSERT_TRUE(CBB_flush(cbb.get()));
    330   EXPECT_EQ(3u, CBB_len(cbb.get()));
    331   ASSERT_TRUE(CBB_add_u16_length_prefixed(cbb.get(), &contents));
    332   ASSERT_TRUE(CBB_add_u16(&contents, 0x203));
    333   ASSERT_TRUE(CBB_add_u24_length_prefixed(cbb.get(), &contents));
    334   ASSERT_TRUE(CBB_add_u24(&contents, 0x40506));
    335   ASSERT_TRUE(CBB_add_u8_length_prefixed(cbb.get(), &contents));
    336   ASSERT_TRUE(CBB_add_u8_length_prefixed(&contents, &inner_contents));
    337   ASSERT_TRUE(CBB_add_u8(&inner_contents, 1));
    338   ASSERT_TRUE(
    339       CBB_add_u16_length_prefixed(&inner_contents, &inner_inner_contents));
    340   ASSERT_TRUE(CBB_add_u8(&inner_inner_contents, 2));
    341   ASSERT_TRUE(CBB_finish(cbb.get(), &buf, &buf_len));
    342 
    343   bssl::UniquePtr<uint8_t> scoper(buf);
    344   EXPECT_EQ(Bytes(kExpected), Bytes(buf, buf_len));
    345 }
    346 
    347 TEST(CBBTest, DiscardChild) {
    348   bssl::ScopedCBB cbb;
    349   CBB contents, inner_contents, inner_inner_contents;
    350 
    351   ASSERT_TRUE(CBB_init(cbb.get(), 0));
    352   ASSERT_TRUE(CBB_add_u8(cbb.get(), 0xaa));
    353 
    354   // Discarding |cbb|'s children preserves the byte written.
    355   CBB_discard_child(cbb.get());
    356 
    357   ASSERT_TRUE(CBB_add_u8_length_prefixed(cbb.get(), &contents));
    358   ASSERT_TRUE(CBB_add_u8_length_prefixed(cbb.get(), &contents));
    359   ASSERT_TRUE(CBB_add_u8(&contents, 0xbb));
    360   ASSERT_TRUE(CBB_add_u16_length_prefixed(cbb.get(), &contents));
    361   ASSERT_TRUE(CBB_add_u16(&contents, 0xcccc));
    362   ASSERT_TRUE(CBB_add_u24_length_prefixed(cbb.get(), &contents));
    363   ASSERT_TRUE(CBB_add_u24(&contents, 0xdddddd));
    364   ASSERT_TRUE(CBB_add_u8_length_prefixed(cbb.get(), &contents));
    365   ASSERT_TRUE(CBB_add_u8(&contents, 0xff));
    366   ASSERT_TRUE(CBB_add_u8_length_prefixed(&contents, &inner_contents));
    367   ASSERT_TRUE(CBB_add_u8(&inner_contents, 0x42));
    368   ASSERT_TRUE(
    369       CBB_add_u16_length_prefixed(&inner_contents, &inner_inner_contents));
    370   ASSERT_TRUE(CBB_add_u8(&inner_inner_contents, 0x99));
    371 
    372   // Discard everything from |inner_contents| down.
    373   CBB_discard_child(&contents);
    374 
    375   uint8_t *buf;
    376   size_t buf_len;
    377   ASSERT_TRUE(CBB_finish(cbb.get(), &buf, &buf_len));
    378   bssl::UniquePtr<uint8_t> scoper(buf);
    379 
    380   static const uint8_t kExpected[] = {
    381         0xaa,
    382         0,
    383         1, 0xbb,
    384         0, 2, 0xcc, 0xcc,
    385         0, 0, 3, 0xdd, 0xdd, 0xdd,
    386         1, 0xff,
    387   };
    388   EXPECT_EQ(Bytes(kExpected), Bytes(buf, buf_len));
    389 }
    390 
    391 TEST(CBBTest, Misuse) {
    392   bssl::ScopedCBB cbb;
    393   CBB child, contents;
    394   uint8_t *buf;
    395   size_t buf_len;
    396 
    397   ASSERT_TRUE(CBB_init(cbb.get(), 0));
    398   ASSERT_TRUE(CBB_add_u8_length_prefixed(cbb.get(), &child));
    399   ASSERT_TRUE(CBB_add_u8(&child, 1));
    400   ASSERT_TRUE(CBB_add_u8(cbb.get(), 2));
    401 
    402   // Since we wrote to |cbb|, |child| is now invalid and attempts to write to
    403   // it should fail.
    404   EXPECT_FALSE(CBB_add_u8(&child, 1));
    405   EXPECT_FALSE(CBB_add_u16(&child, 1));
    406   EXPECT_FALSE(CBB_add_u24(&child, 1));
    407   EXPECT_FALSE(CBB_add_u8_length_prefixed(&child, &contents));
    408   EXPECT_FALSE(CBB_add_u16_length_prefixed(&child, &contents));
    409   EXPECT_FALSE(CBB_add_asn1(&child, &contents, 1));
    410   EXPECT_FALSE(CBB_add_bytes(&child, (const uint8_t*) "a", 1));
    411 
    412   ASSERT_TRUE(CBB_finish(cbb.get(), &buf, &buf_len));
    413   bssl::UniquePtr<uint8_t> scoper(buf);
    414 
    415   EXPECT_EQ(Bytes("\x01\x01\x02"), Bytes(buf, buf_len));
    416 }
    417 
    418 TEST(CBBTest, ASN1) {
    419   static const uint8_t kExpected[] = {0x30, 3, 1, 2, 3};
    420   uint8_t *buf;
    421   size_t buf_len;
    422   bssl::ScopedCBB cbb;
    423   CBB contents, inner_contents;
    424 
    425   ASSERT_TRUE(CBB_init(cbb.get(), 0));
    426   ASSERT_TRUE(CBB_add_asn1(cbb.get(), &contents, 0x30));
    427   ASSERT_TRUE(CBB_add_bytes(&contents, (const uint8_t *)"\x01\x02\x03", 3));
    428   ASSERT_TRUE(CBB_finish(cbb.get(), &buf, &buf_len));
    429   bssl::UniquePtr<uint8_t> scoper(buf);
    430 
    431   EXPECT_EQ(Bytes(kExpected), Bytes(buf, buf_len));
    432 
    433   std::vector<uint8_t> test_data(100000, 0x42);
    434   ASSERT_TRUE(CBB_init(cbb.get(), 0));
    435   ASSERT_TRUE(CBB_add_asn1(cbb.get(), &contents, 0x30));
    436   ASSERT_TRUE(CBB_add_bytes(&contents, test_data.data(), 130));
    437   ASSERT_TRUE(CBB_finish(cbb.get(), &buf, &buf_len));
    438   scoper.reset(buf);
    439 
    440   ASSERT_EQ(3u + 130u, buf_len);
    441   EXPECT_EQ(Bytes("\x30\x81\x82"), Bytes(buf, 3));
    442   EXPECT_EQ(Bytes(test_data.data(), 130), Bytes(buf + 3, 130));
    443 
    444   ASSERT_TRUE(CBB_init(cbb.get(), 0));
    445   ASSERT_TRUE(CBB_add_asn1(cbb.get(), &contents, 0x30));
    446   ASSERT_TRUE(CBB_add_bytes(&contents, test_data.data(), 1000));
    447   ASSERT_TRUE(CBB_finish(cbb.get(), &buf, &buf_len));
    448   scoper.reset(buf);
    449 
    450   ASSERT_EQ(4u + 1000u, buf_len);
    451   EXPECT_EQ(Bytes("\x30\x82\x03\xe8"), Bytes(buf, 4));
    452   EXPECT_EQ(Bytes(test_data.data(), 1000), Bytes(buf + 4, 1000));
    453 
    454   ASSERT_TRUE(CBB_init(cbb.get(), 0));
    455   ASSERT_TRUE(CBB_add_asn1(cbb.get(), &contents, 0x30));
    456   ASSERT_TRUE(CBB_add_asn1(&contents, &inner_contents, 0x30));
    457   ASSERT_TRUE(CBB_add_bytes(&inner_contents, test_data.data(), 100000));
    458   ASSERT_TRUE(CBB_finish(cbb.get(), &buf, &buf_len));
    459   scoper.reset(buf);
    460 
    461   ASSERT_EQ(5u + 5u + 100000u, buf_len);
    462   EXPECT_EQ(Bytes("\x30\x83\x01\x86\xa5\x30\x83\x01\x86\xa0"), Bytes(buf, 10));
    463   EXPECT_EQ(Bytes(test_data.data(), test_data.size()), Bytes(buf + 10, 100000));
    464 }
    465 
    466 static void ExpectBerConvert(const char *name, const uint8_t *der_expected,
    467                              size_t der_len, const uint8_t *ber,
    468                              size_t ber_len) {
    469   SCOPED_TRACE(name);
    470   CBS in;
    471   uint8_t *out;
    472   size_t out_len;
    473 
    474   CBS_init(&in, ber, ber_len);
    475   ASSERT_TRUE(CBS_asn1_ber_to_der(&in, &out, &out_len));
    476   bssl::UniquePtr<uint8_t> scoper(out);
    477 
    478   if (out == NULL) {
    479     EXPECT_EQ(Bytes(der_expected, der_len), Bytes(ber, ber_len));
    480   } else {
    481     EXPECT_NE(Bytes(der_expected, der_len), Bytes(ber, ber_len));
    482     EXPECT_EQ(Bytes(der_expected, der_len), Bytes(out, out_len));
    483   }
    484 }
    485 
    486 TEST(CBSTest, BerConvert) {
    487   static const uint8_t kSimpleBER[] = {0x01, 0x01, 0x00};
    488 
    489   // kIndefBER contains a SEQUENCE with an indefinite length.
    490   static const uint8_t kIndefBER[] = {0x30, 0x80, 0x01, 0x01, 0x02, 0x00, 0x00};
    491   static const uint8_t kIndefDER[] = {0x30, 0x03, 0x01, 0x01, 0x02};
    492 
    493   // kOctetStringBER contains an indefinite length OCTET STRING with two parts.
    494   // These parts need to be concatenated in DER form.
    495   static const uint8_t kOctetStringBER[] = {0x24, 0x80, 0x04, 0x02, 0,    1,
    496                                             0x04, 0x02, 2,    3,    0x00, 0x00};
    497   static const uint8_t kOctetStringDER[] = {0x04, 0x04, 0, 1, 2, 3};
    498 
    499   // kNSSBER is part of a PKCS#12 message generated by NSS that uses indefinite
    500   // length elements extensively.
    501   static const uint8_t kNSSBER[] = {
    502       0x30, 0x80, 0x02, 0x01, 0x03, 0x30, 0x80, 0x06, 0x09, 0x2a, 0x86, 0x48,
    503       0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01, 0xa0, 0x80, 0x24, 0x80, 0x04, 0x04,
    504       0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x39,
    505       0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05,
    506       0x00, 0x04, 0x14, 0x84, 0x98, 0xfc, 0x66, 0x33, 0xee, 0xba, 0xe7, 0x90,
    507       0xc1, 0xb6, 0xe8, 0x8f, 0xfe, 0x1d, 0xc5, 0xa5, 0x97, 0x93, 0x3e, 0x04,
    508       0x10, 0x38, 0x62, 0xc6, 0x44, 0x12, 0xd5, 0x30, 0x00, 0xf8, 0xf2, 0x1b,
    509       0xf0, 0x6e, 0x10, 0x9b, 0xb8, 0x02, 0x02, 0x07, 0xd0, 0x00, 0x00,
    510   };
    511 
    512   static const uint8_t kNSSDER[] = {
    513       0x30, 0x53, 0x02, 0x01, 0x03, 0x30, 0x13, 0x06, 0x09, 0x2a, 0x86,
    514       0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01, 0xa0, 0x06, 0x04, 0x04,
    515       0x01, 0x02, 0x03, 0x04, 0x30, 0x39, 0x30, 0x21, 0x30, 0x09, 0x06,
    516       0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14, 0x84,
    517       0x98, 0xfc, 0x66, 0x33, 0xee, 0xba, 0xe7, 0x90, 0xc1, 0xb6, 0xe8,
    518       0x8f, 0xfe, 0x1d, 0xc5, 0xa5, 0x97, 0x93, 0x3e, 0x04, 0x10, 0x38,
    519       0x62, 0xc6, 0x44, 0x12, 0xd5, 0x30, 0x00, 0xf8, 0xf2, 0x1b, 0xf0,
    520       0x6e, 0x10, 0x9b, 0xb8, 0x02, 0x02, 0x07, 0xd0,
    521   };
    522 
    523   // kConstructedStringBER contains a deeply-nested constructed OCTET STRING.
    524   // The BER conversion collapses this to one level deep, but not completely.
    525   static const uint8_t kConstructedStringBER[] = {
    526       0xa0, 0x10, 0x24, 0x06, 0x04, 0x01, 0x00, 0x04, 0x01,
    527       0x01, 0x24, 0x06, 0x04, 0x01, 0x02, 0x04, 0x01, 0x03,
    528   };
    529   static const uint8_t kConstructedStringDER[] = {
    530       0xa0, 0x08, 0x04, 0x02, 0x00, 0x01, 0x04, 0x02, 0x02, 0x03,
    531   };
    532 
    533   ExpectBerConvert("kSimpleBER", kSimpleBER, sizeof(kSimpleBER), kSimpleBER,
    534                    sizeof(kSimpleBER));
    535   ExpectBerConvert("kIndefBER", kIndefDER, sizeof(kIndefDER), kIndefBER,
    536                    sizeof(kIndefBER));
    537   ExpectBerConvert("kOctetStringBER", kOctetStringDER, sizeof(kOctetStringDER),
    538                    kOctetStringBER, sizeof(kOctetStringBER));
    539   ExpectBerConvert("kNSSBER", kNSSDER, sizeof(kNSSDER), kNSSBER,
    540                    sizeof(kNSSBER));
    541   ExpectBerConvert("kConstructedStringBER", kConstructedStringDER,
    542                    sizeof(kConstructedStringDER), kConstructedStringBER,
    543                    sizeof(kConstructedStringBER));
    544 }
    545 
    546 struct ImplicitStringTest {
    547   const char *in;
    548   size_t in_len;
    549   bool ok;
    550   const char *out;
    551   size_t out_len;
    552 };
    553 
    554 static const ImplicitStringTest kImplicitStringTests[] = {
    555     // A properly-encoded string.
    556     {"\x80\x03\x61\x61\x61", 5, true, "aaa", 3},
    557     // An implicit-tagged string.
    558     {"\xa0\x09\x04\x01\x61\x04\x01\x61\x04\x01\x61", 11, true, "aaa", 3},
    559     // |CBS_get_asn1_implicit_string| only accepts one level deep of nesting.
    560     {"\xa0\x0b\x24\x06\x04\x01\x61\x04\x01\x61\x04\x01\x61", 13, false, nullptr,
    561      0},
    562     // The outer tag must match.
    563     {"\x81\x03\x61\x61\x61", 5, false, nullptr, 0},
    564     {"\xa1\x09\x04\x01\x61\x04\x01\x61\x04\x01\x61", 11, false, nullptr, 0},
    565     // The inner tag must match.
    566     {"\xa1\x09\x0c\x01\x61\x0c\x01\x61\x0c\x01\x61", 11, false, nullptr, 0},
    567 };
    568 
    569 TEST(CBSTest, ImplicitString) {
    570   for (const auto &test : kImplicitStringTests) {
    571     SCOPED_TRACE(Bytes(test.in, test.in_len));
    572     uint8_t *storage = nullptr;
    573     CBS in, out;
    574     CBS_init(&in, reinterpret_cast<const uint8_t *>(test.in), test.in_len);
    575     int ok = CBS_get_asn1_implicit_string(&in, &out, &storage,
    576                                           CBS_ASN1_CONTEXT_SPECIFIC | 0,
    577                                           CBS_ASN1_OCTETSTRING);
    578     bssl::UniquePtr<uint8_t> scoper(storage);
    579     EXPECT_EQ(test.ok, static_cast<bool>(ok));
    580 
    581     if (ok) {
    582       EXPECT_EQ(Bytes(test.out, test.out_len),
    583                 Bytes(CBS_data(&out), CBS_len(&out)));
    584     }
    585   }
    586 }
    587 
    588 struct ASN1Uint64Test {
    589   uint64_t value;
    590   const char *encoding;
    591   size_t encoding_len;
    592 };
    593 
    594 static const ASN1Uint64Test kASN1Uint64Tests[] = {
    595     {0, "\x02\x01\x00", 3},
    596     {1, "\x02\x01\x01", 3},
    597     {127, "\x02\x01\x7f", 3},
    598     {128, "\x02\x02\x00\x80", 4},
    599     {0xdeadbeef, "\x02\x05\x00\xde\xad\xbe\xef", 7},
    600     {UINT64_C(0x0102030405060708),
    601      "\x02\x08\x01\x02\x03\x04\x05\x06\x07\x08", 10},
    602     {UINT64_C(0xffffffffffffffff),
    603       "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff", 11},
    604 };
    605 
    606 struct ASN1InvalidUint64Test {
    607   const char *encoding;
    608   size_t encoding_len;
    609 };
    610 
    611 static const ASN1InvalidUint64Test kASN1InvalidUint64Tests[] = {
    612     // Bad tag.
    613     {"\x03\x01\x00", 3},
    614     // Empty contents.
    615     {"\x02\x00", 2},
    616     // Negative number.
    617     {"\x02\x01\x80", 3},
    618     // Overflow.
    619     {"\x02\x09\x01\x00\x00\x00\x00\x00\x00\x00\x00", 11},
    620     // Leading zeros.
    621     {"\x02\x02\x00\x01", 4},
    622 };
    623 
    624 TEST(CBSTest, ASN1Uint64) {
    625   for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kASN1Uint64Tests); i++) {
    626     SCOPED_TRACE(i);
    627     const ASN1Uint64Test *test = &kASN1Uint64Tests[i];
    628     CBS cbs;
    629     uint64_t value;
    630     uint8_t *out;
    631     size_t len;
    632 
    633     CBS_init(&cbs, (const uint8_t *)test->encoding, test->encoding_len);
    634     ASSERT_TRUE(CBS_get_asn1_uint64(&cbs, &value));
    635     EXPECT_EQ(0u, CBS_len(&cbs));
    636     EXPECT_EQ(test->value, value);
    637 
    638     bssl::ScopedCBB cbb;
    639     ASSERT_TRUE(CBB_init(cbb.get(), 0));
    640     ASSERT_TRUE(CBB_add_asn1_uint64(cbb.get(), test->value));
    641     ASSERT_TRUE(CBB_finish(cbb.get(), &out, &len));
    642     bssl::UniquePtr<uint8_t> scoper(out);
    643     EXPECT_EQ(Bytes(test->encoding, test->encoding_len), Bytes(out, len));
    644   }
    645 
    646   for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kASN1InvalidUint64Tests); i++) {
    647     const ASN1InvalidUint64Test *test = &kASN1InvalidUint64Tests[i];
    648     CBS cbs;
    649     uint64_t value;
    650 
    651     CBS_init(&cbs, (const uint8_t *)test->encoding, test->encoding_len);
    652     EXPECT_FALSE(CBS_get_asn1_uint64(&cbs, &value));
    653   }
    654 }
    655 
    656 TEST(CBBTest, Zero) {
    657   CBB cbb;
    658   CBB_zero(&cbb);
    659   // Calling |CBB_cleanup| on a zero-state |CBB| must not crash.
    660   CBB_cleanup(&cbb);
    661 }
    662 
    663 TEST(CBBTest, Reserve) {
    664   uint8_t buf[10];
    665   uint8_t *ptr;
    666   size_t len;
    667   bssl::ScopedCBB cbb;
    668   ASSERT_TRUE(CBB_init_fixed(cbb.get(), buf, sizeof(buf)));
    669   // Too large.
    670   EXPECT_FALSE(CBB_reserve(cbb.get(), &ptr, 11));
    671 
    672   cbb.Reset();
    673   ASSERT_TRUE(CBB_init_fixed(cbb.get(), buf, sizeof(buf)));
    674   // Successfully reserve the entire space.
    675   ASSERT_TRUE(CBB_reserve(cbb.get(), &ptr, 10));
    676   EXPECT_EQ(buf, ptr);
    677   // Advancing under the maximum bytes is legal.
    678   ASSERT_TRUE(CBB_did_write(cbb.get(), 5));
    679   ASSERT_TRUE(CBB_finish(cbb.get(), NULL, &len));
    680   EXPECT_EQ(5u, len);
    681 }
    682 
    683 // Test that CBB errors are sticky; once on operation on CBB fails, all
    684 // subsequent ones do.
    685 TEST(CBBTest, StickyError) {
    686   // Write an input that exceeds the limit for its length prefix.
    687   bssl::ScopedCBB cbb;
    688   CBB child;
    689   static const uint8_t kZeros[256] = {0};
    690   ASSERT_TRUE(CBB_init(cbb.get(), 0));
    691   ASSERT_TRUE(CBB_add_u8_length_prefixed(cbb.get(), &child));
    692   ASSERT_TRUE(CBB_add_bytes(&child, kZeros, sizeof(kZeros)));
    693   ASSERT_FALSE(CBB_flush(cbb.get()));
    694 
    695   // All future operations should fail.
    696   uint8_t *ptr;
    697   size_t len;
    698   EXPECT_FALSE(CBB_add_u8(cbb.get(), 0));
    699   EXPECT_FALSE(CBB_finish(cbb.get(), &ptr, &len));
    700 
    701   // Write an input that cannot fit in a fixed CBB.
    702   cbb.Reset();
    703   uint8_t buf;
    704   ASSERT_TRUE(CBB_init_fixed(cbb.get(), &buf, 1));
    705   ASSERT_FALSE(CBB_add_bytes(cbb.get(), kZeros, sizeof(kZeros)));
    706 
    707   // All future operations should fail.
    708   EXPECT_FALSE(CBB_add_u8(cbb.get(), 0));
    709   EXPECT_FALSE(CBB_finish(cbb.get(), &ptr, &len));
    710 
    711   // Write a u32 that cannot fit in a u24.
    712   cbb.Reset();
    713   ASSERT_TRUE(CBB_init(cbb.get(), 0));
    714   ASSERT_FALSE(CBB_add_u24(cbb.get(), 1u << 24));
    715 
    716   // All future operations should fail.
    717   EXPECT_FALSE(CBB_add_u8(cbb.get(), 0));
    718   EXPECT_FALSE(CBB_finish(cbb.get(), &ptr, &len));
    719 }
    720 
    721 TEST(CBSTest, BitString) {
    722   static const std::vector<uint8_t> kValidBitStrings[] = {
    723       {0x00},                                      // 0 bits
    724       {0x07, 0x80},                                // 1 bit
    725       {0x04, 0xf0},                                // 4 bits
    726       {0x00, 0xff},                                // 8 bits
    727       {0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0},  // 42 bits
    728   };
    729   for (const auto& test : kValidBitStrings) {
    730     SCOPED_TRACE(Bytes(test.data(), test.size()));
    731     CBS cbs;
    732     CBS_init(&cbs, test.data(), test.size());
    733     EXPECT_TRUE(CBS_is_valid_asn1_bitstring(&cbs));
    734   }
    735 
    736   static const std::vector<uint8_t> kInvalidBitStrings[] = {
    737       // BIT STRINGs always have a leading byte.
    738       std::vector<uint8_t>{},
    739       // It's not possible to take an unused bit off the empty string.
    740       {0x01},
    741       // There can be at most 7 unused bits.
    742       {0x08, 0xff},
    743       {0xff, 0xff},
    744       // All unused bits must be cleared.
    745       {0x06, 0xff, 0xc1},
    746   };
    747   for (const auto& test : kInvalidBitStrings) {
    748     SCOPED_TRACE(Bytes(test.data(), test.size()));
    749     CBS cbs;
    750     CBS_init(&cbs, test.data(), test.size());
    751     EXPECT_FALSE(CBS_is_valid_asn1_bitstring(&cbs));
    752 
    753     // CBS_asn1_bitstring_has_bit returns false on invalid inputs.
    754     EXPECT_FALSE(CBS_asn1_bitstring_has_bit(&cbs, 0));
    755   }
    756 
    757   static const struct {
    758     std::vector<uint8_t> in;
    759     unsigned bit;
    760     bool bit_set;
    761   } kBitTests[] = {
    762       // Basic tests.
    763       {{0x00}, 0, false},
    764       {{0x07, 0x80}, 0, true},
    765       {{0x06, 0x0f, 0x40}, 0, false},
    766       {{0x06, 0x0f, 0x40}, 1, false},
    767       {{0x06, 0x0f, 0x40}, 2, false},
    768       {{0x06, 0x0f, 0x40}, 3, false},
    769       {{0x06, 0x0f, 0x40}, 4, true},
    770       {{0x06, 0x0f, 0x40}, 5, true},
    771       {{0x06, 0x0f, 0x40}, 6, true},
    772       {{0x06, 0x0f, 0x40}, 7, true},
    773       {{0x06, 0x0f, 0x40}, 8, false},
    774       {{0x06, 0x0f, 0x40}, 9, true},
    775       // Out-of-bounds bits return 0.
    776       {{0x06, 0x0f, 0x40}, 10, false},
    777       {{0x06, 0x0f, 0x40}, 15, false},
    778       {{0x06, 0x0f, 0x40}, 16, false},
    779       {{0x06, 0x0f, 0x40}, 1000, false},
    780   };
    781   for (const auto& test : kBitTests) {
    782     SCOPED_TRACE(Bytes(test.in.data(), test.in.size()));
    783     SCOPED_TRACE(test.bit);
    784     CBS cbs;
    785     CBS_init(&cbs, test.in.data(), test.in.size());
    786     EXPECT_EQ(static_cast<int>(test.bit_set),
    787               CBS_asn1_bitstring_has_bit(&cbs, test.bit));
    788   }
    789 }
    790