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 #include <openssl/buf.h>
     16 #include <openssl/mem.h>
     17 #include <openssl/bytestring.h>
     18 
     19 #include <assert.h>
     20 #include <inttypes.h>
     21 #include <string.h>
     22 
     23 #include "internal.h"
     24 #include "../internal.h"
     25 
     26 
     27 void CBS_init(CBS *cbs, const uint8_t *data, size_t len) {
     28   cbs->data = data;
     29   cbs->len = len;
     30 }
     31 
     32 static int cbs_get(CBS *cbs, const uint8_t **p, size_t n) {
     33   if (cbs->len < n) {
     34     return 0;
     35   }
     36 
     37   *p = cbs->data;
     38   cbs->data += n;
     39   cbs->len -= n;
     40   return 1;
     41 }
     42 
     43 int CBS_skip(CBS *cbs, size_t len) {
     44   const uint8_t *dummy;
     45   return cbs_get(cbs, &dummy, len);
     46 }
     47 
     48 const uint8_t *CBS_data(const CBS *cbs) {
     49   return cbs->data;
     50 }
     51 
     52 size_t CBS_len(const CBS *cbs) {
     53   return cbs->len;
     54 }
     55 
     56 int CBS_stow(const CBS *cbs, uint8_t **out_ptr, size_t *out_len) {
     57   OPENSSL_free(*out_ptr);
     58   *out_ptr = NULL;
     59   *out_len = 0;
     60 
     61   if (cbs->len == 0) {
     62     return 1;
     63   }
     64   *out_ptr = BUF_memdup(cbs->data, cbs->len);
     65   if (*out_ptr == NULL) {
     66     return 0;
     67   }
     68   *out_len = cbs->len;
     69   return 1;
     70 }
     71 
     72 int CBS_strdup(const CBS *cbs, char **out_ptr) {
     73   if (*out_ptr != NULL) {
     74     OPENSSL_free(*out_ptr);
     75   }
     76   *out_ptr = BUF_strndup((const char*)cbs->data, cbs->len);
     77   return (*out_ptr != NULL);
     78 }
     79 
     80 int CBS_contains_zero_byte(const CBS *cbs) {
     81   return OPENSSL_memchr(cbs->data, 0, cbs->len) != NULL;
     82 }
     83 
     84 int CBS_mem_equal(const CBS *cbs, const uint8_t *data, size_t len) {
     85   if (len != cbs->len) {
     86     return 0;
     87   }
     88   return CRYPTO_memcmp(cbs->data, data, len) == 0;
     89 }
     90 
     91 static int cbs_get_u(CBS *cbs, uint64_t *out, size_t len) {
     92   uint64_t result = 0;
     93   const uint8_t *data;
     94 
     95   if (!cbs_get(cbs, &data, len)) {
     96     return 0;
     97   }
     98   for (size_t i = 0; i < len; i++) {
     99     result <<= 8;
    100     result |= data[i];
    101   }
    102   *out = result;
    103   return 1;
    104 }
    105 
    106 int CBS_get_u8(CBS *cbs, uint8_t *out) {
    107   const uint8_t *v;
    108   if (!cbs_get(cbs, &v, 1)) {
    109     return 0;
    110   }
    111   *out = *v;
    112   return 1;
    113 }
    114 
    115 int CBS_get_u16(CBS *cbs, uint16_t *out) {
    116   uint64_t v;
    117   if (!cbs_get_u(cbs, &v, 2)) {
    118     return 0;
    119   }
    120   *out = v;
    121   return 1;
    122 }
    123 
    124 int CBS_get_u24(CBS *cbs, uint32_t *out) {
    125   uint64_t v;
    126   if (!cbs_get_u(cbs, &v, 3)) {
    127     return 0;
    128   }
    129   *out = v;
    130   return 1;
    131 }
    132 
    133 int CBS_get_u32(CBS *cbs, uint32_t *out) {
    134   uint64_t v;
    135   if (!cbs_get_u(cbs, &v, 4)) {
    136     return 0;
    137   }
    138   *out = v;
    139   return 1;
    140 }
    141 
    142 int CBS_get_u64(CBS *cbs, uint64_t *out) {
    143   return cbs_get_u(cbs, out, 8);
    144 }
    145 
    146 int CBS_get_last_u8(CBS *cbs, uint8_t *out) {
    147   if (cbs->len == 0) {
    148     return 0;
    149   }
    150   *out = cbs->data[cbs->len - 1];
    151   cbs->len--;
    152   return 1;
    153 }
    154 
    155 int CBS_get_bytes(CBS *cbs, CBS *out, size_t len) {
    156   const uint8_t *v;
    157   if (!cbs_get(cbs, &v, len)) {
    158     return 0;
    159   }
    160   CBS_init(out, v, len);
    161   return 1;
    162 }
    163 
    164 int CBS_copy_bytes(CBS *cbs, uint8_t *out, size_t len) {
    165   const uint8_t *v;
    166   if (!cbs_get(cbs, &v, len)) {
    167     return 0;
    168   }
    169   OPENSSL_memcpy(out, v, len);
    170   return 1;
    171 }
    172 
    173 static int cbs_get_length_prefixed(CBS *cbs, CBS *out, size_t len_len) {
    174   uint64_t len;
    175   if (!cbs_get_u(cbs, &len, len_len)) {
    176     return 0;
    177   }
    178   // If |len_len| <= 3 then we know that |len| will fit into a |size_t|, even on
    179   // 32-bit systems.
    180   assert(len_len <= 3);
    181   return CBS_get_bytes(cbs, out, len);
    182 }
    183 
    184 int CBS_get_u8_length_prefixed(CBS *cbs, CBS *out) {
    185   return cbs_get_length_prefixed(cbs, out, 1);
    186 }
    187 
    188 int CBS_get_u16_length_prefixed(CBS *cbs, CBS *out) {
    189   return cbs_get_length_prefixed(cbs, out, 2);
    190 }
    191 
    192 int CBS_get_u24_length_prefixed(CBS *cbs, CBS *out) {
    193   return cbs_get_length_prefixed(cbs, out, 3);
    194 }
    195 
    196 // parse_base128_integer reads a big-endian base-128 integer from |cbs| and sets
    197 // |*out| to the result. This is the encoding used in DER for both high tag
    198 // number form and OID components.
    199 static int parse_base128_integer(CBS *cbs, uint64_t *out) {
    200   uint64_t v = 0;
    201   uint8_t b;
    202   do {
    203     if (!CBS_get_u8(cbs, &b)) {
    204       return 0;
    205     }
    206     if ((v >> (64 - 7)) != 0) {
    207       // The value is too large.
    208       return 0;
    209     }
    210     if (v == 0 && b == 0x80) {
    211       // The value must be minimally encoded.
    212       return 0;
    213     }
    214     v = (v << 7) | (b & 0x7f);
    215 
    216     // Values end at an octet with the high bit cleared.
    217   } while (b & 0x80);
    218 
    219   *out = v;
    220   return 1;
    221 }
    222 
    223 static int parse_asn1_tag(CBS *cbs, unsigned *out) {
    224   uint8_t tag_byte;
    225   if (!CBS_get_u8(cbs, &tag_byte)) {
    226     return 0;
    227   }
    228 
    229   // ITU-T X.690 section 8.1.2.3 specifies the format for identifiers with a tag
    230   // number no greater than 30.
    231   //
    232   // If the number portion is 31 (0x1f, the largest value that fits in the
    233   // allotted bits), then the tag is more than one byte long and the
    234   // continuation bytes contain the tag number. This parser only supports tag
    235   // numbers less than 31 (and thus single-byte tags).
    236   unsigned tag = ((unsigned)tag_byte & 0xe0) << CBS_ASN1_TAG_SHIFT;
    237   unsigned tag_number = tag_byte & 0x1f;
    238   if (tag_number == 0x1f) {
    239     uint64_t v;
    240     if (!parse_base128_integer(cbs, &v) ||
    241         // Check the tag number is within our supported bounds.
    242         v > CBS_ASN1_TAG_NUMBER_MASK ||
    243         // Small tag numbers should have used low tag number form.
    244         v < 0x1f) {
    245       return 0;
    246     }
    247     tag_number = (unsigned)v;
    248   }
    249 
    250   tag |= tag_number;
    251 
    252   *out = tag;
    253   return 1;
    254 }
    255 
    256 static int cbs_get_any_asn1_element(CBS *cbs, CBS *out, unsigned *out_tag,
    257                                     size_t *out_header_len, int ber_ok) {
    258   CBS header = *cbs;
    259   CBS throwaway;
    260 
    261   if (out == NULL) {
    262     out = &throwaway;
    263   }
    264 
    265   unsigned tag;
    266   if (!parse_asn1_tag(&header, &tag)) {
    267     return 0;
    268   }
    269   if (out_tag != NULL) {
    270     *out_tag = tag;
    271   }
    272 
    273   uint8_t length_byte;
    274   if (!CBS_get_u8(&header, &length_byte)) {
    275     return 0;
    276   }
    277 
    278   size_t header_len = CBS_len(cbs) - CBS_len(&header);
    279 
    280   size_t len;
    281   // The format for the length encoding is specified in ITU-T X.690 section
    282   // 8.1.3.
    283   if ((length_byte & 0x80) == 0) {
    284     // Short form length.
    285     len = ((size_t) length_byte) + header_len;
    286     if (out_header_len != NULL) {
    287       *out_header_len = header_len;
    288     }
    289   } else {
    290     // The high bit indicate that this is the long form, while the next 7 bits
    291     // encode the number of subsequent octets used to encode the length (ITU-T
    292     // X.690 clause 8.1.3.5.b).
    293     const size_t num_bytes = length_byte & 0x7f;
    294     uint64_t len64;
    295 
    296     if (ber_ok && (tag & CBS_ASN1_CONSTRUCTED) != 0 && num_bytes == 0) {
    297       // indefinite length
    298       if (out_header_len != NULL) {
    299         *out_header_len = header_len;
    300       }
    301       return CBS_get_bytes(cbs, out, header_len);
    302     }
    303 
    304     // ITU-T X.690 clause 8.1.3.5.c specifies that the value 0xff shall not be
    305     // used as the first byte of the length. If this parser encounters that
    306     // value, num_bytes will be parsed as 127, which will fail the check below.
    307     if (num_bytes == 0 || num_bytes > 4) {
    308       return 0;
    309     }
    310     if (!cbs_get_u(&header, &len64, num_bytes)) {
    311       return 0;
    312     }
    313     // ITU-T X.690 section 10.1 (DER length forms) requires encoding the length
    314     // with the minimum number of octets.
    315     if (len64 < 128) {
    316       // Length should have used short-form encoding.
    317       return 0;
    318     }
    319     if ((len64 >> ((num_bytes-1)*8)) == 0) {
    320       // Length should have been at least one byte shorter.
    321       return 0;
    322     }
    323     len = len64;
    324     if (len + header_len + num_bytes < len) {
    325       // Overflow.
    326       return 0;
    327     }
    328     len += header_len + num_bytes;
    329     if (out_header_len != NULL) {
    330       *out_header_len = header_len + num_bytes;
    331     }
    332   }
    333 
    334   return CBS_get_bytes(cbs, out, len);
    335 }
    336 
    337 int CBS_get_any_asn1(CBS *cbs, CBS *out, unsigned *out_tag) {
    338   size_t header_len;
    339   if (!CBS_get_any_asn1_element(cbs, out, out_tag, &header_len)) {
    340     return 0;
    341   }
    342 
    343   if (!CBS_skip(out, header_len)) {
    344     assert(0);
    345     return 0;
    346   }
    347 
    348   return 1;
    349 }
    350 
    351 int CBS_get_any_asn1_element(CBS *cbs, CBS *out, unsigned *out_tag,
    352                                     size_t *out_header_len) {
    353   return cbs_get_any_asn1_element(cbs, out, out_tag, out_header_len,
    354                                   0 /* DER only */);
    355 }
    356 
    357 int CBS_get_any_ber_asn1_element(CBS *cbs, CBS *out, unsigned *out_tag,
    358                                  size_t *out_header_len) {
    359   return cbs_get_any_asn1_element(cbs, out, out_tag, out_header_len,
    360                                   1 /* BER allowed */);
    361 }
    362 
    363 static int cbs_get_asn1(CBS *cbs, CBS *out, unsigned tag_value,
    364                         int skip_header) {
    365   size_t header_len;
    366   unsigned tag;
    367   CBS throwaway;
    368 
    369   if (out == NULL) {
    370     out = &throwaway;
    371   }
    372 
    373   if (!CBS_get_any_asn1_element(cbs, out, &tag, &header_len) ||
    374       tag != tag_value) {
    375     return 0;
    376   }
    377 
    378   if (skip_header && !CBS_skip(out, header_len)) {
    379     assert(0);
    380     return 0;
    381   }
    382 
    383   return 1;
    384 }
    385 
    386 int CBS_get_asn1(CBS *cbs, CBS *out, unsigned tag_value) {
    387   return cbs_get_asn1(cbs, out, tag_value, 1 /* skip header */);
    388 }
    389 
    390 int CBS_get_asn1_element(CBS *cbs, CBS *out, unsigned tag_value) {
    391   return cbs_get_asn1(cbs, out, tag_value, 0 /* include header */);
    392 }
    393 
    394 int CBS_peek_asn1_tag(const CBS *cbs, unsigned tag_value) {
    395   if (CBS_len(cbs) < 1) {
    396     return 0;
    397   }
    398 
    399   CBS copy = *cbs;
    400   unsigned actual_tag;
    401   return parse_asn1_tag(&copy, &actual_tag) && tag_value == actual_tag;
    402 }
    403 
    404 int CBS_get_asn1_uint64(CBS *cbs, uint64_t *out) {
    405   CBS bytes;
    406   if (!CBS_get_asn1(cbs, &bytes, CBS_ASN1_INTEGER)) {
    407     return 0;
    408   }
    409 
    410   *out = 0;
    411   const uint8_t *data = CBS_data(&bytes);
    412   size_t len = CBS_len(&bytes);
    413 
    414   if (len == 0) {
    415     // An INTEGER is encoded with at least one octet.
    416     return 0;
    417   }
    418 
    419   if ((data[0] & 0x80) != 0) {
    420     // Negative number.
    421     return 0;
    422   }
    423 
    424   if (data[0] == 0 && len > 1 && (data[1] & 0x80) == 0) {
    425     // Extra leading zeros.
    426     return 0;
    427   }
    428 
    429   for (size_t i = 0; i < len; i++) {
    430     if ((*out >> 56) != 0) {
    431       // Too large to represent as a uint64_t.
    432       return 0;
    433     }
    434     *out <<= 8;
    435     *out |= data[i];
    436   }
    437 
    438   return 1;
    439 }
    440 
    441 int CBS_get_asn1_bool(CBS *cbs, int *out) {
    442   CBS bytes;
    443   if (!CBS_get_asn1(cbs, &bytes, CBS_ASN1_BOOLEAN) ||
    444       CBS_len(&bytes) != 1) {
    445     return 0;
    446   }
    447 
    448   const uint8_t value = *CBS_data(&bytes);
    449   if (value != 0 && value != 0xff) {
    450     return 0;
    451   }
    452 
    453   *out = !!value;
    454   return 1;
    455 }
    456 
    457 int CBS_get_optional_asn1(CBS *cbs, CBS *out, int *out_present, unsigned tag) {
    458   int present = 0;
    459 
    460   if (CBS_peek_asn1_tag(cbs, tag)) {
    461     if (!CBS_get_asn1(cbs, out, tag)) {
    462       return 0;
    463     }
    464     present = 1;
    465   }
    466 
    467   if (out_present != NULL) {
    468     *out_present = present;
    469   }
    470 
    471   return 1;
    472 }
    473 
    474 int CBS_get_optional_asn1_octet_string(CBS *cbs, CBS *out, int *out_present,
    475                                        unsigned tag) {
    476   CBS child;
    477   int present;
    478   if (!CBS_get_optional_asn1(cbs, &child, &present, tag)) {
    479     return 0;
    480   }
    481   if (present) {
    482     assert(out);
    483     if (!CBS_get_asn1(&child, out, CBS_ASN1_OCTETSTRING) ||
    484         CBS_len(&child) != 0) {
    485       return 0;
    486     }
    487   } else {
    488     CBS_init(out, NULL, 0);
    489   }
    490   if (out_present) {
    491     *out_present = present;
    492   }
    493   return 1;
    494 }
    495 
    496 int CBS_get_optional_asn1_uint64(CBS *cbs, uint64_t *out, unsigned tag,
    497                                  uint64_t default_value) {
    498   CBS child;
    499   int present;
    500   if (!CBS_get_optional_asn1(cbs, &child, &present, tag)) {
    501     return 0;
    502   }
    503   if (present) {
    504     if (!CBS_get_asn1_uint64(&child, out) ||
    505         CBS_len(&child) != 0) {
    506       return 0;
    507     }
    508   } else {
    509     *out = default_value;
    510   }
    511   return 1;
    512 }
    513 
    514 int CBS_get_optional_asn1_bool(CBS *cbs, int *out, unsigned tag,
    515                                int default_value) {
    516   CBS child, child2;
    517   int present;
    518   if (!CBS_get_optional_asn1(cbs, &child, &present, tag)) {
    519     return 0;
    520   }
    521   if (present) {
    522     uint8_t boolean;
    523 
    524     if (!CBS_get_asn1(&child, &child2, CBS_ASN1_BOOLEAN) ||
    525         CBS_len(&child2) != 1 ||
    526         CBS_len(&child) != 0) {
    527       return 0;
    528     }
    529 
    530     boolean = CBS_data(&child2)[0];
    531     if (boolean == 0) {
    532       *out = 0;
    533     } else if (boolean == 0xff) {
    534       *out = 1;
    535     } else {
    536       return 0;
    537     }
    538   } else {
    539     *out = default_value;
    540   }
    541   return 1;
    542 }
    543 
    544 int CBS_is_valid_asn1_bitstring(const CBS *cbs) {
    545   CBS in = *cbs;
    546   uint8_t num_unused_bits;
    547   if (!CBS_get_u8(&in, &num_unused_bits) ||
    548       num_unused_bits > 7) {
    549     return 0;
    550   }
    551 
    552   if (num_unused_bits == 0) {
    553     return 1;
    554   }
    555 
    556   // All num_unused_bits bits must exist and be zeros.
    557   uint8_t last;
    558   if (!CBS_get_last_u8(&in, &last) ||
    559       (last & ((1 << num_unused_bits) - 1)) != 0) {
    560     return 0;
    561   }
    562 
    563   return 1;
    564 }
    565 
    566 int CBS_asn1_bitstring_has_bit(const CBS *cbs, unsigned bit) {
    567   if (!CBS_is_valid_asn1_bitstring(cbs)) {
    568     return 0;
    569   }
    570 
    571   const unsigned byte_num = (bit >> 3) + 1;
    572   const unsigned bit_num = 7 - (bit & 7);
    573 
    574   // Unused bits are zero, and this function does not distinguish between
    575   // missing and unset bits. Thus it is sufficient to do a byte-level length
    576   // check.
    577   return byte_num < CBS_len(cbs) &&
    578          (CBS_data(cbs)[byte_num] & (1 << bit_num)) != 0;
    579 }
    580 
    581 static int add_decimal(CBB *out, uint64_t v) {
    582   char buf[DECIMAL_SIZE(uint64_t) + 1];
    583   BIO_snprintf(buf, sizeof(buf), "%" PRIu64, v);
    584   return CBB_add_bytes(out, (const uint8_t *)buf, strlen(buf));
    585 }
    586 
    587 char *CBS_asn1_oid_to_text(const CBS *cbs) {
    588   CBB cbb;
    589   if (!CBB_init(&cbb, 32)) {
    590     goto err;
    591   }
    592 
    593   CBS copy = *cbs;
    594   // The first component is 40 * value1 + value2, where value1 is 0, 1, or 2.
    595   uint64_t v;
    596   if (!parse_base128_integer(&copy, &v)) {
    597     goto err;
    598   }
    599 
    600   if (v >= 80) {
    601     if (!CBB_add_bytes(&cbb, (const uint8_t *)"2.", 2) ||
    602         !add_decimal(&cbb, v - 80)) {
    603       goto err;
    604     }
    605   } else if (!add_decimal(&cbb, v / 40) ||
    606              !CBB_add_u8(&cbb, '.') ||
    607              !add_decimal(&cbb, v % 40)) {
    608     goto err;
    609   }
    610 
    611   while (CBS_len(&copy) != 0) {
    612     if (!parse_base128_integer(&copy, &v) ||
    613         !CBB_add_u8(&cbb, '.') ||
    614         !add_decimal(&cbb, v)) {
    615       goto err;
    616     }
    617   }
    618 
    619   uint8_t *txt;
    620   size_t txt_len;
    621   if (!CBB_add_u8(&cbb, '\0') ||
    622       !CBB_finish(&cbb, &txt, &txt_len)) {
    623     goto err;
    624   }
    625 
    626   return (char *)txt;
    627 
    628 err:
    629   CBB_cleanup(&cbb);
    630   return NULL;
    631 }
    632